diff --git a/.gitattributes b/.gitattributes index 726c739cfd..d5b196971c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7305,6 +7305,25 @@ OfficeCore/Test/TestConsole/bin/Debug/TestConsole.vshost.exe svn_mime_002dtype=a OfficeCore/Test/TestConsole/bin/Release/Interop.OfficeCore.dll svn_mime_002dtype=application%2Foctet-stream OfficeCore/Test/TestConsole/bin/Release/TestConsole.exe svn_mime_002dtype=application%2Foctet-stream OfficeCore/Test/TestConsole/bin/Release/TestConsole.pdb svn_mime_002dtype=application%2Foctet-stream +/PdfReader svnc_tsvn_003alogminsize=5 +PdfReader/PdfReaderTest svnc_tsvn_003alogminsize=5 +PdfReader/Resources svnc_tsvn_003alogminsize=5 +PdfReader/Resources/Fonts svnc_tsvn_003alogminsize=5 +PdfReader/Resources/Fonts/d050000l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n019003l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n019004l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n019023l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n019024l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n021003l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n021004l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n021023l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n021024l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n022003l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n022004l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n022023l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/n022024l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Resources/Fonts/s050000l.pfb svn_mime_002dtype=application%2Foctet-stream +PdfReader/Src svnc_tsvn_003alogminsize=5 Redist/ASCEBOOKWriter.dll svn_mime_002dtype=application%2Foctet-stream Redist/ASCFontConverter.dll svn_mime_002dtype=application%2Foctet-stream Redist/ASCGraphics.dll svn_mime_002dtype=application%2Foctet-stream diff --git a/PdfReader/PdfReader.cpp b/PdfReader/PdfReader.cpp new file mode 100644 index 0000000000..d781ab8638 --- /dev/null +++ b/PdfReader/PdfReader.cpp @@ -0,0 +1,306 @@ +#include "PdfReader.h" +#include "../Common/OfficeDefines.h" +#include "../DesktopEditor/raster/BgraFrame.h" +#include "../DesktopEditor/graphics/GraphicsRenderer.h" +#include "../DesktopEditor/fontengine/ApplicationFonts.h" +#include "../DesktopEditor/fontengine/FontManager.h" +#include "../DesktopEditor/graphics/IRenderer.h" +#include "../DesktopEditor/common/Directory.h" + +#include "Src/StringExt.h" +#include "Src/PDFDoc.h" +#include "Src/GlobalParams.h" +#include "Src/ErrorConstants.h" +#include "Src/ExtractImageOutputDev.h" +#include "Src/RendererOutputDev.h" + +#include + +namespace PdfReader +{ + CPdfReader::CPdfReader(CApplicationFonts* pAppFonts) + { + m_wsTempFolder = NULL; + m_wsCMapFolder = NULL; + + m_pPDFDocument = NULL; + m_pFontManager = NULL; + + m_pGlobalParams = new GlobalParams(); + m_pFontList = new CFontList(); + + m_pAppFonts = pAppFonts; + + // Создаем менеджер шрифтов с собственным кэшем + m_pFontManager = pAppFonts->GenerateFontManager(); + CFontsCache* pMeasurerCache = new CFontsCache(); + pMeasurerCache->SetStreams(pAppFonts->GetStreams()); + m_pFontManager->SetOwnerCache(pMeasurerCache); + m_pGlobalParams->SetFontManager(m_pFontManager); + } + CPdfReader::~CPdfReader() + { + if (m_pFontList) + { + m_pFontList->Clear(); + delete m_pFontList; + } + + if (m_wsCMapFolder) + FreeWString(m_wsCMapFolder); + + if (m_wsTempFolder) + { + NSDirectory::DeleteDirectory(m_wsTempFolder); + FreeWString(m_wsTempFolder); + } + + RELEASEOBJECT(m_pPDFDocument); + RELEASEOBJECT(m_pGlobalParams); + RELEASEINTERFACE(m_pFontManager); + } + bool CPdfReader::LoadFromFile(const wchar_t* wsSrcPath, const wchar_t* wsOwnerPassword, const wchar_t* wsUserPassword, const wchar_t* wsOptions) + { + // TODO: Сейчас при загрузке каждой новой картинки мы пересоздаем + // FontManager, потому что сейчас в нем кэш без ограничения. + //------------------------------------------------------ + RELEASEINTERFACE(m_pFontManager); + m_pFontManager = m_pAppFonts->GenerateFontManager(); + CFontsCache* pMeasurerCache = new CFontsCache(); + pMeasurerCache->SetStreams(m_pAppFonts->GetStreams()); + m_pFontManager->SetOwnerCache(pMeasurerCache); + m_pGlobalParams->SetFontManager(m_pFontManager); + //------------------------------------------------------ + + if (m_pPDFDocument) + delete m_pPDFDocument; + + StringExt *seOwner = NULL, *seUser = NULL; + if (NULL != wsOwnerPassword) + seOwner = new StringExt(wsOwnerPassword); + if (NULL != wsUserPassword) + seUser = new StringExt(wsUserPassword); + + m_pPDFDocument = new PDFDoc(m_pGlobalParams, wsSrcPath, seOwner, seUser); + + if (seUser) + delete seUser; + + if (seOwner) + delete seOwner; + + if (!m_pPDFDocument || !m_pPDFDocument->CheckValidation()) + { + if (m_pPDFDocument) + delete m_pPDFDocument; + + return false; + } + + m_pFontList->Clear(); + + if (L"CheckPassword" != wsOptions) + { + m_pGlobalParams->SetTempFolder(m_wsTempFolder); + m_pGlobalParams->SetCMapFolder(m_wsCMapFolder); + m_pGlobalParams->SetFontManager(m_pFontManager); + } + + return (errorNone == m_pPDFDocument->GetErrorCode()); + } + void CPdfReader::Close() + { + RELEASEOBJECT(m_pPDFDocument); + } + EError CPdfReader::GetError() + { + return m_pPDFDocument->GetErrorCode(); + } + int CPdfReader::GetPagesCount() + { + if (!m_pPDFDocument) + return 0; + + return m_pPDFDocument->GetPagesCount(); + } + double CPdfReader::GetVersion() + { + if (!m_pPDFDocument) + return 0; + + return m_pPDFDocument->GetPDFVersion(); + } + int CPdfReader::GetPermissions() + { + if (!m_pPDFDocument) + return 0; + + int nPermissions = 0; + + if (m_pPDFDocument->CheckPrint()) + nPermissions += PERMISSION_PRINT; + if (m_pPDFDocument->CheckCopy()) + nPermissions += PERMISSION_COPY; + if (m_pPDFDocument->CheckChange()) + nPermissions += PERMISSION_CHANGE; + + return nPermissions; + } + bool CPdfReader::ExtractAllImages(const wchar_t* wsDstPath, const wchar_t* wsPrefix) + { + StringExt seString(wsDstPath); + ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev(m_pGlobalParams, seString.GetBuffer(), true); + if (!pOutputDev) + return false; + + for (int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++) + { + m_pPDFDocument->DisplayPage(pOutputDev, nIndex, 72, 72, 0, false, false, false); + } + + delete pOutputDev; + + return true; + } + void CPdfReader::GetPageSize(int _nPageIndex, double* pdWidth, double* pdHeight) + { + int nPageIndex = _nPageIndex + 1; + + if (!m_pPDFDocument) + return; + + const double c_dInch = 25.399; // Миллиметров в дюйме + const double c_dXResolution = 154.0; + const double c_dYResolution = 154.0; + + double dKoefX = c_dInch / c_dXResolution; + double dKoefY = c_dInch / c_dYResolution; + + int nRotate = m_pPDFDocument->GetPageRotate(nPageIndex); + + while (nRotate >= 360) + nRotate -= 360; + + while (nRotate < 0) + nRotate += 360; + + if (0 != nRotate && 180 != nRotate) + { + *pdHeight = PDFCoordsToMM(m_pPDFDocument->GetPageCropWidth(nPageIndex)); + *pdWidth = PDFCoordsToMM(m_pPDFDocument->GetPageCropHeight(nPageIndex)); + } + else + { + *pdWidth = PDFCoordsToMM(m_pPDFDocument->GetPageCropWidth(nPageIndex)); + *pdHeight = PDFCoordsToMM(m_pPDFDocument->GetPageCropHeight(nPageIndex)); + } + } + void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* pbBreak) + { + int nPageIndex = _nPageIndex + 1; + + if (m_pPDFDocument && pRenderer) + { + RendererOutputDev oRendererOut(m_pGlobalParams, pRenderer, m_pFontManager, m_pFontList); + oRendererOut.NewPDF(m_pPDFDocument->GetXRef()); + oRendererOut.SetBreak(pbBreak); + m_pPDFDocument->DisplayPage(&oRendererOut, nPageIndex, 72.0, 72.0, 0, false, true, false); + } + } + void CPdfReader::ConvertToRaster(int nPageIndex, const wchar_t* wsDstPath, int nImageType) + { + CFontManager *pFontManager = m_pAppFonts->GenerateFontManager(); + CFontsCache* pFontCache = new CFontsCache(); + pFontCache->SetStreams(m_pAppFonts->GetStreams()); + pFontManager->SetOwnerCache(pFontCache); + + CGraphicsRenderer oRenderer; + oRenderer.SetFontManager(pFontManager); + + double dWidth, dHeight; + GetPageSize(nPageIndex, &dWidth, &dHeight); + + int nWidth = (int)dWidth * 72 / 25.4; + int nHeight = (int)dHeight * 72 / 25.4; + + BYTE* pBgraData = new BYTE[nWidth * nHeight * 4]; + if (!pBgraData) + return; + + memset(pBgraData, 0xff, nWidth * nHeight * 4); + CBgraFrame oFrame; + oFrame.put_Data(pBgraData); + oFrame.put_Width(nWidth); + oFrame.put_Height(nHeight); + oFrame.put_Stride(-4 * nWidth); + + oRenderer.CreateFromBgraFrame(&oFrame); + oRenderer.SetSwapRGB(false); + oRenderer.put_Width(dWidth); + oRenderer.put_Height(dHeight); + + bool bBreak = false; + DrawPageOnRenderer(&oRenderer, nPageIndex, &bBreak); + + oFrame.SaveFile(wsDstPath, nImageType); + RELEASEINTERFACE(pFontManager); + } + int CPdfReader::GetImagesCount() + { + ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev(m_pGlobalParams, NULL, true, true); + if (!pOutputDev) + return 0; + + for (int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++) + { + m_pPDFDocument->DisplayPage(pOutputDev, nIndex, 72, 72, 0, false, false, false); + } + + return pOutputDev->GetImagesCount(); + } + void CPdfReader::SetTempFolder(const wchar_t* wsTempFolder) + { + if (m_wsTempFolder) + { + NSDirectory::DeleteDirectory(m_wsTempFolder); + FreeWString(m_wsTempFolder); + } + + if (NULL != wsTempFolder) + { + std::wstring wsFolderName = std::wstring(wsTempFolder) + L"//pdftemp"; + std::wstring wsFolder = wsFolderName; + int nCounter = 0; + while (NSDirectory::Exists(wsFolder)) + { + nCounter++; + wsFolder = wsFolderName + L"_" + std::to_wstring(nCounter); + } + NSDirectory::CreateDirectoryW(wsFolder); + m_wsTempFolder = AllocWString(wsFolder); + } + else + m_wsTempFolder = NULL; + + if (m_pGlobalParams) + m_pGlobalParams->SetTempFolder(m_wsTempFolder); + } + void CPdfReader::SetCMapFolder(const wchar_t* wsCMapFolder) + { + if (m_wsCMapFolder) + FreeWString(m_wsCMapFolder); + + if (NULL != wsCMapFolder) + m_wsCMapFolder = AllocWString(wsCMapFolder); + else + m_wsCMapFolder = NULL; + + + if (m_pGlobalParams) + m_pGlobalParams->SetCMapFolder(m_wsCMapFolder); + } + CFontManager*CPdfReader::GetFontManager() + { + return m_pFontManager; + } +} \ No newline at end of file diff --git a/PdfReader/PdfReader.h b/PdfReader/PdfReader.h new file mode 100644 index 0000000000..4ec29cddab --- /dev/null +++ b/PdfReader/PdfReader.h @@ -0,0 +1,54 @@ +#ifndef _PDF_READER_H +#define _PDF_READER_H + +#include "Src/ErrorConstants.h" + +class IRenderer; +class CFontManager; +class CApplicationFonts; + +namespace PdfReader +{ + class PDFDoc; + class GlobalParams; + class CFontList; + + class CPdfReader + { + public: + + CPdfReader(CApplicationFonts* pAppFonts); + ~CPdfReader(); + + bool LoadFromFile(const wchar_t* wsSrcPath, const wchar_t* wsOwnerPassword = 0, const wchar_t* wsUserPassword = 0, const wchar_t* wsOptions = 0); + void Close(); + + EError GetError(); + double GetVersion(); + int GetPermissions(); + + int GetPagesCount(); + void GetPageSize(int nPageIndex, double* pdWidth, double* pdHeight); + void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pbBreak); + void ConvertToRaster(int nPageIndex, const wchar_t* wsDstPath, int nImageType); + + bool ExtractAllImages(const wchar_t* wsDstPath, const wchar_t* wsPrefix = 0); + int GetImagesCount(); + + void SetTempFolder(const wchar_t* wsTempFolder); + void SetCMapFolder(const wchar_t* wsCMapFolder); + CFontManager*GetFontManager(); + + private: + + PDFDoc* m_pPDFDocument; + GlobalParams* m_pGlobalParams; + wchar_t* m_wsTempFolder; + wchar_t* m_wsCMapFolder; + CApplicationFonts* m_pAppFonts; + CFontManager* m_pFontManager; + CFontList* m_pFontList; + }; +} + +#endif // _PDF_READER_H diff --git a/PdfReader/PdfReader.sln b/PdfReader/PdfReader.sln new file mode 100644 index 0000000000..96084eca09 --- /dev/null +++ b/PdfReader/PdfReader.sln @@ -0,0 +1,50 @@ +п»ї +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PdfReader", "PdfReader.vcxproj", "{4EA2BD9F-7F41-482B-9BD8-2102C703D912}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PdfReaderTest", "PdfReaderTest\PdfReaderTest.vcxproj", "{29C4FC88-8442-46E1-A94B-6C3284DE13C0}" + ProjectSection(ProjectDependencies) = postProject + {4EA2BD9F-7F41-482B-9BD8-2102C703D912} = {4EA2BD9F-7F41-482B-9BD8-2102C703D912} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|Mixed Platforms.Build.0 = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|Win32.ActiveCfg = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|Win32.Build.0 = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|x64.ActiveCfg = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Debug|x64.Build.0 = Debug|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|Win32.ActiveCfg = Release|Win32 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|Win32.Build.0 = Release|Win32 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|x64.ActiveCfg = Release|x64 + {4EA2BD9F-7F41-482B-9BD8-2102C703D912}.Release|x64.Build.0 = Release|x64 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|Win32.Build.0 = Debug|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|x64.ActiveCfg = Debug|x64 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Debug|x64.Build.0 = Debug|x64 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Release|Mixed Platforms.Build.0 = Release|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Release|Win32.ActiveCfg = Release|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Release|Win32.Build.0 = Release|Win32 + {29C4FC88-8442-46E1-A94B-6C3284DE13C0}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PdfReader/PdfReader.vcxproj b/PdfReader/PdfReader.vcxproj new file mode 100644 index 0000000000..c7df06535d --- /dev/null +++ b/PdfReader/PdfReader.vcxproj @@ -0,0 +1,257 @@ +п»ї + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4EA2BD9F-7F41-482B-9BD8-2102C703D912} + Win32Proj + PdfReader + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + true + Unicode + + + StaticLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + ../DesktopEditor/cximage/zlib;$(IncludePath) + ../DesktopEditor/cximage/zlib;$(LibraryPath) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + true + 4267;4018;4244;4005; + ..\DesktopEditor\agg-2.4\include;..\DesktopEditor\freetype-2.5.2\include;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + true + ..\DesktopEditor\agg-2.4\include;..\DesktopEditor\freetype-2.5.2\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PdfReader/PdfReader.vcxproj.filters b/PdfReader/PdfReader.vcxproj.filters new file mode 100644 index 0000000000..461aa0392e --- /dev/null +++ b/PdfReader/PdfReader.vcxproj.filters @@ -0,0 +1,348 @@ +п»ї + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {480187d6-5678-4ac6-9c15-ec306d7d5b5b} + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + Header Files\Resources + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/PdfReader/PdfReaderTest/PdfReaderTest.cpp b/PdfReader/PdfReaderTest/PdfReaderTest.cpp new file mode 100644 index 0000000000..b26edc0820 --- /dev/null +++ b/PdfReader/PdfReaderTest/PdfReaderTest.cpp @@ -0,0 +1,71 @@ +// PdfReaderTest.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include "../PdfReader.h" +#include "../../DesktopEditor/fontengine/ApplicationFonts.h" +#include +#include +#include "windows.h" + +std::vector GetAllFilesInFolder(std::wstring wsFolder, std::wstring wsExt) +{ + std::vector vwsNames; + + std::wstring wsSearchPath = wsFolder; + wsSearchPath.append(L"*."); + wsSearchPath.append(wsExt); + + WIN32_FIND_DATA oFindData; + HANDLE hFind = ::FindFirstFile(wsSearchPath.c_str(), &oFindData); + if (hFind != INVALID_HANDLE_VALUE) + { + do + { + if (!(oFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + vwsNames.push_back(oFindData.cFileName); + } + } while (::FindNextFile(hFind, &oFindData)); + ::FindClose(hFind); + } + return vwsNames; +} +void ConvertFolder(PdfReader::CPdfReader& oReader, std::wstring wsFolderPath) +{ + oReader.Close(); + + std::vector vFiles = GetAllFilesInFolder(wsFolderPath, L"pdf"); + for (int nIndex = 0; nIndex < vFiles.size(); nIndex++) + { + std::wstring wsFilePath = wsFolderPath; + wsFilePath.append(vFiles.at(nIndex)); + std::wstring wsFilePathName = (wsFilePath.substr(0, wsFilePath.size() - 4)); + if (oReader.LoadFromFile(wsFilePath.c_str(), NULL, NULL, NULL)) + { + int nPagesCount = oReader.GetPagesCount(); + for (int nPageIndex = 0; nPageIndex < nPagesCount; nPageIndex++) + { + std::wstring wsDstFilePath = wsFilePathName + L"_" + std::to_wstring(nPageIndex) + L".png"; + oReader.ConvertToRaster(nPageIndex, wsDstFilePath.c_str(), 4); + } + oReader.Close(); + } + else + { + printf("%d of %d %S error %d\n", nIndex, vFiles.size(), vFiles.at(nIndex).c_str(), oReader.GetError()); + } + } +} + +void main() +{ + CApplicationFonts oFonts; + oFonts.Initialize(); + + PdfReader::CPdfReader oPdfReader(&oFonts); + oPdfReader.SetTempFolder(L"D://Test Files//Temp//"); + oPdfReader.SetCMapFolder(L"D://Subversion//AVS//Redist//AVSOfficeStudio//CMaps//"); + ConvertFolder(oPdfReader, L"D://Test Files//"); +} + diff --git a/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj b/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj new file mode 100644 index 0000000000..3a6ee07426 --- /dev/null +++ b/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj @@ -0,0 +1,163 @@ +п»ї + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {29C4FC88-8442-46E1-A94B-6C3284DE13C0} + Win32Proj + PdfReaderTest + + + + Application + true + v120 + Unicode + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + true + + + true + $(ReferencePath) + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + ..\..\DesktopEditor\freetype-2.5.2\include + + + Console + true + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + ..\..\DesktopEditor\freetype-2.5.2\include;..\..\DesktopEditor\agg-2.4\include;..\..\DesktopEditor\cximage\zlib + + + Console + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj.filters b/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj.filters new file mode 100644 index 0000000000..c8a65f78da --- /dev/null +++ b/PdfReader/PdfReaderTest/PdfReaderTest.vcxproj.filters @@ -0,0 +1,36 @@ +п»ї + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/PdfReader/PdfReaderTest/ReadMe.txt b/PdfReader/PdfReaderTest/ReadMe.txt new file mode 100644 index 0000000000..1e46e50861 --- /dev/null +++ b/PdfReader/PdfReaderTest/ReadMe.txt @@ -0,0 +1,40 @@ +======================================================================== + CONSOLE APPLICATION : PdfReaderTest Project Overview +======================================================================== + +AppWizard has created this PdfReaderTest application for you. + +This file contains a summary of what you will find in each of the files that +make up your PdfReaderTest application. + + +PdfReaderTest.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +PdfReaderTest.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +PdfReaderTest.cpp + This is the main application source file. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named PdfReaderTest.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/PdfReader/PdfReaderTest/stdafx.cpp b/PdfReader/PdfReaderTest/stdafx.cpp new file mode 100644 index 0000000000..32a6800c4b --- /dev/null +++ b/PdfReader/PdfReaderTest/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// PdfReaderTest.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/PdfReader/PdfReaderTest/stdafx.h b/PdfReader/PdfReaderTest/stdafx.h new file mode 100644 index 0000000000..cda325b1eb --- /dev/null +++ b/PdfReader/PdfReaderTest/stdafx.h @@ -0,0 +1,18 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#ifdef _DEBUG +#pragma comment(lib, "../x64/Debug/PdfReader.lib") +#pragma comment(lib, "../../DesktopEditor/Qt_build/graphics/project/debug/graphics.lib") +#else +#pragma comment(lib, "../x64/Release/PdfReader.lib") +#pragma comment(lib, "../../DesktopEditor/Qt_build/graphics/project/release/graphics.lib") +#endif + +// TODO: reference additional headers your program requires here diff --git a/PdfReader/PdfReaderTest/targetver.h b/PdfReader/PdfReaderTest/targetver.h new file mode 100644 index 0000000000..90e767bfce --- /dev/null +++ b/PdfReader/PdfReaderTest/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/PdfReader/ReadMe.txt b/PdfReader/ReadMe.txt new file mode 100644 index 0000000000..42f1d35043 --- /dev/null +++ b/PdfReader/ReadMe.txt @@ -0,0 +1,29 @@ +======================================================================== + STATIC LIBRARY : PdfReader Project Overview +======================================================================== + +AppWizard has created this PdfReader library project for you. + +No source files were created as part of your project. + + +PdfReader.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +PdfReader.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/PdfReader/Resources/Fontd050000l.h b/PdfReader/Resources/Fontd050000l.h new file mode 100644 index 0000000000..eb6657ab4b --- /dev/null +++ b/PdfReader/Resources/Fontd050000l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_d050000l_H +#define _PDF_READER_RESOURCE_FONT_d050000l_H +namespace PdfReader +{ +static const unsigned char c_arrd050000l[]={128,1,182,18,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,68,105,110,103,98,97,116,115,32,48,48,49,46,48,48,53,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,84,117,101,32,79,99,116,32,49,57,32,49,57,57,57,10,37,32,67,111,112,121,114,105,103,104,116,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,10,37,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,10,49,50,32,100,105,99,116,32,98,101,103,105,110,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,10,47,118,101,114,115,105,111,110,32,40,48,48,49,46,48,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,78,111,116,105,99,101,32,40,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,70,117,108,108,78,97,109,101,32,40,68,105,110,103,98,97,116,115,32,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,70,97,109,105,108,121,78,97,109,101,32,40,68,105,110,103,98,97,116,115,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,55,50,32,100,101,102,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,51,54,32,100,101,102,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,70,111,110,116,78,97,109,101,32,47,68,105,110,103,98,97,116,115,32,100,101,102,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,10,47,87,77,111,100,101,32,48,32,100,101,102,10,47,70,111,110,116,66,66,111,120,32,123,45,49,32,45,49,52,51,32,57,56,49,32,56,49,57,125,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,10,47,69,110,99,111,100,105,110,103,32,50,53,54,32,97,114,114,97,121,32,10,48,32,49,32,50,53,53,32,123,49,32,105,110,100,101,120,32,101,120,99,104,32,47,46,110,111,116,100,101,102,32,112,117,116,125,32,102,111,114,32,10,100,117,112,32,51,50,32,47,115,112,97,99,101,32,112,117,116,10,100,117,112,32,51,51,32,47,97,49,32,112,117,116,10,100,117,112,32,51,52,32,47,97,50,32,112,117,116,10,100,117,112,32,51,53,32,47,97,50,48,50,32,112,117,116,10,100,117,112,32,51,54,32,47,97,51,32,112,117,116,10,100,117,112,32,51,55,32,47,97,52,32,112,117,116,10,100,117,112,32,51,56,32,47,97,53,32,112,117,116,10,100,117,112,32,51,57,32,47,97,49,49,57,32,112,117,116,10,100,117,112,32,52,48,32,47,97,49,49,56,32,112,117,116,10,100,117,112,32,52,49,32,47,97,49,49,55,32,112,117,116,10,100,117,112,32,52,50,32,47,97,49,49,32,112,117,116,10,100,117,112,32,52,51,32,47,97,49,50,32,112,117,116,10,100,117,112,32,52,52,32,47,97,49,51,32,112,117,116,10,100,117,112,32,52,53,32,47,97,49,52,32,112,117,116,10,100,117,112,32,52,54,32,47,97,49,53,32,112,117,116,10,100,117,112,32,52,55,32,47,97,49,54,32,112,117,116,10,100,117,112,32,52,56,32,47,97,49,48,53,32,112,117,116,10,100,117,112,32,52,57,32,47,97,49,55,32,112,117,116,10,100,117,112,32,53,48,32,47,97,49,56,32,112,117,116,10,100,117,112,32,53,49,32,47,97,49,57,32,112,117,116,10,100,117,112,32,53,50,32,47,97,50,48,32,112,117,116,10,100,117,112,32,53,51,32,47,97,50,49,32,112,117,116,10,100,117,112,32,53,52,32,47,97,50,50,32,112,117,116,10,100,117,112,32,53,53,32,47,97,50,51,32,112,117,116,10,100,117,112,32,53,54,32,47,97,50,52,32,112,117,116,10,100,117,112,32,53,55,32,47,97,50,53,32,112,117,116,10,100,117,112,32,53,56,32,47,97,50,54,32,112,117,116,10,100,117,112,32,53,57,32,47,97,50,55,32,112,117,116,10,100,117,112,32,54,48,32,47,97,50,56,32,112,117,116,10,100,117,112,32,54,49,32,47,97,54,32,112,117,116,10,100,117,112,32,54,50,32,47,97,55,32,112,117,116,10,100,117,112,32,54,51,32,47,97,56,32,112,117,116,10,100,117,112,32,54,52,32,47,97,57,32,112,117,116,10,100,117,112,32,54,53,32,47,97,49,48,32,112,117,116,10,100,117,112,32,54,54,32,47,97,50,57,32,112,117,116,10,100,117,112,32,54,55,32,47,97,51,48,32,112,117,116,10,100,117,112,32,54,56,32,47,97,51,49,32,112,117,116,10,100,117,112,32,54,57,32,47,97,51,50,32,112,117,116,10,100,117,112,32,55,48,32,47,97,51,51,32,112,117,116,10,100,117,112,32,55,49,32,47,97,51,52,32,112,117,116,10,100,117,112,32,55,50,32,47,97,51,53,32,112,117,116,10,100,117,112,32,55,51,32,47,97,51,54,32,112,117,116,10,100,117,112,32,55,52,32,47,97,51,55,32,112,117,116,10,100,117,112,32,55,53,32,47,97,51,56,32,112,117,116,10,100,117,112,32,55,54,32,47,97,51,57,32,112,117,116,10,100,117,112,32,55,55,32,47,97,52,48,32,112,117,116,10,100,117,112,32,55,56,32,47,97,52,49,32,112,117,116,10,100,117,112,32,55,57,32,47,97,52,50,32,112,117,116,10,100,117,112,32,56,48,32,47,97,52,51,32,112,117,116,10,100,117,112,32,56,49,32,47,97,52,52,32,112,117,116,10,100,117,112,32,56,50,32,47,97,52,53,32,112,117,116,10,100,117,112,32,56,51,32,47,97,52,54,32,112,117,116,10,100,117,112,32,56,52,32,47,97,52,55,32,112,117,116,10,100,117,112,32,56,53,32,47,97,52,56,32,112,117,116,10,100,117,112,32,56,54,32,47,97,52,57,32,112,117,116,10,100,117,112,32,56,55,32,47,97,53,48,32,112,117,116,10,100,117,112,32,56,56,32,47,97,53,49,32,112,117,116,10,100,117,112,32,56,57,32,47,97,53,50,32,112,117,116,10,100,117,112,32,57,48,32,47,97,53,51,32,112,117,116,10,100,117,112,32,57,49,32,47,97,53,52,32,112,117,116,10,100,117,112,32,57,50,32,47,97,53,53,32,112,117,116,10,100,117,112,32,57,51,32,47,97,53,54,32,112,117,116,10,100,117,112,32,57,52,32,47,97,53,55,32,112,117,116,10,100,117,112,32,57,53,32,47,97,53,56,32,112,117,116,10,100,117,112,32,57,54,32,47,97,53,57,32,112,117,116,10,100,117,112,32,57,55,32,47,97,54,48,32,112,117,116,10,100,117,112,32,57,56,32,47,97,54,49,32,112,117,116,10,100,117,112,32,57,57,32,47,97,54,50,32,112,117,116,10,100,117,112,32,49,48,48,32,47,97,54,51,32,112,117,116,10,100,117,112,32,49,48,49,32,47,97,54,52,32,112,117,116,10,100,117,112,32,49,48,50,32,47,97,54,53,32,112,117,116,10,100,117,112,32,49,48,51,32,47,97,54,54,32,112,117,116,10,100,117,112,32,49,48,52,32,47,97,54,55,32,112,117,116,10,100,117,112,32,49,48,53,32,47,97,54,56,32,112,117,116,10,100,117,112,32,49,48,54,32,47,97,54,57,32,112,117,116,10,100,117,112,32,49,48,55,32,47,97,55,48,32,112,117,116,10,100,117,112,32,49,48,56,32,47,97,55,49,32,112,117,116,10,100,117,112,32,49,48,57,32,47,97,55,50,32,112,117,116,10,100,117,112,32,49,49,48,32,47,97,55,51,32,112,117,116,10,100,117,112,32,49,49,49,32,47,97,55,52,32,112,117,116,10,100,117,112,32,49,49,50,32,47,97,50,48,51,32,112,117,116,10,100,117,112,32,49,49,51,32,47,97,55,53,32,112,117,116,10,100,117,112,32,49,49,52,32,47,97,50,48,52,32,112,117,116,10,100,117,112,32,49,49,53,32,47,97,55,54,32,112,117,116,10,100,117,112,32,49,49,54,32,47,97,55,55,32,112,117,116,10,100,117,112,32,49,49,55,32,47,97,55,56,32,112,117,116,10,100,117,112,32,49,49,56,32,47,97,55,57,32,112,117,116,10,100,117,112,32,49,49,57,32,47,97,56,49,32,112,117,116,10,100,117,112,32,49,50,48,32,47,97,56,50,32,112,117,116,10,100,117,112,32,49,50,49,32,47,97,56,51,32,112,117,116,10,100,117,112,32,49,50,50,32,47,97,56,52,32,112,117,116,10,100,117,112,32,49,50,51,32,47,97,57,55,32,112,117,116,10,100,117,112,32,49,50,52,32,47,97,57,56,32,112,117,116,10,100,117,112,32,49,50,53,32,47,97,57,57,32,112,117,116,10,100,117,112,32,49,50,54,32,47,97,49,48,48,32,112,117,116,10,100,117,112,32,49,54,49,32,47,97,49,48,49,32,112,117,116,10,100,117,112,32,49,54,50,32,47,97,49,48,50,32,112,117,116,10,100,117,112,32,49,54,51,32,47,97,49,48,51,32,112,117,116,10,100,117,112,32,49,54,52,32,47,97,49,48,52,32,112,117,116,10,100,117,112,32,49,54,53,32,47,97,49,48,54,32,112,117,116,10,100,117,112,32,49,54,54,32,47,97,49,48,55,32,112,117,116,10,100,117,112,32,49,54,55,32,47,97,49,48,56,32,112,117,116,10,100,117,112,32,49,54,56,32,47,97,49,49,50,32,112,117,116,10,100,117,112,32,49,54,57,32,47,97,49,49,49,32,112,117,116,10,100,117,112,32,49,55,48,32,47,97,49,49,48,32,112,117,116,10,100,117,112,32,49,55,49,32,47,97,49,48,57,32,112,117,116,10,100,117,112,32,49,55,50,32,47,97,49,50,48,32,112,117,116,10,100,117,112,32,49,55,51,32,47,97,49,50,49,32,112,117,116,10,100,117,112,32,49,55,52,32,47,97,49,50,50,32,112,117,116,10,100,117,112,32,49,55,53,32,47,97,49,50,51,32,112,117,116,10,100,117,112,32,49,55,54,32,47,97,49,50,52,32,112,117,116,10,100,117,112,32,49,55,55,32,47,97,49,50,53,32,112,117,116,10,100,117,112,32,49,55,56,32,47,97,49,50,54,32,112,117,116,10,100,117,112,32,49,55,57,32,47,97,49,50,55,32,112,117,116,10,100,117,112,32,49,56,48,32,47,97,49,50,56,32,112,117,116,10,100,117,112,32,49,56,49,32,47,97,49,50,57,32,112,117,116,10,100,117,112,32,49,56,50,32,47,97,49,51,48,32,112,117,116,10,100,117,112,32,49,56,51,32,47,97,49,51,49,32,112,117,116,10,100,117,112,32,49,56,52,32,47,97,49,51,50,32,112,117,116,10,100,117,112,32,49,56,53,32,47,97,49,51,51,32,112,117,116,10,100,117,112,32,49,56,54,32,47,97,49,51,52,32,112,117,116,10,100,117,112,32,49,56,55,32,47,97,49,51,53,32,112,117,116,10,100,117,112,32,49,56,56,32,47,97,49,51,54,32,112,117,116,10,100,117,112,32,49,56,57,32,47,97,49,51,55,32,112,117,116,10,100,117,112,32,49,57,48,32,47,97,49,51,56,32,112,117,116,10,100,117,112,32,49,57,49,32,47,97,49,51,57,32,112,117,116,10,100,117,112,32,49,57,50,32,47,97,49,52,48,32,112,117,116,10,100,117,112,32,49,57,51,32,47,97,49,52,49,32,112,117,116,10,100,117,112,32,49,57,52,32,47,97,49,52,50,32,112,117,116,10,100,117,112,32,49,57,53,32,47,97,49,52,51,32,112,117,116,10,100,117,112,32,49,57,54,32,47,97,49,52,52,32,112,117,116,10,100,117,112,32,49,57,55,32,47,97,49,52,53,32,112,117,116,10,100,117,112,32,49,57,56,32,47,97,49,52,54,32,112,117,116,10,100,117,112,32,49,57,57,32,47,97,49,52,55,32,112,117,116,10,100,117,112,32,50,48,48,32,47,97,49,52,56,32,112,117,116,10,100,117,112,32,50,48,49,32,47,97,49,52,57,32,112,117,116,10,100,117,112,32,50,48,50,32,47,97,49,53,48,32,112,117,116,10,100,117,112,32,50,48,51,32,47,97,49,53,49,32,112,117,116,10,100,117,112,32,50,48,52,32,47,97,49,53,50,32,112,117,116,10,100,117,112,32,50,48,53,32,47,97,49,53,51,32,112,117,116,10,100,117,112,32,50,48,54,32,47,97,49,53,52,32,112,117,116,10,100,117,112,32,50,48,55,32,47,97,49,53,53,32,112,117,116,10,100,117,112,32,50,48,56,32,47,97,49,53,54,32,112,117,116,10,100,117,112,32,50,48,57,32,47,97,49,53,55,32,112,117,116,10,100,117,112,32,50,49,48,32,47,97,49,53,56,32,112,117,116,10,100,117,112,32,50,49,49,32,47,97,49,53,57,32,112,117,116,10,100,117,112,32,50,49,50,32,47,97,49,54,48,32,112,117,116,10,100,117,112,32,50,49,51,32,47,97,49,54,49,32,112,117,116,10,100,117,112,32,50,49,52,32,47,97,49,54,51,32,112,117,116,10,100,117,112,32,50,49,53,32,47,97,49,54,52,32,112,117,116,10,100,117,112,32,50,49,54,32,47,97,49,57,54,32,112,117,116,10,100,117,112,32,50,49,55,32,47,97,49,54,53,32,112,117,116,10,100,117,112,32,50,49,56,32,47,97,49,57,50,32,112,117,116,10,100,117,112,32,50,49,57,32,47,97,49,54,54,32,112,117,116,10,100,117,112,32,50,50,48,32,47,97,49,54,55,32,112,117,116,10,100,117,112,32,50,50,49,32,47,97,49,54,56,32,112,117,116,10,100,117,112,32,50,50,50,32,47,97,49,54,57,32,112,117,116,10,100,117,112,32,50,50,51,32,47,97,49,55,48,32,112,117,116,10,100,117,112,32,50,50,52,32,47,97,49,55,49,32,112,117,116,10,100,117,112,32,50,50,53,32,47,97,49,55,50,32,112,117,116,10,100,117,112,32,50,50,54,32,47,97,49,55,51,32,112,117,116,10,100,117,112,32,50,50,55,32,47,97,49,54,50,32,112,117,116,10,100,117,112,32,50,50,56,32,47,97,49,55,52,32,112,117,116,10,100,117,112,32,50,50,57,32,47,97,49,55,53,32,112,117,116,10,100,117,112,32,50,51,48,32,47,97,49,55,54,32,112,117,116,10,100,117,112,32,50,51,49,32,47,97,49,55,55,32,112,117,116,10,100,117,112,32,50,51,50,32,47,97,49,55,56,32,112,117,116,10,100,117,112,32,50,51,51,32,47,97,49,55,57,32,112,117,116,10,100,117,112,32,50,51,52,32,47,97,49,57,51,32,112,117,116,10,100,117,112,32,50,51,53,32,47,97,49,56,48,32,112,117,116,10,100,117,112,32,50,51,54,32,47,97,49,57,57,32,112,117,116,10,100,117,112,32,50,51,55,32,47,97,49,56,49,32,112,117,116,10,100,117,112,32,50,51,56,32,47,97,50,48,48,32,112,117,116,10,100,117,112,32,50,51,57,32,47,97,49,56,50,32,112,117,116,10,100,117,112,32,50,52,49,32,47,97,50,48,49,32,112,117,116,10,100,117,112,32,50,52,50,32,47,97,49,56,51,32,112,117,116,10,100,117,112,32,50,52,51,32,47,97,49,56,52,32,112,117,116,10,100,117,112,32,50,52,52,32,47,97,49,57,55,32,112,117,116,10,100,117,112,32,50,52,53,32,47,97,49,56,53,32,112,117,116,10,100,117,112,32,50,52,54,32,47,97,49,57,52,32,112,117,116,10,100,117,112,32,50,52,55,32,47,97,49,57,56,32,112,117,116,10,100,117,112,32,50,52,56,32,47,97,49,56,54,32,112,117,116,10,100,117,112,32,50,52,57,32,47,97,49,57,53,32,112,117,116,10,100,117,112,32,50,53,48,32,47,97,49,56,55,32,112,117,116,10,100,117,112,32,50,53,49,32,47,97,49,56,56,32,112,117,116,10,100,117,112,32,50,53,50,32,47,97,49,56,57,32,112,117,116,10,100,117,112,32,50,53,51,32,47,97,49,57,48,32,112,117,116,10,100,117,112,32,50,53,52,32,47,97,49,57,49,32,112,117,116,10,114,101,97,100,111,110,108,121,32,100,101,102,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,49,54,52,32,100,101,102,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,165,158,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,54,220,4,206,26,248,44,181,240,191,53,171,139,231,252,255,114,172,109,96,111,33,86,85,116,133,245,0,48,45,175,248,239,225,89,51,121,23,56,241,214,21,49,214,92,22,86,216,32,159,35,240,158,209,192,117,147,198,221,211,76,249,248,21,6,38,126,68,58,103,169,188,149,89,183,207,220,110,240,49,231,144,196,223,242,7,174,68,24,208,198,31,160,190,189,178,157,20,230,134,227,216,34,79,233,244,246,230,50,173,85,127,67,30,181,32,149,177,31,146,73,181,39,252,75,248,224,205,65,170,190,68,143,11,160,109,11,227,117,203,162,255,112,139,234,105,209,226,30,138,155,173,193,52,220,130,97,219,158,14,68,15,246,47,139,167,203,49,75,121,10,48,239,115,61,181,227,196,159,250,201,103,82,124,146,90,98,60,119,45,15,53,28,78,193,129,33,36,231,233,239,146,70,143,193,52,142,59,16,24,96,123,174,74,225,177,80,96,146,244,43,83,228,137,172,162,245,72,139,166,229,74,68,251,197,115,171,242,237,120,119,137,230,133,198,218,128,244,222,236,30,4,76,2,68,52,18,244,88,104,13,3,231,248,206,108,118,125,67,225,180,203,123,172,145,188,248,13,188,206,158,80,109,39,244,230,188,44,127,171,5,206,180,107,225,0,119,8,232,85,191,173,67,181,242,148,116,70,95,125,210,170,124,171,222,125,246,103,124,32,167,134,37,150,235,224,248,208,77,14,207,3,3,132,40,30,0,252,162,117,238,167,151,21,97,66,140,20,50,239,123,242,246,134,116,147,163,89,251,197,126,4,191,236,185,214,0,220,197,254,6,9,164,141,42,191,201,12,113,87,135,217,192,121,224,172,212,255,96,19,62,235,4,141,236,192,166,194,68,249,92,112,227,3,153,116,33,239,136,13,205,156,241,209,43,179,208,150,127,51,178,255,174,93,182,22,111,253,26,117,162,149,53,18,101,140,149,194,103,198,21,83,58,253,202,177,229,150,191,234,70,44,32,49,209,127,220,239,82,180,171,90,120,118,132,149,113,206,27,175,118,151,77,0,200,101,245,100,128,203,62,196,67,196,255,6,223,241,144,87,188,220,135,237,248,157,110,75,6,89,56,219,146,252,201,145,223,242,177,215,16,25,126,124,31,159,164,21,191,16,157,109,175,7,175,215,62,194,143,251,244,195,209,19,223,69,72,140,98,208,242,88,54,224,116,23,15,98,51,158,156,192,13,233,12,203,10,37,121,27,218,7,87,2,1,48,85,38,6,51,5,222,140,5,229,222,14,121,227,116,78,17,172,194,77,96,243,184,242,104,74,51,24,97,165,104,75,198,142,132,119,229,48,184,139,165,140,110,8,17,141,197,212,117,161,248,178,194,32,47,248,206,166,73,17,65,35,86,185,233,120,186,220,53,79,71,104,119,166,121,189,179,59,160,249,251,218,17,108,190,4,140,2,6,179,156,235,52,104,156,198,239,10,71,147,6,199,64,23,210,168,42,183,39,190,97,251,241,90,51,54,13,234,54,221,61,135,243,50,25,251,65,232,198,169,182,46,208,174,193,11,173,65,92,3,92,137,111,213,33,163,255,194,109,186,204,58,51,95,8,30,166,157,10,128,137,63,201,217,18,89,32,241,161,213,129,158,93,246,238,135,39,45,93,79,30,93,105,217,12,2,53,39,14,166,120,122,66,87,168,210,22,141,18,153,202,49,186,117,177,219,120,236,66,53,189,131,135,55,71,128,31,198,20,29,94,75,13,16,186,140,35,73,204,3,244,183,105,169,8,103,37,110,139,132,103,50,46,182,90,47,139,53,171,32,201,164,201,95,5,145,248,245,151,111,203,182,148,197,24,236,167,169,115,148,206,97,68,10,25,206,227,22,235,216,18,213,80,34,124,6,190,37,12,253,188,33,40,17,0,43,48,38,65,211,53,170,227,208,56,145,45,108,121,17,223,214,152,78,149,137,47,138,178,36,96,10,75,247,228,92,144,4,78,54,170,89,243,77,112,51,134,68,41,50,130,149,214,95,34,211,21,190,226,231,132,244,10,188,181,218,75,153,148,183,76,63,194,117,254,183,55,192,12,162,64,13,4,161,124,230,124,58,85,236,60,227,207,98,101,161,233,110,237,14,159,67,233,97,18,221,112,116,81,28,87,39,225,53,199,40,139,113,3,180,255,11,207,160,209,150,23,154,211,5,110,39,52,73,235,173,242,185,130,88,171,84,159,190,174,245,47,148,76,6,181,110,147,72,59,53,40,130,33,171,83,161,235,220,233,120,157,130,195,49,157,254,232,139,57,220,232,108,11,90,95,27,98,44,56,91,96,101,229,148,178,45,187,193,113,80,22,173,92,202,181,230,228,59,187,96,32,249,59,253,101,186,226,106,228,162,57,113,231,103,149,24,97,153,152,98,182,14,229,40,33,116,58,68,186,152,41,144,137,72,105,125,254,91,250,47,141,160,198,92,231,70,126,54,154,198,87,36,224,226,233,68,24,91,25,90,13,97,162,229,207,199,237,75,51,179,188,183,192,77,177,250,123,121,132,79,16,86,247,26,213,84,142,124,42,178,13,245,180,48,55,200,8,189,41,81,149,231,217,65,7,144,22,123,229,66,91,235,252,132,117,145,96,82,155,111,151,21,187,38,48,31,115,1,2,115,147,86,244,144,43,244,109,104,197,211,13,113,122,7,24,138,118,73,216,209,67,112,185,9,254,178,117,32,41,251,145,37,134,127,61,105,207,12,67,61,44,118,162,58,51,170,131,233,153,106,129,59,180,52,208,255,176,222,180,73,61,43,238,218,237,154,46,73,104,130,82,6,17,22,90,175,183,251,9,81,31,30,241,163,227,189,51,210,221,86,186,160,206,78,161,88,40,39,42,40,116,194,231,54,108,38,19,86,209,243,226,8,204,80,171,179,241,195,170,189,206,218,53,95,79,223,27,183,123,137,171,143,203,211,98,87,252,138,24,146,140,72,84,81,120,205,88,62,9,139,224,241,104,212,209,41,80,250,126,220,50,247,171,102,233,136,215,75,53,2,204,252,64,138,88,20,196,54,185,56,172,2,30,57,246,0,246,28,20,36,126,138,46,233,223,240,16,239,173,66,139,243,253,1,205,231,77,59,161,233,40,242,48,137,79,117,248,17,15,50,150,28,216,46,198,38,201,54,32,154,82,243,113,242,46,194,166,185,247,44,159,251,240,73,244,80,171,90,168,202,48,236,200,176,20,65,94,203,91,3,151,247,40,49,61,43,28,174,12,11,56,242,133,155,199,2,104,34,32,83,149,5,169,92,155,0,28,238,241,108,42,165,200,188,221,223,203,106,135,197,50,110,165,167,145,130,119,246,238,96,124,145,133,196,209,101,204,157,175,49,118,34,120,160,137,172,77,254,100,11,154,200,65,87,30,156,210,134,246,207,127,131,102,82,214,39,181,215,112,103,181,30,167,238,90,62,253,56,196,11,195,77,117,245,188,205,71,162,126,85,242,27,138,176,153,65,252,170,145,30,27,155,211,46,205,32,144,143,119,192,172,117,149,101,166,96,131,240,11,51,29,133,61,44,84,229,238,58,182,172,151,19,57,35,233,101,62,48,222,175,215,101,108,164,156,109,114,86,235,224,223,34,217,12,26,130,127,138,200,122,192,223,57,177,5,127,251,146,45,245,240,206,248,59,5,90,181,213,206,36,212,141,133,246,105,47,9,137,20,174,88,147,35,163,226,135,107,239,128,192,28,42,91,177,200,62,198,127,95,219,204,68,69,11,159,209,217,231,222,151,53,187,248,121,154,135,214,42,81,11,47,124,91,92,252,250,65,137,147,245,100,60,9,153,252,106,254,2,133,62,54,218,113,93,120,170,176,17,17,57,146,226,20,186,16,38,73,241,229,170,160,87,34,28,230,32,119,53,166,228,248,18,69,72,51,52,99,140,71,215,60,19,147,77,16,107,86,83,210,55,141,213,12,68,55,11,76,30,220,47,93,245,89,151,118,238,145,0,242,165,163,219,129,118,249,194,113,81,168,179,37,239,228,235,164,169,162,242,249,48,16,43,99,138,185,29,83,109,188,112,124,141,0,154,218,137,241,75,214,212,227,131,255,212,148,202,122,68,34,42,226,138,113,69,90,112,20,73,151,6,243,3,96,107,70,227,9,229,82,145,141,215,145,178,146,4,229,118,197,140,155,3,202,173,241,193,9,178,231,90,158,156,223,225,77,100,137,54,105,116,199,185,99,1,152,7,89,6,50,233,132,82,219,37,98,107,178,203,99,85,221,168,135,163,215,218,65,124,144,108,186,245,172,181,248,50,50,230,42,204,60,102,8,177,91,129,240,14,51,19,218,115,117,180,240,121,127,16,9,229,50,134,15,212,76,32,236,101,131,247,215,173,109,216,195,33,147,202,89,78,97,240,73,12,211,204,137,142,193,171,142,199,178,58,151,208,128,194,100,25,71,200,233,134,120,34,150,126,192,97,154,141,64,35,200,18,121,125,172,10,197,161,32,248,34,203,88,200,226,25,55,75,170,188,146,223,108,116,46,182,240,157,160,86,190,3,223,8,20,250,96,114,117,246,80,236,252,28,155,150,197,170,13,149,180,66,21,214,230,70,236,51,104,216,2,159,229,76,227,247,88,226,200,132,27,243,106,88,247,200,34,107,34,246,74,7,14,236,106,87,122,223,246,222,169,105,56,111,34,201,225,18,37,168,7,19,92,187,112,184,29,61,24,132,239,11,113,198,197,61,78,232,62,1,22,177,52,153,126,209,138,221,100,160,167,175,78,50,61,220,11,145,231,58,42,253,95,141,9,9,73,107,115,136,109,134,253,170,128,83,56,228,67,36,249,71,178,70,212,110,7,86,133,134,175,143,104,192,63,113,88,196,232,13,242,165,70,190,109,209,213,60,254,128,176,110,157,133,248,225,164,179,34,2,19,44,0,195,230,157,28,142,44,225,242,83,253,65,76,46,47,31,177,249,134,165,230,45,14,77,181,164,88,9,43,76,159,139,230,182,108,229,147,178,15,65,90,145,31,193,107,146,141,150,67,3,45,44,195,144,133,18,43,141,57,189,127,175,44,24,11,34,151,96,108,186,26,101,217,59,77,49,82,113,43,132,111,108,132,197,32,57,32,79,199,222,35,146,144,88,184,201,16,63,42,162,206,151,105,237,121,212,236,168,72,107,20,208,165,102,72,245,156,210,252,136,78,50,132,30,107,225,164,93,142,189,249,165,0,94,137,186,15,246,134,97,220,186,234,198,102,250,153,29,147,34,9,179,244,200,98,135,85,110,157,26,19,210,252,255,60,229,15,234,191,3,130,247,128,206,227,183,201,168,91,164,252,6,207,179,162,48,231,178,234,101,24,89,199,115,43,213,127,5,189,193,198,105,28,24,56,121,203,57,118,92,173,36,6,177,194,47,74,210,179,219,17,250,245,165,66,212,223,22,187,161,13,110,171,60,253,247,71,14,12,207,203,197,108,84,76,184,125,40,67,132,214,173,8,226,136,211,125,111,207,234,91,203,162,187,130,250,208,49,48,3,175,91,29,164,230,0,173,62,26,61,91,71,28,173,70,114,128,30,110,44,70,29,186,120,80,140,83,245,195,160,27,59,210,67,148,19,237,241,211,111,255,161,44,253,14,146,71,79,128,121,106,82,208,141,45,129,199,191,174,165,40,144,170,240,138,148,53,147,98,242,71,11,54,182,220,42,167,132,240,100,127,24,227,195,97,92,167,218,112,151,31,39,100,33,93,80,151,252,47,217,172,2,178,62,57,142,164,159,205,212,18,203,184,90,221,33,213,165,48,49,248,88,158,15,11,165,156,204,251,157,3,51,219,243,242,148,235,86,109,218,181,63,107,193,251,193,27,202,172,152,188,221,117,152,68,197,160,26,71,126,43,0,14,150,7,252,22,132,135,238,171,206,160,1,163,118,147,153,222,228,171,198,195,184,56,216,193,107,113,8,2,24,160,72,176,43,157,16,66,53,200,95,143,134,19,106,44,167,21,79,200,151,170,104,219,217,214,211,115,194,240,250,69,14,19,223,113,43,150,88,208,193,21,158,227,0,132,148,96,8,168,119,56,156,150,206,84,212,8,77,181,251,128,53,13,187,181,91,196,184,29,246,3,96,150,57,141,141,16,216,142,77,98,207,43,234,68,150,60,21,212,201,72,44,210,60,241,53,128,250,30,98,225,235,225,153,56,69,193,178,58,181,27,195,163,242,24,157,151,171,185,204,102,99,199,23,83,106,204,65,8,4,42,198,58,148,214,173,129,202,225,147,111,39,110,109,51,111,204,236,240,189,246,217,66,196,89,35,169,94,36,69,122,60,138,203,215,254,57,243,187,250,179,224,132,185,103,206,49,197,241,157,110,92,74,82,207,203,227,230,20,199,144,246,58,239,241,53,167,150,153,243,146,21,251,245,2,187,244,165,189,109,212,80,68,122,196,237,70,81,220,157,163,32,247,227,90,121,137,39,194,250,102,13,67,207,245,122,142,78,234,113,168,11,63,226,51,1,144,128,50,164,40,80,13,81,237,36,189,14,193,179,144,10,138,106,11,147,253,121,152,149,33,84,212,211,153,65,117,126,91,209,56,235,57,53,248,195,177,162,246,23,5,155,29,35,23,228,178,203,162,47,37,173,165,39,30,207,99,41,167,133,160,124,209,63,79,50,3,143,200,207,80,113,12,29,105,120,226,244,151,110,215,27,148,99,120,155,129,211,101,89,22,70,218,125,55,48,27,183,171,35,241,227,225,164,38,158,94,68,27,184,40,97,228,108,193,229,125,212,178,168,247,188,16,41,179,64,15,144,237,195,153,115,28,116,252,113,31,91,68,156,55,171,246,114,21,96,200,134,37,228,148,112,89,154,61,36,135,128,104,169,34,77,190,96,212,20,163,180,126,17,148,19,221,149,86,138,126,23,172,68,75,238,149,155,166,102,202,58,208,105,99,103,133,22,84,216,38,251,198,238,102,133,128,222,243,224,48,191,129,209,161,137,125,13,121,227,112,132,45,252,34,16,175,171,79,251,151,48,86,246,47,193,69,147,251,16,65,241,81,66,75,124,127,246,157,171,118,77,82,107,224,110,149,201,213,154,154,253,102,168,106,146,211,53,105,89,219,97,226,100,216,208,228,70,80,56,30,150,217,71,126,164,196,162,169,217,222,138,210,93,75,255,112,119,0,165,23,224,126,94,199,212,15,83,172,50,182,130,14,100,153,238,84,76,28,150,216,115,74,77,161,131,219,39,53,99,147,226,60,179,191,231,159,118,149,113,22,60,70,159,162,158,73,127,250,169,112,46,91,228,235,50,91,235,225,148,143,119,20,97,153,204,128,253,168,69,85,31,194,98,11,243,186,181,156,182,36,247,187,158,217,55,81,35,12,249,50,70,202,64,101,177,22,145,15,139,233,247,137,25,115,185,195,182,226,208,81,42,182,225,111,171,10,99,78,104,191,210,209,253,185,126,193,23,56,103,7,109,89,212,235,131,225,164,183,226,197,11,161,146,71,252,218,107,123,175,134,28,103,59,69,143,209,184,255,85,58,83,159,5,191,211,103,43,138,10,217,178,1,108,128,100,224,225,175,30,224,54,147,1,191,143,18,18,246,54,104,22,136,14,120,56,201,226,241,136,157,20,223,246,167,83,180,74,153,68,60,179,0,199,219,152,56,9,136,119,88,63,238,27,55,47,203,172,224,187,199,199,221,45,69,15,232,168,200,185,224,240,48,27,62,101,218,195,203,47,226,166,233,116,217,91,8,34,160,206,49,119,72,106,110,206,151,209,63,204,27,239,226,131,171,118,159,26,224,127,245,200,19,180,48,39,188,178,162,10,19,120,206,137,189,222,164,220,114,97,74,100,103,7,205,237,166,25,145,45,110,83,51,254,53,224,166,124,46,151,40,171,172,57,16,184,184,233,42,240,185,24,63,37,10,197,204,45,34,100,110,175,130,57,160,226,223,193,61,91,109,26,159,247,26,44,243,107,187,1,197,166,246,153,80,194,36,92,79,109,252,41,34,204,121,96,22,13,185,115,30,173,115,242,58,218,9,174,179,86,152,75,3,225,179,201,208,16,40,230,240,171,226,107,28,208,104,88,13,92,245,215,206,135,254,13,62,48,253,12,126,160,237,146,57,169,201,71,179,58,82,134,135,239,66,108,186,47,250,150,22,63,48,113,69,54,218,249,128,219,166,112,228,235,64,72,144,45,211,217,233,243,10,237,110,186,115,166,249,71,99,72,197,77,211,62,243,25,90,130,33,253,81,161,144,200,252,249,230,147,159,8,44,87,177,151,105,180,209,38,26,88,154,123,168,65,161,32,122,75,80,138,76,206,120,182,19,17,19,73,166,160,54,16,88,35,128,179,239,48,48,126,144,102,94,87,165,237,108,103,47,161,71,110,119,178,39,239,152,58,25,195,33,57,233,144,248,32,226,228,162,51,22,233,115,235,78,236,14,186,225,26,28,229,82,111,55,149,174,170,79,143,183,78,40,148,25,38,34,212,106,155,76,89,186,229,243,217,53,188,151,71,182,191,167,234,5,125,253,98,74,178,62,237,243,238,143,192,223,43,115,57,73,197,35,31,18,238,227,252,239,242,39,165,162,236,179,158,3,235,181,119,212,45,10,172,74,190,8,134,56,91,249,5,199,216,108,88,56,196,69,181,81,51,22,200,31,78,51,88,3,134,27,128,63,144,207,110,255,167,134,84,165,43,168,22,195,69,64,199,29,236,83,233,207,77,33,102,236,4,130,5,229,194,190,183,194,57,236,149,218,241,139,205,9,195,61,232,241,125,140,57,0,131,93,61,61,102,12,132,14,18,11,149,190,201,125,52,57,23,133,222,79,48,84,204,11,61,174,209,129,182,107,92,179,174,19,255,216,247,34,131,52,216,227,76,141,152,83,254,58,17,142,32,151,154,57,42,163,195,252,76,240,215,149,89,112,38,8,48,207,247,178,48,145,45,17,188,82,198,22,186,251,96,216,114,188,78,84,180,74,20,144,83,137,20,83,166,38,175,86,82,57,141,42,169,253,115,245,123,170,4,87,253,32,77,97,49,211,102,210,184,141,96,133,145,141,245,45,219,109,103,224,222,212,80,175,201,85,152,105,51,146,210,150,52,119,25,51,207,92,80,234,108,204,217,210,180,19,220,11,237,54,73,138,22,64,121,153,24,19,153,172,241,56,11,159,25,61,240,138,147,99,169,221,213,181,139,200,147,162,50,248,250,227,147,39,112,17,34,49,77,8,146,166,173,49,17,193,107,144,67,73,194,77,33,117,120,249,125,110,83,238,245,178,120,175,79,62,60,41,183,98,214,208,73,167,58,201,75,59,224,225,75,245,233,170,160,103,110,117,184,100,207,138,207,88,169,158,237,145,196,32,143,179,38,72,118,205,70,205,219,8,83,96,233,93,101,38,168,47,132,255,240,243,121,91,53,63,12,239,197,81,1,139,75,143,100,249,206,192,47,120,91,42,93,155,6,199,192,138,18,135,76,79,46,53,146,138,1,202,0,34,156,176,78,146,227,41,38,84,64,206,111,5,186,110,104,254,185,209,2,108,85,178,191,219,224,254,168,157,78,147,11,10,26,192,189,204,89,14,5,90,83,254,151,185,71,132,69,148,114,76,114,7,67,180,5,205,177,219,173,162,30,69,185,243,118,19,12,36,216,134,205,44,171,171,216,98,87,22,236,45,166,114,65,172,254,36,34,169,93,230,167,221,148,122,96,112,155,144,4,163,7,92,117,184,21,85,161,159,34,33,178,144,179,186,67,57,150,142,149,151,238,100,119,21,132,4,222,13,215,103,51,206,108,73,4,207,194,161,219,35,128,248,188,238,161,199,192,122,15,219,233,54,242,95,250,131,116,111,33,167,4,187,49,77,46,168,163,123,194,93,158,240,34,148,242,253,215,49,93,39,174,41,97,103,24,100,172,194,9,87,221,115,119,196,212,157,137,173,16,8,232,62,215,255,205,125,163,181,211,95,223,253,36,124,17,175,133,116,148,113,81,213,69,187,216,103,31,230,62,201,120,92,106,148,144,89,56,201,157,138,147,220,216,220,26,131,246,190,129,142,138,164,248,230,227,130,82,38,100,118,149,20,30,164,188,76,3,230,17,206,211,142,7,217,78,70,104,177,15,72,177,38,131,150,91,151,231,229,221,178,192,153,164,184,172,136,46,49,154,20,172,72,205,122,241,25,69,152,118,23,20,78,73,158,26,183,241,33,75,147,40,13,151,39,248,169,71,111,175,38,174,227,205,210,81,206,255,105,83,253,34,234,139,246,190,77,215,156,161,44,53,132,109,101,77,71,51,226,156,100,204,197,206,10,157,186,93,176,163,247,85,125,50,177,135,105,99,197,58,224,142,82,63,114,229,227,226,68,9,157,220,181,186,35,160,175,123,180,120,37,221,154,135,174,97,243,75,152,149,172,34,49,128,98,0,115,49,36,177,172,16,180,64,135,25,102,67,55,33,48,240,151,142,61,188,186,162,54,66,225,164,125,224,244,241,44,191,33,61,194,189,246,67,129,211,87,14,46,86,59,74,239,201,101,230,50,248,187,90,54,116,17,105,50,154,106,21,160,81,165,130,23,46,225,140,195,234,213,17,126,214,29,71,114,220,137,250,77,33,219,140,246,63,204,126,203,189,8,197,105,186,197,16,184,233,240,58,32,44,152,74,176,235,157,73,16,0,109,80,114,135,72,69,242,174,152,3,216,108,72,154,4,164,95,223,133,255,98,103,3,46,60,155,252,128,97,39,239,165,91,53,252,100,46,169,149,216,158,65,238,125,103,219,161,234,242,158,31,54,28,148,214,164,48,85,69,61,103,41,214,136,200,135,42,113,244,75,76,9,143,174,125,166,228,126,52,177,99,160,249,159,7,163,51,129,220,214,150,82,17,167,195,253,26,15,50,152,143,194,251,114,221,122,232,32,149,214,89,4,39,248,0,78,78,2,141,97,29,69,71,211,154,135,125,223,26,143,232,117,14,6,68,117,192,192,44,11,68,118,114,35,108,143,62,147,162,181,73,14,68,35,88,94,39,8,93,21,134,5,120,177,108,0,79,5,238,85,46,1,253,198,28,222,137,197,156,46,201,202,112,4,1,154,71,205,156,8,166,64,131,171,209,1,47,120,123,127,131,246,26,79,132,29,86,126,79,181,70,19,214,0,103,75,70,157,28,42,95,255,66,170,122,178,111,203,175,157,5,68,193,166,109,148,81,37,139,222,115,96,6,197,136,176,98,33,192,216,180,170,84,104,125,8,159,139,72,178,101,52,80,66,14,130,19,174,13,233,183,200,204,228,209,157,108,134,108,20,66,48,143,73,60,193,31,246,204,179,62,93,149,200,59,36,177,238,36,157,206,147,32,119,35,167,177,151,113,81,227,79,24,46,155,121,52,244,189,42,38,151,192,100,230,119,19,12,241,14,163,87,55,226,113,23,199,229,150,73,83,192,65,57,236,207,31,30,201,221,206,27,48,64,144,65,154,67,180,18,1,178,58,161,215,155,248,94,13,0,14,204,78,223,223,73,156,95,29,55,12,209,38,231,218,219,127,129,156,38,219,152,8,77,42,246,132,66,243,232,69,52,92,90,242,55,43,55,142,17,71,183,180,143,240,156,154,146,13,131,151,248,172,138,122,162,53,224,198,152,231,241,86,184,234,119,126,143,230,57,210,6,7,94,205,119,140,59,120,95,6,178,22,112,144,81,42,72,248,188,178,155,74,247,119,17,135,77,13,108,194,149,80,237,129,184,198,202,94,113,54,92,25,192,151,0,233,238,48,57,85,127,242,143,29,71,147,229,90,138,69,109,128,43,168,65,38,255,60,198,18,113,226,233,96,199,73,66,245,99,106,33,111,98,172,128,22,201,82,66,55,135,131,210,201,206,61,205,55,13,155,16,180,92,79,154,116,60,2,106,54,171,153,88,71,94,34,93,196,100,3,3,79,210,187,174,160,207,27,34,185,49,0,131,113,105,181,22,239,245,246,201,149,82,48,192,80,54,138,59,175,16,211,224,108,40,5,184,239,113,93,253,85,175,12,214,80,97,231,161,188,95,124,199,184,2,6,201,62,73,40,86,164,27,96,47,27,161,233,140,254,21,43,214,121,152,93,239,245,184,114,184,221,224,55,5,95,249,12,254,14,106,230,236,110,45,222,249,195,197,255,50,5,4,140,231,117,68,161,205,215,234,228,182,60,10,19,95,129,116,127,241,153,168,38,103,238,228,216,48,174,162,162,217,25,60,148,237,157,208,14,159,178,6,58,150,24,114,153,61,168,76,191,97,160,137,111,52,13,13,235,173,105,26,49,133,166,204,252,151,56,58,104,3,161,127,60,165,160,19,217,51,153,82,57,96,27,124,63,72,170,223,180,34,27,93,215,228,175,134,167,94,187,139,201,80,94,130,231,34,149,1,139,44,39,250,243,146,246,134,192,211,117,99,48,162,106,99,11,37,174,214,64,54,5,80,37,49,158,162,252,26,114,173,20,159,93,95,117,21,61,132,128,65,62,20,162,39,94,240,161,239,57,23,68,227,67,136,6,23,209,206,183,176,2,81,172,121,115,222,37,82,203,184,123,174,127,173,16,184,78,179,10,4,9,5,211,66,131,217,15,67,121,194,39,38,128,1,61,241,77,6,101,30,34,88,95,128,207,182,156,234,27,16,29,42,127,7,71,146,252,142,182,235,143,32,140,38,128,38,165,195,223,97,59,143,241,163,59,65,135,31,100,120,251,113,200,9,204,50,199,11,122,30,131,37,79,250,8,159,53,213,161,43,195,34,7,166,27,196,187,84,73,188,244,45,143,143,163,233,34,161,218,200,37,171,97,124,173,117,119,120,224,110,152,54,103,148,40,247,37,61,101,45,216,244,20,151,116,55,206,7,9,113,101,232,9,191,69,107,153,28,233,154,156,158,143,226,123,66,39,75,174,57,236,136,186,201,142,234,201,248,243,72,255,239,44,94,41,58,231,73,240,37,203,242,216,87,28,93,86,236,31,95,114,55,19,172,88,22,196,14,172,74,114,137,122,240,126,170,227,123,244,240,141,87,128,32,206,196,178,71,108,157,248,116,182,20,234,80,21,99,83,158,216,189,82,65,25,114,28,59,31,70,28,244,135,206,8,248,132,140,12,42,208,154,80,74,232,224,101,200,90,193,152,129,40,142,198,25,212,21,184,98,103,132,62,185,25,172,47,241,254,226,17,95,29,45,31,85,55,21,172,252,251,234,24,135,159,157,139,166,153,161,38,222,247,163,251,29,184,96,179,171,36,51,227,102,117,27,192,182,32,112,163,6,15,199,106,114,234,117,128,68,178,222,15,87,217,57,14,92,15,114,121,79,179,222,190,190,158,65,160,177,86,128,227,161,98,71,56,187,102,253,70,171,120,215,124,122,76,20,31,251,87,112,118,67,201,183,221,213,76,139,29,193,229,174,157,143,115,238,170,210,92,253,123,202,38,233,82,132,115,25,239,6,178,14,187,113,186,155,86,122,159,41,151,99,247,55,170,207,169,122,206,6,252,103,93,190,192,17,236,68,186,157,6,242,109,205,114,159,147,89,114,41,142,13,148,223,8,245,95,147,98,223,10,13,63,79,231,155,108,179,21,28,13,67,69,229,49,208,81,169,39,185,70,127,49,162,4,96,44,222,109,152,27,156,6,225,28,14,195,122,130,225,232,191,196,170,208,6,67,144,18,63,0,51,151,164,43,190,60,217,187,243,54,241,49,233,65,242,35,181,171,52,236,55,81,47,186,42,119,144,81,173,201,194,243,12,11,9,120,162,35,20,212,204,119,111,17,104,171,89,95,126,6,152,64,129,226,241,39,125,191,18,31,240,224,11,69,235,48,30,32,120,149,80,116,133,193,82,213,81,216,131,43,136,26,195,188,85,138,91,21,110,126,254,134,128,16,235,20,35,123,217,68,229,65,178,25,12,31,12,77,164,166,157,144,128,56,249,139,49,162,159,119,164,84,239,115,224,113,90,154,68,78,182,163,146,28,51,160,255,178,78,244,241,224,56,43,184,193,81,127,198,20,176,183,160,243,240,171,29,48,46,109,150,86,66,108,219,1,180,211,58,249,239,127,68,52,254,189,29,99,207,40,174,100,129,128,208,208,62,154,94,30,165,129,124,86,243,197,199,72,93,149,57,149,188,147,50,163,240,188,187,50,108,158,13,239,89,74,48,7,55,42,248,0,45,101,209,145,229,99,168,199,156,87,138,242,24,81,190,190,145,130,63,46,196,237,62,85,182,83,22,85,6,19,161,42,8,114,218,74,181,15,202,68,255,79,37,124,196,9,230,226,153,91,196,63,153,95,54,127,59,149,65,11,52,5,180,247,75,62,106,212,147,6,121,139,196,81,244,186,175,19,205,73,134,216,117,55,15,61,74,26,87,130,8,61,81,235,145,91,127,50,164,97,178,184,252,37,110,33,41,95,10,27,172,177,115,152,76,44,136,158,76,29,118,0,5,170,96,231,71,20,17,209,81,211,122,148,237,141,20,191,240,160,168,56,183,61,238,116,92,194,240,23,21,119,140,87,209,69,40,5,95,178,208,49,106,139,14,233,251,31,186,6,3,10,167,237,196,12,89,231,17,62,149,137,182,208,136,31,179,153,97,74,15,73,41,174,75,126,145,47,56,105,137,206,19,7,2,41,24,15,80,244,204,90,113,240,20,46,230,84,194,10,69,15,181,113,167,76,89,252,194,221,66,142,227,20,222,48,144,247,255,18,5,231,30,196,150,103,123,205,86,252,156,145,210,181,34,244,220,45,20,130,174,254,182,129,215,171,135,54,229,235,64,126,126,254,244,192,32,228,87,123,80,28,159,84,215,222,25,69,113,81,105,172,111,199,245,82,146,6,84,138,98,2,222,18,110,135,9,224,30,111,43,195,232,77,156,129,63,115,103,75,201,219,84,111,183,171,186,82,64,196,22,109,57,166,187,107,62,219,136,152,207,14,107,168,165,91,35,192,51,127,241,52,197,5,109,14,75,78,161,127,191,36,218,115,123,39,1,215,164,218,124,186,47,164,161,57,70,75,8,61,108,125,174,214,48,250,6,194,181,226,194,6,129,26,32,220,196,11,117,136,180,95,149,94,166,182,51,198,44,191,54,205,147,11,10,56,218,240,155,67,99,203,6,165,117,146,176,7,221,13,194,20,193,236,116,40,94,158,156,6,242,32,10,192,246,9,144,35,4,84,238,0,26,133,235,114,16,17,48,80,105,154,40,195,227,1,81,15,250,41,222,176,198,4,132,211,17,227,75,87,82,109,38,10,148,49,188,128,225,217,24,3,222,82,236,89,237,53,91,213,254,12,96,134,108,29,56,47,206,34,224,182,216,193,71,238,81,28,37,175,176,113,214,149,142,96,234,24,69,70,150,131,70,124,26,167,0,118,98,156,32,74,3,61,148,226,148,139,176,69,136,183,126,153,221,19,224,117,250,234,113,252,241,183,83,84,220,224,84,115,66,157,143,107,190,33,142,39,227,142,51,19,131,58,49,154,132,66,149,5,136,72,75,47,155,72,129,128,243,194,146,164,141,112,70,207,120,30,115,38,127,136,186,100,173,74,58,103,149,52,138,108,50,29,213,13,80,186,153,92,84,218,15,248,86,87,14,31,193,24,233,187,60,16,75,92,109,158,17,33,223,75,218,51,102,32,47,49,151,204,167,179,101,169,92,223,246,151,123,169,101,226,166,134,120,9,244,138,253,99,123,212,85,90,223,206,50,44,206,233,110,157,226,46,119,216,246,50,45,216,43,15,98,126,194,39,63,40,223,32,162,1,25,42,29,234,253,184,202,190,23,152,18,81,37,125,203,113,180,177,166,114,55,134,228,172,188,193,42,110,214,97,250,28,220,60,141,78,220,80,41,108,100,102,33,253,253,87,57,140,94,228,142,104,197,206,63,167,157,80,182,214,205,205,101,59,73,18,255,175,13,84,83,80,14,101,151,1,253,8,17,147,244,120,174,155,136,239,21,152,51,133,151,217,207,39,171,104,187,231,137,162,206,38,63,191,74,49,135,129,1,55,146,54,163,201,124,254,253,173,114,63,73,210,76,56,38,77,110,30,168,195,197,201,5,111,37,1,229,55,144,160,246,79,229,145,213,13,228,10,109,159,208,40,78,56,150,85,30,150,183,197,192,38,150,38,27,12,122,153,164,199,41,97,144,41,224,174,223,54,193,237,190,66,214,153,92,26,74,203,177,234,204,159,60,13,235,185,237,88,43,129,31,236,85,242,254,170,55,71,229,226,131,63,45,152,251,29,88,113,160,39,131,120,65,145,58,43,80,205,81,101,195,28,154,15,29,236,90,11,75,241,133,210,3,127,208,75,39,196,191,112,122,146,61,224,194,139,111,235,174,188,159,120,188,156,17,204,71,105,193,139,174,24,188,66,50,149,122,1,164,184,133,145,16,100,108,134,207,52,153,92,130,219,240,10,64,69,236,224,195,181,185,179,58,122,189,87,171,135,58,111,102,20,182,64,145,110,58,58,110,56,136,13,218,57,152,156,228,36,173,185,102,1,103,41,142,117,134,63,7,5,47,251,153,168,5,39,196,168,3,73,117,54,174,23,69,152,184,186,61,37,103,46,22,10,3,196,252,176,102,179,195,20,254,122,52,160,167,17,63,169,47,115,239,68,110,33,141,201,253,164,76,147,121,94,205,9,230,26,253,222,179,115,90,108,217,3,167,137,203,156,180,253,120,81,66,133,0,58,126,52,151,114,129,107,0,55,184,119,213,254,14,21,58,247,105,53,107,110,165,159,127,107,196,13,249,254,36,53,21,60,32,26,106,107,79,82,200,227,177,16,182,44,90,142,137,165,248,123,139,191,155,187,204,80,90,186,138,192,174,106,8,109,42,68,242,205,160,235,214,65,35,27,79,127,142,63,111,79,25,0,190,172,80,20,91,46,169,61,36,182,138,193,210,108,149,148,117,202,53,120,199,153,184,82,13,18,179,206,229,147,25,76,28,4,102,81,176,34,71,35,105,51,226,5,66,91,112,96,245,180,114,181,1,188,49,144,175,17,240,180,145,204,183,14,68,136,160,188,176,99,72,241,7,250,58,184,102,102,169,82,107,161,211,114,180,1,102,74,98,226,165,249,83,74,245,3,208,171,160,177,18,151,211,54,43,202,247,155,222,30,109,58,19,187,170,57,220,142,131,196,233,27,152,186,179,0,121,10,251,243,91,64,242,82,225,219,121,81,225,7,187,57,94,154,106,150,229,70,150,129,3,160,14,174,146,48,68,76,238,32,77,169,145,166,211,241,6,3,37,0,42,17,209,16,184,20,25,156,141,69,246,246,161,246,225,214,19,137,241,122,13,254,83,190,109,3,110,206,133,31,162,226,14,26,65,43,231,163,181,180,79,219,159,167,7,244,255,253,171,51,6,221,206,38,173,2,149,56,40,135,249,213,39,205,4,124,181,131,210,0,63,65,174,38,250,214,85,155,61,58,234,146,47,218,246,145,45,204,241,134,235,222,3,23,130,205,20,90,55,175,188,48,182,14,93,157,252,16,86,107,86,62,87,184,112,150,120,8,109,108,72,100,89,249,35,71,78,50,29,7,55,249,87,185,66,150,125,4,13,202,173,216,50,212,159,43,130,22,209,218,163,164,238,40,11,170,248,99,204,58,234,174,60,184,84,73,0,132,141,125,44,144,178,26,76,237,171,158,97,124,247,34,20,0,53,198,42,156,207,62,91,55,85,118,232,18,62,75,1,158,9,35,210,232,21,255,54,10,121,139,35,48,138,50,169,25,66,228,88,160,241,174,77,184,207,49,41,204,51,200,170,74,184,243,51,97,102,174,29,20,107,7,99,18,27,77,126,41,144,241,146,6,77,183,251,217,100,117,51,47,247,0,32,205,230,15,0,20,156,53,81,87,84,210,36,209,145,117,207,167,145,100,35,72,206,155,139,163,222,226,16,99,42,105,215,142,180,85,245,135,248,150,74,159,76,235,225,27,157,198,20,155,239,125,247,129,177,151,236,191,75,154,218,120,241,120,192,206,26,39,215,127,172,206,150,50,192,248,117,45,136,82,254,44,90,6,225,71,209,64,15,245,180,185,255,75,240,197,196,190,19,80,217,210,253,225,127,18,119,144,122,108,48,136,4,42,67,114,202,62,107,130,182,136,227,32,47,68,15,252,193,106,126,16,85,28,125,221,52,53,185,181,158,154,218,175,227,184,125,225,79,61,195,29,27,135,37,29,212,60,148,131,248,164,198,18,64,237,172,136,14,80,135,221,223,205,8,95,15,204,253,27,22,222,148,99,38,2,241,76,191,231,6,49,98,254,102,80,104,143,147,235,46,46,158,32,91,55,134,155,21,6,85,242,42,203,79,179,68,99,118,153,121,27,148,114,43,195,43,183,180,246,3,144,228,209,75,164,146,69,38,132,202,221,51,229,112,172,179,170,221,150,15,137,35,255,47,58,41,228,71,160,41,163,185,46,37,252,160,23,161,197,189,79,170,140,171,36,233,20,245,15,171,89,6,250,80,179,57,160,213,168,57,137,119,31,65,163,145,3,169,35,213,201,86,62,91,234,110,227,110,27,74,54,36,24,4,13,53,198,176,219,2,56,206,151,47,149,21,198,47,61,101,97,112,76,165,112,129,202,65,152,95,23,221,134,19,162,146,155,161,115,153,49,170,38,12,62,100,235,77,148,152,214,204,20,128,19,102,158,40,46,150,245,93,160,26,237,166,148,153,81,126,220,76,82,0,10,92,116,210,147,141,250,247,96,95,38,247,153,223,38,122,88,160,185,251,48,122,194,6,131,107,247,224,177,88,203,211,105,149,118,222,103,113,127,0,221,56,195,205,8,89,100,232,197,120,127,157,50,94,178,13,192,178,234,47,200,121,231,164,124,20,158,216,250,142,222,48,251,241,124,252,211,157,229,22,37,32,31,144,71,197,12,163,196,239,90,224,93,184,28,218,54,52,147,78,72,58,175,126,9,123,223,227,136,204,198,88,91,92,146,143,250,180,19,199,118,168,181,167,159,58,167,38,137,222,29,71,240,2,218,126,250,132,216,234,153,54,194,50,18,215,240,64,152,223,202,28,241,224,71,100,87,51,133,212,75,231,222,34,43,128,225,14,17,72,109,44,18,24,233,43,110,191,209,75,73,36,215,237,114,102,75,243,69,99,153,106,150,229,99,239,98,236,173,17,129,248,68,64,245,143,65,22,52,9,211,241,1,43,116,39,175,175,49,55,151,204,16,159,218,1,7,57,180,68,84,113,7,147,16,82,5,68,25,14,6,21,138,88,134,210,151,57,51,133,187,88,124,112,65,202,2,228,217,126,55,52,125,79,223,163,204,28,66,48,172,36,117,229,178,129,191,132,78,167,169,177,77,95,138,180,237,42,160,233,226,145,128,90,250,102,72,65,27,93,235,134,53,115,103,195,116,153,200,203,145,241,203,235,2,191,60,16,142,10,207,161,17,138,83,188,118,241,211,166,5,47,248,23,42,8,228,38,164,114,137,209,232,193,53,248,178,220,158,165,34,153,243,7,67,153,122,94,117,33,102,80,127,62,174,159,155,159,215,148,239,30,137,204,255,34,66,135,124,193,128,249,171,11,140,192,100,37,198,147,5,69,87,163,76,170,171,39,166,129,8,1,130,180,140,174,19,94,32,249,182,246,104,116,30,53,109,49,180,220,89,196,122,193,230,221,251,203,164,38,70,108,77,223,137,28,212,243,210,35,6,253,134,112,37,54,88,70,81,1,23,25,1,78,158,254,38,139,76,100,98,168,244,239,151,118,56,239,49,91,255,216,168,32,214,47,187,190,99,76,250,50,32,179,102,87,115,226,87,39,9,198,108,13,79,76,215,141,228,192,46,171,9,76,154,78,220,154,89,175,164,179,176,8,176,39,176,139,62,252,186,230,232,165,217,230,217,24,106,84,41,36,125,124,157,130,219,158,202,232,72,19,174,195,84,24,121,24,217,238,17,134,29,97,44,101,3,96,179,92,186,233,151,71,215,248,107,58,33,218,93,63,46,68,132,216,41,207,120,167,30,231,171,30,105,17,24,203,156,125,65,24,77,225,160,237,145,80,65,104,255,234,86,101,49,116,77,65,94,146,218,37,198,182,122,250,152,79,235,211,42,200,44,60,194,17,83,135,147,89,236,173,243,77,97,0,13,215,36,16,38,253,151,237,149,14,180,226,42,85,138,164,103,57,194,238,242,51,62,252,136,168,50,113,235,88,140,225,39,226,201,24,111,172,215,80,108,143,49,60,159,152,195,112,222,85,126,99,230,62,68,251,79,253,156,133,57,240,106,35,82,90,203,188,145,233,2,102,148,64,235,85,197,255,26,14,52,183,185,225,18,14,82,243,145,178,248,190,247,99,140,194,244,202,183,148,234,62,140,63,20,194,121,236,54,253,156,163,160,233,7,74,106,89,230,248,210,144,148,203,86,125,177,247,58,181,244,238,172,91,235,49,232,55,228,175,71,232,124,152,208,72,195,213,215,83,242,48,187,61,181,39,67,47,78,219,7,166,54,161,69,178,14,203,43,53,100,238,156,6,47,10,40,60,117,68,126,50,38,163,24,160,240,184,17,140,38,121,232,176,61,79,238,134,115,92,167,72,10,104,164,60,222,194,72,57,232,253,241,60,151,161,14,28,191,58,222,144,162,216,254,54,197,119,67,219,240,115,91,33,77,75,41,152,134,73,87,203,233,50,50,77,186,160,196,92,123,169,251,102,9,198,224,135,157,77,125,106,241,148,223,124,65,46,34,128,143,224,186,90,147,125,210,255,79,81,67,160,145,48,36,187,32,244,185,229,41,201,223,254,53,113,251,187,246,38,117,18,219,71,93,19,177,166,28,228,39,220,152,189,204,184,234,221,215,6,246,67,16,220,156,222,2,92,66,42,172,144,171,193,181,0,229,245,177,163,138,240,35,64,237,75,109,5,161,166,183,113,173,209,49,114,121,249,226,54,171,172,153,55,59,148,101,176,18,214,169,225,34,198,50,62,199,211,163,175,209,169,27,55,78,181,44,32,200,251,24,47,221,44,190,125,136,24,130,40,46,221,156,71,134,86,221,181,156,123,178,255,164,196,64,123,83,86,158,194,42,175,186,158,25,120,73,64,245,198,116,206,96,115,190,143,211,117,207,21,192,204,136,171,201,33,32,186,2,236,131,116,100,100,253,114,109,156,11,123,185,88,159,204,52,170,63,70,63,187,224,40,127,43,60,191,122,254,3,206,194,199,42,4,73,3,195,36,110,148,75,41,35,223,43,76,124,88,237,5,102,72,181,41,86,74,235,28,34,135,213,98,152,8,176,206,163,115,78,219,238,77,179,73,56,218,142,35,192,212,57,174,164,190,35,135,150,66,231,85,72,220,84,124,254,166,148,19,252,157,93,68,240,182,37,24,10,8,53,124,228,133,220,252,119,133,54,159,37,142,238,114,61,126,47,202,113,45,176,149,91,89,188,148,136,244,235,158,171,29,14,139,232,41,47,145,1,206,174,208,134,128,146,186,158,116,61,82,131,76,212,170,26,240,13,149,145,58,250,79,29,186,239,157,104,176,27,99,208,78,10,210,88,139,76,194,3,238,231,24,115,173,46,87,146,190,179,203,105,173,222,159,153,90,123,54,241,3,148,63,196,147,102,60,101,163,10,118,15,41,166,23,51,108,177,125,63,97,118,32,220,84,155,115,3,116,245,37,28,162,238,18,91,93,4,142,169,105,127,159,81,169,23,239,52,195,133,19,203,45,87,201,251,56,170,79,189,30,142,147,217,49,151,154,222,65,174,1,86,154,85,60,161,158,219,88,223,119,146,0,33,109,65,158,117,35,185,124,52,168,174,39,117,81,45,157,108,229,81,229,95,104,136,101,18,33,191,153,136,17,239,232,121,43,209,151,35,14,55,71,171,101,145,237,73,4,71,120,170,242,89,124,244,149,150,91,50,137,87,245,189,45,161,73,97,150,70,177,74,37,187,64,113,220,112,210,92,144,150,31,151,35,138,152,195,41,136,212,177,203,154,11,149,133,122,252,213,225,44,112,224,125,17,137,157,123,11,131,34,17,13,89,253,16,223,32,177,201,64,180,110,226,15,237,188,145,254,13,219,89,242,187,217,137,229,162,212,150,214,107,179,69,171,51,20,199,187,52,83,164,152,183,204,27,30,239,9,232,134,110,21,154,194,63,32,5,201,9,145,179,132,195,206,228,191,87,32,172,188,138,245,164,114,241,56,64,139,42,112,210,122,10,253,130,138,175,246,156,9,107,208,85,109,80,112,14,1,250,251,231,134,113,101,152,210,144,172,245,81,32,32,144,211,184,155,46,34,139,85,159,61,252,233,172,87,227,74,0,246,55,214,177,151,52,43,200,173,16,2,155,56,211,139,245,38,226,181,183,48,116,14,158,237,193,105,255,133,3,143,217,191,57,34,66,4,179,217,242,2,126,157,83,95,39,208,22,240,190,233,9,228,69,66,183,133,62,175,95,238,150,141,106,63,175,57,54,41,149,162,2,158,120,116,158,137,111,115,148,134,178,47,206,17,164,58,104,85,70,142,7,86,37,213,232,196,137,235,88,176,252,94,26,96,148,91,245,166,234,160,25,248,62,191,172,84,115,250,38,66,53,142,22,47,29,139,48,76,93,192,89,137,75,133,241,251,245,199,30,203,32,77,109,15,29,207,240,144,9,145,6,30,122,196,146,62,128,230,81,124,96,62,60,164,248,88,189,183,116,160,198,47,87,92,49,95,123,103,166,250,59,4,220,178,146,50,253,181,148,94,242,44,69,26,162,30,164,139,152,37,66,121,115,12,135,150,79,11,69,143,71,36,191,217,143,226,158,70,163,99,93,42,98,142,60,41,207,135,177,52,224,108,151,120,204,220,178,122,61,213,229,38,22,87,144,37,216,66,45,183,133,171,199,164,77,173,164,5,153,89,33,96,106,35,166,26,54,253,104,163,47,174,49,221,102,26,235,49,51,197,26,134,237,133,22,148,38,169,144,14,130,215,59,253,216,5,36,94,230,54,204,119,121,133,70,57,79,241,106,180,28,112,223,104,162,7,138,253,20,14,119,72,58,50,98,111,15,255,48,72,246,124,255,6,113,205,191,100,59,100,59,244,3,7,184,60,100,13,4,150,107,202,106,83,242,206,53,143,103,24,79,43,94,155,94,7,213,25,221,227,212,191,225,27,78,40,112,252,97,185,19,153,130,142,1,152,250,47,214,175,244,96,93,22,230,160,95,13,14,2,218,185,89,98,125,168,30,95,23,173,129,214,231,247,123,126,154,215,57,212,31,90,240,27,234,128,147,111,123,142,222,183,232,124,74,114,89,235,155,249,27,162,226,210,149,181,194,18,140,63,89,198,187,170,113,243,112,4,79,76,161,98,207,209,47,207,172,181,248,232,69,93,83,172,53,159,123,226,208,200,7,5,23,64,78,101,133,5,47,67,109,211,118,112,105,158,4,192,213,30,17,47,196,17,105,107,230,193,50,43,115,39,173,225,112,249,120,119,137,23,101,213,136,94,13,236,158,119,7,174,75,101,147,39,100,162,241,6,124,88,29,138,104,212,227,121,63,118,111,79,108,240,204,94,155,23,180,212,187,189,188,111,245,222,98,201,220,157,152,33,10,153,48,214,121,158,56,17,72,82,117,68,226,143,128,138,8,7,13,168,47,147,41,1,137,92,137,233,140,40,101,234,154,168,210,157,243,103,123,212,243,63,68,191,224,195,84,37,125,156,102,19,199,220,24,137,156,237,153,149,112,125,38,183,39,48,107,67,245,95,184,241,130,4,186,117,165,242,246,16,192,254,85,239,68,254,152,155,184,186,180,169,103,66,141,52,21,56,92,234,122,172,70,204,50,64,103,102,93,253,4,42,77,229,177,209,14,197,178,178,222,69,138,144,137,106,205,126,12,111,95,43,157,24,214,45,201,96,26,184,141,232,205,149,2,15,70,56,189,43,73,159,41,232,20,98,3,174,172,106,26,38,149,111,252,195,111,209,242,108,240,4,254,6,233,13,239,18,99,247,205,192,131,143,148,16,238,173,73,237,121,53,130,189,137,208,101,178,23,137,181,157,95,101,225,127,215,146,110,206,127,230,64,103,64,80,75,119,13,60,1,79,55,244,75,237,87,57,56,128,90,191,9,175,58,155,119,250,12,190,220,31,143,245,69,87,47,53,198,203,41,242,184,67,14,241,8,203,159,154,68,109,42,103,28,212,81,45,246,25,58,248,229,206,132,198,230,142,124,175,181,165,163,74,176,47,157,134,191,25,140,97,114,53,44,128,68,162,141,230,43,239,16,255,54,25,24,39,81,92,77,25,41,152,114,203,124,249,138,168,164,48,12,114,27,38,225,190,26,231,16,225,179,123,55,135,89,103,121,106,169,3,204,72,102,214,237,56,126,91,103,220,11,78,249,103,3,52,251,220,184,29,48,131,234,61,4,44,89,36,147,120,94,163,52,34,30,91,191,221,166,181,167,166,103,150,172,91,146,254,39,78,165,15,175,182,184,237,187,133,251,177,119,184,53,115,241,140,157,253,174,166,30,204,30,204,220,169,186,155,45,232,52,33,176,40,14,52,112,206,255,21,228,9,206,90,192,65,38,147,5,4,86,231,32,236,96,62,83,139,34,60,13,41,211,36,191,128,188,206,8,162,156,99,158,146,137,35,32,182,122,152,187,211,94,9,160,48,107,170,89,188,64,28,63,190,154,60,248,164,69,31,204,183,111,174,140,145,183,11,63,255,172,211,181,161,98,96,120,228,4,96,179,236,229,88,63,42,151,249,61,143,202,223,97,87,26,91,112,139,219,165,136,28,96,35,7,25,127,150,251,235,20,170,197,177,31,192,233,231,116,77,110,106,242,221,151,208,0,87,223,231,249,93,32,21,174,38,57,249,220,185,156,124,16,240,180,182,74,214,225,126,79,2,139,91,17,104,228,235,74,234,150,243,210,118,146,155,47,210,164,255,108,178,222,3,8,210,250,7,51,29,53,98,253,24,215,36,15,90,117,134,116,131,176,224,86,189,159,236,119,130,214,125,223,37,14,58,171,172,1,45,121,210,79,21,44,92,208,11,115,144,205,60,135,219,139,113,178,125,77,45,71,172,130,67,68,34,42,117,164,254,18,173,212,128,118,60,145,23,149,115,167,208,184,112,99,199,8,206,1,242,92,85,45,193,0,48,180,118,25,80,254,125,242,207,195,216,104,162,33,97,1,125,30,214,93,17,169,173,78,127,76,145,200,7,241,163,178,158,54,230,140,58,219,152,184,231,207,48,111,95,90,188,84,227,253,131,62,141,134,66,31,5,0,42,159,207,43,79,239,48,69,119,218,67,77,158,171,187,239,203,152,222,176,164,180,64,231,95,38,126,167,235,146,90,113,202,148,120,199,214,126,89,47,223,234,104,182,180,53,89,244,158,94,222,130,237,131,178,10,139,177,186,150,134,187,238,239,51,69,207,164,70,197,65,124,18,59,159,167,157,198,203,40,148,37,101,32,148,53,94,18,228,191,32,210,66,224,34,240,163,106,28,25,46,123,129,204,210,146,197,0,171,192,25,14,112,77,226,109,147,175,130,212,225,97,42,127,52,179,233,103,79,144,204,140,209,104,252,197,157,55,189,190,45,57,208,163,222,186,13,148,125,10,4,14,81,198,109,106,177,87,80,54,48,77,103,116,41,178,215,120,13,96,6,5,37,255,52,200,244,103,16,46,228,100,226,66,8,82,49,76,13,178,229,23,116,4,38,90,14,205,208,234,2,60,213,195,227,235,197,1,182,89,115,87,243,30,241,111,110,141,41,205,231,0,19,30,108,135,166,24,203,194,186,250,218,238,143,157,206,115,40,222,71,244,76,52,242,223,199,144,95,75,85,75,79,16,32,2,140,75,148,33,60,0,163,219,11,210,171,106,217,19,39,134,186,56,77,168,192,209,12,11,151,181,3,85,125,186,7,235,233,124,79,63,136,242,190,29,136,191,139,46,39,108,109,96,157,247,226,183,109,250,51,141,40,169,211,214,37,33,84,217,208,48,133,22,207,32,88,192,89,36,109,47,11,188,209,200,96,101,246,65,51,92,90,27,252,27,102,189,201,210,63,110,130,184,32,177,128,110,113,175,79,194,68,51,138,75,160,123,229,25,108,169,99,193,30,113,226,153,12,81,170,245,141,49,196,141,254,178,0,184,161,255,40,98,26,155,21,142,187,85,133,105,214,194,200,248,51,70,33,131,127,156,95,25,50,192,235,197,26,228,26,80,70,96,222,49,72,232,73,241,50,71,220,115,126,189,44,8,21,97,116,192,249,255,120,187,246,45,213,210,0,2,182,79,73,104,84,138,90,101,205,108,41,29,228,239,222,93,184,247,118,236,147,19,215,118,217,54,220,2,197,97,75,49,59,254,47,82,130,178,194,2,108,4,202,147,1,153,98,156,115,162,86,184,197,34,148,195,99,244,167,64,74,219,109,203,242,120,19,234,141,141,149,18,223,16,199,236,124,189,206,70,93,157,76,120,231,47,58,46,250,102,20,240,30,222,13,35,4,28,79,193,108,228,80,75,235,23,6,58,151,5,45,236,227,27,236,229,186,165,130,20,68,127,169,42,117,185,174,232,13,232,197,174,184,68,22,16,6,180,80,194,155,117,108,29,231,113,179,255,208,146,187,237,136,193,49,229,78,48,145,90,243,26,18,154,21,66,111,55,107,7,77,91,133,94,25,153,90,176,190,28,178,189,228,35,104,13,38,135,187,250,102,71,195,150,112,65,47,121,82,55,58,70,193,241,173,249,194,220,202,55,179,96,35,67,34,6,11,56,24,202,205,80,153,195,128,20,150,194,240,214,5,97,132,36,16,186,253,158,244,160,110,15,160,191,177,174,248,124,129,43,100,218,174,247,1,173,31,213,56,16,134,241,1,38,50,56,29,7,171,149,84,208,172,163,14,209,26,32,8,91,20,31,141,148,109,145,131,76,190,206,176,146,122,112,170,98,194,146,236,92,39,69,168,27,156,139,154,144,19,32,23,42,225,116,31,170,82,220,159,40,39,186,193,139,27,5,235,37,123,56,184,68,245,255,4,66,65,89,31,5,43,145,104,34,34,179,204,43,63,110,225,114,11,28,249,162,142,92,155,145,21,24,69,171,91,255,116,101,225,143,53,92,0,214,87,206,97,176,242,38,165,205,218,217,79,15,221,250,201,80,62,22,135,178,187,247,119,31,109,142,236,142,197,163,55,125,220,199,39,88,5,166,12,226,108,26,206,139,205,143,100,6,203,0,173,70,69,93,249,223,70,222,254,45,139,63,247,51,221,177,4,150,82,154,173,238,139,9,185,249,216,114,190,251,155,187,40,152,88,91,244,78,254,34,125,15,169,236,246,52,48,33,54,96,84,137,236,45,36,100,106,1,124,94,130,124,199,230,181,39,23,123,72,1,156,145,232,44,128,224,100,8,204,82,77,190,18,85,223,171,50,233,162,31,57,56,50,241,199,124,219,116,220,17,41,227,14,184,114,234,248,192,177,79,188,180,199,7,106,82,242,178,253,75,221,214,37,177,31,194,215,215,144,255,4,21,25,182,248,49,109,193,143,137,10,142,128,194,229,206,233,253,25,236,155,166,59,169,23,118,219,38,235,60,90,112,157,109,120,249,253,90,16,135,94,251,72,250,220,244,91,169,143,109,147,50,29,201,192,179,214,39,47,42,181,108,170,213,41,213,163,91,57,69,93,131,52,249,201,174,12,122,252,94,152,80,62,185,96,211,82,38,90,250,93,96,41,119,233,12,15,157,232,41,34,166,158,230,175,251,215,82,22,199,245,58,12,110,17,155,82,4,206,174,74,217,148,219,219,101,240,105,153,224,96,69,218,86,134,224,243,210,189,33,189,211,249,206,28,188,155,182,85,240,210,149,167,164,152,113,99,57,129,209,119,201,200,105,52,80,115,137,36,217,84,71,185,41,180,99,88,53,233,205,217,32,176,247,226,195,42,245,133,52,226,228,56,150,127,28,254,244,252,195,108,14,247,63,73,153,140,20,151,183,78,210,212,55,71,157,199,88,178,13,139,142,202,79,137,54,139,141,74,179,218,83,143,111,136,18,212,248,90,21,7,80,37,128,102,118,121,242,176,101,227,232,13,162,173,135,175,90,111,199,14,161,253,210,242,171,145,118,146,183,178,146,137,118,1,89,162,207,149,136,197,135,145,16,212,178,30,32,36,28,195,11,55,157,19,133,83,72,151,0,160,255,243,246,53,226,32,119,255,170,36,87,163,92,241,171,247,198,36,130,241,106,165,173,153,60,140,30,252,167,156,245,24,111,30,226,130,211,0,139,128,90,15,23,237,170,51,0,46,105,73,160,184,196,94,181,117,195,244,143,155,131,57,46,235,55,150,223,6,108,182,244,28,46,44,219,57,72,208,171,138,18,210,31,241,113,120,76,193,13,175,74,245,56,206,103,255,67,243,197,32,88,237,105,201,234,95,233,202,121,148,169,135,9,69,124,128,218,107,49,251,99,79,244,122,90,162,75,224,203,57,249,14,196,182,177,184,130,170,216,41,159,17,63,164,136,30,160,197,193,174,225,238,72,196,237,55,231,3,212,10,65,198,142,28,143,248,238,23,223,121,183,196,74,118,26,62,148,205,79,12,103,221,90,77,112,206,178,195,156,85,192,0,21,11,50,237,153,56,28,174,39,110,136,244,57,40,225,19,221,252,149,217,83,238,48,70,31,89,162,46,184,40,158,42,66,74,149,241,149,5,28,104,112,187,144,56,87,89,9,21,196,202,219,57,168,173,158,62,56,157,26,236,55,87,132,93,165,23,101,83,198,29,136,153,108,157,95,225,80,135,213,1,189,6,254,68,155,183,133,28,115,124,150,124,157,76,84,9,162,127,112,219,124,44,182,93,63,208,53,40,142,90,224,253,242,228,13,82,106,124,128,89,52,93,218,48,6,69,164,5,165,253,12,207,31,9,65,41,128,255,11,47,251,110,129,78,41,120,83,235,62,36,3,40,12,74,254,30,40,126,93,125,50,24,226,152,98,89,134,252,111,7,139,236,223,149,196,186,33,43,135,125,101,174,95,97,146,245,208,153,26,154,53,118,63,151,121,62,97,167,241,2,159,165,233,91,219,108,156,138,81,161,126,95,167,226,143,219,71,237,88,189,23,244,124,100,53,201,180,217,76,171,155,111,233,170,216,134,110,180,13,242,209,209,242,44,170,150,113,38,223,135,164,53,195,24,6,74,160,180,59,49,70,36,214,13,67,95,120,192,240,14,98,57,254,9,79,65,78,103,194,155,223,213,149,138,248,3,145,197,88,43,110,100,145,242,212,137,77,161,21,6,161,251,222,3,58,201,92,222,123,29,55,107,245,194,99,152,185,155,249,221,149,35,133,73,238,139,161,17,251,120,189,252,73,208,5,153,129,99,100,80,37,118,181,131,12,70,144,54,172,221,31,2,5,221,181,173,104,207,155,170,37,118,122,104,91,176,83,6,26,0,217,40,215,30,44,66,173,225,97,183,250,192,203,77,211,185,38,50,208,147,226,237,149,144,162,20,184,65,229,51,194,76,58,141,103,23,184,12,182,26,30,166,73,57,61,131,192,144,40,177,22,162,218,215,20,155,23,122,192,0,191,241,207,49,83,106,238,100,200,34,44,247,118,32,134,132,149,41,244,217,67,189,181,72,235,28,40,241,123,117,249,177,205,116,220,147,239,76,251,185,50,162,91,95,34,231,112,210,112,199,222,42,217,118,146,123,143,117,5,195,250,108,200,186,236,8,246,180,132,31,168,29,22,96,199,17,164,15,231,254,80,41,16,41,7,55,68,65,49,235,147,25,126,234,232,0,137,252,93,50,68,0,242,220,75,67,213,77,53,96,190,158,139,156,31,150,19,60,170,228,164,161,80,32,127,11,163,43,106,109,219,204,159,226,195,49,3,177,247,204,222,171,161,120,10,248,254,97,99,197,20,63,91,168,115,2,222,131,151,238,139,222,70,226,217,233,169,58,200,131,198,120,98,193,205,154,148,106,224,213,205,117,9,205,89,20,29,34,185,237,82,175,54,119,175,35,234,110,67,92,80,85,237,70,173,217,45,43,198,136,192,199,171,15,225,110,210,132,152,110,228,164,24,229,218,8,162,197,192,99,255,211,78,71,2,79,210,131,75,67,1,51,254,63,167,134,30,218,249,37,26,206,240,45,179,242,101,1,18,71,5,87,71,122,21,165,133,164,13,82,101,1,76,18,79,99,153,121,101,137,144,118,217,209,33,46,235,22,74,176,158,149,255,132,201,35,61,182,117,66,173,163,124,231,156,125,32,23,224,126,93,61,75,68,3,96,228,152,193,14,51,49,218,41,251,255,38,222,140,167,197,62,48,106,239,238,187,197,21,26,95,161,144,90,148,237,129,192,218,118,143,238,193,185,46,48,102,195,57,255,181,35,36,95,113,59,147,219,218,182,164,56,254,190,251,163,160,208,134,24,110,29,255,242,149,53,233,167,19,93,177,29,52,6,232,201,72,38,58,172,151,148,242,165,76,58,195,41,134,181,227,17,249,146,40,78,83,238,6,155,142,242,216,109,182,57,209,247,160,3,203,190,219,28,59,217,194,94,28,21,86,120,18,4,111,130,72,221,59,215,11,111,180,208,221,111,78,88,222,102,25,150,133,129,19,40,111,207,69,247,46,169,209,241,126,124,92,201,191,117,47,84,192,77,189,133,167,45,242,40,237,177,63,176,212,153,160,130,167,47,114,45,155,172,86,94,223,219,219,171,26,90,7,108,11,146,122,87,44,186,240,209,230,90,14,82,172,124,167,234,145,193,114,140,211,160,130,62,163,77,40,83,140,117,30,1,78,107,97,25,219,111,50,65,127,188,55,221,57,248,121,105,127,179,149,3,80,68,239,146,110,233,178,240,120,223,141,158,75,247,20,54,225,144,137,170,251,82,193,185,105,10,99,196,33,240,194,102,220,169,220,28,213,197,234,174,241,182,99,15,61,193,129,252,157,240,67,159,81,41,173,225,55,237,249,175,0,88,236,219,70,217,77,226,116,174,142,191,145,7,175,181,82,97,86,237,53,100,251,85,183,105,117,28,146,156,88,55,242,208,23,246,18,34,73,80,97,93,162,3,56,202,230,54,34,108,207,229,191,238,76,193,147,85,74,193,99,228,147,92,234,155,209,167,26,112,78,98,46,2,254,58,101,68,39,2,242,70,49,152,66,107,29,248,57,234,105,196,170,249,48,24,65,42,122,208,72,56,242,0,222,173,152,23,225,121,108,203,228,240,1,228,236,3,239,22,239,157,107,80,24,23,172,244,205,18,46,183,118,143,214,50,247,152,146,19,221,40,253,25,77,63,248,74,59,255,1,55,115,167,127,12,142,247,131,168,26,181,191,60,186,201,4,25,136,221,227,62,14,35,169,17,132,96,174,139,20,147,113,221,78,49,205,238,3,22,27,54,160,133,222,119,79,60,89,237,85,101,242,9,107,103,59,51,19,10,9,80,26,79,10,109,14,54,179,12,237,107,184,158,71,13,49,29,94,45,61,49,20,84,157,218,238,177,175,79,254,133,46,123,107,224,45,10,84,255,95,202,255,57,167,52,218,169,37,116,108,185,2,181,85,178,19,166,104,103,99,151,135,15,126,87,43,25,27,2,236,189,9,52,84,105,190,241,126,176,227,64,165,124,221,4,169,172,108,77,233,57,51,1,154,32,50,143,201,217,78,77,104,166,209,83,166,112,152,162,97,29,101,117,21,11,42,147,220,207,194,2,199,29,195,23,190,54,39,48,222,173,20,238,115,35,56,214,176,145,185,22,25,57,57,219,69,79,214,103,242,98,240,95,184,127,88,45,9,200,198,25,249,8,104,34,162,23,220,255,50,140,183,61,222,11,207,182,232,189,30,242,197,62,180,183,162,191,20,238,201,213,153,243,153,168,89,159,134,95,224,179,125,142,84,93,136,61,63,200,51,217,230,151,233,43,103,25,254,74,243,239,175,147,130,130,74,75,153,18,35,144,183,90,111,51,47,214,82,231,70,175,103,229,219,35,178,58,103,228,179,176,64,167,218,36,236,81,232,15,191,196,242,249,227,98,38,112,100,79,225,17,255,71,168,32,254,197,183,33,185,68,187,49,224,212,129,193,84,222,27,122,224,229,3,139,64,24,56,51,52,129,129,167,23,124,74,2,117,27,95,120,230,194,92,29,162,193,106,228,240,198,219,5,127,28,80,10,223,227,36,131,56,10,173,142,152,13,67,85,33,78,92,63,242,2,23,244,80,92,247,141,154,57,235,135,252,154,71,49,22,66,236,143,247,204,160,242,227,142,153,59,4,156,30,179,59,170,110,53,81,181,59,166,243,57,68,39,96,56,74,69,98,192,212,38,97,191,98,91,168,14,77,89,49,203,184,151,148,133,163,59,88,111,120,115,48,0,171,4,90,229,74,161,27,49,136,85,152,96,154,236,15,45,76,69,11,123,198,172,32,145,196,133,155,131,232,34,89,79,89,121,218,187,58,6,209,154,100,56,245,245,220,210,6,111,35,174,1,17,215,116,31,205,95,125,59,57,21,213,235,159,117,69,99,218,1,47,219,172,76,228,63,24,191,109,123,5,154,75,238,166,115,243,30,142,7,174,249,8,56,242,233,138,33,76,37,16,109,93,205,21,219,239,139,127,225,125,41,126,55,80,36,9,28,168,107,217,156,13,229,164,190,27,144,166,113,196,81,62,130,237,217,66,150,243,245,145,142,225,136,228,201,194,221,208,245,121,252,163,38,20,186,86,180,132,191,245,163,234,17,245,183,110,231,245,191,177,184,225,0,204,124,73,149,115,185,97,70,46,86,68,84,183,178,104,147,240,249,146,154,159,222,250,2,253,161,66,197,46,219,185,95,120,93,179,134,71,216,118,103,200,224,149,172,119,217,218,52,24,127,132,106,22,75,83,127,236,140,153,29,43,0,154,204,44,70,136,71,247,213,152,225,190,197,73,182,129,100,66,215,182,72,150,208,112,106,173,51,119,62,145,104,59,13,154,18,122,162,104,24,132,72,137,221,38,224,134,159,174,9,36,164,226,137,63,98,11,52,46,236,253,92,3,46,236,49,92,27,146,151,231,51,129,155,235,4,109,80,145,112,51,228,107,29,113,113,81,141,161,28,221,63,107,192,106,78,123,48,228,36,2,218,25,1,48,167,212,215,169,48,132,218,89,253,228,152,240,85,132,38,183,190,48,30,114,58,202,250,161,84,159,163,65,144,90,106,106,163,109,54,207,76,103,120,235,189,199,113,197,51,53,126,202,93,82,168,231,135,50,220,52,24,58,185,214,65,240,75,240,55,56,164,191,163,108,209,37,115,203,99,85,45,63,139,239,67,91,72,139,127,250,236,160,251,103,19,70,184,175,34,191,99,4,168,184,176,118,229,224,6,226,48,9,201,62,7,61,242,160,30,188,105,197,187,128,132,155,133,252,99,93,205,71,251,253,40,118,57,44,209,182,156,194,56,63,70,239,46,197,47,30,68,7,134,224,92,210,198,103,136,211,5,225,104,11,14,159,235,148,79,72,167,80,104,174,204,41,172,0,21,35,124,52,75,122,22,215,102,240,69,177,220,52,177,22,104,54,64,78,101,199,222,80,243,48,57,131,240,177,89,219,232,131,188,217,241,93,212,176,243,79,225,78,63,69,101,146,60,170,122,215,16,112,16,81,179,134,248,103,25,179,72,197,156,159,226,238,243,74,22,254,14,51,176,63,229,109,246,101,83,188,11,48,219,59,150,161,26,232,226,204,54,117,4,233,249,17,41,30,234,43,146,246,10,90,157,146,2,193,82,159,57,188,168,97,188,55,197,96,41,191,188,112,211,158,102,52,177,27,173,202,109,120,247,184,199,206,251,248,1,50,119,112,61,251,59,11,110,45,63,239,198,165,87,225,75,254,208,42,56,214,19,67,61,189,34,253,165,168,231,158,0,152,130,98,62,184,105,109,157,114,159,146,34,28,240,222,69,10,151,213,229,189,244,194,6,61,213,188,98,21,35,8,148,172,111,101,62,153,93,198,26,216,12,197,85,169,71,150,5,210,252,66,86,105,139,211,23,117,249,255,238,251,45,138,82,165,21,61,90,146,112,17,203,12,45,204,107,56,14,173,6,82,116,75,76,219,87,205,125,152,129,232,5,105,255,92,131,233,171,84,248,73,22,93,122,239,150,7,105,240,146,192,193,228,64,195,93,59,230,87,231,187,136,205,97,25,49,11,74,119,117,231,229,95,19,216,194,129,40,27,170,101,22,67,122,190,157,144,2,198,113,55,35,157,174,64,217,228,237,108,106,222,35,188,110,107,61,44,176,103,61,24,121,248,179,229,137,133,156,157,44,35,137,219,237,210,112,230,74,3,40,183,173,67,228,90,234,229,172,234,229,83,158,192,24,187,96,3,146,186,170,239,213,15,193,109,224,26,24,45,148,122,239,17,90,163,213,50,191,87,183,193,34,82,232,240,218,145,143,191,113,104,10,181,12,255,205,97,57,117,39,242,204,1,237,239,203,71,6,243,4,237,47,143,180,96,194,249,41,121,118,42,125,152,200,81,37,105,159,20,236,38,67,246,144,230,229,29,148,124,39,202,227,110,198,71,225,130,3,153,134,104,13,2,144,118,15,124,149,248,43,176,46,233,37,84,72,183,162,95,111,128,213,181,13,49,57,130,126,197,193,171,230,95,218,14,250,83,93,60,242,27,4,76,233,12,139,127,75,141,163,202,56,36,171,10,126,135,243,92,219,53,29,117,133,191,167,175,252,28,77,14,118,236,250,110,3,223,132,226,103,78,44,64,1,163,24,63,188,250,233,201,185,6,210,194,111,188,208,79,112,76,46,173,167,112,18,251,96,197,226,146,76,162,92,25,139,81,102,245,110,233,227,76,182,231,71,137,216,32,236,65,195,225,209,191,56,199,81,186,157,167,253,185,204,10,56,205,79,138,164,161,159,243,71,101,104,232,38,203,157,246,16,191,150,156,3,234,83,78,109,10,45,151,125,129,245,102,50,67,213,186,232,39,248,5,11,238,107,55,225,31,13,253,254,32,37,83,43,6,57,71,26,70,89,186,32,66,196,108,68,227,91,177,52,243,230,207,244,32,44,203,108,103,131,97,105,9,40,230,153,131,172,144,127,251,105,190,218,104,103,245,45,37,60,18,99,39,53,201,156,209,113,111,70,232,185,181,150,252,27,62,108,218,232,190,52,172,226,152,124,101,70,235,78,223,192,157,171,72,158,79,175,158,78,255,158,80,251,137,5,150,103,57,174,148,253,80,227,250,122,138,107,224,84,184,178,85,9,188,197,66,248,120,48,198,29,56,5,213,152,147,175,181,150,197,87,141,125,238,96,241,230,201,200,44,96,55,98,54,194,18,196,177,54,104,40,184,172,141,168,159,78,241,124,56,216,176,254,180,101,124,149,215,99,40,81,113,87,3,219,191,17,99,121,163,56,82,248,133,76,72,138,1,231,173,129,108,48,66,15,92,18,79,43,241,96,254,72,38,22,155,151,133,181,71,88,0,51,100,225,50,210,60,49,162,118,114,183,117,181,92,137,59,172,66,208,88,45,116,99,33,172,123,97,36,114,168,177,166,55,204,208,104,168,103,115,6,117,235,209,182,0,242,55,101,84,221,219,125,13,116,35,248,4,179,4,84,212,221,122,170,168,215,249,125,83,216,206,226,54,55,116,215,230,178,129,61,166,4,33,90,139,62,97,207,241,104,1,114,118,105,84,194,197,191,35,78,152,77,216,155,24,251,149,125,129,126,137,149,76,69,241,255,138,84,62,132,250,198,49,113,198,154,218,1,84,76,110,215,76,92,162,132,187,124,150,130,138,178,195,115,8,217,35,114,119,178,30,115,87,20,85,77,192,185,203,150,78,91,56,15,120,87,233,225,114,79,63,246,44,213,225,114,163,98,24,241,1,127,84,226,242,127,8,27,78,7,168,163,6,212,153,75,239,195,55,75,7,215,38,20,88,199,166,41,221,93,35,105,32,223,129,168,205,38,152,89,25,170,89,143,162,117,94,236,130,18,249,210,41,179,46,213,170,131,85,31,196,214,151,239,12,250,84,97,22,30,105,209,6,7,244,94,132,36,74,121,155,173,145,49,35,91,198,247,177,163,182,204,13,133,43,213,153,216,84,105,187,154,166,22,97,216,10,248,212,110,193,30,180,145,90,38,81,44,0,8,196,202,56,46,182,205,26,82,97,124,147,22,93,237,12,144,205,116,7,254,114,42,252,42,91,146,106,35,245,4,87,133,150,43,59,119,73,149,228,227,139,100,33,125,203,80,23,253,56,178,87,95,160,76,123,60,192,181,31,124,144,215,232,254,137,179,94,83,111,6,180,243,27,219,204,49,6,91,221,200,154,11,10,188,107,92,42,43,8,77,238,215,116,221,192,242,88,202,154,9,167,149,229,50,230,98,215,104,82,199,194,91,235,155,113,85,241,42,171,215,86,179,238,227,170,105,63,127,150,34,138,202,98,239,59,114,80,133,179,156,160,53,168,80,15,68,212,207,178,16,100,6,193,78,54,31,133,3,194,205,255,78,58,118,29,246,214,253,219,144,253,179,148,198,238,230,168,52,186,102,3,62,89,94,213,221,236,180,244,166,122,230,185,13,234,152,113,98,112,190,25,216,22,7,78,78,79,57,132,113,253,190,156,176,149,65,170,150,141,220,186,158,230,52,83,36,54,96,91,104,70,254,148,174,1,40,68,102,72,111,227,88,163,215,118,36,143,213,126,5,223,148,232,68,119,26,107,34,171,19,211,78,150,119,44,65,147,234,78,226,115,77,9,116,81,98,181,51,105,197,205,103,173,58,125,133,172,58,31,232,191,3,15,98,112,117,177,65,211,14,60,110,174,133,102,30,242,186,132,244,239,58,155,213,44,169,163,103,37,140,147,197,204,100,176,35,241,132,28,121,61,78,168,108,28,126,217,22,99,43,243,12,39,40,13,185,197,201,90,69,56,219,42,133,236,25,185,148,214,212,86,96,210,145,51,86,188,134,77,18,103,132,103,49,244,82,176,217,208,185,78,245,135,79,98,65,40,113,121,57,115,209,174,204,54,156,172,134,1,30,31,174,154,2,186,181,127,21,252,64,244,86,101,86,8,189,95,44,114,142,112,131,45,53,75,49,15,139,142,113,19,105,245,151,231,174,138,172,78,32,144,198,231,15,220,81,124,114,135,150,169,66,160,41,132,25,22,100,229,24,12,85,95,196,97,56,156,25,42,187,51,32,186,232,84,83,14,144,216,150,89,34,177,234,248,216,140,199,210,186,196,97,151,74,252,219,31,116,110,58,23,127,20,29,245,88,108,204,48,191,156,123,64,214,17,185,151,4,153,139,74,162,248,223,157,193,170,64,193,43,229,57,207,243,69,36,170,147,201,175,214,91,111,125,43,21,171,127,189,149,203,50,50,194,127,156,180,65,23,229,147,181,90,121,79,246,62,242,243,72,240,50,56,88,178,61,157,123,168,139,154,162,170,47,37,60,18,74,31,210,171,45,43,155,27,141,249,139,132,125,59,251,216,187,19,20,101,136,155,25,80,125,133,92,172,144,51,11,203,62,210,12,181,15,190,47,185,243,243,91,106,202,111,144,158,244,38,120,163,212,115,190,116,21,4,144,84,105,79,191,103,30,56,254,101,100,30,126,36,192,20,78,162,141,232,184,81,245,239,71,229,60,193,173,237,154,59,148,76,38,33,51,135,137,208,56,161,236,149,93,147,107,186,97,119,149,253,79,229,23,23,223,95,138,46,57,244,21,53,246,199,135,190,223,194,174,212,55,208,235,129,28,145,205,26,20,95,4,63,44,231,6,227,159,48,106,146,177,80,28,210,57,116,231,109,68,220,225,172,129,206,150,252,139,88,62,86,5,51,53,118,18,112,101,46,75,34,163,215,18,178,230,30,162,47,78,221,47,224,75,225,92,62,154,142,159,68,212,254,144,243,247,80,154,98,138,244,180,222,67,21,104,62,32,77,95,72,15,143,201,20,188,150,62,18,15,29,22,190,110,204,146,167,227,41,115,204,181,186,113,93,112,106,200,6,94,218,251,190,42,145,100,233,138,139,112,97,135,179,190,7,124,9,247,71,130,133,190,27,27,160,137,236,235,108,98,107,205,124,92,76,2,98,157,7,142,154,147,244,226,2,41,18,31,114,122,168,28,166,172,202,229,134,171,179,192,174,2,22,246,30,176,177,94,250,150,250,80,97,106,176,162,89,30,221,123,74,176,154,200,125,92,36,222,55,72,146,166,142,2,106,121,27,69,239,48,8,255,204,6,82,95,248,181,245,70,93,235,205,208,198,119,47,51,118,87,23,87,29,194,170,182,97,87,153,82,203,125,92,74,73,70,20,191,229,92,181,27,252,130,10,9,39,174,195,244,202,250,83,109,152,45,217,109,190,71,136,184,38,46,106,95,234,97,191,189,106,128,148,124,251,229,56,199,23,212,112,31,117,128,49,185,235,248,89,202,113,151,92,113,20,132,179,42,6,71,87,96,125,59,230,250,50,26,62,1,137,195,213,249,22,214,193,39,81,192,100,65,253,216,51,20,227,235,160,162,41,162,166,118,48,90,19,225,158,182,35,147,8,221,187,219,189,56,165,86,23,188,212,130,62,71,176,121,3,225,140,110,131,248,93,85,125,31,21,157,246,206,63,205,99,241,130,188,69,208,182,143,227,171,241,25,127,178,176,120,73,197,165,81,172,74,125,51,114,211,111,208,34,14,243,235,22,123,205,149,88,105,184,5,135,209,112,61,143,231,118,65,24,189,210,116,8,28,141,213,173,141,32,218,102,164,107,194,150,199,128,7,136,255,226,30,82,16,167,143,22,127,56,114,222,250,59,229,59,15,208,212,55,24,7,22,27,225,47,174,25,86,226,34,69,108,153,124,229,46,32,243,101,72,142,47,104,43,125,206,222,164,255,212,118,177,252,14,255,31,76,172,86,83,10,69,159,191,109,42,128,86,237,220,33,30,212,107,49,81,189,161,218,58,11,129,163,90,56,67,240,118,76,156,232,54,105,17,113,227,118,34,218,46,14,142,210,126,156,102,239,92,34,10,194,49,178,139,47,86,54,35,31,61,7,118,149,216,250,5,188,3,75,19,144,215,223,225,75,117,71,194,44,62,255,27,141,160,237,52,161,3,100,21,250,53,200,58,65,28,136,251,5,162,180,175,55,194,32,148,45,62,254,114,70,161,113,72,221,151,191,13,29,78,225,238,137,181,87,56,183,22,238,1,26,51,40,51,130,32,68,45,132,124,105,214,175,70,232,93,23,126,48,199,233,197,217,45,230,26,222,197,101,16,49,82,128,243,183,244,176,112,125,55,155,222,149,85,141,22,140,80,250,36,2,21,154,232,154,33,138,201,95,185,130,252,45,78,232,119,159,176,185,105,217,78,151,196,206,148,147,112,148,210,195,0,150,205,180,59,53,127,17,220,186,196,216,224,2,227,166,235,166,61,170,158,119,241,220,20,136,48,134,34,87,161,176,126,13,191,36,198,8,243,120,249,33,104,106,226,198,124,100,198,195,124,100,49,13,208,132,14,229,148,157,93,26,126,36,112,9,25,238,223,120,34,91,70,18,112,209,241,6,93,231,39,74,23,74,196,152,30,147,168,214,11,35,167,49,150,57,223,157,232,206,140,229,222,92,3,73,219,17,169,213,132,197,141,197,213,62,235,68,9,16,54,30,139,67,68,161,200,29,153,56,148,10,144,102,61,205,41,26,22,43,120,100,185,192,82,228,93,77,167,17,43,210,68,153,0,103,112,64,211,206,53,193,8,250,89,178,161,165,16,200,162,129,189,179,104,120,183,248,243,155,74,168,161,1,217,35,71,66,73,133,135,55,242,84,227,205,117,116,144,90,61,6,243,23,3,40,75,243,227,189,177,88,174,68,142,115,104,62,27,20,104,58,117,157,182,90,202,93,15,230,33,80,53,44,157,71,216,97,92,101,151,216,71,84,191,2,242,1,183,101,204,120,243,160,79,224,167,151,8,68,47,178,246,218,151,197,252,163,192,219,80,184,235,59,130,238,188,80,79,176,204,66,11,38,126,46,229,29,130,239,188,143,48,212,56,160,192,2,93,138,223,11,41,237,223,66,22,109,149,232,196,111,235,99,44,251,94,253,150,128,17,157,30,56,8,81,210,222,3,234,56,93,192,40,85,33,185,133,157,37,216,67,21,21,25,197,250,75,126,237,220,129,150,72,221,143,156,23,25,209,143,52,208,32,85,133,132,140,149,40,61,72,197,59,238,134,71,28,129,212,240,85,49,251,68,118,254,8,87,215,28,87,124,19,58,37,132,56,67,112,56,35,82,236,226,121,143,22,96,162,84,54,221,196,11,148,7,106,157,20,186,45,240,4,110,217,22,232,240,118,232,231,34,96,101,69,249,196,74,54,89,27,177,189,225,162,3,140,204,20,31,171,102,80,134,58,16,29,182,189,203,149,138,31,66,229,150,28,16,201,120,192,166,182,47,254,217,107,76,247,95,84,130,62,154,181,123,33,32,190,31,187,143,93,228,192,241,78,22,9,72,165,75,208,163,233,8,202,235,100,181,104,252,42,4,57,131,230,97,215,93,173,128,101,31,106,185,219,47,12,174,11,129,35,167,254,157,106,36,2,153,13,34,105,2,88,251,106,100,151,161,53,42,60,65,6,114,251,204,250,200,114,131,13,219,28,78,139,178,219,185,40,6,243,202,200,250,96,26,12,102,131,138,221,70,1,152,251,89,89,150,183,199,124,252,22,4,16,204,86,57,87,48,146,151,120,205,72,61,255,148,245,58,10,128,62,86,143,183,140,205,94,96,174,202,9,249,204,204,89,17,118,13,130,92,89,93,223,95,56,145,97,13,232,235,53,19,222,71,82,109,107,136,238,142,255,211,92,22,42,231,208,252,47,107,181,253,234,79,219,0,121,2,7,215,121,95,179,186,163,248,66,165,208,26,125,252,65,234,243,82,33,145,184,90,100,230,117,214,204,246,121,182,93,245,230,89,195,203,190,3,251,231,77,192,184,88,83,213,99,146,190,22,94,76,142,143,155,251,230,71,124,217,163,103,143,80,137,68,153,213,28,21,183,237,212,244,236,223,121,161,82,169,35,59,252,177,33,61,203,171,169,189,33,107,131,36,30,156,213,9,170,29,138,52,61,82,55,165,176,145,77,58,132,211,185,108,87,36,190,61,114,229,245,47,92,11,130,60,70,183,24,156,60,146,157,138,146,36,224,119,64,14,244,89,193,55,179,156,69,164,253,96,120,204,199,162,228,133,185,131,203,160,167,129,149,198,21,31,129,103,11,112,63,119,7,61,147,126,1,182,205,251,103,238,132,42,80,88,15,103,234,160,99,176,111,104,198,75,193,100,127,133,191,188,195,59,3,116,242,146,93,176,73,160,114,241,244,240,60,81,33,59,19,200,78,131,204,86,196,158,6,169,186,77,87,46,146,11,66,19,228,94,18,49,212,159,34,3,197,102,177,34,118,35,100,127,155,105,37,103,247,154,156,80,150,82,12,52,242,196,170,87,166,2,96,215,9,231,240,32,100,65,128,183,240,236,190,235,53,195,243,167,189,198,166,245,246,10,230,36,38,81,184,216,197,246,131,26,182,217,2,227,246,200,234,226,143,149,124,182,44,211,203,41,187,207,236,190,204,80,14,211,74,236,99,46,118,106,190,10,146,179,108,198,45,51,82,73,198,102,16,187,254,139,32,91,23,215,118,220,140,62,100,193,42,201,51,5,149,7,249,103,68,83,220,24,118,17,217,123,140,203,115,30,213,145,157,218,47,169,202,220,22,174,236,44,193,164,80,192,245,209,116,78,195,203,187,178,227,19,54,233,142,122,162,217,177,39,122,121,217,66,57,22,201,21,230,198,181,1,47,213,7,146,68,35,220,213,5,75,196,227,149,45,66,38,74,105,133,107,228,191,210,102,136,84,147,171,10,174,123,87,45,23,1,41,53,202,248,59,251,136,29,46,120,208,105,216,106,105,96,129,211,31,195,35,225,135,30,228,65,151,114,106,61,107,195,58,28,149,229,37,205,181,90,145,13,6,230,143,144,228,82,5,35,173,140,30,130,197,66,195,195,214,133,33,60,218,222,92,204,235,37,146,152,118,140,116,45,7,152,30,95,237,193,66,4,73,90,35,116,146,16,55,53,218,14,153,225,249,199,62,238,0,51,205,54,159,172,67,162,13,178,121,202,170,145,55,136,203,87,204,135,147,131,20,207,128,244,35,252,253,94,135,31,49,131,47,65,199,164,122,132,170,21,241,1,244,28,32,15,234,213,10,196,53,91,168,163,0,81,11,140,158,156,166,128,218,154,41,57,209,40,230,106,225,38,185,24,60,71,202,233,136,71,150,189,91,194,253,122,107,86,178,137,253,29,25,135,182,37,208,27,184,45,102,155,50,32,132,160,77,172,196,162,124,0,194,103,82,84,203,95,26,148,134,244,180,224,231,2,26,45,12,137,151,15,167,183,58,197,10,102,121,38,106,54,166,52,155,126,77,138,17,193,38,254,125,26,39,46,41,28,253,38,152,140,225,111,71,73,136,25,57,140,91,88,50,156,141,17,68,246,205,219,128,4,244,20,136,72,70,13,253,157,242,79,49,21,162,159,227,219,18,211,103,192,167,245,25,114,36,123,169,68,46,103,197,164,142,20,169,67,142,156,2,95,12,30,154,101,232,176,97,102,116,235,248,204,102,179,242,254,25,246,26,12,104,81,131,217,37,55,26,148,165,68,229,240,78,175,196,134,150,118,228,225,238,184,113,174,142,199,130,178,251,145,23,205,222,196,239,247,145,254,43,38,231,233,241,13,177,13,140,221,110,228,188,190,205,55,207,60,245,190,28,96,225,133,123,215,201,185,128,133,150,160,189,107,234,153,19,67,40,248,251,209,161,165,246,134,204,249,162,55,21,75,180,142,15,147,5,78,61,142,232,85,192,221,102,93,3,179,135,95,201,131,126,224,193,138,226,176,221,187,245,187,34,37,156,27,198,232,225,218,30,59,159,207,143,60,61,216,98,226,202,172,67,245,144,236,150,11,54,196,111,247,182,16,184,203,74,123,108,141,83,6,175,118,249,114,136,195,64,130,177,234,105,18,137,17,174,183,148,126,106,124,18,121,204,211,87,5,7,184,209,144,101,168,113,58,72,53,13,187,45,171,149,218,39,104,138,191,10,174,82,76,222,139,207,147,159,177,213,173,135,70,58,121,125,213,52,53,179,102,24,183,29,209,70,87,169,39,187,133,84,172,135,196,13,24,161,115,90,48,218,77,1,83,40,127,161,169,101,54,27,84,21,88,72,157,207,61,26,183,9,104,145,151,32,217,139,253,175,227,21,9,113,2,52,50,114,190,231,113,203,214,65,189,61,224,141,108,105,248,93,225,4,85,51,252,43,43,151,63,223,125,94,29,201,119,43,152,238,236,239,56,106,169,75,85,148,141,216,162,152,223,133,200,126,77,187,10,37,57,200,107,84,253,129,157,174,24,211,83,7,231,41,29,110,162,127,133,134,14,232,235,63,89,74,30,220,222,243,95,37,69,49,117,6,206,25,213,148,116,107,103,85,66,163,17,66,27,215,3,10,175,196,33,29,53,129,36,16,113,59,166,109,191,50,68,99,164,141,96,190,131,80,224,237,241,84,83,53,208,88,248,244,173,31,82,31,71,171,108,79,156,133,35,9,142,77,235,70,64,96,27,56,222,126,110,163,241,54,168,178,242,218,64,195,212,70,165,17,158,144,8,209,167,162,165,154,16,128,87,254,187,240,71,92,206,240,29,146,148,97,214,128,56,215,168,196,79,76,15,59,102,83,90,126,27,36,228,158,252,149,130,15,190,108,224,101,7,53,185,80,17,115,20,209,231,97,209,215,198,63,169,234,95,162,252,136,27,150,85,139,127,169,124,137,154,13,210,0,174,220,89,27,250,240,144,237,211,74,41,186,58,110,149,254,151,10,24,85,231,220,61,244,243,128,167,231,11,222,218,213,81,209,149,135,120,29,170,79,205,45,84,114,106,35,39,157,66,16,136,143,28,170,4,181,215,111,184,205,114,11,231,163,81,245,44,154,198,109,181,195,46,61,36,217,92,214,191,246,29,116,242,149,242,132,109,69,5,112,197,134,88,181,138,120,250,141,86,242,49,91,77,218,79,110,94,175,79,201,254,228,138,120,88,135,60,160,163,40,100,242,98,115,12,39,232,223,1,252,43,70,70,201,148,37,212,229,153,52,204,46,209,159,43,29,114,156,219,82,190,15,230,121,161,55,139,223,237,232,253,155,195,51,34,163,14,70,137,173,113,177,229,33,146,51,103,211,137,32,255,26,112,66,177,175,236,103,71,182,167,32,29,20,150,5,162,72,165,63,82,169,69,8,156,32,57,217,197,57,183,56,123,92,246,107,192,93,112,33,134,198,62,213,98,191,125,223,203,113,67,52,195,181,11,249,32,12,23,231,80,55,155,169,175,104,152,228,83,71,127,179,56,87,163,118,198,179,61,224,28,248,124,45,205,229,170,230,13,1,197,145,221,160,135,83,65,53,141,118,176,197,86,91,111,249,166,78,195,125,92,164,27,152,164,196,231,135,159,82,37,97,203,90,58,233,38,50,109,63,141,114,166,116,195,214,97,118,204,61,212,223,236,180,68,124,50,168,140,156,199,87,145,93,28,34,41,24,114,0,41,84,28,65,167,101,171,82,60,63,130,153,187,111,84,74,240,162,167,133,191,125,181,122,203,159,38,16,74,213,203,187,128,229,12,144,22,236,55,244,154,112,209,222,128,48,81,39,81,77,191,85,182,21,214,21,250,203,70,17,10,130,69,227,47,187,180,232,215,140,207,223,39,136,77,163,17,184,217,136,249,197,5,92,122,144,1,38,162,198,177,47,183,166,117,178,248,218,52,76,12,75,90,209,214,59,150,149,48,179,60,52,40,185,79,215,24,194,161,143,146,94,39,239,156,30,36,87,13,121,234,207,213,188,252,127,158,101,112,206,5,255,43,238,174,52,158,170,210,150,161,240,194,120,195,210,27,239,158,174,87,212,22,155,128,125,170,253,184,108,154,139,98,151,148,132,253,97,216,148,114,84,116,124,249,32,99,246,8,155,18,192,165,244,112,147,111,218,136,39,0,67,239,51,250,214,95,8,68,18,233,203,75,121,214,29,81,185,43,164,132,92,85,162,153,135,70,253,125,247,134,98,98,19,7,146,170,204,36,151,83,110,131,179,179,131,132,20,29,88,113,113,23,224,22,1,33,180,4,53,195,92,91,214,13,250,178,160,176,121,162,180,31,176,117,225,10,170,162,213,29,86,24,148,44,157,129,45,182,33,196,92,253,224,145,77,7,24,170,154,44,250,90,87,117,215,15,148,148,249,4,43,69,180,3,108,220,173,169,60,117,35,7,32,160,220,111,63,151,130,155,118,94,160,9,68,164,188,212,131,197,172,93,167,20,192,38,121,237,66,21,180,163,37,100,51,59,194,150,128,131,135,159,142,107,95,179,150,216,104,127,182,143,80,92,173,34,196,155,197,138,24,117,146,242,101,219,72,203,18,223,81,179,152,156,113,96,94,155,25,89,27,165,132,205,202,97,197,67,210,200,66,192,119,54,23,38,167,235,135,27,235,240,161,166,241,10,207,63,212,233,199,90,130,79,82,185,214,34,137,179,45,78,77,51,208,218,154,177,42,198,160,86,170,53,244,180,132,153,213,224,240,149,192,75,69,49,254,86,239,158,205,194,85,50,1,153,168,19,210,190,20,124,165,20,205,206,47,237,196,183,83,169,162,62,48,182,23,115,123,219,44,127,206,66,18,5,103,11,144,154,183,214,215,78,84,113,175,46,100,164,184,245,6,91,227,95,200,11,214,66,243,91,55,105,97,153,8,76,248,235,179,129,65,33,162,185,32,124,18,50,252,122,31,213,164,193,197,85,137,23,198,186,32,194,230,201,29,19,99,163,225,75,201,43,182,199,251,97,192,3,223,96,20,225,241,191,229,227,162,240,135,94,143,44,244,46,6,105,217,79,212,124,166,193,230,182,227,117,87,52,64,217,113,61,172,239,105,237,210,229,193,190,200,91,73,147,237,180,116,89,43,191,21,147,222,79,228,233,201,255,247,13,28,107,239,111,163,207,77,178,19,149,137,103,169,15,10,210,100,129,133,148,161,146,184,131,162,85,216,79,197,202,168,197,223,53,89,168,21,138,201,17,205,35,159,209,109,25,201,254,180,27,27,75,238,34,201,156,162,174,244,169,220,169,205,124,49,168,216,187,1,104,192,49,71,193,144,137,243,147,33,253,253,225,74,151,123,53,114,115,85,132,179,6,130,60,195,101,116,3,67,49,240,104,122,137,129,194,18,29,27,207,110,165,154,34,63,82,234,113,149,183,3,12,156,14,219,49,155,133,37,185,233,37,56,95,127,255,116,19,81,81,141,183,20,115,188,89,70,88,220,244,77,247,108,242,93,17,141,68,114,38,51,113,96,15,252,179,191,32,198,163,123,188,106,19,240,153,254,167,229,114,41,142,42,241,234,28,254,202,133,231,120,32,234,112,31,196,64,242,45,216,127,111,224,176,150,11,240,170,170,18,155,16,218,78,210,127,178,59,216,89,77,83,74,183,118,166,54,66,147,75,11,6,166,219,183,133,36,114,227,197,130,144,183,143,228,202,254,132,235,185,123,137,148,152,153,167,237,24,207,238,80,11,45,19,129,144,232,9,132,251,85,94,203,42,79,189,218,76,36,32,97,148,213,170,124,65,44,201,33,19,57,248,246,120,177,173,201,78,59,8,214,42,181,0,185,146,185,53,247,59,156,116,18,112,43,6,214,208,54,182,8,179,89,72,73,39,239,86,41,102,174,127,38,185,206,55,159,151,87,16,204,35,22,80,14,55,87,12,162,26,40,233,96,25,5,57,133,80,194,29,19,18,95,159,70,101,236,189,186,154,39,176,111,155,202,8,97,27,28,134,68,69,228,117,197,145,102,250,123,252,34,196,189,218,117,243,34,119,169,61,45,144,211,247,82,112,113,250,230,35,44,216,212,176,172,129,233,254,107,246,73,128,227,229,130,167,161,221,103,146,158,40,23,154,231,116,4,119,63,146,183,65,205,77,53,234,62,127,90,96,118,9,14,117,109,94,47,27,81,206,153,136,115,6,122,21,251,20,178,22,4,24,207,208,37,151,116,179,50,172,18,75,144,141,231,163,174,98,139,249,124,46,154,134,120,117,228,178,216,88,4,254,251,90,136,254,90,206,254,61,91,162,197,58,31,249,131,129,22,107,124,189,28,207,144,21,217,58,7,76,15,104,136,50,94,2,144,94,114,115,145,116,240,29,219,161,255,31,102,251,104,30,242,162,251,210,58,246,184,175,140,118,107,38,148,187,206,50,57,185,116,130,88,157,49,153,177,54,228,76,84,236,52,138,27,157,86,153,147,129,115,78,250,74,140,138,57,34,121,87,88,217,155,176,28,94,122,199,201,224,71,65,185,54,150,157,119,22,18,188,249,41,231,0,52,239,157,120,154,102,135,238,157,113,123,202,49,57,225,177,174,251,158,19,35,233,184,190,117,80,243,72,14,238,74,247,34,188,215,128,142,33,16,64,43,193,223,99,26,34,136,233,110,248,216,193,90,222,135,242,226,10,238,158,106,87,212,10,196,218,8,33,86,36,199,101,6,78,157,47,70,137,246,182,65,240,235,50,192,13,61,77,147,98,152,233,251,0,16,10,147,13,9,50,242,92,25,79,157,253,163,150,14,216,211,21,134,95,23,58,81,61,76,250,158,211,154,170,9,144,53,133,33,137,210,96,235,12,71,7,11,59,143,42,124,163,107,253,7,193,37,77,144,149,222,167,35,56,199,93,189,139,106,0,240,42,105,111,230,111,133,200,10,61,90,85,25,4,81,54,204,180,83,40,15,145,86,8,106,59,143,180,211,99,148,162,104,160,121,66,75,29,47,183,133,54,13,7,170,72,218,212,223,69,229,168,134,230,173,201,156,43,57,80,104,228,223,163,243,31,40,205,129,226,228,76,15,53,197,35,0,177,143,189,220,216,205,228,130,183,186,145,56,71,245,1,137,16,186,90,168,214,138,190,70,89,162,221,95,253,161,2,153,12,1,207,178,221,22,201,237,112,97,245,91,18,66,175,110,250,127,97,7,163,15,4,150,119,254,195,118,77,228,148,10,198,98,63,3,96,15,90,14,23,3,152,189,9,45,203,44,116,234,156,157,209,73,105,203,99,34,211,203,211,156,183,50,187,123,243,160,232,82,48,9,179,189,30,57,119,66,222,166,254,18,80,87,46,251,219,228,21,171,163,86,234,146,159,6,218,176,182,179,162,143,101,101,182,237,47,231,164,253,14,110,42,210,164,194,127,185,192,57,77,47,39,24,197,46,124,252,206,57,197,206,63,190,35,242,172,7,198,186,120,23,68,161,6,18,242,220,77,138,147,131,14,67,23,62,213,73,93,45,15,1,204,76,92,51,92,20,250,7,212,113,30,234,212,73,64,191,215,136,242,149,78,201,34,172,50,227,32,198,242,236,35,213,17,77,210,56,210,111,242,159,78,91,246,58,31,3,187,222,184,38,159,54,8,195,69,226,21,108,211,66,114,99,228,67,125,204,96,215,201,84,3,5,75,132,213,156,131,235,60,233,127,235,86,166,210,108,245,160,96,119,162,223,219,36,0,55,172,48,212,51,124,241,208,214,27,166,26,216,138,43,144,44,113,94,204,221,142,128,17,139,249,206,182,136,37,243,212,34,147,18,153,88,23,150,247,117,195,209,212,218,176,2,41,106,159,109,67,199,137,5,186,78,72,216,104,225,223,205,97,121,36,51,153,175,80,76,11,97,221,50,250,153,75,198,57,27,92,53,45,70,22,15,110,31,124,34,25,211,135,224,78,111,166,220,140,11,132,237,184,148,11,178,170,28,3,7,127,174,187,186,162,54,17,169,43,94,238,78,230,251,118,241,118,184,250,32,29,107,219,59,142,236,102,65,217,183,119,23,39,254,113,209,38,224,7,156,201,20,138,164,88,234,210,240,124,47,102,57,168,115,154,233,177,198,137,35,169,37,20,145,4,43,187,233,159,175,107,80,214,113,41,210,115,241,107,9,126,171,232,129,126,61,174,79,32,34,248,99,216,236,150,74,172,44,39,189,153,154,133,165,7,145,167,38,187,116,140,233,2,152,85,128,232,181,59,61,27,189,153,35,59,125,84,31,140,158,220,141,224,4,107,87,104,214,200,177,255,210,18,151,20,130,213,163,110,177,67,50,179,214,215,27,150,242,140,230,155,177,122,90,81,138,213,222,218,122,71,226,16,110,163,82,233,36,140,33,145,40,252,94,151,79,228,18,183,132,15,29,252,5,172,154,140,195,36,2,20,6,81,229,59,15,157,148,86,240,78,251,89,174,186,51,221,8,91,122,46,248,212,78,20,27,184,98,198,189,63,149,141,5,111,157,97,48,152,217,14,232,237,188,9,58,31,210,102,165,27,184,78,12,6,35,43,140,92,73,227,3,142,137,100,150,1,227,229,63,75,255,139,202,4,0,94,114,122,208,75,42,251,83,203,89,8,79,230,152,7,188,95,55,195,218,130,75,147,38,251,83,199,144,197,248,112,125,103,202,210,189,183,59,241,86,1,237,168,198,60,160,113,154,66,157,43,218,228,41,20,11,113,6,238,227,37,189,196,207,161,219,71,241,231,144,89,198,69,39,162,98,134,173,116,138,121,47,245,206,125,220,155,105,97,86,239,3,251,126,247,52,55,238,37,213,55,184,75,33,138,226,122,123,199,66,22,180,144,195,160,131,54,107,49,20,233,153,202,91,128,77,108,22,202,239,132,247,18,136,121,83,59,245,160,63,136,65,143,95,25,138,192,111,217,53,197,240,13,246,69,6,120,61,132,129,204,71,8,120,45,149,245,127,200,142,27,187,231,92,4,218,68,32,12,197,1,68,25,173,58,226,185,35,231,178,142,89,137,17,44,239,72,136,65,108,48,115,180,26,42,129,78,173,6,235,14,225,155,226,150,251,204,29,190,250,89,44,12,92,160,252,241,35,127,60,171,11,198,223,56,49,212,226,35,150,131,143,45,35,106,87,216,58,231,106,74,247,15,209,60,82,215,157,101,154,52,242,17,86,141,140,228,123,173,145,130,141,45,83,115,231,38,219,202,37,132,6,58,223,241,42,30,220,6,29,13,198,51,18,117,42,75,91,97,115,23,131,33,33,173,243,140,63,198,230,94,126,118,37,200,161,86,203,179,53,175,237,231,176,163,230,127,145,93,189,80,2,245,109,177,30,201,214,143,163,119,5,216,158,194,78,245,32,244,89,3,187,103,144,61,149,218,18,233,59,250,165,83,193,226,22,52,138,184,123,188,164,11,254,20,50,83,119,78,55,132,170,95,248,98,23,60,228,246,166,221,16,250,123,5,192,90,173,17,131,203,26,189,239,227,76,125,17,2,143,74,150,58,208,184,168,90,190,94,48,233,73,117,235,199,80,43,72,100,209,114,155,151,32,183,45,175,162,200,156,188,77,51,105,16,28,192,255,119,169,144,45,25,6,12,205,126,14,177,27,249,198,45,73,55,82,26,53,117,122,160,175,95,106,134,182,114,49,202,80,147,127,192,122,231,28,116,75,42,119,54,32,99,135,225,212,237,162,221,30,85,185,61,229,232,56,134,37,149,155,137,201,2,82,87,76,133,5,67,175,69,242,41,178,98,90,38,155,74,198,13,87,35,169,157,104,170,198,164,160,189,26,206,201,116,51,150,65,88,228,242,219,197,177,87,123,137,194,36,31,249,25,154,49,51,118,212,15,39,119,31,127,228,75,248,253,67,118,18,211,244,24,143,241,146,120,25,183,213,65,82,65,76,17,18,34,22,224,191,41,60,235,245,195,45,132,40,127,196,158,72,250,22,32,196,183,128,95,105,208,101,128,238,37,173,74,80,59,21,36,67,113,112,239,59,34,82,73,96,234,253,213,18,213,210,249,118,69,223,22,101,104,18,79,72,34,56,22,185,242,200,110,146,160,88,178,57,1,102,236,182,248,75,153,27,250,105,88,62,213,205,179,201,156,192,129,125,120,20,114,207,127,198,1,161,43,44,161,200,245,161,48,161,124,104,128,78,228,181,25,0,189,33,56,151,11,231,177,54,67,98,144,81,214,68,4,176,218,252,206,63,139,185,75,142,65,199,227,191,62,234,195,73,199,108,204,19,44,131,92,32,80,198,228,101,221,82,213,99,31,186,89,58,169,238,97,0,169,163,63,28,18,163,146,117,170,46,120,153,186,90,10,96,172,217,195,145,155,8,102,101,105,100,13,62,130,101,0,191,177,206,236,200,224,94,33,115,1,182,166,78,232,236,143,137,71,0,135,130,240,241,125,50,63,182,23,210,29,188,211,41,108,119,203,6,82,192,192,25,232,122,35,92,70,61,96,248,222,155,128,58,123,253,48,151,35,210,222,43,181,79,132,181,209,63,82,123,205,233,174,24,116,234,252,149,84,136,237,44,90,46,136,29,154,142,148,144,157,129,172,95,189,22,242,152,146,182,216,24,101,222,82,252,103,61,141,196,96,32,193,116,182,103,241,132,82,235,113,226,36,126,78,229,4,91,245,133,122,97,209,103,92,121,19,59,182,221,59,57,65,28,152,109,63,70,199,162,218,37,229,9,202,137,122,225,222,248,144,183,41,228,143,227,148,142,151,163,98,149,11,242,138,97,240,131,64,40,219,54,236,78,144,89,221,38,170,196,255,245,131,144,240,7,59,244,191,180,134,69,6,26,165,226,148,188,17,102,46,201,15,105,5,119,202,196,108,126,39,141,215,135,214,6,172,191,67,0,185,87,192,96,224,129,236,109,25,59,109,96,139,120,82,153,24,65,65,24,159,17,3,238,110,165,215,251,105,60,154,124,123,252,121,11,240,20,33,141,253,162,7,89,10,46,152,245,61,121,79,89,215,242,169,8,24,164,95,224,182,47,178,172,93,208,211,73,30,233,91,176,59,235,12,128,94,197,195,204,98,6,236,193,190,144,41,150,73,36,107,127,208,229,254,22,99,114,79,49,9,50,244,71,169,84,247,146,72,191,127,124,186,142,0,223,37,207,67,27,121,7,68,83,237,245,227,76,239,143,194,187,83,90,92,63,246,9,52,32,220,94,145,25,98,172,219,131,251,35,250,147,203,238,183,138,47,142,84,55,63,151,24,135,125,167,252,26,232,138,115,61,87,29,230,240,164,117,163,61,185,83,98,220,114,94,207,61,220,75,128,145,4,207,156,39,121,168,25,201,18,110,140,189,164,231,171,170,30,206,245,12,202,97,51,242,229,55,129,30,238,10,74,146,106,77,5,75,131,186,135,49,48,7,57,81,197,159,62,9,21,127,34,77,224,212,73,128,14,62,42,129,157,201,91,129,206,147,78,231,49,51,123,144,234,83,160,25,37,158,64,180,173,49,230,200,41,145,190,213,231,126,7,195,110,105,71,73,139,52,100,70,33,163,96,194,20,89,101,193,159,32,170,108,152,206,125,194,113,162,117,125,181,113,246,243,142,128,192,135,113,60,140,33,217,204,4,225,135,190,246,127,250,14,19,63,41,119,176,117,246,130,26,140,139,79,216,91,129,22,90,111,163,124,183,78,46,12,98,187,143,246,124,24,120,159,121,75,162,120,71,129,2,13,49,230,252,96,248,199,150,190,207,187,153,124,9,95,112,48,193,149,221,216,214,171,221,145,221,176,17,121,113,2,245,7,13,9,134,212,99,170,167,251,18,112,66,102,49,0,92,123,145,229,70,13,73,143,191,10,1,66,66,11,92,150,73,118,5,1,176,59,253,133,215,4,200,126,206,142,93,187,179,46,196,163,219,144,36,176,90,75,228,201,232,200,64,195,93,56,104,226,52,205,128,172,248,29,232,182,200,163,87,129,23,216,154,71,93,58,243,103,73,110,52,7,252,150,134,111,29,102,142,144,199,230,230,142,93,91,184,82,186,15,178,223,67,242,190,184,203,180,102,215,69,58,55,120,181,178,167,44,204,38,119,13,34,192,63,64,214,128,2,247,103,130,180,224,166,163,253,44,60,0,32,252,112,190,115,37,174,96,190,243,5,173,137,27,42,221,97,109,27,55,15,89,178,153,217,12,212,5,190,26,108,2,129,7,128,205,81,128,128,249,86,119,28,123,81,250,143,50,251,181,192,33,229,217,46,250,20,31,189,210,184,145,168,67,97,116,180,90,238,147,128,140,102,10,79,33,129,35,139,194,215,245,122,243,127,38,76,182,202,173,140,244,133,165,171,181,88,13,237,192,2,137,197,237,13,206,126,4,208,2,89,43,187,238,21,129,186,226,247,152,41,181,107,101,196,233,80,128,232,221,89,7,244,68,185,9,73,49,203,88,215,98,170,253,113,89,51,80,218,155,191,8,52,96,252,135,136,112,182,180,126,200,241,65,0,90,99,131,48,126,4,58,232,142,29,71,184,93,128,12,193,124,48,159,54,103,186,11,83,153,62,83,150,221,157,16,140,53,17,116,44,159,246,242,179,28,218,144,68,178,158,211,59,102,2,234,82,151,175,247,39,51,121,55,245,90,152,170,208,120,54,120,203,127,206,135,130,219,238,250,74,226,252,57,143,116,42,13,60,133,222,89,241,196,32,110,58,25,12,79,27,226,89,255,174,88,233,60,2,150,64,151,20,114,241,226,145,38,187,225,152,107,178,86,109,46,167,213,211,77,202,46,29,22,12,153,250,0,206,180,112,34,54,221,188,110,211,186,0,146,162,170,237,24,17,191,69,218,157,235,69,222,164,102,57,167,90,4,103,12,214,150,232,74,226,235,104,152,211,199,181,69,51,92,162,196,219,101,151,4,79,132,235,144,238,174,114,108,60,167,47,136,100,85,189,216,4,62,178,24,23,144,174,47,131,28,55,52,45,226,68,165,179,186,13,25,74,119,140,122,74,83,197,14,211,142,237,253,21,189,82,133,255,169,70,142,224,161,80,187,129,251,59,143,147,22,149,24,230,23,106,228,89,245,234,175,167,129,197,4,236,131,217,96,153,235,207,137,37,75,182,38,28,199,251,240,148,208,246,110,163,229,178,66,157,142,59,236,140,42,123,193,124,215,230,244,63,3,222,71,46,81,5,244,250,12,29,180,22,63,253,12,107,41,249,226,110,143,207,185,73,101,36,121,73,6,172,216,77,187,137,235,118,45,45,131,164,206,27,233,204,187,60,86,103,56,205,166,104,203,29,166,180,225,62,203,25,9,47,165,216,31,150,238,89,190,240,14,100,123,251,85,132,196,184,71,40,239,64,81,150,182,3,117,36,25,238,18,205,112,142,183,70,158,172,32,198,167,98,195,110,236,241,60,185,246,40,130,211,43,207,176,146,157,148,245,46,247,66,148,251,119,112,120,186,125,56,74,1,46,107,5,187,3,85,36,22,129,153,252,72,235,5,223,203,69,192,190,163,58,187,66,54,126,108,134,56,143,220,179,190,24,191,115,126,152,241,20,109,41,168,40,55,245,249,203,127,17,48,154,110,95,92,168,43,105,91,148,26,89,203,35,109,180,29,173,58,150,44,172,196,247,174,105,96,65,118,182,61,164,22,186,199,31,6,104,138,109,13,206,188,43,101,64,26,77,122,100,73,215,81,136,86,11,104,231,212,237,83,131,33,156,51,6,47,133,240,216,27,163,108,221,194,135,190,176,135,238,253,247,145,217,44,179,34,85,181,63,222,3,160,64,128,207,78,241,249,66,219,67,46,180,8,25,161,204,5,213,183,133,213,95,156,153,145,128,135,190,104,73,255,2,113,160,20,36,170,14,88,255,137,203,240,189,149,42,80,186,107,252,145,143,198,8,67,209,117,29,117,67,236,176,197,63,226,85,7,239,51,183,70,105,186,27,209,214,44,149,55,74,153,175,50,236,46,154,253,233,84,143,107,154,247,83,117,199,136,115,229,228,133,122,91,19,103,106,157,91,91,209,246,241,69,79,72,69,26,123,133,117,75,253,98,86,109,238,18,96,212,66,92,38,166,1,120,184,232,248,185,57,59,188,4,0,73,231,104,178,247,69,44,150,235,138,158,122,150,247,59,242,202,173,131,108,152,28,52,109,63,237,160,66,42,40,251,248,154,0,169,154,240,52,207,13,93,88,210,65,238,143,79,73,89,155,43,61,105,22,217,219,218,182,164,56,244,71,255,156,20,195,228,230,129,154,253,4,240,189,50,11,146,80,102,252,40,89,235,230,67,173,212,72,246,164,230,210,159,36,138,245,44,208,207,250,254,191,5,206,180,236,70,121,212,242,216,13,103,25,233,217,226,52,36,41,207,186,209,157,248,29,163,218,93,149,237,238,214,82,33,94,52,108,173,111,70,181,136,216,228,129,159,36,114,39,72,145,242,23,219,126,215,137,77,159,27,250,220,75,141,215,236,157,89,135,11,231,159,94,8,36,175,176,181,62,18,224,242,121,74,5,224,11,228,114,195,173,181,95,74,128,52,134,120,116,14,153,36,248,72,223,126,218,38,187,234,115,129,200,105,36,44,210,143,41,82,154,53,244,11,20,60,95,111,173,62,74,63,37,183,14,83,196,133,82,159,192,239,19,177,159,53,235,68,55,70,116,56,220,27,97,202,164,52,175,162,90,68,156,238,139,25,142,199,207,74,33,233,86,112,245,172,13,213,77,250,224,212,99,155,97,106,129,178,225,131,236,99,28,60,144,59,17,87,96,162,86,236,229,18,135,195,86,145,144,169,233,92,148,54,138,140,255,246,102,26,70,247,113,67,102,98,235,114,171,180,32,55,66,136,179,212,89,188,80,134,207,230,209,92,233,65,219,150,85,104,64,251,201,109,164,119,197,154,21,72,213,209,236,30,123,191,218,104,59,119,31,42,159,180,109,215,186,240,23,2,201,88,244,48,13,122,234,54,8,251,10,165,86,98,209,18,119,47,215,109,30,181,179,138,42,45,132,150,233,184,48,144,45,120,2,254,53,179,52,180,116,155,59,162,110,197,139,47,53,69,116,174,168,244,215,101,59,206,153,25,141,47,155,6,187,129,164,247,86,184,229,137,202,197,125,114,7,48,162,23,193,89,135,181,158,229,77,39,170,65,107,182,238,81,250,168,220,113,203,7,164,218,181,242,164,100,11,130,97,219,28,173,115,131,78,147,44,102,228,18,121,5,170,234,231,153,67,36,54,220,34,133,125,12,96,209,217,7,91,28,231,129,137,229,47,82,157,237,129,248,127,120,25,59,22,105,23,56,151,215,154,3,151,151,89,90,96,43,106,72,59,73,0,23,162,135,89,249,34,226,85,29,40,222,155,25,93,129,164,188,241,216,204,27,36,51,192,96,42,122,167,168,210,142,136,255,159,242,172,181,199,118,229,84,124,155,239,10,129,68,254,233,199,53,41,70,49,1,199,207,25,14,100,28,227,224,88,42,5,150,253,218,44,211,168,32,187,55,134,0,129,37,165,194,118,66,77,11,188,165,127,196,233,241,58,98,43,149,165,241,45,47,57,123,247,22,207,2,249,129,224,114,227,235,211,47,0,144,210,120,136,91,245,25,6,123,158,41,159,233,238,18,86,195,204,173,99,155,177,166,10,24,183,3,49,186,75,116,176,152,254,167,3,106,207,104,216,109,35,12,111,251,9,179,26,139,44,230,164,162,112,124,199,147,195,59,10,59,236,184,26,199,147,75,224,134,0,186,58,245,151,189,32,69,228,108,181,217,185,52,253,227,204,182,38,80,199,135,133,177,185,0,247,54,124,215,187,215,49,41,191,254,205,251,88,186,80,151,240,137,33,232,20,154,206,28,224,25,249,152,242,165,243,247,205,129,33,151,17,7,185,27,18,94,205,80,26,213,189,39,4,183,142,94,129,36,243,252,202,61,233,97,190,164,57,247,37,232,197,230,157,185,110,153,56,129,173,33,204,158,10,75,44,252,145,12,134,226,131,155,15,50,183,151,225,111,123,69,113,136,17,42,184,59,148,134,150,253,117,4,125,242,18,192,116,102,127,225,161,218,109,131,125,126,197,221,41,140,244,0,17,58,52,145,245,224,217,175,1,22,157,188,240,242,54,194,113,92,197,164,138,19,55,177,30,156,175,6,55,2,8,174,255,107,212,22,103,59,230,23,175,21,198,106,144,201,61,123,203,203,108,57,199,74,25,30,118,122,226,119,19,168,238,27,246,184,140,211,16,155,182,251,220,133,97,36,49,129,104,145,157,241,117,237,64,16,47,8,199,79,104,221,199,30,138,241,49,201,209,147,80,209,254,219,84,93,57,108,227,61,228,199,230,131,188,173,60,214,63,32,117,38,80,242,177,71,190,197,27,207,154,63,14,234,26,79,44,2,5,8,219,95,175,138,6,218,155,162,214,187,176,140,193,98,171,111,112,240,222,207,69,159,88,148,231,96,33,97,145,66,66,49,190,213,85,31,243,21,83,51,248,143,61,249,111,224,58,247,174,65,218,142,74,228,16,12,19,115,9,226,97,10,173,169,19,96,130,26,202,48,158,110,153,32,229,142,129,181,229,94,119,242,105,127,57,160,89,18,119,0,253,223,49,32,17,241,159,148,248,189,171,205,247,163,131,102,97,70,87,165,123,176,170,1,132,41,183,188,104,107,31,68,182,187,76,2,6,234,79,46,180,64,4,174,232,16,189,217,31,27,143,250,166,43,243,180,137,213,70,152,241,133,241,93,97,75,56,83,34,78,210,77,227,170,126,157,64,114,252,173,155,9,136,167,148,248,22,7,240,219,42,226,67,97,98,218,99,87,137,227,59,152,182,181,162,109,101,200,112,142,159,153,172,141,155,70,41,225,105,23,14,79,96,190,87,184,105,240,72,23,150,2,112,181,250,254,104,116,78,56,3,212,124,150,162,116,85,38,250,94,52,49,71,138,223,105,171,48,181,144,117,112,169,129,64,128,176,61,129,16,115,111,134,115,141,152,198,198,89,36,15,37,230,137,251,25,122,10,231,208,63,78,15,183,46,134,196,53,60,250,68,210,68,137,212,21,33,93,146,160,124,55,57,10,235,67,68,196,167,14,0,41,45,204,179,103,50,21,146,154,54,185,103,123,38,9,63,168,229,177,54,110,113,92,29,121,31,98,92,24,175,173,206,49,188,45,150,73,106,104,239,50,64,202,145,172,62,43,205,190,254,49,113,203,6,201,3,122,117,241,90,185,211,177,145,250,3,36,220,149,62,24,232,200,53,248,118,145,240,51,242,138,218,190,21,54,181,221,240,84,57,246,46,91,21,216,169,52,210,62,78,44,170,133,8,98,164,174,91,184,41,19,22,1,98,249,91,181,12,188,88,233,202,149,19,7,172,87,167,232,113,151,169,40,168,142,47,236,66,254,42,54,129,202,57,55,117,252,15,57,42,64,98,177,246,64,158,54,205,69,165,251,217,36,74,83,88,248,35,86,10,179,3,135,66,104,21,90,225,132,126,66,17,83,55,137,167,123,33,164,181,184,251,91,238,119,12,76,221,235,136,243,65,241,90,9,5,171,223,90,200,56,80,196,100,250,89,96,78,192,52,43,45,234,0,39,64,135,82,91,127,235,10,3,131,24,176,230,246,139,136,199,97,182,191,42,44,18,177,174,199,3,145,180,201,89,8,63,76,218,45,143,51,85,82,26,138,210,113,239,147,143,246,100,252,128,100,18,90,176,120,14,74,24,92,30,128,4,0,31,210,213,19,172,158,27,24,128,164,198,98,238,95,233,238,127,13,29,152,19,242,214,226,2,113,96,223,15,41,44,71,224,102,174,176,237,208,58,22,62,131,88,69,18,192,225,205,40,221,206,149,166,55,214,52,251,219,163,122,41,35,156,205,184,162,84,79,24,90,115,61,173,65,113,179,90,105,211,216,115,92,217,20,218,37,126,85,91,172,246,59,109,159,220,8,143,155,182,237,169,215,158,231,102,64,63,124,209,215,82,125,138,202,145,107,13,120,152,75,141,79,62,70,221,15,138,216,61,21,55,53,254,149,99,8,194,152,127,255,39,198,88,233,150,92,208,189,18,78,62,62,86,198,203,19,36,179,12,243,27,100,44,200,6,105,171,186,94,201,107,15,227,255,185,103,29,146,172,153,107,14,82,184,207,43,32,16,100,131,107,9,12,78,196,141,19,202,23,118,235,17,137,189,131,44,215,25,34,155,98,82,216,209,207,59,188,95,75,250,82,100,134,76,212,8,160,141,207,220,47,203,32,73,197,202,198,165,76,127,84,166,23,97,136,213,82,19,18,129,199,85,164,180,248,164,84,63,247,114,64,139,147,5,254,40,250,174,151,79,90,174,96,107,34,59,178,223,131,107,46,9,231,19,52,129,79,101,25,100,155,140,66,153,147,168,173,122,235,58,25,180,254,105,43,239,169,45,150,68,22,132,230,79,242,59,214,97,96,211,27,15,65,1,224,200,238,70,222,140,5,76,250,83,11,245,34,117,61,65,108,207,220,37,137,53,197,99,181,201,99,114,102,213,245,32,173,38,190,34,179,116,199,59,78,9,97,98,47,222,1,182,105,51,25,200,188,47,129,31,119,19,119,45,192,197,136,155,246,138,245,163,231,111,143,107,107,78,117,17,83,123,57,15,135,131,104,191,65,139,124,217,95,234,124,25,136,24,132,174,101,24,2,116,224,233,128,176,55,185,207,104,54,9,242,76,34,212,155,95,102,243,131,148,182,138,80,149,69,172,37,33,250,105,16,15,241,155,73,118,248,39,75,166,32,158,29,72,143,252,242,248,237,202,174,255,121,15,27,255,177,119,158,3,1,16,173,171,202,187,55,62,114,105,191,176,251,138,138,89,12,197,54,134,24,218,2,41,238,13,235,96,15,112,89,222,176,148,104,9,3,23,123,98,204,26,36,191,166,112,101,228,30,36,177,117,75,74,194,62,89,244,86,33,223,251,171,187,131,16,148,15,117,212,8,8,38,113,220,246,182,18,181,4,211,192,16,15,182,177,147,28,71,26,251,125,65,56,170,185,31,112,178,141,202,163,42,138,32,163,5,58,124,107,175,210,147,175,2,15,252,244,62,151,87,143,112,19,202,219,97,50,41,133,138,229,111,10,73,26,9,31,108,9,11,130,201,249,136,138,131,49,58,214,198,127,111,170,243,127,83,221,189,246,140,118,44,243,2,18,7,174,76,51,175,226,94,7,221,243,65,39,213,18,60,167,203,69,204,60,169,205,228,21,197,32,89,194,57,3,115,253,59,67,161,120,200,111,154,50,198,90,245,23,196,58,35,248,123,76,20,209,173,59,22,239,254,162,67,6,91,221,168,117,19,35,52,72,29,104,36,91,182,197,39,32,127,83,178,1,238,212,245,78,244,128,174,5,166,81,108,73,122,115,130,33,216,89,178,120,83,73,120,3,41,69,83,18,248,6,117,84,45,109,229,161,98,230,98,107,130,1,30,26,49,48,194,142,77,108,102,190,29,12,227,14,58,240,80,75,203,198,62,73,86,78,38,167,193,93,232,133,176,7,41,133,103,184,131,180,121,113,232,165,143,241,202,219,209,122,220,58,3,25,126,202,47,75,247,155,92,205,163,186,216,222,65,179,7,168,8,221,181,148,107,97,59,246,100,127,237,10,255,31,51,251,181,134,135,221,203,42,113,103,55,71,55,50,70,156,3,4,156,231,79,183,163,92,11,114,207,177,37,206,207,243,158,247,191,148,135,51,215,115,120,16,88,197,242,193,192,52,38,66,63,98,62,31,252,47,202,7,76,51,16,212,127,229,102,38,160,145,65,155,155,21,107,30,21,165,29,173,228,173,251,170,31,32,76,80,183,84,63,158,51,18,9,223,51,183,64,106,128,12,227,129,247,61,92,217,176,133,77,200,68,92,218,233,136,105,190,21,127,192,168,20,188,76,222,91,68,162,38,249,120,98,104,208,80,74,91,88,172,4,90,32,249,84,66,94,108,205,209,67,218,253,48,136,149,109,155,182,117,221,213,238,38,249,151,51,162,28,221,112,13,43,105,161,176,200,110,82,95,154,1,122,52,161,138,13,246,207,51,242,235,46,145,117,153,244,64,175,250,119,54,238,52,97,202,237,131,239,102,254,50,112,57,144,202,239,249,207,68,223,209,32,76,147,242,138,141,250,216,10,42,100,86,152,120,222,245,134,87,78,234,103,200,240,19,29,77,208,56,238,83,120,255,95,213,81,76,208,104,73,168,64,182,200,233,28,99,165,11,198,207,146,89,243,244,144,115,127,141,78,244,147,242,22,12,158,242,153,255,152,56,140,39,76,158,123,56,95,181,240,69,34,92,148,187,243,204,73,118,117,196,92,117,223,74,123,88,220,175,172,44,14,72,89,23,114,151,43,47,96,125,190,237,12,215,178,105,221,105,43,180,251,238,120,31,45,13,214,49,239,116,98,57,191,204,124,97,220,209,184,88,107,206,209,42,78,26,119,101,178,49,70,135,101,124,230,86,87,179,55,72,130,111,34,97,160,217,7,41,67,174,14,175,41,66,22,102,155,88,61,39,59,62,9,60,148,241,197,161,40,184,19,121,28,13,183,147,224,23,85,107,156,255,219,132,207,43,197,35,176,119,61,124,89,84,163,215,180,228,57,236,102,201,218,132,89,252,125,90,158,106,231,246,91,132,17,168,29,195,108,190,3,18,156,71,93,63,42,144,150,230,141,164,211,174,29,188,133,137,61,40,228,131,134,1,112,152,73,55,122,178,178,2,135,5,199,172,19,0,121,127,22,197,234,241,44,27,171,237,94,205,5,147,105,171,50,111,229,163,70,67,16,176,139,160,12,146,255,231,20,195,185,82,40,35,27,130,158,120,245,215,87,200,9,62,63,142,44,41,253,213,57,92,93,172,147,15,123,137,44,105,196,34,12,227,145,97,166,17,74,217,250,79,117,21,39,170,1,254,118,5,87,80,72,131,82,56,3,0,39,255,187,178,239,212,188,210,32,187,123,211,148,88,162,161,20,30,120,113,6,55,8,198,116,81,135,65,23,154,201,57,142,54,227,154,142,229,173,86,239,117,116,119,92,62,44,149,160,185,46,92,199,14,117,188,208,88,211,4,9,244,49,52,153,92,143,124,17,166,19,253,128,171,63,99,41,158,170,195,68,18,209,98,169,211,134,243,233,109,152,162,231,20,206,166,13,168,158,210,144,105,59,125,167,139,146,175,189,156,7,22,42,3,112,98,151,143,115,169,100,187,64,170,111,36,252,240,68,36,92,220,13,129,137,81,211,104,64,21,21,46,238,191,110,1,196,196,246,216,82,82,161,234,40,4,24,2,252,60,195,198,30,31,123,182,6,87,119,235,196,199,71,126,137,154,90,245,16,130,71,74,218,220,153,142,202,202,125,20,226,104,198,227,14,203,102,54,69,254,163,91,111,54,137,235,251,92,162,161,196,77,122,221,77,13,210,2,40,159,51,173,223,226,13,72,153,46,157,105,98,186,38,54,182,195,200,36,189,99,107,11,55,26,159,177,229,170,196,60,35,224,168,213,31,150,237,246,78,241,102,11,167,237,129,27,163,126,212,40,14,195,224,159,104,125,199,135,49,26,216,204,58,205,125,244,65,192,175,51,134,50,102,250,12,202,52,243,0,116,109,57,232,196,94,225,18,10,29,219,31,185,85,227,207,135,71,175,124,54,16,38,203,86,16,238,196,62,188,221,209,82,123,220,226,62,94,223,69,152,241,96,41,80,5,203,75,230,226,28,235,160,116,148,193,2,52,247,130,242,110,227,5,90,51,80,173,80,51,12,125,65,90,128,72,134,233,239,110,132,174,223,38,37,162,122,194,67,199,225,191,29,60,166,151,53,15,136,27,137,225,9,107,95,73,73,94,9,225,118,83,189,162,142,202,186,126,183,216,10,53,187,152,66,119,247,59,52,223,209,142,50,34,189,201,118,161,142,0,53,215,51,177,157,167,235,33,233,106,7,65,132,71,254,221,39,55,12,44,126,227,77,163,242,247,64,135,185,153,35,200,192,238,94,28,222,12,54,29,65,143,58,169,74,27,191,209,225,137,102,150,255,50,123,190,176,6,216,126,249,103,198,90,199,199,237,181,191,196,165,177,162,30,9,138,173,204,245,115,32,73,167,220,63,37,212,31,212,60,239,194,254,28,254,68,201,65,26,172,27,60,81,199,95,142,118,54,75,180,1,237,211,72,252,96,226,194,172,3,114,77,184,53,41,67,1,62,215,93,181,164,39,21,253,13,187,56,214,246,214,16,80,248,96,158,228,205,132,205,166,210,92,23,101,122,97,171,39,70,30,51,244,41,148,76,83,185,88,191,222,241,180,162,166,43,170,51,94,146,42,1,112,7,205,142,56,92,153,180,49,171,19,182,124,205,193,211,35,204,70,48,168,188,221,45,215,50,141,145,44,158,208,223,40,123,93,107,230,100,70,203,10,160,194,98,164,13,63,167,103,21,205,167,79,25,211,90,92,251,165,80,60,142,248,107,213,203,217,10,170,197,44,4,27,81,73,17,171,37,211,47,171,76,79,151,22,199,79,86,86,105,73,156,47,221,242,207,221,113,189,203,174,86,207,9,118,133,182,107,117,184,20,190,154,14,198,58,177,230,71,37,225,149,184,42,60,171,198,19,225,243,108,254,101,2,162,179,17,87,20,246,118,244,120,162,117,150,62,159,102,81,79,209,175,51,167,36,165,212,101,136,24,59,142,48,75,79,12,61,149,194,9,81,82,172,53,86,56,150,125,157,147,52,137,252,26,254,154,61,76,141,253,107,13,17,85,235,25,143,175,5,190,93,228,181,63,132,118,148,104,110,14,81,189,184,232,209,24,249,136,78,173,47,39,34,213,32,186,219,107,0,150,63,30,94,213,53,127,229,5,226,191,89,163,132,186,111,39,172,116,101,112,38,16,102,55,180,78,221,158,20,139,218,184,203,74,155,158,231,84,22,136,88,198,68,236,99,71,89,200,86,7,180,8,1,233,218,227,176,27,120,235,15,101,118,144,60,18,125,181,147,125,14,104,232,24,82,51,96,105,93,67,20,24,133,107,53,69,54,208,161,1,207,161,189,159,214,156,234,33,44,1,26,93,195,103,177,126,30,11,62,220,50,250,254,88,209,195,8,111,55,252,188,125,251,94,25,173,60,174,200,14,209,208,106,151,158,177,10,249,49,243,122,152,195,206,21,8,252,123,140,201,77,22,37,208,109,203,150,30,141,33,249,58,254,243,172,113,1,16,38,205,248,98,219,137,86,247,30,59,59,97,99,117,218,91,166,107,112,30,223,172,224,200,187,230,229,31,155,153,26,238,71,105,217,230,23,253,96,254,47,185,48,147,247,241,112,229,204,182,176,161,169,177,200,85,33,15,150,255,32,80,181,231,71,104,199,101,30,206,111,206,194,162,166,36,121,121,237,187,101,209,115,90,5,123,232,38,130,220,202,22,177,144,105,248,181,92,236,223,249,71,83,105,248,176,193,204,59,252,69,173,138,5,109,214,101,238,34,199,162,79,12,140,170,151,38,111,147,233,240,221,41,94,181,249,125,222,116,77,82,138,247,153,88,94,237,33,111,211,1,32,7,170,57,43,255,51,203,2,107,254,192,172,7,45,65,65,252,168,12,21,235,43,45,48,74,183,205,5,63,82,38,54,40,185,143,212,115,218,147,65,95,98,139,77,0,119,122,112,187,65,32,165,209,109,70,154,32,206,61,4,164,193,210,222,132,199,227,222,20,212,224,162,73,22,127,50,9,207,123,118,187,156,60,196,109,164,214,199,99,37,80,226,98,105,60,212,81,183,18,220,1,200,137,97,154,8,60,124,55,182,41,237,241,47,196,180,42,35,29,197,6,21,138,160,200,58,28,228,125,221,169,1,121,74,161,233,193,151,74,248,24,239,90,25,196,247,63,137,136,3,70,79,214,124,138,27,240,203,178,190,213,22,30,156,202,18,48,25,145,208,87,229,233,63,85,120,135,140,152,81,128,43,228,255,158,69,110,1,95,23,50,211,60,210,198,5,134,92,144,105,239,196,181,247,2,226,106,85,108,98,212,117,73,100,60,94,62,81,246,13,97,228,136,57,74,193,180,5,160,204,48,145,168,193,43,34,68,236,39,11,178,166,197,166,15,67,11,41,88,41,104,210,246,92,251,155,106,210,146,28,253,125,94,189,188,51,44,253,86,138,222,197,79,97,0,106,221,13,100,124,83,255,59,211,160,197,72,152,72,197,252,238,192,188,104,149,220,106,58,140,253,100,201,81,99,171,181,248,172,5,56,168,128,141,25,230,27,40,250,120,250,26,226,38,180,143,56,253,196,187,56,197,38,93,167,115,36,190,5,115,191,134,155,165,227,96,228,10,113,8,154,28,140,109,61,170,46,236,114,7,203,105,70,126,234,179,114,66,137,45,140,213,181,237,179,242,247,176,17,217,21,192,232,188,3,198,223,4,153,234,255,182,181,198,65,128,106,202,73,36,96,135,192,56,173,38,69,58,242,170,57,82,242,43,206,131,5,106,14,183,245,115,142,193,181,99,196,213,122,194,142,234,8,196,228,34,114,190,182,10,8,190,208,109,58,128,175,144,69,169,214,236,39,226,101,194,100,178,127,146,230,46,226,67,212,219,177,98,58,21,255,93,60,120,216,159,189,60,150,46,49,169,183,94,119,235,29,116,181,98,78,43,234,20,199,123,130,94,150,50,37,66,104,50,206,165,47,199,84,87,85,168,112,30,92,200,234,12,20,132,237,207,252,112,60,118,98,227,9,197,6,115,6,17,163,171,254,135,203,29,169,234,50,233,90,218,157,172,2,2,128,126,148,104,4,97,185,202,46,79,216,163,3,186,68,240,243,222,79,230,70,28,106,111,156,87,37,23,162,29,184,40,217,42,0,72,195,105,241,59,10,206,91,120,219,76,22,251,227,212,86,59,96,105,154,35,158,61,28,118,49,234,174,15,39,68,127,100,128,56,199,54,144,168,235,231,186,37,108,144,191,5,28,198,15,166,88,0,1,110,245,174,113,195,66,194,64,23,149,99,179,250,40,190,115,160,49,201,239,244,179,48,174,41,89,158,94,217,90,245,136,57,55,130,3,54,235,96,39,154,38,131,107,17,122,146,207,222,223,122,32,75,115,173,255,174,249,177,98,172,95,25,73,138,195,53,166,244,217,169,10,54,28,169,119,90,79,184,187,243,188,112,65,245,193,52,231,191,11,149,210,129,44,119,47,216,122,173,161,25,38,245,91,243,138,11,211,216,60,123,235,217,171,157,20,218,255,54,58,42,56,163,238,250,105,220,160,152,194,80,104,213,67,70,105,238,97,41,121,223,56,136,255,46,3,143,35,84,178,227,73,207,191,191,183,244,14,169,71,142,209,184,11,145,27,54,66,113,199,250,165,250,191,207,188,148,249,252,222,231,235,2,46,207,199,113,226,122,82,49,28,1,26,210,239,98,176,186,144,66,250,74,217,83,14,66,74,92,50,214,86,134,94,128,235,154,133,34,77,31,65,190,9,82,176,108,98,104,128,207,206,103,178,114,241,79,165,23,76,2,67,216,167,118,230,216,4,30,231,123,113,210,114,156,13,51,221,167,249,179,93,199,70,58,62,208,246,16,196,255,114,109,132,86,205,136,218,186,94,250,223,46,89,29,103,233,220,180,253,77,69,117,121,92,26,34,126,233,210,152,191,77,46,4,182,225,245,216,195,181,106,169,143,234,170,15,79,120,108,21,216,35,105,18,109,253,127,132,74,246,98,251,98,175,110,0,211,159,124,91,174,213,73,95,14,102,129,92,190,157,255,130,79,190,74,208,210,163,55,210,77,145,117,4,141,5,53,129,215,33,106,172,186,144,171,13,215,95,88,168,174,76,45,68,241,33,36,35,171,29,0,208,41,25,80,171,4,172,52,28,22,239,102,147,164,196,206,142,92,165,167,37,220,103,216,231,162,187,123,115,234,222,100,228,215,32,216,203,167,1,182,233,186,41,45,196,247,72,190,20,186,35,144,178,145,228,75,153,12,160,72,101,247,84,52,240,148,133,170,52,79,46,134,211,6,40,158,144,148,42,202,248,74,230,104,110,235,6,161,125,72,222,72,248,136,165,9,87,249,177,24,168,167,242,130,244,104,169,225,0,44,181,160,111,183,78,96,152,72,116,233,243,67,99,210,232,197,229,99,127,126,24,66,52,74,187,191,160,53,106,200,25,245,173,141,46,146,191,236,169,29,62,121,141,122,40,170,8,108,59,25,240,210,244,138,151,208,35,52,8,56,219,165,5,85,12,179,142,126,127,37,113,84,161,240,73,143,63,200,150,53,159,60,51,108,96,169,164,255,215,187,81,142,92,81,145,3,176,47,132,15,176,96,145,109,14,45,137,51,185,100,46,125,168,214,193,175,27,225,253,213,208,2,63,151,223,201,214,148,242,232,203,145,164,82,137,192,27,70,244,148,21,69,42,111,91,57,131,6,125,230,151,210,39,206,84,120,96,245,22,143,107,101,156,38,103,6,159,204,208,17,111,169,2,139,156,166,220,186,129,118,110,131,245,28,148,170,82,186,152,200,223,252,205,239,35,162,171,218,28,169,245,41,141,195,154,149,45,209,11,147,178,67,52,54,188,10,19,133,140,140,62,46,211,75,159,6,0,160,150,135,22,124,66,21,206,115,72,67,209,162,77,143,18,125,77,205,53,51,234,211,209,103,211,61,87,235,58,185,226,144,131,88,54,58,159,61,241,84,87,27,217,189,78,144,202,244,42,0,143,76,33,138,125,176,150,71,112,163,112,0,124,76,147,1,39,29,161,137,25,31,187,139,179,242,137,77,12,205,213,180,68,175,228,160,165,239,71,253,141,40,5,131,251,47,181,148,176,70,190,250,228,0,128,61,103,66,156,141,21,245,115,174,24,209,140,16,172,251,192,29,249,17,64,179,150,111,5,180,224,109,30,63,7,66,184,168,171,77,39,74,166,129,167,209,45,53,191,36,233,250,196,140,112,53,83,91,224,212,25,188,154,32,123,119,57,97,100,115,56,130,115,246,72,37,156,14,165,156,117,109,12,225,86,49,246,155,144,244,49,189,35,253,143,229,150,0,45,171,171,199,245,110,50,159,83,106,113,210,137,81,235,82,139,114,33,94,163,87,119,90,42,198,147,152,139,107,34,195,252,163,33,85,42,220,32,147,28,180,219,73,113,217,236,36,210,116,0,70,70,98,122,161,193,32,14,38,37,255,150,33,156,204,225,161,42,141,105,239,209,231,52,19,33,15,145,72,52,232,77,109,237,141,233,109,3,245,140,73,98,23,167,183,47,177,0,89,5,231,202,103,126,9,71,52,61,54,220,23,134,134,177,254,222,228,196,181,179,80,242,32,190,142,5,213,76,57,157,134,190,50,239,17,33,189,93,91,28,165,187,17,144,19,223,182,175,249,78,107,92,170,81,227,220,26,14,172,149,77,117,47,243,179,18,81,205,23,151,108,121,139,253,203,107,91,250,26,74,68,157,234,164,47,247,26,197,179,151,219,219,100,171,154,154,120,247,85,160,20,202,68,163,162,130,64,199,8,61,167,22,231,169,71,80,140,5,26,75,112,2,71,13,210,155,101,55,10,31,224,49,27,95,170,207,218,110,167,34,151,236,122,164,44,48,94,7,152,46,94,173,111,207,90,101,9,16,1,115,92,177,208,119,200,197,213,100,58,176,134,130,158,106,242,93,165,123,55,71,153,10,97,139,152,162,139,163,149,124,149,63,249,154,219,81,185,171,210,77,183,135,218,133,176,48,237,100,36,227,107,135,56,75,169,27,245,68,91,94,50,53,181,243,56,57,134,196,19,203,242,131,15,69,3,95,209,40,45,198,246,192,144,38,190,232,28,194,211,91,187,134,90,19,103,23,88,212,195,184,71,132,249,82,162,66,68,34,57,115,142,234,37,207,169,155,193,142,196,209,53,197,53,114,137,83,61,203,34,95,213,171,51,77,183,189,127,201,57,100,70,156,74,6,55,101,193,127,110,2,153,56,152,230,57,182,243,199,35,207,187,5,0,151,167,58,249,148,47,77,60,17,235,161,123,41,75,86,11,206,25,62,46,57,183,160,23,245,77,133,146,214,53,32,229,40,245,89,87,142,110,149,0,126,246,230,190,59,223,124,71,12,24,115,233,88,52,46,202,185,47,2,174,66,180,5,83,239,180,235,79,89,142,200,202,113,173,38,234,26,23,70,81,65,35,113,230,203,186,213,130,150,199,58,18,99,20,193,188,36,120,124,249,76,116,115,70,182,112,67,39,115,185,154,135,196,159,40,32,177,30,161,255,173,100,163,89,41,130,233,46,145,225,184,140,50,83,120,246,221,109,207,168,231,183,58,66,54,37,94,233,33,180,121,160,26,246,34,155,206,246,91,10,242,202,124,76,177,94,197,248,253,164,209,167,215,66,247,185,28,104,170,97,248,122,134,73,147,142,139,169,42,75,117,201,63,129,9,179,119,142,226,35,146,95,129,25,23,92,190,171,144,38,64,183,80,216,194,48,8,242,60,12,16,150,19,53,184,7,207,131,48,253,65,142,37,225,132,143,205,141,13,177,132,24,17,179,176,57,29,57,235,86,107,122,184,194,82,96,157,19,78,183,146,186,54,34,230,48,75,95,231,89,179,34,72,223,157,218,132,42,160,8,109,54,140,200,71,136,43,29,15,149,22,181,182,170,221,193,168,32,180,134,175,52,136,114,73,178,81,231,141,62,210,133,101,116,199,178,184,28,170,111,204,113,219,52,162,204,252,38,175,177,189,18,103,242,173,177,66,156,77,147,75,16,203,253,56,34,161,221,197,138,231,95,177,76,54,23,142,245,174,4,7,225,187,153,228,103,116,23,186,127,230,229,252,185,230,244,45,195,244,111,117,0,98,144,106,185,72,224,214,150,24,139,25,225,6,16,168,171,223,40,115,156,78,104,57,175,243,72,50,25,243,178,221,220,170,157,0,246,122,251,241,187,111,29,250,7,165,42,133,40,231,245,151,193,186,105,72,123,10,155,19,106,253,215,224,204,37,43,14,87,133,236,193,254,12,171,207,185,144,109,185,50,169,167,102,137,209,98,24,214,149,63,12,55,72,218,238,205,111,247,165,229,133,171,52,98,14,27,7,219,124,29,102,79,241,118,244,77,54,33,54,211,111,11,7,240,161,89,99,93,63,227,21,237,118,16,197,5,185,106,242,196,237,37,246,19,223,196,63,238,57,29,37,67,46,107,138,161,239,114,176,143,45,70,199,196,132,143,50,123,85,169,95,234,131,121,217,43,179,208,217,215,118,183,8,236,166,235,3,155,69,160,181,100,74,122,157,109,4,207,221,76,19,246,92,130,96,29,125,124,238,116,44,76,241,248,229,234,18,193,12,238,81,240,65,7,6,199,171,159,4,231,209,184,129,5,166,155,72,179,160,69,243,29,54,223,184,243,83,172,47,214,58,173,21,102,231,109,36,117,183,202,180,152,109,224,141,149,1,240,250,160,65,179,210,120,169,207,99,118,170,137,149,192,176,57,48,253,235,139,203,170,29,122,173,52,154,49,223,29,82,89,147,27,84,104,141,149,203,54,228,224,64,65,249,122,114,109,39,8,72,142,214,219,227,30,146,103,201,70,96,138,231,72,40,200,239,75,163,64,35,232,78,168,34,187,204,171,25,99,32,77,89,145,154,130,153,202,233,136,20,47,66,112,132,233,182,50,155,40,58,93,187,74,108,105,154,148,6,12,90,214,94,187,175,68,157,44,234,13,203,156,153,102,250,166,57,126,143,153,106,223,170,252,42,175,91,43,147,182,127,65,45,37,77,64,141,36,46,28,199,200,47,198,24,148,118,136,52,46,130,91,172,110,58,32,96,132,80,214,49,42,197,140,140,94,192,45,1,9,52,187,42,146,50,217,31,228,86,131,108,21,190,3,197,6,107,87,229,24,174,167,236,9,208,74,49,80,140,109,12,34,183,254,227,77,119,146,34,1,101,133,1,163,9,200,220,207,79,77,239,220,249,168,106,139,212,78,24,104,238,167,73,134,130,44,185,111,199,208,23,130,231,77,69,221,76,104,237,100,142,221,209,33,183,39,232,155,85,219,206,53,195,238,77,104,152,159,30,144,187,190,171,111,205,167,133,10,235,254,118,18,161,198,179,155,61,48,176,180,229,3,29,210,199,136,50,74,245,202,247,151,81,226,218,162,50,203,114,145,150,58,174,79,38,14,198,106,117,202,89,167,11,145,249,9,84,199,69,216,14,96,72,138,177,243,28,28,118,214,230,199,61,234,23,209,40,52,13,172,0,190,206,235,100,124,14,144,213,211,172,212,209,22,253,231,119,182,41,25,100,230,18,218,20,101,158,159,46,124,24,66,216,158,44,229,59,4,166,29,128,24,209,160,120,212,212,68,170,21,5,113,202,191,105,229,82,44,153,176,106,83,125,163,231,49,82,31,75,20,79,64,59,203,62,147,88,28,195,102,148,227,155,236,12,174,12,3,101,86,163,225,212,187,51,217,219,172,102,69,171,88,98,16,189,159,210,190,98,233,120,155,29,82,157,205,32,149,230,1,108,221,128,145,115,156,223,12,178,18,130,162,63,233,86,229,164,140,18,251,61,199,99,231,182,103,229,40,146,179,149,211,173,235,130,195,143,60,104,177,46,22,147,247,127,110,38,38,4,27,179,169,126,191,231,7,204,160,179,150,134,200,66,22,126,137,124,248,222,191,154,248,83,109,156,4,52,42,180,116,41,159,92,101,52,8,117,29,138,163,164,55,229,197,194,137,84,211,5,97,56,30,162,62,120,221,61,92,16,191,159,204,234,28,25,11,200,105,220,109,30,33,103,109,106,254,8,233,139,79,194,210,90,20,40,149,73,199,144,159,118,112,188,32,179,207,85,156,48,112,169,41,177,5,131,148,135,77,217,34,170,193,147,206,151,199,69,172,23,185,42,93,101,47,167,111,100,209,169,98,227,152,85,179,4,150,31,220,198,15,238,157,3,248,86,97,240,225,222,229,32,38,115,17,56,89,165,157,120,54,40,200,31,113,5,168,5,103,32,128,208,208,135,147,29,57,93,134,102,82,65,248,60,53,22,232,208,180,150,0,236,115,229,243,201,102,0,146,18,119,252,156,69,148,134,145,249,171,96,105,49,66,208,177,196,170,33,163,190,233,5,43,7,184,11,58,124,214,10,14,233,36,91,219,97,16,27,99,201,247,99,229,67,240,218,144,22,81,77,204,18,134,18,102,4,24,9,163,200,91,111,44,41,62,163,30,216,192,127,14,248,132,215,27,144,127,204,95,85,253,63,165,177,40,208,119,125,64,99,92,134,210,136,102,105,104,239,35,222,49,209,1,202,215,213,189,255,225,87,155,202,66,238,75,170,146,60,76,163,70,254,19,88,243,140,163,101,9,96,42,24,37,154,208,44,219,81,139,1,67,24,187,71,95,93,72,55,217,163,226,137,207,243,158,81,156,160,78,106,50,242,83,129,112,233,4,149,134,255,135,115,90,3,3,200,86,45,251,172,196,185,116,189,55,226,56,156,2,79,153,238,179,182,158,191,105,175,247,58,144,204,82,93,224,177,22,140,250,154,170,177,87,165,253,119,204,197,85,151,121,213,207,20,29,241,103,198,171,57,185,243,128,145,64,110,144,175,118,199,210,199,80,136,47,192,171,192,87,167,96,23,13,13,192,81,81,29,184,247,53,60,208,125,123,251,16,32,120,123,99,202,248,127,54,10,175,115,98,114,248,110,137,116,87,122,196,59,65,16,55,236,5,126,185,83,168,85,121,183,76,98,3,4,88,118,114,254,114,232,221,86,159,194,143,153,63,127,183,139,246,107,214,231,14,239,140,181,8,47,23,127,243,52,68,42,178,158,117,132,119,60,214,165,211,185,14,27,94,206,68,138,184,138,100,165,132,208,140,76,224,118,30,182,232,19,250,248,163,158,157,13,251,189,76,38,104,150,105,117,17,235,178,134,195,217,157,255,119,157,132,146,29,207,187,9,144,201,166,132,19,180,101,30,124,223,168,7,92,159,170,99,128,98,118,32,127,4,52,201,89,157,5,248,99,39,207,153,182,192,151,12,96,101,139,250,72,176,72,91,72,129,161,217,6,17,24,250,26,84,73,179,188,235,24,201,97,234,221,199,137,247,185,157,105,102,245,67,255,129,235,194,160,135,58,218,57,86,201,124,32,182,96,130,176,151,56,3,44,165,33,20,195,13,212,86,193,193,222,205,211,88,121,228,39,108,123,97,66,207,254,207,133,61,116,65,36,153,146,58,249,31,198,41,34,183,161,85,145,177,151,9,107,64,197,246,225,128,72,125,96,221,27,76,72,104,206,111,135,225,222,169,153,210,247,218,144,38,33,60,213,92,61,20,228,79,112,157,11,105,248,107,75,140,225,93,46,67,6,22,211,241,199,156,90,213,193,77,212,199,151,63,182,102,238,12,77,174,205,98,47,155,12,121,228,99,255,10,165,127,196,112,172,9,85,204,186,192,133,182,155,92,90,33,154,135,150,144,101,96,10,151,154,49,173,237,73,174,158,127,178,118,207,146,195,51,28,27,136,9,212,153,192,55,215,147,223,103,54,168,126,174,47,241,37,8,207,25,165,91,49,24,0,210,204,166,47,169,145,53,98,213,239,161,124,63,15,0,190,8,238,46,210,73,45,169,23,55,51,120,210,37,96,4,167,180,39,52,171,145,244,199,214,22,246,118,245,198,34,165,234,239,86,235,24,99,59,188,146,170,161,48,52,250,233,167,117,131,31,106,138,104,54,213,243,204,180,131,79,30,246,43,111,126,116,174,46,237,37,207,149,233,161,205,91,150,115,217,40,96,205,159,243,55,105,61,242,195,10,149,253,29,79,123,131,176,202,49,203,87,29,24,237,194,223,210,165,184,16,108,230,1,180,6,87,5,148,70,68,156,156,0,129,77,3,195,142,26,202,92,54,197,59,107,150,223,245,122,92,64,154,63,106,225,241,118,150,148,140,249,122,84,52,1,235,176,26,76,173,3,102,104,113,189,244,177,181,156,133,72,147,162,143,100,204,132,249,34,122,74,31,29,180,176,212,130,153,41,126,213,187,190,216,9,217,121,166,157,182,193,185,148,47,65,18,55,161,45,134,107,10,101,220,98,192,85,160,232,156,179,28,83,66,42,163,132,54,253,245,103,106,178,236,219,15,118,64,177,137,219,182,232,245,174,218,149,75,195,45,61,193,138,142,225,101,11,92,49,185,156,228,119,39,206,9,19,24,4,22,99,237,67,166,85,237,98,158,189,234,184,76,253,24,56,74,255,25,232,40,87,138,157,162,19,55,229,42,84,18,255,48,103,255,179,98,6,94,20,129,204,49,196,238,247,55,47,216,144,20,105,18,70,99,106,217,239,67,28,0,90,75,41,151,133,134,141,51,231,236,221,2,98,19,20,7,53,207,222,177,9,25,97,231,242,165,222,187,61,176,165,101,33,163,42,173,165,136,245,118,60,72,70,24,195,18,38,96,73,1,73,69,87,146,22,74,136,167,126,230,56,8,222,251,71,152,209,21,85,206,216,73,66,35,48,188,121,53,171,156,31,33,15,79,75,185,233,255,230,213,147,152,245,4,22,165,225,38,79,32,12,150,72,138,163,195,219,170,135,5,141,166,125,83,136,131,70,24,105,158,83,82,164,237,138,161,182,189,237,147,91,235,214,117,183,46,215,107,147,184,38,198,58,216,23,98,11,157,29,226,50,122,157,130,209,55,151,105,155,253,97,134,35,155,216,32,100,72,155,158,124,128,215,182,203,194,84,54,194,156,137,215,242,205,74,228,144,47,134,45,230,223,48,217,47,201,76,72,181,147,50,142,8,18,58,255,201,189,237,135,3,149,8,197,248,198,210,140,148,61,88,239,52,79,184,147,182,211,24,113,37,187,216,146,92,12,43,200,118,141,227,218,244,191,125,60,214,206,160,19,199,31,81,83,227,110,186,121,212,63,34,94,244,1,18,236,84,26,217,7,30,145,35,27,34,189,30,243,152,80,99,249,19,157,210,198,211,13,16,160,150,114,24,120,57,85,35,11,174,215,37,201,250,27,31,216,206,201,116,255,55,224,253,149,243,217,57,41,116,148,233,238,158,9,10,245,97,208,125,228,91,194,72,13,231,67,193,209,61,58,25,118,134,99,255,56,157,135,121,9,188,130,187,154,172,247,82,121,130,35,112,100,10,98,167,32,62,225,122,128,83,194,213,105,63,149,44,162,249,200,70,211,41,223,42,170,236,227,118,44,39,239,160,20,158,228,63,187,56,246,114,250,178,106,75,195,10,196,181,194,246,201,165,194,33,103,155,135,179,233,17,165,97,193,173,98,73,100,80,74,206,94,55,249,43,97,4,186,162,81,33,200,206,127,134,180,152,39,201,250,111,244,195,150,200,186,123,36,74,140,142,246,191,118,132,60,168,3,222,121,99,157,104,250,129,247,251,18,67,215,46,164,222,91,92,131,216,115,23,124,102,141,80,229,126,198,34,1,160,118,155,76,243,168,223,194,21,236,183,174,101,113,187,51,124,255,176,179,139,58,76,80,111,79,74,90,55,192,186,183,183,172,185,93,5,43,192,15,7,181,5,9,219,95,197,25,208,108,88,195,251,252,151,206,176,49,136,7,170,235,47,116,17,101,183,9,30,36,111,56,102,219,66,237,247,53,192,57,131,62,24,45,201,4,184,27,135,41,23,220,41,208,209,239,54,63,126,32,7,90,13,230,61,249,224,155,114,193,167,123,205,223,11,175,170,3,201,205,103,231,160,173,8,153,229,37,234,170,0,71,87,248,44,104,128,156,228,218,150,223,80,183,216,64,1,117,36,136,110,99,2,60,37,180,78,175,169,242,156,43,18,90,56,232,235,104,134,223,159,185,200,248,235,66,100,193,71,170,217,126,191,33,54,222,68,19,31,198,51,74,137,159,12,179,216,175,165,240,156,137,198,4,13,214,200,126,162,59,209,58,49,230,126,147,175,3,103,122,72,1,199,105,120,144,204,248,252,189,86,37,11,47,224,201,201,211,75,255,28,133,193,159,165,179,128,32,54,178,158,89,89,52,226,82,138,185,235,237,84,204,231,6,169,153,38,22,107,193,188,176,241,52,68,158,209,134,6,184,121,69,245,253,252,168,190,56,84,154,64,36,100,205,142,64,119,230,11,205,110,32,213,17,176,226,119,58,226,211,31,233,181,23,147,184,125,172,204,10,121,45,252,189,156,216,166,139,215,65,60,139,5,158,230,122,16,121,239,248,189,140,112,242,138,0,36,138,254,58,138,140,110,130,155,46,200,28,120,181,243,4,89,194,27,71,47,135,199,138,172,209,242,120,222,84,228,122,124,46,166,169,138,143,142,38,191,130,116,162,7,51,3,52,234,148,191,157,18,240,185,186,158,126,142,113,181,217,179,89,164,111,9,67,242,85,181,26,189,216,166,1,20,40,67,205,242,18,222,202,165,231,165,63,168,73,103,94,165,213,166,68,70,157,54,184,176,171,158,32,54,96,155,129,79,248,109,98,98,179,150,87,86,206,100,219,57,44,42,227,157,116,105,237,236,147,160,202,134,223,115,0,125,25,159,247,213,31,88,76,18,80,228,51,0,78,2,128,222,147,253,19,125,128,167,117,109,230,89,149,125,155,57,103,39,2,60,86,124,32,196,108,50,28,155,42,126,111,183,104,97,134,95,232,59,206,171,234,218,4,64,161,53,153,131,25,2,241,199,37,246,139,9,108,69,120,34,239,236,35,207,154,36,139,234,237,10,201,63,180,46,85,255,192,42,249,34,190,59,3,191,109,240,234,16,248,15,176,240,162,84,172,66,199,146,181,32,166,236,158,226,54,77,252,187,28,20,157,143,210,69,135,89,242,214,152,173,77,187,57,194,90,123,29,78,140,129,242,247,70,223,192,110,232,164,244,84,99,59,82,180,69,88,110,1,56,30,21,177,246,131,173,28,160,193,29,51,224,7,202,29,116,92,85,26,206,242,123,166,251,200,251,165,75,192,138,182,240,221,151,96,105,103,179,11,224,115,188,149,40,188,159,143,153,137,143,40,224,78,140,17,209,245,177,172,145,100,245,43,214,54,252,203,220,245,195,213,83,210,40,13,80,148,160,21,125,139,2,137,16,127,215,247,213,4,240,140,187,90,113,6,107,149,96,203,200,81,226,224,15,182,26,141,122,68,198,62,213,128,146,62,247,124,129,146,205,88,201,5,185,6,134,77,46,64,19,132,55,43,199,172,93,3,234,13,60,127,39,96,113,1,140,174,19,125,228,39,26,249,249,8,86,7,217,142,101,135,104,154,68,221,189,176,136,3,17,130,73,178,127,95,123,174,239,168,16,234,230,246,2,124,10,167,2,203,193,231,16,53,108,214,129,70,35,179,53,145,144,195,194,37,44,41,233,191,134,141,59,164,30,35,91,161,137,135,190,72,154,157,219,195,124,240,42,1,31,86,25,77,208,180,127,123,229,23,218,11,55,162,192,249,22,115,16,14,139,90,80,148,106,52,2,205,202,59,149,179,17,209,191,161,163,199,24,0,97,144,25,21,192,156,76,208,77,225,68,128,206,88,195,246,110,52,111,126,82,158,160,123,82,97,133,166,70,67,162,248,28,156,61,120,124,38,85,250,49,232,67,81,146,149,17,6,64,171,38,133,60,12,252,12,235,188,85,22,180,29,152,186,5,172,254,11,150,229,214,156,39,216,189,38,33,65,82,158,93,113,34,47,30,130,125,71,155,94,172,189,238,47,239,201,73,75,200,215,179,140,93,88,213,19,237,206,86,103,68,85,176,226,103,17,101,142,54,54,54,43,107,162,30,102,83,61,136,251,45,23,5,37,72,191,176,215,24,12,60,224,128,26,157,170,164,141,112,179,236,148,92,219,171,74,241,116,3,175,213,192,28,77,160,155,239,195,115,132,18,243,210,169,244,210,34,94,96,141,17,47,148,208,182,51,101,128,97,57,21,90,224,128,78,31,1,88,20,191,174,133,56,100,93,253,190,29,217,55,43,61,26,244,245,209,35,174,186,52,178,66,207,17,65,9,173,76,63,5,11,219,118,255,188,119,174,8,73,10,44,28,249,86,101,37,99,7,31,159,72,132,187,2,231,251,30,103,26,7,192,148,215,124,122,229,47,146,198,27,143,48,232,133,44,89,189,219,34,174,5,36,28,8,47,145,159,71,197,140,53,12,77,19,85,122,241,53,51,253,202,44,254,18,156,148,20,214,72,146,171,27,165,166,104,233,107,74,197,200,218,0,238,14,22,151,194,34,1,90,77,1,71,174,24,153,64,11,85,38,151,160,110,230,169,216,36,71,50,49,252,104,246,155,53,215,139,233,140,57,29,131,72,11,205,39,149,45,150,245,224,180,66,236,46,6,91,44,207,170,82,178,13,254,225,196,155,234,65,129,20,105,150,217,47,197,204,216,72,46,199,12,166,160,1,37,74,100,198,61,240,1,116,145,37,204,102,133,72,141,205,19,202,212,164,224,56,96,249,225,111,252,164,244,118,199,87,245,22,142,153,6,37,155,252,203,40,8,54,159,121,133,138,136,135,86,40,121,79,71,198,10,177,185,92,46,116,209,48,218,80,106,146,178,80,164,63,130,206,26,5,35,98,57,10,47,239,73,203,218,78,188,164,63,169,41,179,173,80,157,206,145,143,93,195,157,101,120,20,93,255,59,43,187,209,233,39,124,128,129,142,19,182,25,241,14,130,89,45,243,76,136,227,166,10,102,208,120,27,215,99,250,103,28,202,167,198,12,178,213,32,206,210,218,232,221,241,149,150,28,175,36,49,181,110,79,181,119,170,179,14,73,68,161,57,234,41,243,164,74,71,25,228,225,216,119,41,152,242,191,116,170,41,193,196,26,71,42,252,209,52,175,114,97,225,158,11,120,179,78,59,242,58,144,138,94,150,173,195,65,21,103,191,208,78,22,158,204,160,64,178,176,65,92,2,108,230,208,201,225,5,142,33,115,61,163,141,39,111,173,56,16,234,30,223,150,238,250,185,160,122,153,235,92,157,218,151,46,30,11,131,60,140,69,244,96,103,36,57,231,78,184,250,28,208,220,147,19,11,158,89,185,38,123,74,157,35,194,93,230,205,156,56,0,251,51,165,23,181,235,74,60,109,153,105,204,64,135,160,254,7,44,168,26,116,123,208,141,29,28,13,22,30,239,185,235,34,29,166,4,59,24,48,75,36,4,240,181,76,184,136,172,69,230,96,90,87,132,194,39,107,31,132,129,165,152,35,127,161,220,220,202,153,68,45,141,173,2,187,196,75,69,52,136,37,78,226,116,13,86,155,237,143,28,147,19,212,135,54,10,97,4,71,179,52,62,210,55,156,183,112,224,131,167,205,58,147,238,230,21,115,68,229,103,45,165,238,66,171,251,78,106,244,152,181,67,81,138,106,93,49,59,26,133,69,35,48,176,103,217,76,110,194,9,242,47,127,62,156,16,154,215,143,221,169,32,20,216,70,152,135,75,184,51,31,151,44,70,163,218,185,67,60,6,52,238,210,169,38,23,4,119,93,226,85,16,241,225,63,248,146,140,74,162,15,196,187,89,22,67,128,116,10,134,189,76,154,95,253,14,53,190,154,75,14,42,164,198,106,225,125,232,124,244,4,155,215,164,162,120,230,136,144,218,121,31,61,0,42,177,18,235,40,247,85,77,253,124,77,195,152,190,213,147,94,40,80,62,45,196,231,16,89,113,112,191,96,174,200,143,104,231,108,195,188,61,18,217,78,89,97,224,221,29,10,146,196,56,91,41,63,103,57,229,8,241,37,40,119,47,245,111,124,72,42,120,121,10,86,137,88,104,24,59,41,158,190,173,206,249,228,153,54,49,241,167,203,243,86,35,215,216,96,30,33,140,2,81,242,248,223,216,27,146,8,35,145,7,194,118,165,86,14,247,107,175,145,90,73,14,73,4,228,151,241,156,3,247,1,251,14,71,236,56,136,192,58,117,182,36,90,219,14,135,139,4,125,125,235,136,84,253,252,175,172,208,109,52,233,125,204,67,210,251,243,129,207,25,80,74,13,150,132,100,64,74,70,199,33,238,216,109,31,118,60,49,1,236,107,131,142,166,163,148,39,244,7,28,238,150,18,27,26,246,171,116,221,238,107,78,75,21,102,124,150,241,205,29,1,220,239,44,213,48,54,127,93,42,151,136,94,38,105,218,82,23,157,196,215,46,75,167,81,44,97,89,183,31,79,147,235,33,189,79,98,28,86,46,47,72,191,218,179,158,113,59,214,78,177,122,246,73,239,125,248,64,164,57,223,11,1,46,250,129,241,102,98,20,197,180,80,240,164,247,6,90,151,11,108,10,132,6,121,112,48,214,238,148,125,151,29,120,123,98,97,93,104,90,39,211,174,3,133,46,248,46,30,81,122,118,18,83,132,8,202,105,131,20,25,51,196,133,2,251,2,54,98,226,41,253,64,119,126,62,217,150,141,77,62,153,68,95,12,221,62,190,123,229,46,210,203,131,121,5,65,100,240,0,178,236,186,196,62,1,200,129,75,64,250,75,124,180,80,169,196,95,204,182,17,44,159,200,9,234,24,92,217,21,103,205,104,164,232,15,10,53,87,134,40,142,79,142,220,168,22,109,92,34,225,221,244,222,40,107,65,124,247,243,116,164,176,153,106,19,246,71,68,149,33,203,195,122,236,98,84,28,171,109,171,220,46,201,244,113,218,84,53,234,40,154,253,242,52,239,73,162,0,67,167,254,164,56,237,161,216,68,211,80,240,222,73,12,180,54,231,20,181,101,5,221,255,169,154,106,119,58,92,146,66,8,173,184,168,101,144,27,155,253,22,107,217,72,138,34,141,184,86,67,241,89,129,143,62,185,56,79,131,157,196,109,75,215,154,207,126,99,14,153,235,240,178,5,133,79,155,241,240,122,216,194,206,209,191,32,53,174,107,68,188,34,129,254,218,123,255,101,175,94,67,182,82,238,23,33,49,73,71,38,218,109,55,203,74,206,67,157,225,203,238,154,7,11,31,185,84,14,164,247,19,140,55,16,208,72,103,237,184,91,149,221,220,234,60,242,51,199,184,59,235,42,13,254,67,199,8,63,185,222,16,91,109,51,136,143,27,107,248,73,13,160,194,61,162,83,11,194,67,10,80,106,151,232,205,207,41,35,68,138,178,171,78,38,195,197,191,186,114,29,101,140,128,156,1,240,168,74,98,193,183,35,100,126,75,96,38,96,107,142,67,234,30,175,211,18,29,133,119,147,85,35,169,126,127,209,210,152,108,54,178,80,150,151,84,96,200,145,232,17,73,102,212,57,125,216,204,47,29,213,72,238,2,69,22,85,156,204,116,127,145,36,138,174,251,191,87,131,86,88,132,179,56,151,1,84,197,227,49,226,148,47,76,148,237,188,211,58,209,185,87,242,152,196,249,127,15,14,17,242,36,222,105,134,118,82,126,176,119,109,111,47,52,233,183,44,220,28,248,118,126,161,32,92,120,197,25,43,151,187,232,103,81,110,212,205,50,35,179,150,179,33,139,225,248,142,151,111,238,119,4,162,219,132,47,177,175,94,78,101,187,203,165,116,138,252,60,103,81,212,231,189,250,19,51,106,184,252,125,195,85,135,252,44,224,61,230,56,119,171,187,132,196,241,162,38,31,79,100,68,19,194,237,157,8,72,129,57,233,224,135,37,43,93,90,114,9,137,202,112,22,63,94,56,140,43,138,213,241,160,153,160,3,213,104,120,200,83,165,85,26,221,121,130,226,105,88,41,253,161,155,50,218,87,106,51,188,10,171,117,47,179,173,41,70,161,93,45,101,97,24,25,235,255,48,209,53,130,125,104,5,11,4,152,12,68,23,102,115,167,246,65,65,41,54,227,53,214,233,172,83,99,185,244,146,97,15,215,239,37,173,117,156,101,151,115,153,86,172,3,72,112,109,173,15,239,106,6,219,252,207,38,219,163,186,190,147,128,171,60,195,212,178,37,136,119,252,24,37,252,198,177,82,221,34,8,53,238,197,173,242,238,205,130,36,230,137,222,94,66,63,137,209,215,159,43,135,106,48,178,167,63,2,33,148,205,161,75,243,240,218,1,119,115,227,126,229,246,179,189,128,88,178,119,131,130,53,147,218,14,109,158,197,178,87,212,196,140,238,77,215,59,53,10,151,11,137,177,31,33,142,74,163,112,152,4,154,93,76,0,95,189,174,33,168,88,230,109,45,143,228,97,167,246,104,159,101,181,25,100,29,153,141,55,147,111,233,36,201,163,175,156,213,225,101,169,129,105,66,108,152,200,111,15,160,12,16,241,37,180,60,139,141,228,239,145,237,104,144,200,227,35,64,112,41,140,133,145,216,162,149,246,222,79,14,76,229,121,166,3,81,64,187,89,246,241,34,163,129,179,244,78,215,189,7,15,122,159,60,242,137,39,140,25,28,49,102,254,8,80,234,180,236,240,78,176,219,205,203,163,174,17,16,53,83,16,106,110,17,162,75,34,172,40,243,192,227,1,205,209,86,7,65,211,224,169,129,109,137,172,251,203,98,226,216,151,102,32,122,195,148,19,233,96,154,114,51,100,229,115,78,33,109,223,112,122,95,66,150,95,90,91,164,212,245,53,8,221,143,23,109,92,5,222,84,105,169,243,201,18,191,145,82,4,141,70,213,6,221,11,103,25,7,153,145,212,191,253,249,79,59,182,76,120,137,185,49,244,23,231,151,115,216,86,133,71,75,210,237,219,214,244,57,174,76,182,11,149,176,248,64,87,254,91,83,101,76,201,68,99,10,40,95,117,29,175,72,227,23,1,99,77,61,105,65,239,232,82,210,77,241,229,104,165,33,88,16,29,57,93,177,196,25,231,47,63,140,91,84,4,202,209,163,57,190,114,242,107,125,197,78,137,64,137,151,236,80,12,44,90,241,66,113,151,75,227,22,246,191,156,200,59,162,25,79,96,76,43,143,130,173,125,242,4,169,214,185,51,98,218,176,100,49,31,183,228,177,25,214,57,164,53,130,108,5,53,97,3,37,72,161,209,253,25,41,221,114,39,16,142,252,187,1,175,71,172,29,89,147,116,135,211,122,169,53,250,161,185,209,172,188,74,152,54,203,189,111,25,148,96,188,50,162,138,69,106,54,55,78,183,88,79,55,43,63,203,156,181,226,137,5,212,114,195,2,241,176,33,62,27,111,119,150,206,218,170,103,215,116,11,201,13,85,172,186,73,15,141,126,201,126,22,219,111,4,103,63,220,137,243,88,187,237,96,206,95,71,83,169,134,122,230,97,102,198,36,207,37,227,157,60,209,193,173,119,233,38,80,10,46,20,231,230,21,70,148,68,42,173,219,180,222,10,1,196,187,26,102,189,34,165,194,114,110,8,247,49,133,84,162,150,201,201,68,187,31,235,214,121,43,95,153,103,91,63,73,4,184,112,243,37,31,107,134,252,62,218,82,76,218,158,62,17,4,244,96,59,101,5,170,10,91,20,143,213,63,84,246,196,70,138,104,102,14,112,80,200,190,235,99,11,47,40,152,64,109,194,163,22,154,193,121,9,165,187,9,228,109,70,244,235,193,76,237,216,215,225,63,95,7,33,179,150,55,222,240,104,137,205,221,210,82,99,143,232,137,153,195,215,1,95,235,55,223,152,197,124,23,79,212,109,163,107,234,192,216,7,186,156,57,178,185,15,251,145,200,168,99,102,55,142,12,237,218,153,169,130,30,180,97,23,157,211,119,144,67,152,19,241,49,224,172,240,167,238,213,166,125,136,228,53,18,147,220,212,77,32,101,240,25,92,83,215,7,86,175,213,76,13,86,36,1,160,242,113,7,143,59,231,52,89,10,87,173,70,109,222,240,82,46,37,240,248,94,9,10,10,46,78,55,76,109,16,88,142,188,50,201,144,14,235,182,2,213,68,176,121,64,54,18,0,138,57,51,5,200,176,197,54,203,8,163,156,36,96,53,186,86,217,203,53,162,214,117,253,51,152,156,19,3,67,194,161,175,209,158,246,247,117,184,16,122,62,179,27,154,110,211,133,164,134,132,10,11,208,21,45,161,166,78,70,207,71,30,216,17,39,134,62,183,26,33,8,50,151,62,166,250,50,101,153,144,233,63,7,72,218,122,210,119,79,129,99,250,237,241,83,241,118,13,201,234,87,14,192,52,122,68,246,248,238,68,169,74,12,208,148,143,52,26,226,51,243,25,124,171,37,11,217,111,167,96,146,232,120,96,181,24,184,81,106,36,163,226,122,73,206,140,233,54,213,145,83,14,95,48,148,96,10,25,233,235,113,173,43,20,142,92,0,149,150,151,119,244,99,1,245,206,215,179,186,181,150,101,148,63,236,168,184,213,126,21,227,57,104,37,35,116,221,94,64,125,73,242,44,58,20,132,94,115,152,170,162,31,115,239,128,120,215,44,148,242,145,218,39,189,138,40,232,131,225,114,248,38,128,124,180,125,163,35,61,13,239,14,251,249,241,160,7,227,85,143,111,252,82,29,102,154,184,69,86,88,4,101,125,168,49,83,214,58,208,237,180,67,12,36,34,145,15,145,20,91,163,214,146,190,172,212,70,174,248,20,32,85,250,177,54,86,186,155,51,73,27,209,41,62,22,188,189,219,98,72,74,153,146,223,152,110,137,44,88,147,26,213,88,62,26,195,128,117,248,111,235,37,193,172,179,148,189,28,189,143,45,123,56,197,169,216,130,75,208,129,238,115,87,247,205,39,173,167,234,64,50,238,29,59,238,101,145,34,17,123,135,4,102,251,199,161,229,12,37,255,80,6,141,179,78,206,166,241,239,161,9,94,101,18,66,24,175,0,68,109,161,185,143,203,111,154,50,73,77,127,19,18,235,239,65,50,120,190,42,203,76,112,21,112,217,86,49,104,240,201,105,186,38,183,250,13,52,134,42,164,160,160,242,31,107,221,59,152,149,197,159,253,40,149,222,216,31,197,161,51,220,210,219,48,254,216,105,35,143,1,154,12,196,79,53,198,78,242,216,66,133,3,103,118,214,80,147,234,108,130,168,87,125,122,178,200,150,108,40,11,6,213,240,102,5,77,108,107,100,131,51,245,207,47,39,27,106,75,50,179,73,27,125,78,7,148,194,116,248,158,77,145,145,52,28,133,199,143,167,121,113,138,213,220,229,227,13,68,72,211,125,37,199,196,193,119,158,14,78,22,155,138,108,154,228,84,74,49,39,31,198,38,145,199,155,41,143,49,196,196,125,12,253,104,104,113,240,195,159,236,11,250,39,68,121,15,144,91,88,210,95,191,177,220,152,15,17,133,23,194,25,87,201,140,77,110,89,107,155,194,70,253,154,150,30,58,178,211,244,215,55,9,146,147,81,238,19,243,100,141,12,172,147,95,249,139,95,35,255,134,58,239,77,185,36,10,40,173,1,160,190,44,55,167,231,14,52,12,145,20,178,44,231,71,85,150,161,50,3,135,121,217,37,249,25,233,48,244,168,184,162,247,95,6,29,5,10,146,24,89,77,249,158,143,122,216,133,70,89,60,148,73,114,136,79,108,108,73,127,95,255,31,224,9,35,205,245,209,227,185,162,204,206,3,232,21,115,224,182,248,17,47,89,169,18,41,242,242,27,92,38,105,127,196,198,46,220,233,53,101,14,86,177,175,199,117,7,126,140,190,177,223,27,27,229,209,56,142,51,18,171,71,28,72,248,66,181,184,37,37,208,57,115,186,94,189,163,241,55,121,166,193,157,218,203,200,45,95,65,86,74,252,42,174,144,222,133,40,27,116,248,242,134,232,15,96,106,158,10,221,5,191,144,91,154,3,255,78,33,76,180,34,237,12,140,93,167,101,207,112,87,116,98,81,77,13,62,122,251,197,160,62,197,53,213,66,211,141,126,158,230,9,103,170,211,142,207,24,148,68,96,95,55,119,172,188,190,206,246,25,125,111,95,48,87,139,213,137,126,242,42,124,86,47,84,64,122,177,0,83,125,18,179,114,236,121,190,27,230,21,188,28,137,38,62,32,138,92,22,150,13,41,53,135,172,187,217,160,212,149,254,168,20,139,231,67,113,193,57,235,26,241,42,161,205,185,182,251,146,182,116,114,120,244,175,93,244,226,47,159,113,238,179,165,73,114,103,196,249,120,66,164,145,229,102,142,95,48,121,8,19,173,75,237,56,202,250,164,76,114,93,35,155,242,198,15,131,236,222,228,171,106,237,215,71,27,164,153,116,174,3,22,70,198,55,213,67,102,174,160,135,13,64,123,89,241,158,162,129,242,18,53,31,180,46,109,152,183,161,54,219,138,217,243,5,79,114,237,12,160,69,30,251,209,78,51,8,148,0,84,253,254,201,170,8,239,233,85,207,170,66,22,216,46,198,118,116,50,193,81,94,186,80,231,48,255,88,30,193,58,253,217,251,155,73,21,127,149,174,124,173,58,243,126,93,1,195,23,7,10,5,102,74,52,154,225,114,178,211,196,152,171,188,130,27,125,173,145,250,140,71,227,210,194,186,179,29,44,38,73,48,49,33,132,12,14,61,240,238,1,240,1,124,136,229,201,89,139,202,160,152,145,171,54,90,249,6,202,236,130,156,166,210,106,228,28,77,132,199,182,72,122,35,47,32,96,3,34,193,104,70,7,221,92,80,234,79,148,111,208,10,174,33,13,31,77,234,94,215,9,253,234,122,231,46,170,253,20,7,240,141,139,190,95,170,46,194,101,245,255,14,90,29,12,75,47,32,72,233,95,255,106,88,27,208,123,45,129,196,85,106,21,15,248,248,11,78,150,163,187,180,36,18,235,55,209,201,27,202,196,252,115,189,33,223,158,244,107,194,208,202,116,3,39,98,251,239,15,86,89,40,231,160,139,104,27,134,206,119,92,156,135,215,152,83,160,89,255,178,178,114,238,171,57,139,10,196,224,184,146,31,137,171,242,65,41,65,140,175,159,237,0,69,214,40,248,116,215,73,190,208,159,93,121,241,237,200,84,7,204,26,182,123,49,3,251,210,196,63,208,102,242,13,145,181,233,237,134,233,227,33,224,138,209,19,5,255,131,71,170,9,235,49,128,249,81,106,190,13,245,88,165,104,86,68,244,84,95,115,137,40,142,5,63,52,49,208,138,254,189,132,176,5,181,155,24,231,67,237,59,28,164,67,136,31,185,189,41,156,160,61,163,118,228,232,31,226,195,145,253,72,6,195,154,32,42,95,41,133,145,169,64,70,160,39,227,214,211,27,251,250,64,6,61,213,210,216,152,215,208,42,161,69,99,45,56,11,51,115,93,45,245,15,69,12,8,29,33,122,155,46,214,15,129,236,50,214,241,159,157,100,1,249,182,45,160,173,198,231,5,133,137,80,28,211,19,233,207,88,181,220,52,225,32,71,226,80,18,168,172,149,133,2,98,129,190,51,68,219,206,170,197,152,51,229,49,77,196,212,69,44,11,188,37,198,101,140,53,75,28,4,22,73,204,113,211,226,172,119,64,110,25,3,237,210,26,145,210,92,42,101,177,178,22,103,186,44,164,58,17,236,67,243,92,76,99,174,195,151,145,28,35,104,38,187,127,185,171,134,250,223,156,158,24,116,7,202,237,167,130,2,176,151,149,237,242,109,173,223,87,72,0,195,146,190,81,116,143,194,189,103,228,108,96,232,59,236,94,248,84,37,75,54,88,226,84,91,27,98,165,218,192,142,160,170,138,227,196,193,203,177,137,100,186,247,160,63,147,235,235,138,97,106,220,229,197,207,251,94,29,168,161,76,225,187,67,247,28,184,152,218,1,178,116,49,113,228,153,78,127,240,44,168,239,221,255,72,93,209,253,171,63,159,31,56,135,3,51,58,63,238,183,153,196,26,255,119,0,0,31,200,158,196,180,186,69,162,152,188,248,18,18,118,73,140,159,59,25,58,22,16,148,39,220,215,161,90,242,83,125,166,21,108,69,125,230,24,33,83,248,208,145,168,148,101,77,110,227,35,130,129,14,184,240,94,10,176,153,113,3,32,211,25,173,95,151,154,74,184,77,239,94,241,234,241,82,75,144,35,187,73,43,188,137,5,197,13,223,69,230,209,118,237,178,200,199,155,77,78,12,132,131,152,205,96,221,168,243,70,225,34,49,191,149,127,238,221,190,215,164,189,145,172,69,115,36,253,178,134,102,134,251,24,64,85,231,15,245,135,30,221,1,202,79,200,69,123,135,189,119,226,92,58,120,230,86,126,144,90,195,85,217,164,14,210,89,132,178,112,38,183,202,212,48,12,136,61,238,200,212,9,64,94,59,181,32,65,213,26,85,238,16,15,86,5,55,79,176,165,53,230,186,255,185,134,46,64,154,67,113,174,2,18,1,110,139,105,228,138,42,221,183,163,38,102,1,60,33,166,238,97,11,163,94,24,216,81,27,191,202,253,128,50,207,145,227,143,205,58,124,141,151,41,195,91,48,74,240,9,54,138,65,246,246,1,160,57,96,230,55,102,174,1,76,65,145,63,145,131,209,35,142,171,20,71,149,38,18,192,64,1,180,83,180,45,226,107,249,103,79,195,72,124,228,215,218,33,5,103,11,1,37,216,31,133,7,2,64,97,220,222,194,190,134,183,11,44,62,134,163,34,32,104,169,58,65,23,196,59,50,89,116,212,15,43,85,45,253,229,13,183,103,204,168,158,163,40,218,112,71,190,76,144,45,30,46,118,98,181,186,48,40,199,138,149,227,21,100,29,137,176,53,82,37,223,195,172,198,159,32,202,57,120,150,21,207,124,167,14,48,155,221,86,110,41,254,114,186,59,76,30,171,193,55,84,5,142,125,75,201,228,8,248,236,236,181,225,206,85,49,164,103,128,121,159,41,237,208,61,111,86,124,119,193,147,19,226,144,74,143,192,216,204,41,248,188,182,157,78,113,125,247,245,242,45,146,30,187,67,122,108,29,225,2,235,44,242,62,48,233,72,37,210,59,29,192,98,207,211,95,87,192,175,31,208,228,221,17,74,131,34,143,83,54,117,158,64,164,81,104,11,230,229,214,158,206,163,13,184,182,191,161,42,148,184,229,63,29,251,194,229,152,58,227,178,17,179,209,233,215,174,236,39,238,243,152,102,77,78,66,159,80,91,194,1,10,29,168,76,234,100,185,71,218,223,52,148,97,151,51,61,26,244,57,116,172,100,11,160,124,186,47,98,112,193,27,39,183,188,157,244,29,78,118,205,207,245,229,243,237,78,188,15,87,61,49,254,226,137,5,177,188,15,97,112,56,112,37,43,218,186,100,4,213,9,74,237,104,250,60,86,238,207,230,171,100,72,107,27,41,88,20,73,112,236,148,239,5,233,146,83,167,62,76,160,107,32,172,121,97,153,206,42,196,46,162,232,207,231,174,6,25,177,222,123,60,201,123,181,179,64,115,225,164,121,175,196,160,146,38,237,180,199,254,164,144,238,92,131,38,182,52,187,147,15,252,149,81,186,37,207,60,136,166,141,138,168,74,89,242,83,36,87,132,70,47,228,74,14,179,34,82,187,56,81,185,93,65,60,181,191,88,26,253,35,35,121,22,50,199,101,192,163,121,209,132,156,59,237,75,102,225,78,9,27,31,105,211,15,234,209,195,149,193,149,89,11,63,60,54,231,222,93,61,27,225,199,166,77,73,58,27,222,233,42,179,227,77,56,157,143,195,191,188,118,228,171,98,60,167,183,254,31,201,5,188,141,113,235,28,230,99,154,97,76,15,204,53,124,204,27,97,77,188,245,113,114,232,245,82,216,67,9,127,90,68,144,14,84,117,60,26,144,5,50,39,58,62,196,61,102,43,80,17,206,65,231,48,53,78,236,92,44,194,33,159,125,88,172,222,166,171,167,72,117,45,45,118,133,116,149,245,41,98,229,248,193,101,205,13,37,77,93,132,55,181,213,191,230,201,91,200,136,42,79,210,235,134,95,154,181,76,195,241,74,64,117,208,127,212,179,175,152,23,31,183,62,194,215,100,122,36,110,22,27,152,116,13,116,67,113,243,102,108,122,125,18,246,215,209,86,109,17,37,66,36,85,130,68,200,12,241,250,197,1,150,76,151,98,97,219,133,246,247,83,116,27,139,90,38,138,86,165,197,142,33,66,27,169,132,218,218,131,140,221,216,108,10,114,13,29,228,176,143,185,244,158,7,60,197,193,146,185,9,111,196,48,13,3,140,31,50,10,3,149,252,17,55,213,140,130,98,188,65,18,155,20,45,135,244,53,197,136,238,28,120,2,231,66,91,57,145,248,79,120,128,47,177,191,103,148,235,33,14,65,205,77,105,81,225,69,127,179,26,133,188,218,132,247,214,222,140,87,98,135,43,9,14,207,236,104,29,228,231,193,123,161,211,192,199,207,126,172,149,233,194,44,88,127,247,171,39,10,142,133,221,180,130,239,236,214,133,157,110,12,86,101,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,10,128,3}; +static const unsigned int c_nSized050000l=45955; +} +#endif //_PDF_READER_RESOURCE_FONT_d050000l_H diff --git a/PdfReader/Resources/Fontn019003l.h b/PdfReader/Resources/Fontn019003l.h new file mode 100644 index 0000000000..ff65b8d030 --- /dev/null +++ b/PdfReader/Resources/Fontn019003l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n019003l_H +#define _PDF_READER_RESOURCE_FONT_n019003l_H +namespace PdfReader +{ +static const unsigned char c_arrn019003l[]={128,1,93,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,53,49,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,55,52,32,45,50,56,53,32,49,48,48,49,32,57,53,51,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,48,50,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,53,132,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,110,99,53,43,92,51,118,44,142,73,212,53,76,153,58,118,160,76,36,108,164,219,172,152,186,58,209,115,34,206,241,222,32,97,147,230,148,83,217,252,199,227,152,167,196,156,59,147,64,81,99,73,122,76,168,253,226,234,54,107,71,121,229,167,189,242,177,160,167,11,232,163,179,90,144,102,99,133,89,237,186,181,192,11,48,64,31,92,100,155,216,207,224,34,131,216,242,25,5,172,252,237,204,67,129,75,231,23,35,128,230,13,10,217,146,188,58,203,163,243,110,7,254,116,115,137,103,65,180,25,104,224,208,120,28,47,82,28,9,210,200,245,8,5,101,189,228,129,39,82,62,123,113,149,194,185,127,195,177,39,211,241,1,143,137,18,248,88,249,236,233,227,146,74,60,50,166,30,17,117,144,151,236,95,108,49,72,218,53,71,135,130,131,173,111,165,113,178,173,65,240,106,232,233,76,252,221,224,46,166,61,249,205,49,64,235,136,146,240,0,117,58,108,155,78,188,58,143,216,199,221,182,8,175,167,111,87,18,136,187,4,111,197,79,132,41,195,197,122,5,139,252,88,38,147,17,119,102,92,188,82,115,82,236,243,184,254,213,55,78,140,210,112,138,194,162,95,91,135,15,230,13,100,43,165,238,24,109,41,223,102,141,159,127,139,174,52,160,100,73,195,109,52,98,139,195,125,231,138,41,242,229,198,121,173,242,236,86,166,154,69,18,245,234,141,91,13,10,248,130,1,67,31,49,185,13,43,26,145,130,127,237,78,228,233,121,172,153,16,60,187,22,58,147,80,97,12,230,164,52,99,221,102,207,164,161,108,52,16,99,187,195,132,156,99,167,104,183,104,85,184,172,232,184,197,233,136,110,187,152,247,133,141,223,148,68,74,44,179,251,4,150,141,107,77,245,106,196,200,141,30,114,54,113,177,116,184,76,220,249,171,65,148,27,99,150,36,162,194,5,51,84,25,81,50,206,219,203,145,233,50,120,248,103,116,55,247,81,220,108,162,27,247,70,246,120,32,51,24,244,244,139,15,65,52,73,70,252,220,219,59,230,18,128,193,64,52,105,93,129,198,61,145,131,85,87,163,50,125,95,83,236,149,69,181,9,248,204,254,211,239,105,26,255,144,138,153,109,175,22,247,138,103,225,181,64,228,72,13,220,75,44,170,254,124,122,250,210,108,152,136,109,131,114,43,144,136,69,228,14,105,80,127,250,29,19,183,126,238,87,17,52,51,57,152,9,225,62,80,157,42,85,254,140,122,27,241,251,108,198,216,204,87,63,103,136,202,102,165,94,235,98,17,252,252,254,146,85,138,183,58,56,239,255,225,214,211,203,98,110,232,115,14,137,204,66,165,253,206,179,221,59,76,214,240,19,21,224,131,160,26,143,241,23,100,225,196,198,31,98,137,59,23,224,1,236,120,197,243,154,43,91,68,42,64,100,196,63,5,217,249,26,234,185,153,141,105,200,126,158,218,211,189,90,228,150,134,201,99,168,160,38,227,67,154,150,217,155,228,5,112,214,224,250,28,51,218,128,169,169,185,68,17,219,79,180,201,174,133,104,5,143,178,114,143,2,97,163,29,46,137,106,157,51,37,176,42,81,152,206,169,148,184,61,230,205,189,112,120,141,163,12,183,144,224,80,41,120,241,170,238,7,59,92,58,11,147,216,67,101,254,226,118,187,84,150,13,63,63,71,184,72,66,111,42,233,223,249,186,4,49,227,56,142,205,21,244,210,238,203,60,168,225,141,247,100,2,168,215,252,1,133,249,47,119,91,253,74,114,13,98,255,237,179,114,96,232,173,137,4,27,238,46,15,197,43,217,38,72,138,126,241,89,247,108,59,228,253,73,29,120,209,249,165,54,64,189,186,85,187,128,73,63,214,108,161,84,166,79,250,30,135,202,147,118,188,24,249,99,235,87,174,140,106,75,247,87,158,172,142,16,191,108,128,156,245,74,231,119,44,17,155,136,176,110,88,134,81,251,123,209,130,111,70,104,139,29,135,188,71,123,193,63,179,35,95,81,34,80,124,112,37,66,220,196,246,45,84,4,65,74,129,96,192,141,83,77,233,180,24,14,232,200,53,176,87,213,149,59,165,201,170,118,177,11,44,94,69,229,208,205,50,250,143,108,79,63,178,138,243,45,252,215,155,229,15,215,174,208,84,238,234,200,244,144,7,204,226,193,185,155,143,248,85,53,32,101,26,75,241,99,228,141,113,172,18,244,24,174,193,13,10,9,247,183,212,103,46,160,112,20,96,181,97,194,167,60,41,44,219,227,166,117,20,160,233,251,63,104,78,133,31,44,180,154,189,15,101,54,132,240,74,180,105,189,163,109,128,116,37,218,239,191,154,253,128,183,109,121,71,239,248,53,160,173,183,118,101,238,210,116,134,12,59,13,10,117,163,199,23,170,5,149,213,239,90,165,42,204,112,201,27,135,106,72,7,8,176,11,244,216,179,175,208,160,2,155,15,229,32,221,3,54,83,157,148,252,86,221,243,65,121,214,232,137,154,60,26,165,87,40,92,133,129,117,74,91,85,27,144,228,193,196,158,212,61,112,82,240,168,36,39,251,131,131,27,112,137,83,93,80,243,199,59,88,244,188,146,61,222,159,59,4,1,156,224,39,252,238,83,140,238,128,178,128,104,128,112,67,166,135,249,1,177,208,7,66,82,36,168,138,61,244,209,84,23,102,115,128,55,9,198,80,195,56,242,94,151,187,74,64,140,156,136,48,143,0,161,83,189,40,183,215,49,82,53,205,156,129,36,48,103,72,65,232,34,97,209,101,235,70,123,0,176,56,115,11,234,57,18,247,239,226,67,22,54,225,155,201,206,167,149,40,121,44,116,249,85,46,90,232,8,170,74,40,220,114,61,134,243,47,129,91,72,18,141,27,91,92,246,131,98,94,103,52,138,40,204,138,101,111,76,165,25,201,232,178,78,16,54,35,103,219,127,6,184,96,149,119,75,134,133,36,113,23,118,130,169,28,205,147,166,232,86,56,115,9,226,65,68,206,58,72,184,240,112,116,44,213,228,78,128,16,245,212,216,153,38,50,120,17,40,148,138,33,142,218,134,1,191,159,85,210,19,113,232,247,136,152,231,34,185,174,179,111,99,166,247,58,133,213,89,81,3,84,62,136,41,11,138,182,56,141,48,252,46,35,156,96,204,252,214,108,239,254,89,14,33,168,194,198,100,171,59,48,218,193,117,84,6,183,147,170,101,147,65,237,114,30,57,88,104,17,58,144,187,191,109,64,243,148,79,151,185,138,148,21,159,24,9,23,232,156,213,39,185,198,204,130,203,121,182,116,110,133,110,223,14,32,178,18,104,14,253,11,163,161,20,219,152,64,251,234,24,161,166,214,232,109,98,179,195,0,25,1,133,248,70,45,12,218,29,76,82,80,208,211,205,168,177,50,152,54,204,97,102,242,33,243,46,138,251,59,136,66,42,167,2,240,207,59,157,13,151,247,241,255,71,8,1,177,209,80,39,250,179,148,161,203,75,197,40,255,119,202,158,243,63,244,155,163,128,89,13,104,12,94,153,209,102,40,194,57,196,150,20,94,125,216,79,165,195,167,248,21,122,30,199,143,166,238,169,169,194,128,95,70,221,50,164,53,136,137,246,236,102,250,11,114,127,198,174,118,222,109,44,71,161,121,37,77,205,144,228,160,137,165,22,113,191,31,62,202,202,102,161,239,145,8,1,93,192,55,94,21,147,244,112,67,81,231,122,52,28,2,184,246,247,190,99,35,160,80,241,166,184,182,238,87,30,198,77,78,24,151,171,253,155,230,167,240,172,97,30,224,183,23,155,207,141,116,101,255,206,135,216,106,156,171,59,143,134,201,201,104,236,140,158,128,170,209,93,210,88,27,19,81,253,95,164,64,245,129,236,146,147,219,183,68,91,147,168,109,57,133,192,248,204,41,46,11,211,41,67,165,58,187,60,58,5,40,192,19,163,191,129,29,42,254,97,140,111,13,10,148,24,133,166,212,120,51,20,112,213,49,164,208,114,27,212,80,162,242,97,202,124,26,48,20,205,137,142,154,82,224,84,94,243,128,149,141,176,73,191,15,237,28,146,130,13,10,232,232,40,13,110,161,43,164,17,160,225,174,224,165,33,194,202,18,99,128,64,16,89,83,115,171,85,210,219,35,210,59,132,159,100,119,13,124,149,109,139,1,55,236,38,158,116,244,27,97,255,223,203,14,102,209,25,86,239,47,29,0,8,218,187,97,197,151,198,127,155,15,241,130,160,87,69,208,85,113,90,169,209,94,182,164,89,161,178,43,158,117,173,13,10,93,46,35,105,125,197,44,12,125,173,81,36,72,144,31,96,68,213,175,92,44,46,11,170,140,250,156,105,223,244,238,244,187,217,43,42,224,78,59,7,83,224,68,199,132,7,59,72,118,70,206,186,146,214,146,253,185,70,42,45,111,163,14,124,237,246,137,31,200,7,221,199,240,167,139,197,65,199,221,198,138,38,225,29,122,158,1,201,93,15,142,214,109,217,255,33,184,77,32,191,131,17,22,183,157,167,153,26,30,153,154,244,116,71,153,164,111,146,170,107,255,46,53,21,238,91,78,201,151,25,99,159,218,119,170,160,53,96,139,178,245,223,127,172,123,242,124,202,234,125,73,207,192,166,205,169,42,226,164,159,206,164,58,137,213,9,115,166,171,189,229,233,229,218,197,152,152,50,125,137,96,154,9,195,58,15,229,161,231,38,23,200,123,127,90,243,25,59,117,242,218,85,98,23,9,16,75,219,15,251,119,43,162,86,21,55,83,154,11,237,144,219,62,92,205,136,69,182,186,13,14,162,236,215,16,94,8,79,223,154,105,129,2,255,71,45,120,143,24,20,13,64,102,201,97,191,70,143,37,170,136,213,83,85,128,225,211,70,88,44,46,113,26,26,50,83,122,8,237,179,98,12,135,1,14,163,229,99,111,35,237,228,79,172,75,2,136,51,144,138,83,123,100,125,178,153,133,167,186,149,113,64,5,111,57,16,189,47,177,16,117,213,107,227,143,112,35,159,213,34,237,173,138,232,130,165,159,188,157,5,103,157,41,13,10,53,106,104,193,249,207,57,242,149,156,167,198,250,182,22,249,53,14,172,170,170,189,34,248,83,118,179,220,39,92,149,238,95,138,70,55,239,69,11,220,121,209,253,91,160,167,128,59,7,213,78,96,61,136,33,28,49,133,81,75,95,57,38,205,71,248,205,205,24,209,8,119,119,183,226,13,56,144,55,101,83,120,90,219,237,4,81,192,29,204,146,184,136,213,68,253,135,167,184,180,159,156,34,243,217,115,113,52,25,188,4,39,185,217,175,171,105,65,111,81,139,13,194,81,60,66,103,34,54,248,9,56,226,167,125,80,228,170,202,147,184,109,166,100,81,21,6,245,249,69,224,6,148,107,203,158,204,50,249,25,31,191,162,53,233,206,24,178,51,255,193,131,3,187,59,93,83,198,207,121,208,178,152,60,238,33,255,93,137,157,198,65,231,93,19,177,89,167,99,38,171,73,41,103,158,241,17,213,84,228,123,238,194,132,185,246,224,202,217,44,65,194,28,207,253,98,96,177,95,216,160,28,64,242,217,87,37,53,213,91,31,119,201,88,62,5,171,143,165,163,138,42,123,237,124,25,7,221,245,74,59,169,236,196,118,181,33,104,244,84,210,152,1,18,174,63,183,155,6,13,10,13,87,3,6,99,36,204,232,180,211,68,131,56,9,203,236,212,29,229,174,199,69,95,125,15,208,218,99,186,106,195,221,249,175,168,210,217,163,13,10,117,12,186,62,160,205,206,151,115,202,237,107,88,181,113,201,48,247,109,212,92,31,136,190,200,39,92,19,156,57,11,194,64,218,6,28,189,35,8,91,231,95,226,252,64,80,40,249,99,113,223,12,85,201,66,172,165,117,219,60,65,129,38,233,102,175,51,144,227,251,204,57,96,239,94,225,164,156,107,134,91,117,234,34,170,231,20,6,207,151,237,191,229,203,169,39,6,197,98,152,82,143,134,106,111,252,217,125,236,169,158,9,232,12,138,28,64,7,0,223,53,37,33,196,252,191,55,48,109,6,195,195,114,148,21,47,80,149,253,227,219,51,87,92,38,86,156,86,222,140,219,136,28,63,183,88,138,223,201,214,154,59,100,114,172,137,132,164,253,245,157,92,125,65,101,14,188,136,245,251,90,247,115,136,124,13,148,59,189,47,62,134,214,51,41,160,118,175,0,147,86,222,182,242,13,10,95,84,83,90,177,225,253,115,175,180,217,53,176,159,54,162,89,61,254,93,217,13,10,172,124,236,142,237,170,242,163,251,99,11,66,141,40,167,13,10,62,115,50,143,229,185,58,135,124,245,65,188,176,211,180,112,166,136,100,131,197,143,47,39,183,6,34,198,29,237,75,55,204,31,36,199,252,205,136,214,145,175,203,81,68,213,65,2,147,135,103,96,82,142,39,147,3,109,99,243,96,97,77,49,85,109,73,155,244,159,140,194,48,229,193,210,238,101,103,177,17,9,224,60,175,150,47,166,144,214,55,194,19,199,149,180,219,72,192,107,185,40,64,162,160,160,214,38,42,123,36,234,181,175,158,150,172,246,120,214,245,234,111,74,135,41,236,124,59,78,201,187,6,55,85,58,53,167,46,199,75,103,136,35,42,67,33,14,159,209,179,138,48,222,239,94,26,138,189,212,55,17,241,229,183,218,13,72,166,196,65,86,142,122,135,233,85,203,20,190,247,203,110,149,253,158,212,79,155,223,175,105,180,236,249,38,89,83,226,34,193,171,127,216,83,71,183,154,97,85,139,247,156,59,16,79,237,173,161,232,147,190,106,1,41,31,88,17,168,159,63,29,89,63,50,8,94,194,168,67,125,245,240,42,22,165,110,129,30,107,202,241,207,65,146,42,140,248,70,16,129,230,126,93,207,78,68,11,190,143,4,13,10,150,189,20,163,116,40,15,96,71,101,38,178,111,202,39,204,109,136,204,61,161,170,146,96,206,245,75,220,24,221,161,166,80,88,167,239,9,223,186,14,246,83,8,231,5,219,58,250,231,18,123,1,144,121,238,133,168,202,186,177,211,130,206,194,114,11,38,232,13,10,126,2,7,189,72,254,128,103,22,12,130,89,119,82,174,222,136,149,3,149,128,206,169,163,11,216,88,23,80,216,160,166,18,168,46,243,202,135,98,0,213,251,75,236,79,226,59,148,106,133,91,95,244,236,64,239,1,225,72,44,193,180,60,112,126,37,209,6,165,133,224,121,108,85,55,130,5,50,147,233,237,8,196,240,51,219,56,130,22,53,94,179,168,185,180,181,202,172,149,196,153,93,233,202,106,85,115,89,232,175,172,116,139,119,246,94,167,76,176,169,13,10,98,87,232,204,225,227,50,148,64,214,201,24,61,25,138,192,30,243,115,150,218,61,202,107,133,102,245,248,58,29,96,203,68,35,253,44,12,26,254,212,235,246,9,212,72,126,247,136,38,102,165,78,104,186,239,162,64,134,95,98,88,39,180,142,138,23,1,47,4,197,166,122,225,28,255,14,48,30,23,6,241,167,229,151,51,65,80,219,62,44,127,171,39,184,6,67,202,137,139,170,44,250,216,103,96,79,56,125,134,110,48,72,132,121,37,242,158,171,180,232,97,133,178,1,142,120,53,34,80,13,10,242,126,12,39,147,242,56,216,204,173,94,187,105,219,102,106,27,108,254,217,190,134,25,29,243,64,234,241,214,13,164,118,155,52,209,33,119,131,12,59,91,68,13,37,169,105,62,195,74,117,152,91,202,40,128,133,81,254,179,198,3,252,42,19,127,201,196,176,192,184,166,24,29,224,103,9,21,194,105,52,62,199,148,162,132,138,66,180,118,149,47,210,240,81,90,98,219,32,208,101,202,96,208,53,230,172,112,225,177,181,12,153,113,88,39,113,88,171,190,110,159,85,52,71,23,16,182,12,137,77,120,181,235,28,234,180,230,59,123,180,174,129,216,134,201,77,248,127,57,99,66,186,61,19,210,246,151,71,76,190,81,95,222,235,170,25,57,60,230,105,111,228,207,46,116,115,208,36,15,48,142,32,33,253,141,124,35,161,169,57,28,173,61,75,172,116,94,92,34,240,182,25,12,31,12,77,164,166,157,188,85,164,212,167,17,47,180,164,50,110,13,141,78,100,142,48,184,103,245,115,67,189,168,9,98,52,95,212,239,248,84,88,195,46,72,53,230,18,155,182,85,206,21,129,1,97,179,112,216,143,148,254,104,111,16,177,26,87,30,70,31,140,95,130,193,38,156,79,43,49,22,9,255,244,222,13,97,172,201,40,63,120,217,130,218,255,202,137,158,221,100,147,64,14,164,0,225,229,162,116,97,219,249,28,212,108,58,56,253,116,202,110,190,84,91,236,2,193,69,236,122,206,27,138,4,75,215,221,163,179,55,192,224,244,126,186,40,110,79,83,112,6,99,168,82,41,60,147,192,160,11,209,155,85,51,187,211,94,175,117,245,202,87,254,128,126,102,38,193,37,48,3,87,227,94,24,5,23,75,172,202,188,123,92,51,41,252,191,216,148,209,218,167,168,19,227,218,85,176,9,235,4,183,219,159,104,12,37,238,81,133,230,60,20,181,175,102,91,19,173,107,21,17,132,219,95,160,178,126,142,94,125,149,197,22,189,234,227,45,212,103,47,123,62,0,38,222,228,237,144,175,151,32,13,10,48,3,94,56,138,254,106,18,75,187,24,164,124,125,115,188,170,252,126,161,32,58,104,107,56,188,182,27,3,230,222,18,145,87,146,196,88,196,39,75,108,15,135,137,76,52,97,123,54,184,234,191,45,112,59,227,130,79,222,107,53,241,8,254,28,30,1,105,41,214,204,131,8,34,1,81,205,215,108,49,178,32,62,217,191,159,20,218,115,149,67,71,131,94,164,94,22,218,46,31,220,214,3,206,118,247,36,22,129,211,234,160,200,59,33,133,11,99,247,233,233,181,21,230,57,96,135,226,147,140,44,57,112,16,161,192,229,187,64,106,199,249,254,104,116,92,48,11,162,251,25,166,3,31,1,103,176,229,182,111,156,179,21,70,244,71,15,141,201,160,54,56,226,228,117,192,151,114,82,43,222,163,12,154,49,65,157,224,104,211,30,221,50,221,254,147,200,108,63,109,83,1,77,49,52,178,121,55,195,64,164,122,115,192,194,53,78,70,75,213,139,255,98,156,254,129,208,152,190,52,241,255,54,183,222,28,22,104,91,3,11,191,141,151,27,233,44,20,2,61,106,91,209,205,191,45,132,250,193,103,5,81,203,94,255,14,62,199,204,253,119,146,28,121,245,117,251,228,210,46,0,95,33,191,35,181,164,126,38,220,9,232,247,85,193,157,188,128,253,228,200,26,73,32,173,222,104,204,174,128,176,255,248,246,251,131,223,61,246,1,133,194,63,65,153,56,140,73,55,45,218,239,15,139,14,255,19,112,199,26,161,142,198,149,139,122,141,135,170,65,221,220,185,185,81,223,64,4,166,237,194,134,90,127,66,91,176,28,191,147,221,207,118,5,46,38,92,6,206,221,152,133,98,195,196,85,189,227,49,167,7,222,21,25,116,237,59,203,58,156,127,3,62,135,223,171,61,202,175,9,204,226,227,225,252,203,37,146,12,184,217,210,135,94,159,108,7,152,245,196,129,226,223,125,8,115,164,238,4,80,228,196,70,171,5,62,2,100,140,2,188,95,118,223,131,68,224,5,2,210,190,230,65,171,83,164,245,3,192,64,92,69,5,176,32,7,151,132,23,172,251,134,220,160,216,247,96,232,142,159,53,183,168,3,78,223,121,221,253,198,183,194,234,13,179,73,72,14,142,251,119,248,101,165,90,11,208,157,58,70,216,252,205,2,44,15,205,92,237,165,236,234,18,14,224,62,171,250,235,41,6,153,133,242,98,94,160,181,182,43,13,48,174,23,161,240,211,247,196,115,47,221,66,39,110,93,9,100,107,182,2,123,94,3,94,188,72,47,237,14,99,249,11,141,246,160,9,124,168,151,130,115,119,236,252,24,172,232,33,97,211,20,179,44,1,166,76,27,91,221,87,146,30,11,28,248,110,216,63,61,57,187,146,140,182,164,181,45,136,207,22,165,155,3,122,68,127,140,200,139,217,138,244,221,48,98,205,152,168,112,193,61,188,229,32,78,237,130,87,120,162,27,7,49,16,142,171,40,209,36,168,137,111,145,231,222,178,243,165,168,121,186,197,83,243,225,152,40,189,96,81,200,57,176,148,88,125,82,43,76,1,252,154,120,112,223,100,176,110,26,165,80,214,39,234,239,165,45,154,153,164,125,16,112,138,195,45,212,115,159,62,220,32,95,174,122,217,244,89,197,64,130,47,218,121,37,210,173,26,174,34,93,81,37,163,206,242,182,73,57,62,83,1,57,190,23,219,138,60,11,32,64,24,167,13,113,89,12,4,213,248,151,211,115,30,194,224,13,10,193,240,245,244,88,245,15,30,13,135,16,39,131,87,216,101,155,204,129,13,10,160,16,175,38,172,124,235,66,191,49,148,105,17,174,214,124,18,155,188,0,47,229,55,144,153,103,25,43,220,27,178,138,226,191,142,159,38,125,81,15,85,37,80,113,245,78,130,190,164,251,226,117,127,41,229,185,69,68,238,59,17,242,105,78,47,110,233,0,6,100,152,33,48,127,254,1,120,246,230,202,52,185,62,201,239,1,85,59,138,4,201,95,18,165,189,45,189,94,65,124,112,60,117,246,177,232,183,241,218,228,177,202,47,89,105,121,130,123,51,34,139,224,99,88,224,187,213,83,43,99,64,181,183,87,204,104,73,163,101,249,162,23,11,31,0,3,49,178,222,191,163,27,80,60,194,78,20,193,194,119,94,238,64,89,118,125,228,95,150,111,26,154,14,104,88,111,13,10,25,155,19,244,30,87,145,59,159,142,187,13,10,251,100,92,207,206,232,167,174,78,32,162,248,117,235,148,198,83,185,199,163,118,233,93,127,102,89,82,197,248,78,233,231,228,55,7,83,15,244,70,245,11,13,10,110,33,57,129,60,163,199,216,42,65,85,250,73,65,153,163,189,61,104,77,181,151,41,71,244,97,57,9,220,201,1,234,72,69,68,56,120,71,235,109,2,110,169,201,7,151,27,200,175,171,242,78,11,66,82,240,240,160,33,143,153,99,58,118,42,242,113,213,92,3,178,225,14,28,88,230,65,206,183,173,206,135,42,76,2,126,220,110,90,192,105,194,157,236,75,218,8,119,104,236,68,168,147,167,29,51,229,161,250,155,110,44,122,54,74,246,115,59,98,70,24,4,228,183,183,32,110,242,134,212,215,9,204,228,228,206,244,65,177,218,182,159,105,60,35,234,72,68,107,99,119,198,58,225,135,57,197,102,149,208,170,184,144,112,23,194,71,18,71,85,110,87,145,203,81,252,237,109,243,133,235,4,85,53,228,74,106,203,61,206,251,184,170,114,50,150,224,0,70,63,182,190,22,34,248,251,254,193,185,124,107,222,235,20,214,251,26,60,122,125,24,216,231,205,236,183,158,32,131,15,139,163,169,96,131,224,116,122,53,143,130,99,162,22,207,214,44,197,99,174,34,33,84,230,147,186,109,26,12,128,211,126,30,38,84,219,235,61,180,58,74,195,244,160,23,246,30,13,10,36,156,189,201,133,39,123,185,25,241,72,224,62,143,45,18,142,2,134,23,220,204,195,96,142,132,105,141,206,26,233,240,121,46,209,197,84,205,222,143,170,139,134,124,244,154,211,113,50,191,43,17,119,89,41,177,36,98,100,83,79,206,196,52,145,13,138,234,162,135,123,88,207,31,249,62,157,146,216,21,31,108,195,2,41,135,241,214,30,141,201,208,145,246,122,155,131,68,39,158,40,38,34,250,108,118,240,68,209,88,93,111,205,147,218,86,215,50,144,93,9,177,168,116,120,154,230,199,217,24,128,20,197,177,132,180,46,165,20,110,23,193,145,9,130,129,3,47,37,210,83,130,224,122,3,58,154,3,3,255,25,40,58,130,227,184,111,111,37,77,42,246,247,116,103,194,34,192,194,54,173,5,133,97,180,224,12,68,143,38,59,36,245,186,85,63,86,151,239,111,2,158,101,13,72,13,33,1,62,217,9,250,183,188,19,85,52,183,57,187,85,216,78,2,244,214,37,168,9,72,100,153,136,17,206,33,36,151,26,161,27,41,99,31,32,44,55,180,95,71,82,43,217,58,217,6,199,172,19,155,126,148,65,156,117,43,146,14,217,73,231,0,20,9,139,46,187,217,124,168,52,153,213,182,80,222,163,161,163,247,28,23,120,206,48,206,54,199,171,163,105,249,124,9,187,135,239,153,219,227,108,44,105,137,77,46,108,91,245,193,250,248,217,78,172,231,196,1,122,221,195,211,188,127,30,94,207,102,36,186,166,50,130,85,67,208,246,218,210,128,36,70,21,179,227,229,102,86,156,34,237,243,201,182,233,91,161,72,80,226,85,252,14,107,207,59,152,18,143,206,34,26,181,155,188,239,15,255,61,40,179,229,113,86,38,215,175,96,217,47,230,158,186,163,210,139,61,84,180,232,160,74,114,176,110,201,55,88,85,123,176,246,7,161,168,136,75,149,148,70,131,218,137,183,59,100,146,22,76,50,47,34,196,187,202,226,241,76,0,234,225,32,102,92,234,6,61,123,21,136,154,234,58,87,201,174,179,100,56,185,77,2,245,97,148,203,183,174,151,72,122,125,31,40,206,57,27,239,205,64,118,32,226,225,95,164,145,139,139,150,208,91,68,108,149,70,138,59,130,90,184,65,218,196,103,148,163,202,156,245,206,115,63,208,142,114,20,252,197,59,226,124,238,229,105,239,208,150,209,99,254,179,129,101,191,19,237,11,126,69,5,32,59,161,30,224,177,116,146,160,41,247,207,174,198,17,148,202,125,180,198,144,227,91,243,42,67,82,154,137,72,1,239,52,150,79,3,162,116,93,96,107,190,116,45,205,53,232,31,42,207,241,103,159,23,210,245,105,7,12,98,239,92,179,125,197,95,109,30,209,227,129,135,46,253,40,173,5,239,212,15,63,229,84,207,12,154,161,233,53,166,128,112,252,245,138,146,229,235,35,238,13,10,106,104,242,192,96,170,231,141,28,238,200,125,17,230,23,75,250,193,141,236,197,112,83,69,59,83,226,78,252,156,38,200,113,217,89,42,254,29,100,136,251,102,60,153,64,41,159,146,29,129,14,1,181,199,111,22,104,45,159,2,126,230,48,16,230,164,126,155,137,28,40,147,149,217,210,131,117,230,159,148,39,129,46,49,218,141,208,223,223,53,129,59,217,7,209,34,243,2,255,182,92,22,24,199,187,70,245,101,172,232,62,1,88,36,164,75,65,57,232,155,254,165,234,65,58,63,216,164,39,205,183,21,102,12,194,221,172,85,157,78,242,90,110,37,142,39,93,96,188,137,233,94,189,134,179,185,240,169,31,98,46,86,49,106,249,92,112,31,146,214,21,74,138,155,73,145,66,146,109,190,196,40,183,6,161,23,134,89,52,93,54,221,86,238,247,124,232,206,111,4,221,187,3,44,240,221,169,127,215,51,129,72,73,39,137,57,106,68,137,208,70,196,212,167,89,235,72,28,5,186,235,200,15,40,182,134,11,76,59,55,67,170,138,181,149,125,0,166,31,198,203,177,72,1,186,33,227,98,28,233,96,184,217,105,178,104,8,218,151,106,93,18,159,233,130,212,178,157,244,194,55,141,15,60,252,170,23,99,230,67,157,64,211,69,152,109,150,183,165,34,248,102,85,75,34,60,28,198,168,102,175,11,253,197,30,213,187,75,106,205,46,216,91,176,171,225,96,220,221,57,102,116,1,19,194,95,98,179,189,251,89,245,255,30,218,105,23,250,158,2,106,94,167,177,67,117,64,70,128,244,64,217,147,133,124,112,110,17,66,89,249,148,46,59,127,51,38,45,149,227,64,160,50,155,12,135,235,250,112,151,101,182,83,67,248,120,242,45,167,176,169,57,195,168,43,253,180,78,85,138,128,24,9,63,163,232,186,102,163,47,120,70,71,176,60,161,88,18,148,160,89,124,12,235,32,230,207,82,101,128,221,75,167,196,123,104,103,172,97,44,74,123,163,159,94,205,154,18,187,84,95,141,133,53,150,92,53,194,56,30,89,67,244,13,62,57,131,41,239,219,82,124,231,98,122,63,44,201,47,134,190,221,209,188,158,32,49,14,127,154,129,127,94,183,36,22,138,218,232,161,113,107,200,217,13,10,219,250,115,83,115,204,243,197,1,195,213,153,0,102,115,81,217,231,211,235,180,71,253,202,198,95,213,234,87,42,184,137,67,56,0,54,236,96,83,19,149,211,244,52,56,119,113,150,109,111,14,215,246,237,108,179,126,84,38,219,183,30,235,16,9,0,87,192,19,34,45,204,237,74,65,150,181,221,115,142,97,32,180,149,21,30,109,96,236,237,53,155,147,59,159,70,248,231,40,167,152,161,254,64,26,158,55,131,58,253,180,187,170,176,124,79,243,244,174,25,26,223,249,245,219,15,119,212,97,54,203,70,186,169,66,214,251,23,220,174,0,127,97,54,230,206,93,7,125,170,228,126,107,143,176,227,167,110,255,154,150,62,157,28,226,0,197,74,96,189,49,79,49,218,194,21,16,171,29,213,129,35,148,179,21,134,2,77,63,133,237,21,153,253,41,185,226,95,102,227,14,188,48,198,189,241,106,0,52,189,244,108,251,195,128,12,58,185,225,101,90,187,25,165,132,156,180,136,138,53,48,112,230,190,230,1,239,159,149,233,216,198,59,215,76,233,80,69,49,164,200,20,130,120,89,144,21,112,246,0,250,244,180,147,194,229,212,179,44,36,220,25,26,104,47,189,131,242,211,219,246,55,21,79,113,153,186,225,244,54,225,231,232,28,222,193,219,160,182,180,245,147,51,121,230,49,250,42,157,141,79,47,239,187,211,151,21,243,136,119,114,36,250,144,144,25,47,23,45,5,186,3,154,71,71,74,96,115,136,142,238,189,167,200,43,25,209,26,122,173,78,226,106,37,130,159,43,254,87,74,18,193,192,116,213,172,21,27,110,51,29,153,238,234,196,48,146,69,147,151,74,60,202,92,203,137,186,60,115,242,25,159,67,67,230,221,98,186,165,222,242,150,206,49,119,41,126,250,233,106,252,118,253,229,75,225,149,107,249,168,237,189,161,163,151,184,191,117,127,74,182,226,11,25,160,3,157,239,159,215,13,144,22,71,159,233,217,132,66,45,66,130,0,114,182,169,13,10,120,215,251,142,131,205,196,173,167,159,124,133,3,95,106,200,62,73,37,149,50,93,45,239,152,81,234,210,217,164,201,198,180,110,185,191,157,32,129,54,86,251,216,242,146,138,178,117,124,51,19,103,66,95,131,41,111,133,72,63,227,67,213,190,93,98,187,110,119,41,195,128,200,29,229,137,91,245,25,252,147,117,51,49,227,0,194,120,20,83,73,202,131,166,136,55,6,136,140,139,21,71,104,59,182,119,63,37,184,30,149,225,176,66,154,15,157,200,87,176,8,53,214,210,112,213,69,109,213,32,67,94,25,186,89,173,138,239,201,84,178,80,92,19,117,26,96,112,38,210,179,24,118,32,250,185,165,157,46,70,91,168,252,220,133,70,53,148,186,233,166,137,157,253,21,246,36,39,83,26,80,149,249,246,243,111,187,12,250,120,161,25,140,33,224,68,237,181,173,133,44,189,130,199,133,45,122,223,189,16,155,81,75,7,126,73,206,102,69,135,215,72,82,99,162,201,84,205,216,136,144,166,20,66,207,226,251,123,195,101,5,81,38,7,224,133,154,33,175,173,238,219,171,21,5,108,46,174,140,251,13,10,161,192,159,235,56,132,120,132,90,143,133,21,123,11,224,90,163,58,63,132,206,238,195,151,246,41,210,89,173,229,196,15,240,192,250,16,150,49,43,55,108,247,105,83,90,115,240,163,58,18,31,216,152,48,76,110,174,240,67,165,138,243,219,49,145,223,208,193,5,203,111,69,114,197,234,190,248,85,205,134,9,63,198,172,127,54,112,230,217,164,173,156,178,134,200,182,192,117,222,13,10,221,207,196,221,23,53,37,115,201,1,119,200,75,87,38,202,166,91,245,210,195,89,201,90,227,75,168,155,150,217,220,226,182,242,2,102,241,16,17,12,96,172,210,145,181,128,62,78,50,210,79,94,91,255,0,255,98,164,85,183,81,229,65,129,8,166,171,127,6,94,215,238,148,5,203,41,228,12,251,207,106,31,5,141,205,211,45,80,25,109,181,39,250,98,242,71,188,101,216,153,113,187,85,16,173,147,52,32,210,100,71,151,77,93,239,211,120,113,145,153,242,33,242,22,5,57,162,39,162,59,93,100,51,117,50,237,83,79,165,124,80,30,234,184,42,239,55,79,185,191,171,67,178,14,207,218,161,0,190,114,131,57,218,58,32,251,251,239,71,36,193,8,47,156,127,234,221,54,22,84,173,32,215,207,185,86,79,102,24,3,232,185,147,97,112,149,232,19,22,224,195,13,141,11,57,112,134,139,234,100,18,38,33,194,238,110,101,64,213,162,96,44,130,108,151,99,22,157,107,169,40,60,38,157,46,59,201,12,198,77,179,122,62,27,31,238,28,17,154,88,201,30,158,139,153,76,182,206,141,26,100,205,217,26,151,24,99,17,51,102,237,69,252,200,239,155,115,43,16,76,242,4,181,220,210,50,235,232,2,30,122,73,182,15,65,191,21,99,126,141,168,205,28,188,135,232,60,247,33,65,56,93,128,213,178,26,212,141,233,163,245,181,220,174,178,202,184,203,119,130,251,6,154,166,156,115,20,99,22,231,151,152,138,122,191,61,125,45,204,159,136,216,133,109,167,104,159,250,50,242,200,227,131,214,230,170,215,25,168,32,242,38,218,100,149,247,130,95,175,43,170,96,238,167,104,52,192,104,12,122,105,150,60,4,120,215,43,98,25,123,245,91,92,135,11,231,159,94,8,36,175,176,111,238,99,183,100,56,23,240,206,121,141,197,70,165,7,145,184,159,188,168,206,201,3,233,171,203,106,223,219,81,138,177,134,65,31,73,155,9,205,143,18,102,163,242,79,82,242,204,235,121,132,210,172,76,207,150,9,58,84,218,199,77,128,19,165,4,87,193,6,233,85,130,236,35,71,169,217,213,52,103,65,100,86,58,43,133,56,253,55,173,249,54,42,18,205,100,176,125,225,50,2,50,155,0,35,88,150,192,170,101,221,194,82,131,216,14,14,234,74,94,241,186,148,87,1,46,83,227,189,17,68,85,172,253,152,130,131,8,131,30,223,137,121,194,199,114,145,172,36,24,6,103,149,95,112,81,240,22,183,178,116,175,240,31,122,66,142,14,200,54,44,164,95,5,169,196,152,119,71,91,209,81,14,21,189,83,164,25,49,177,5,134,171,235,152,127,113,243,39,199,199,92,174,25,210,146,188,28,0,173,88,63,108,105,170,193,137,31,190,187,30,169,200,8,156,75,201,227,159,86,52,213,197,184,45,120,201,140,253,243,143,97,28,214,80,67,172,212,198,32,82,205,71,24,28,82,43,242,253,166,179,32,247,69,225,209,137,125,51,79,170,126,183,22,48,39,29,58,33,148,42,103,154,74,224,176,30,252,236,125,222,199,137,25,93,117,102,13,10,41,236,201,69,130,23,186,81,33,204,102,132,39,202,1,238,103,152,45,96,44,115,81,172,249,148,169,119,235,154,140,133,176,7,209,19,93,135,50,51,211,113,178,43,128,30,74,248,147,25,246,176,202,137,37,137,166,78,192,2,23,234,165,31,122,195,58,129,148,127,174,180,4,167,139,215,101,168,252,128,105,212,209,246,13,95,233,43,58,15,61,227,139,11,173,231,107,70,104,128,124,35,139,17,22,242,52,168,222,144,26,40,45,149,227,64,160,50,155,12,4,244,247,233,151,226,47,60,17,79,220,91,183,60,103,13,10,117,212,135,122,17,27,102,119,194,103,58,119,139,131,51,38,206,129,242,142,1,133,182,227,209,83,116,12,27,240,240,114,118,67,75,95,149,26,247,218,3,80,36,205,74,189,41,65,179,252,38,242,28,78,87,240,148,232,146,73,124,101,89,112,133,90,212,187,197,111,95,20,44,120,16,114,207,175,45,76,12,64,141,78,22,198,95,16,152,112,183,124,129,136,144,97,230,107,193,143,81,39,111,87,181,67,137,197,228,78,40,104,133,141,151,48,31,41,164,218,84,21,232,176,74,92,83,56,177,76,147,247,7,214,237,77,87,221,34,228,128,205,6,109,16,25,108,122,173,63,133,19,125,213,182,127,85,220,94,207,95,114,188,17,236,82,249,71,88,55,165,13,214,251,47,203,209,250,204,82,53,143,245,115,141,101,169,254,50,14,250,157,142,74,69,220,78,62,32,80,207,80,153,8,27,3,139,177,24,17,52,203,136,71,110,50,42,11,83,6,118,183,90,154,129,23,151,90,85,170,149,148,31,27,134,34,167,165,209,154,45,94,195,66,33,144,143,198,85,0,201,90,242,46,212,109,12,190,240,220,171,123,88,90,97,82,171,81,115,49,38,112,159,240,131,184,107,211,121,30,24,41,175,120,222,134,164,14,213,219,46,73,59,211,24,179,122,185,131,214,135,173,197,238,198,252,221,75,78,160,61,231,44,59,226,136,33,144,97,111,121,61,179,19,224,129,49,28,60,188,209,47,75,88,118,242,36,86,68,161,118,8,247,119,26,213,186,40,31,44,173,81,72,207,84,200,224,169,130,196,87,206,189,39,83,237,252,195,43,33,45,217,148,82,43,25,39,208,8,92,92,120,126,222,200,60,70,200,70,19,30,250,53,65,88,38,103,167,135,5,163,209,15,173,233,210,166,236,43,42,241,215,178,163,42,123,91,208,144,211,176,0,117,224,3,35,192,62,222,125,237,136,102,196,96,227,177,138,69,214,245,22,7,140,114,87,247,243,228,245,74,59,33,134,202,119,63,62,223,174,203,32,212,182,60,110,8,212,143,64,11,26,96,41,24,64,222,159,115,200,84,96,224,90,154,210,83,207,175,95,3,143,246,2,231,208,182,62,234,109,160,81,1,234,152,202,252,116,145,1,157,171,48,141,13,97,249,233,154,178,89,213,121,228,24,107,149,29,247,74,130,32,82,112,27,72,184,31,93,241,164,117,26,65,234,187,122,22,68,88,100,73,55,90,170,96,135,112,94,169,110,167,152,184,170,102,180,147,245,169,203,93,21,168,15,182,82,70,217,62,54,167,39,103,147,209,169,79,13,10,140,153,133,20,157,4,12,94,148,195,32,127,104,158,186,195,81,209,75,34,17,128,104,131,130,63,67,210,13,31,76,34,156,98,230,140,167,204,42,241,36,242,183,253,210,127,25,230,53,120,17,116,164,22,3,73,248,125,81,172,118,170,84,136,37,174,117,118,249,3,85,219,222,14,128,166,156,233,50,107,255,99,167,94,227,53,57,117,93,167,170,81,204,107,33,17,120,9,32,2,158,140,158,202,190,69,142,19,174,251,173,206,102,54,135,108,74,241,252,181,29,251,243,63,18,46,249,215,237,227,166,242,44,167,237,182,101,239,238,47,88,151,13,15,129,86,187,42,16,68,182,22,198,165,57,101,48,55,152,246,79,15,228,43,110,250,50,238,0,182,70,121,225,95,254,169,79,27,86,252,182,30,57,13,7,252,175,108,224,185,222,89,177,87,53,61,173,154,228,3,96,105,184,43,43,128,253,4,110,134,232,230,60,131,186,135,90,49,218,222,2,152,250,68,88,46,121,112,120,249,100,156,243,134,133,173,122,252,54,29,174,47,254,93,173,157,160,180,89,162,180,230,26,227,100,158,206,159,121,72,205,121,124,147,229,195,195,172,50,140,34,125,241,152,170,185,61,243,15,178,195,194,72,162,238,247,86,103,146,152,61,118,45,245,151,225,41,13,10,184,74,250,98,90,153,233,219,137,196,49,81,157,251,47,208,83,179,87,141,58,108,82,117,139,186,112,138,170,44,45,115,237,193,226,194,1,129,109,67,160,107,130,13,10,58,227,113,119,80,203,93,120,155,13,76,225,37,225,67,163,133,216,78,16,50,246,162,32,112,14,167,8,65,104,52,159,234,36,87,131,26,146,169,35,199,157,84,105,187,86,145,70,216,182,13,10,241,103,213,223,43,132,222,222,55,101,37,13,10,218,108,208,72,81,140,6,190,195,129,148,215,113,59,225,5,75,174,152,97,245,69,66,32,119,162,35,71,143,206,57,19,100,238,142,156,8,64,3,233,143,99,135,208,200,100,234,129,86,8,91,24,178,68,18,172,200,103,236,162,8,50,194,192,189,178,182,116,66,189,108,119,242,237,227,143,87,14,42,79,176,21,33,42,74,22,158,66,120,253,96,17,208,0,57,151,174,128,171,243,37,161,87,173,198,88,212,34,227,6,131,167,90,140,172,189,94,138,53,127,26,58,146,15,241,99,226,138,187,170,236,172,255,117,109,57,71,0,163,251,186,112,184,248,43,227,211,5,0,157,74,80,76,46,184,217,230,247,236,111,155,27,49,241,118,14,76,220,241,203,217,76,146,87,225,251,77,163,111,195,92,100,99,161,84,152,160,18,29,85,143,165,57,4,161,147,71,22,211,114,253,194,41,110,113,213,102,101,241,144,231,192,189,183,92,60,152,177,187,136,96,63,161,95,9,101,1,16,45,79,207,212,182,152,58,237,18,166,96,44,194,67,166,81,142,102,252,88,162,32,137,58,180,163,212,83,183,129,167,185,213,200,14,171,102,40,252,30,223,165,54,114,248,181,20,11,130,4,178,41,200,68,9,121,82,175,24,211,71,137,55,194,49,13,242,208,230,232,188,77,90,65,85,24,159,95,102,73,22,19,135,78,60,125,240,96,12,80,27,205,50,125,188,191,102,91,0,137,103,118,124,78,64,241,239,164,191,198,238,38,178,86,148,98,138,196,142,180,254,160,133,184,246,233,127,27,151,11,221,162,38,41,216,42,165,51,70,165,164,249,20,125,41,226,166,181,150,41,46,177,35,186,136,244,188,110,139,232,11,51,178,32,15,46,143,213,167,16,227,97,41,198,51,209,171,66,188,203,161,40,251,228,174,164,82,170,181,26,129,135,255,246,193,252,35,187,26,181,47,111,154,123,136,194,193,83,245,78,101,37,13,10,217,15,241,189,229,193,66,141,98,163,45,127,153,121,190,36,166,164,68,208,247,49,37,103,201,252,219,198,229,151,67,251,32,27,239,86,20,112,229,129,118,232,33,28,236,115,76,208,210,171,42,97,111,109,219,170,17,114,160,78,68,90,40,245,204,127,179,165,168,62,244,58,244,226,154,73,210,206,65,251,223,214,84,237,63,133,99,123,23,18,239,18,68,188,167,175,254,131,118,126,138,93,158,179,49,120,167,204,198,245,51,87,70,30,170,79,45,218,42,77,123,237,138,161,208,100,175,145,62,31,141,6,77,241,47,55,149,160,137,197,62,73,237,8,48,192,30,224,30,245,234,154,53,149,52,1,214,37,235,178,225,178,45,205,48,27,69,28,89,252,226,188,88,208,159,239,54,37,55,85,220,149,186,33,246,62,33,50,109,252,42,69,81,87,177,81,21,167,149,126,13,212,177,243,103,120,103,212,94,88,20,180,147,78,199,14,96,86,59,193,171,183,104,162,22,99,48,37,215,15,107,70,170,115,29,238,219,231,136,67,48,239,178,187,102,89,161,117,61,52,49,147,159,254,147,80,14,145,123,154,4,76,252,68,141,133,89,96,198,224,225,216,175,208,105,91,72,21,56,78,254,32,41,215,203,75,4,241,152,87,191,54,118,214,59,182,52,165,173,134,182,111,76,112,133,122,197,92,119,199,123,210,115,196,127,249,176,240,111,71,161,85,86,113,2,198,93,48,81,114,25,29,203,201,164,85,42,241,121,6,147,112,65,220,229,210,91,232,247,184,158,52,99,109,42,150,22,201,0,70,195,120,8,5,143,134,154,233,195,153,184,18,104,243,160,183,241,82,71,23,6,53,150,221,248,22,93,37,53,225,254,239,19,1,223,41,24,182,140,88,90,30,155,29,199,7,60,102,114,8,179,77,160,65,54,152,74,125,2,241,85,81,7,128,4,102,186,183,113,95,69,13,10,23,20,136,159,51,195,157,233,119,232,73,201,210,239,224,188,184,201,161,171,120,79,137,22,237,123,127,243,92,140,245,102,237,156,105,186,163,76,43,204,161,192,217,44,88,40,30,172,230,47,134,229,214,88,215,190,176,148,113,77,121,223,140,22,13,10,0,30,9,242,114,179,30,244,29,60,229,71,192,33,91,226,240,96,76,251,122,225,63,212,63,117,14,35,20,155,125,83,147,240,216,227,139,44,24,53,62,60,128,135,42,9,80,81,142,76,231,124,8,144,161,199,200,160,228,254,179,19,137,145,14,166,188,96,77,125,213,198,16,171,37,125,183,100,125,251,136,199,8,225,27,34,99,187,95,127,179,233,11,216,142,160,32,66,49,233,36,249,53,167,57,240,249,206,5,110,201,109,193,162,35,81,164,223,78,114,185,164,111,203,65,186,122,95,202,37,218,78,227,23,160,161,181,41,207,148,97,20,113,92,195,187,229,97,13,10,118,167,183,175,76,65,221,49,87,76,163,229,171,195,85,198,188,85,236,22,115,112,220,110,213,49,13,10,84,239,187,227,54,17,222,193,173,36,244,145,35,78,142,119,167,202,172,182,139,195,100,34,89,56,121,252,220,209,235,157,247,71,122,24,15,243,81,86,164,117,7,138,211,245,93,55,128,152,207,192,234,16,203,180,131,47,234,56,87,1,37,11,63,197,242,180,198,119,46,106,11,208,11,129,72,82,187,174,193,130,114,12,228,168,87,217,29,241,100,114,215,171,148,102,223,73,192,35,231,51,112,91,151,211,239,119,21,162,17,69,82,122,94,211,255,183,51,222,233,17,26,181,105,13,10,174,194,53,226,73,89,70,189,230,69,133,165,93,223,49,126,110,67,8,82,144,89,46,182,90,59,108,190,75,73,137,240,238,68,175,102,173,40,231,217,158,36,229,28,35,138,151,234,77,100,69,55,13,10,63,30,13,10,231,27,115,113,48,195,64,37,170,160,121,27,17,64,228,129,63,174,23,90,132,94,90,65,215,156,6,205,108,129,202,136,83,23,32,109,54,104,68,175,80,249,46,198,79,190,100,183,44,225,237,11,138,52,37,111,120,167,212,148,114,188,72,103,26,53,255,46,31,181,31,191,29,82,150,37,38,84,203,239,52,67,4,126,90,34,195,66,131,22,247,254,94,35,4,244,150,143,147,187,19,132,100,251,85,169,15,73,166,212,23,66,187,42,2,216,197,79,0,201,55,46,158,149,172,93,125,35,237,249,13,10,108,183,71,51,47,225,227,252,145,134,76,90,64,149,134,187,133,44,121,194,222,13,188,31,131,107,23,183,252,124,219,21,172,129,129,95,236,88,254,182,198,221,182,53,3,207,43,229,70,13,242,149,201,205,57,217,125,247,138,69,243,27,218,77,59,204,194,224,44,215,214,144,210,115,33,220,5,84,96,136,84,126,65,8,183,28,132,234,109,204,85,245,213,18,33,55,189,27,110,229,48,63,89,121,157,138,224,143,186,60,219,147,199,247,191,249,41,186,151,18,128,159,133,134,94,78,129,118,152,164,98,193,14,200,249,247,175,60,218,220,226,254,109,135,85,157,192,235,158,76,134,210,146,177,84,13,10,142,57,140,55,21,161,99,66,216,248,60,8,147,71,139,247,190,133,148,112,36,138,14,84,148,103,146,95,127,130,69,31,113,28,7,74,156,5,161,124,187,56,231,123,13,231,180,110,185,123,157,202,46,46,65,175,75,89,190,121,95,112,34,64,109,240,227,195,85,112,157,155,137,138,198,191,239,224,200,98,74,83,142,239,186,103,136,168,90,32,179,119,213,45,144,227,225,206,148,178,241,109,112,228,22,137,169,204,54,59,89,4,124,18,139,131,174,187,156,100,15,32,39,39,139,75,60,210,37,81,238,140,39,35,222,43,110,239,20,202,122,55,94,51,189,34,200,159,175,108,8,48,238,55,28,48,22,241,157,188,53,228,188,128,92,142,128,68,113,235,184,149,76,58,144,238,120,197,92,151,92,94,116,169,155,63,64,110,69,255,94,228,251,14,185,19,129,19,112,107,244,15,19,193,152,89,121,18,120,254,45,164,181,190,92,255,87,199,164,101,94,236,112,131,47,49,209,203,207,114,167,87,238,4,6,21,76,116,20,77,136,144,196,106,246,83,216,7,100,79,168,237,105,227,180,129,182,215,201,69,192,206,39,134,151,29,208,237,206,230,206,127,106,106,137,65,108,204,197,66,137,75,250,95,171,143,123,158,109,189,105,95,154,26,148,79,23,234,185,92,130,68,81,130,21,11,38,147,182,7,166,126,13,10,234,183,129,127,24,34,126,11,253,2,206,141,243,74,219,2,90,206,230,175,196,226,130,210,186,82,14,237,152,126,200,231,0,177,235,44,206,45,112,168,42,96,98,181,157,246,179,226,124,154,254,70,239,31,88,161,249,77,252,245,119,196,110,202,81,68,58,237,66,39,194,151,2,191,129,4,128,17,108,66,238,96,202,248,96,51,81,65,184,57,243,53,248,134,219,97,108,143,190,4,119,194,166,185,37,185,174,232,251,89,251,240,91,142,163,228,254,179,19,137,145,14,166,147,191,121,83,108,254,195,48,76,137,123,138,80,142,211,131,92,124,4,104,209,48,75,90,146,232,154,43,129,114,118,171,160,32,97,9,200,137,117,11,229,189,101,67,190,13,10,116,189,65,53,63,172,135,176,205,134,169,227,76,197,236,156,212,117,171,6,122,3,234,91,181,62,49,127,23,77,123,24,250,211,96,205,202,197,175,41,75,98,78,122,82,182,56,219,28,177,35,204,255,105,87,165,186,41,57,85,159,150,158,156,56,219,168,252,62,129,213,102,3,238,208,44,36,199,125,191,207,3,138,89,22,195,81,136,28,98,126,127,103,223,99,177,88,44,226,1,231,193,203,140,53,235,139,170,13,10,79,8,225,45,113,233,100,149,64,200,211,196,65,198,153,219,173,135,122,213,165,230,213,75,51,165,231,62,219,71,164,150,28,81,0,182,6,162,49,156,225,243,253,35,176,104,172,19,232,222,94,68,210,62,166,70,230,105,50,42,129,212,95,72,205,64,154,233,244,143,127,218,244,185,152,78,106,159,73,108,159,74,4,166,162,99,158,176,177,151,58,201,83,225,247,171,149,221,243,112,55,212,36,92,0,17,155,157,13,233,62,23,91,232,205,206,190,51,130,14,165,215,120,225,0,13,188,96,171,177,94,139,93,108,52,223,185,231,15,99,197,214,58,238,229,73,203,200,118,30,38,33,207,74,167,46,60,117,211,43,223,12,29,29,11,200,26,142,40,156,188,254,215,2,125,148,34,141,216,225,181,175,102,96,152,247,74,47,88,160,51,39,127,96,75,135,16,92,0,56,16,241,248,251,175,203,172,19,60,96,37,209,46,19,217,222,93,106,175,158,252,79,139,137,6,198,167,227,215,23,125,251,226,131,17,7,125,160,48,147,142,104,69,214,170,180,58,29,28,124,37,0,45,209,50,180,18,250,86,240,140,109,223,191,76,198,224,111,127,78,201,56,101,191,144,144,199,82,177,252,52,16,219,196,200,199,233,30,19,246,163,231,35,9,166,34,89,242,29,228,220,132,72,70,66,112,217,0,159,175,255,21,101,222,69,91,170,234,225,162,17,233,193,119,31,223,70,211,19,183,203,4,13,10,209,97,126,30,192,96,119,66,61,120,134,178,80,156,138,160,249,39,93,31,54,7,221,158,209,120,19,249,210,14,162,221,33,147,94,98,99,34,92,77,75,117,217,7,25,241,20,166,183,183,227,230,180,46,164,219,151,231,18,42,210,187,43,246,242,152,0,61,123,229,112,103,14,159,206,164,124,64,33,167,139,81,148,24,58,77,28,161,86,163,186,118,152,66,130,114,2,250,171,155,173,163,161,199,100,38,203,157,227,225,189,22,21,131,128,37,117,2,116,125,111,76,161,186,227,9,23,20,58,211,249,200,26,252,158,153,43,185,178,71,47,47,177,218,11,214,63,244,184,162,93,27,95,50,204,158,199,164,175,187,81,109,171,184,37,175,104,83,127,105,210,36,163,5,236,106,31,2,221,155,169,86,174,178,226,117,157,4,170,240,163,32,122,192,183,157,117,126,107,111,117,159,219,69,46,250,0,133,227,90,92,237,101,18,228,41,63,44,251,198,163,130,162,182,150,43,241,227,193,159,19,22,143,55,193,144,104,11,122,174,193,222,23,14,218,39,148,212,169,163,48,195,226,73,67,57,7,200,63,121,78,122,8,225,243,240,56,13,254,243,180,72,76,230,116,56,57,237,114,238,228,45,196,201,12,161,125,254,119,239,144,3,170,165,138,224,193,88,148,12,200,108,62,60,100,50,233,210,178,123,171,226,134,38,36,149,76,234,145,183,222,62,152,177,161,7,109,38,219,53,19,86,149,174,152,131,246,254,4,217,246,188,90,75,185,53,38,121,22,24,191,210,210,113,233,230,41,17,15,14,234,177,132,13,190,34,180,234,202,191,27,245,129,18,105,220,64,142,18,22,8,112,98,25,80,118,63,156,247,111,63,177,45,49,21,132,244,112,197,29,181,215,115,54,93,242,110,145,35,11,25,168,177,38,137,133,51,111,140,59,253,44,170,51,95,180,193,242,64,27,142,25,238,48,107,79,244,175,123,142,4,153,140,237,103,75,170,154,205,231,158,64,197,216,238,157,213,116,86,202,141,214,159,141,205,81,187,62,208,206,43,65,165,180,216,43,102,71,111,185,30,124,36,104,253,162,210,173,207,43,88,64,40,77,229,151,253,106,56,7,100,137,182,31,3,6,108,222,23,237,36,201,204,113,180,29,74,82,35,126,27,188,58,13,56,80,68,104,102,31,57,27,164,69,178,14,191,3,176,173,234,17,175,80,76,169,248,111,9,233,67,222,124,123,233,28,4,215,60,74,177,25,35,34,37,154,76,88,19,86,77,24,104,3,101,132,206,1,230,66,50,123,116,182,22,168,54,240,216,46,75,128,95,49,79,181,231,27,222,163,139,242,129,197,173,168,188,158,241,12,74,161,118,179,81,57,122,95,185,228,173,243,63,181,41,24,210,140,219,209,135,214,130,33,92,131,103,169,25,114,27,40,71,240,45,153,109,176,13,10,147,211,241,158,244,205,15,195,240,29,71,169,146,213,65,237,46,126,29,127,68,11,97,64,255,137,68,51,83,241,240,50,255,140,92,210,188,149,141,135,200,16,154,178,246,184,76,169,158,183,195,11,154,223,132,17,245,28,145,114,95,68,41,212,135,230,190,237,206,231,183,201,206,237,157,249,171,223,61,190,7,101,167,114,140,200,225,134,15,158,13,10,51,48,93,166,121,5,142,122,165,184,181,242,114,145,37,188,43,73,156,211,193,225,50,45,243,37,2,200,62,70,129,114,43,119,69,173,22,26,243,158,242,64,122,24,197,250,147,26,202,227,192,137,232,27,220,53,148,23,168,22,211,24,220,53,66,156,122,171,44,131,143,49,41,6,202,160,5,110,91,18,112,106,117,114,117,238,16,179,72,232,218,184,250,125,147,90,79,215,109,122,38,246,24,30,184,85,158,207,168,171,100,40,139,235,251,111,233,160,118,110,39,152,121,65,222,201,87,154,75,13,10,231,75,52,221,32,145,221,247,197,248,25,228,48,180,196,43,35,209,51,30,147,95,148,242,165,138,74,17,141,68,206,182,225,254,118,165,87,70,119,228,233,91,31,132,146,43,13,10,56,240,126,65,85,58,167,70,252,168,91,9,30,141,12,175,172,129,163,189,72,191,226,5,71,143,176,170,142,180,130,113,35,239,194,139,215,228,190,229,144,151,85,0,36,64,210,93,179,3,43,209,13,10,71,199,187,192,50,219,200,96,244,109,219,95,79,116,191,55,135,198,197,141,45,147,190,218,188,124,71,83,43,75,107,51,192,41,53,11,66,70,8,67,147,74,173,16,132,169,96,146,71,126,164,158,216,202,161,46,8,164,33,234,134,168,46,97,24,213,85,112,79,101,200,231,249,157,34,128,188,85,46,205,4,226,40,196,140,177,190,118,133,99,110,187,48,32,148,147,195,101,26,233,85,164,219,253,122,6,79,230,60,5,3,9,56,193,138,75,229,88,208,189,44,133,203,214,108,150,108,64,136,59,103,76,47,57,185,58,170,199,231,121,214,181,0,128,59,109,36,231,36,242,97,74,128,43,47,108,175,58,11,192,204,29,60,207,130,60,165,233,100,200,247,39,240,40,11,100,114,153,153,190,120,180,194,230,126,0,88,251,155,227,244,215,142,187,89,19,170,83,24,153,216,98,11,151,101,135,119,22,39,34,27,174,23,13,10,213,162,51,128,109,156,209,54,239,101,100,132,100,33,82,234,3,123,110,113,56,131,123,118,78,92,133,216,194,125,193,59,142,66,228,80,100,182,9,85,121,56,13,67,43,120,13,16,216,185,28,64,164,53,161,5,82,155,0,77,96,132,233,76,201,244,166,217,235,107,207,15,247,64,101,137,212,246,181,51,64,143,61,115,50,89,107,32,123,74,100,89,58,61,121,216,90,76,158,194,16,229,8,191,27,155,97,217,221,254,222,49,174,201,119,241,167,25,111,25,178,198,94,63,93,128,50,252,224,181,12,183,13,241,216,213,49,22,138,192,198,213,117,119,139,0,140,107,166,22,171,18,182,250,194,155,43,53,1,135,141,186,0,225,219,155,75,239,160,138,192,145,244,147,7,111,118,40,222,224,230,231,159,134,223,186,129,72,70,158,20,191,213,132,9,60,206,41,64,243,55,144,221,124,13,25,61,138,221,210,173,102,117,98,37,80,78,118,196,48,27,2,205,91,16,137,145,95,243,78,66,110,134,93,200,186,30,100,127,74,139,139,4,2,143,204,1,204,252,139,25,106,235,244,110,62,33,46,42,69,60,54,115,131,59,155,80,22,238,196,207,240,137,62,141,101,167,12,72,78,236,143,239,38,110,97,40,57,184,250,85,49,93,6,23,117,197,190,4,135,138,165,61,6,88,193,17,208,207,86,60,228,95,119,73,180,127,22,167,54,103,228,251,43,25,220,155,53,194,54,82,193,51,57,226,181,65,69,5,7,159,124,140,12,45,20,195,136,242,189,54,241,127,51,232,109,129,112,102,90,187,54,83,164,89,54,13,9,107,79,110,6,148,183,216,63,121,193,75,2,240,36,235,83,11,61,74,193,176,87,183,109,176,192,97,203,39,150,37,254,78,73,159,32,194,206,205,5,197,185,4,244,38,14,225,83,103,215,33,41,58,150,156,225,234,195,43,186,224,156,236,169,217,147,57,140,179,65,39,13,181,234,13,250,212,110,110,28,106,180,29,169,37,13,98,245,169,72,157,118,184,220,167,38,154,220,222,81,121,7,227,247,212,84,47,172,240,31,204,119,168,165,18,63,7,231,161,250,183,241,36,220,64,11,204,34,107,133,129,28,211,166,48,112,238,226,30,167,164,108,66,119,185,97,100,79,37,180,122,35,135,88,195,200,189,209,57,213,192,242,169,198,178,203,218,30,155,118,72,138,39,34,36,219,255,89,162,104,57,20,13,10,32,84,103,38,90,79,89,84,42,177,72,136,231,26,199,88,214,41,19,255,43,177,125,47,39,241,45,186,130,58,57,249,37,40,156,94,157,1,189,79,52,4,25,119,218,73,37,207,73,247,81,131,62,131,48,170,76,152,36,204,172,172,37,255,230,234,239,154,152,146,158,164,110,30,255,177,44,112,255,237,24,6,176,246,140,203,20,22,98,35,82,105,111,228,110,112,59,42,230,227,175,219,226,241,120,80,3,79,121,175,48,143,218,31,207,188,215,91,242,193,106,36,225,244,5,155,118,76,171,226,130,29,240,211,127,172,132,9,255,49,104,212,83,4,68,149,210,107,16,169,158,33,12,121,41,226,47,122,169,164,23,50,245,1,238,28,159,236,106,192,5,111,230,40,194,222,13,67,245,36,140,215,202,134,86,86,221,115,98,41,79,149,81,62,84,187,155,253,79,25,215,15,202,100,71,144,169,30,68,238,239,173,252,195,113,127,186,29,18,71,53,15,233,135,140,134,0,232,125,126,43,102,185,84,162,13,10,189,173,164,229,27,29,96,197,189,88,94,154,72,125,138,82,6,165,254,251,181,19,209,80,220,117,222,11,208,156,46,220,194,146,17,234,246,165,76,14,9,213,164,106,183,35,83,196,154,200,26,101,31,247,1,228,213,243,188,53,75,224,61,250,141,39,122,3,62,92,46,81,242,15,111,194,25,75,17,146,44,194,45,64,44,152,224,190,227,4,227,0,222,195,160,105,67,20,66,25,100,2,206,130,185,163,147,24,141,252,21,137,81,87,251,230,42,175,182,206,103,15,4,241,61,22,251,130,188,182,191,26,184,38,52,172,22,137,78,148,5,234,44,178,197,32,97,68,194,175,27,11,38,212,82,43,245,137,140,236,75,225,95,176,217,131,244,100,142,53,135,124,207,126,204,160,6,196,158,16,9,31,174,113,79,219,181,86,240,22,31,199,112,229,31,164,236,250,151,237,170,72,67,199,252,48,220,183,107,70,212,242,30,62,97,139,8,17,246,195,215,166,84,58,152,45,120,91,165,157,70,164,72,214,12,252,101,150,15,37,87,180,184,118,2,183,133,82,235,5,63,40,217,251,154,27,105,247,109,75,126,6,48,232,170,129,49,146,213,220,156,158,197,16,17,14,222,227,84,25,90,37,99,117,157,70,51,194,141,214,224,180,108,119,143,90,163,194,139,245,235,158,188,136,126,238,181,93,0,62,182,188,232,209,244,2,110,7,229,197,19,124,234,130,36,20,216,245,97,152,49,112,106,27,179,50,152,132,13,13,223,159,184,156,82,159,45,165,38,199,232,228,224,236,66,213,177,244,5,134,120,182,13,19,228,222,197,225,29,94,140,186,142,6,71,137,97,48,36,254,1,242,116,114,242,123,192,209,17,72,148,171,218,85,145,243,186,130,31,217,236,224,37,23,15,186,102,73,241,90,79,53,196,83,122,35,67,125,3,222,7,181,244,244,249,207,13,65,181,95,140,24,147,151,185,96,231,162,245,220,22,155,241,132,117,229,146,206,33,209,46,62,48,2,56,47,108,53,239,151,110,156,176,8,107,64,194,111,151,95,233,133,173,74,71,237,229,0,169,129,128,183,24,88,235,160,123,75,126,108,48,111,81,185,78,118,103,251,40,69,42,127,8,185,246,90,22,179,7,217,177,165,144,144,4,83,24,190,100,161,19,76,217,98,85,129,175,55,162,221,63,141,104,230,123,52,152,168,105,196,148,182,40,52,89,56,77,44,65,152,52,35,103,169,21,23,100,192,109,241,229,207,95,206,235,169,127,190,195,140,78,24,182,122,78,8,19,138,87,128,46,7,189,66,211,187,223,26,121,155,66,105,65,50,234,92,249,35,20,137,252,240,74,21,34,190,27,214,184,234,218,180,23,44,116,46,96,100,16,17,243,27,40,249,27,227,216,25,228,195,8,180,244,175,222,252,126,181,209,130,129,69,235,28,41,20,84,120,160,204,19,229,86,41,96,156,219,251,162,223,33,252,124,139,50,170,92,249,51,157,68,72,141,88,219,214,152,127,9,107,6,169,33,117,152,126,52,23,240,30,212,102,123,4,74,67,25,86,89,171,41,9,45,126,202,147,173,106,86,168,57,131,31,26,141,17,14,93,152,90,172,209,197,209,226,188,224,2,121,71,65,140,65,8,160,164,136,254,56,162,191,207,92,160,13,43,244,173,243,177,109,153,140,239,79,229,121,122,93,218,176,174,188,118,185,64,123,7,70,233,11,239,13,10,193,133,164,145,249,148,150,218,222,87,136,13,10,63,202,162,189,84,201,89,55,93,224,210,32,162,55,231,162,35,107,63,213,154,248,226,121,123,181,44,160,86,196,34,214,39,145,30,133,179,117,24,58,217,237,31,219,235,5,215,72,225,232,113,41,63,97,52,211,106,58,131,96,1,203,99,89,252,186,15,247,233,248,149,223,100,159,229,153,27,160,242,146,213,19,179,89,254,52,73,243,86,134,221,117,131,254,75,192,163,163,139,119,211,131,107,194,214,196,252,205,111,237,55,176,7,165,11,173,185,29,103,124,217,69,195,104,191,137,120,76,160,218,219,93,14,104,12,79,103,9,214,45,2,221,87,142,94,25,92,175,176,238,169,79,97,174,238,5,16,216,36,124,255,7,172,19,37,165,36,214,118,22,27,155,253,205,221,86,70,67,107,204,93,186,193,132,220,94,185,174,170,58,181,165,244,6,139,147,223,26,74,207,161,186,197,130,130,179,138,146,3,70,6,35,35,99,83,143,244,142,7,147,77,26,159,112,32,242,149,153,255,221,55,214,124,57,142,13,10,134,103,103,131,169,1,148,184,24,200,125,220,68,191,248,25,102,232,69,33,254,45,26,17,152,77,237,158,111,72,203,214,163,252,21,75,223,172,97,22,141,162,79,49,213,206,16,177,14,62,206,121,17,118,139,249,73,65,19,124,239,91,86,162,38,192,144,75,158,153,108,191,89,123,252,80,90,143,28,155,12,172,221,192,113,18,44,153,135,239,155,229,203,209,50,191,95,123,169,207,40,38,136,84,243,248,179,142,9,40,199,83,223,11,144,2,155,52,224,155,170,85,158,250,153,213,115,69,68,37,187,195,113,20,219,233,38,172,209,194,142,152,194,173,178,153,31,134,213,238,1,13,10,117,196,133,25,206,167,31,241,139,211,14,78,129,133,233,142,149,119,222,146,9,2,32,169,245,216,64,35,149,94,104,195,116,161,8,233,95,174,197,225,207,115,242,226,86,26,84,228,135,176,28,113,236,52,31,143,80,37,148,41,162,143,102,87,199,111,119,182,151,196,244,185,112,224,59,139,186,83,94,202,21,118,122,192,160,53,155,142,147,153,57,231,63,105,253,15,43,122,167,104,251,192,139,223,111,130,0,214,172,251,34,50,128,198,24,193,129,79,17,46,224,46,243,50,165,40,182,0,154,169,126,46,50,183,113,249,9,21,231,224,148,144,113,83,84,40,24,126,40,44,34,108,25,35,118,40,154,148,163,166,22,7,149,37,28,235,224,29,127,37,163,33,110,162,246,252,120,43,47,200,141,220,167,53,245,194,64,170,114,92,173,162,87,46,110,84,94,195,251,182,220,6,51,51,152,241,207,154,137,82,173,66,243,73,142,172,241,190,84,148,220,15,95,61,26,127,64,166,248,84,102,238,18,90,233,66,227,153,222,57,154,189,58,88,229,235,186,218,234,145,212,187,229,22,46,167,189,29,119,54,48,101,92,162,226,148,97,109,244,53,223,133,177,160,122,162,42,172,152,39,2,43,226,141,18,182,8,193,153,8,86,126,21,78,32,199,57,194,223,46,235,96,113,96,122,135,61,186,55,200,28,32,92,19,65,25,247,109,89,8,185,247,3,9,219,170,51,208,6,13,10,106,238,119,202,78,238,36,169,143,214,3,68,82,180,51,252,50,143,77,131,109,32,252,156,191,77,24,114,83,236,85,115,183,201,122,63,8,167,214,84,155,115,3,116,245,37,28,160,245,97,150,45,238,41,225,104,121,33,119,209,195,96,20,128,58,254,152,245,178,238,155,166,47,3,21,107,96,95,176,178,228,181,120,0,219,185,84,25,22,26,198,101,207,85,146,50,175,11,51,61,49,198,108,9,186,241,210,118,246,97,97,216,170,178,161,174,5,171,152,76,234,2,207,93,96,84,192,22,126,126,206,37,170,23,112,175,139,53,73,88,94,148,36,93,158,216,23,126,229,176,168,253,77,67,56,37,144,119,19,13,10,49,54,138,104,249,76,225,194,200,155,197,43,253,163,48,248,162,223,238,49,21,55,205,139,53,158,83,109,7,134,45,48,144,172,138,129,126,78,120,222,64,65,98,134,82,63,165,83,161,241,74,63,135,38,206,135,106,250,142,188,33,96,207,0,116,13,10,70,46,49,101,231,86,119,110,137,189,110,205,68,25,200,156,171,83,203,179,176,114,48,97,205,116,236,206,43,39,142,193,128,223,0,111,81,170,110,48,51,109,210,224,4,104,226,202,165,2,218,30,242,49,89,150,200,154,230,72,98,92,73,205,247,150,178,75,25,141,100,0,105,125,192,197,212,150,64,38,39,105,237,230,17,154,165,219,196,251,187,121,122,85,84,72,133,46,194,135,120,55,1,179,111,207,144,171,108,249,231,26,147,39,201,180,179,161,246,85,18,66,215,135,11,16,1,49,136,93,184,208,183,42,2,32,2,107,166,0,40,6,228,240,69,213,137,196,225,121,250,105,128,88,22,152,247,141,74,63,138,245,6,108,251,71,205,239,164,201,229,58,206,91,13,73,229,61,127,3,188,188,213,98,117,156,213,180,114,156,32,191,69,168,242,47,206,94,7,249,41,245,62,86,156,7,122,203,194,224,245,21,164,111,140,93,176,19,134,139,12,122,218,131,129,138,165,40,202,98,231,160,190,225,109,122,112,98,107,50,247,62,150,85,67,149,50,52,207,200,159,27,90,142,131,207,223,234,119,65,80,150,33,224,229,193,157,97,17,108,174,32,39,233,151,139,55,146,170,215,136,60,113,150,211,184,253,184,40,152,99,103,226,3,85,248,101,109,75,191,177,52,166,2,135,131,192,58,162,35,228,244,8,214,193,135,141,102,222,135,221,155,59,68,219,94,130,188,227,132,198,215,109,133,227,241,52,139,47,147,12,47,72,232,1,138,206,194,13,10,253,138,220,140,89,131,7,47,62,133,32,239,20,209,52,216,187,239,64,103,174,204,118,163,11,77,207,251,39,18,189,108,85,131,15,179,100,69,199,33,88,216,78,169,183,41,249,11,115,99,149,33,123,188,134,88,120,152,210,66,234,101,213,67,119,61,84,230,161,59,73,43,112,178,218,208,32,73,177,180,195,17,11,154,234,4,11,218,244,23,89,216,88,18,53,147,112,96,118,214,47,76,64,239,48,87,109,28,34,239,15,165,21,160,246,170,122,128,145,66,46,153,59,87,120,149,154,181,30,117,41,84,84,140,123,71,125,234,99,5,127,126,11,239,56,158,148,27,203,37,251,249,41,244,144,201,147,168,254,44,1,75,89,93,153,239,107,7,231,232,244,137,4,204,180,22,232,113,56,26,211,6,54,125,247,150,164,105,32,254,210,199,129,176,83,170,83,203,41,196,37,92,137,63,119,73,196,70,175,110,209,252,187,192,172,144,25,190,167,237,117,140,122,246,197,15,99,163,88,174,46,136,83,29,215,174,149,193,152,139,135,23,168,35,57,62,73,210,15,5,14,49,28,112,142,28,239,36,6,119,87,28,101,197,54,207,29,246,91,95,101,204,188,197,244,46,20,167,17,36,50,51,24,77,125,153,236,3,76,158,141,242,195,36,83,254,211,174,169,240,34,249,201,244,54,203,98,13,10,62,29,232,201,166,243,89,119,177,55,220,72,225,165,142,124,151,23,81,100,127,78,83,227,46,180,114,166,143,183,96,216,74,148,119,92,215,192,218,69,105,8,139,6,16,120,201,213,32,33,210,219,178,130,90,102,209,65,41,46,76,51,129,68,97,136,172,151,80,99,177,58,173,228,41,21,81,13,107,220,109,43,174,193,28,187,158,171,46,202,174,152,233,152,137,21,38,103,90,151,98,144,46,210,126,51,61,167,152,133,94,22,68,105,13,10,180,90,255,202,132,130,166,211,223,34,48,240,22,172,116,168,25,3,114,18,175,111,15,43,43,83,125,132,255,196,26,119,99,172,13,99,14,161,87,247,108,118,172,164,220,187,161,207,164,218,21,22,201,235,86,47,101,195,219,194,137,210,21,11,129,65,201,204,61,75,110,210,8,242,55,143,43,64,159,33,33,82,141,66,191,39,24,128,251,70,137,109,58,199,33,67,223,3,66,227,172,61,148,200,230,16,0,108,90,138,174,243,90,26,194,131,116,48,58,102,13,10,137,64,99,131,44,213,217,247,57,235,189,48,45,20,242,171,93,131,238,59,18,126,210,244,162,15,145,20,132,60,221,241,147,42,38,182,153,163,5,207,12,238,72,144,63,13,85,207,231,3,168,31,0,73,4,39,184,79,204,83,201,201,212,225,118,181,13,185,131,65,200,26,102,143,234,27,237,140,102,5,239,223,96,50,85,181,168,42,106,223,168,192,93,238,3,164,5,5,70,120,40,70,195,35,247,39,213,70,179,213,27,56,162,8,25,16,174,157,142,193,172,13,10,182,147,65,59,26,183,163,154,32,48,249,217,83,51,200,177,6,222,64,215,39,30,159,55,63,115,28,4,203,124,6,38,26,84,78,171,92,4,192,82,7,144,102,85,12,109,200,175,224,60,136,254,65,197,200,216,185,143,24,127,206,81,171,143,114,11,201,64,251,91,13,248,216,200,20,230,230,25,138,143,242,155,30,254,202,255,49,146,240,241,35,15,203,151,6,11,130,228,125,193,128,215,218,86,16,98,152,18,188,125,207,185,198,133,66,118,255,116,177,117,214,156,81,89,32,250,207,160,2,24,202,203,159,91,154,38,220,3,66,178,82,12,226,224,183,84,59,45,60,112,138,185,207,49,194,134,96,85,115,122,102,114,99,251,245,136,153,79,221,117,181,134,18,231,205,2,103,69,52,19,32,60,104,72,42,252,206,112,57,194,246,17,13,10,66,208,247,13,171,138,17,204,58,162,2,255,226,220,8,12,229,98,31,183,237,43,100,204,166,12,166,118,99,90,86,59,118,97,5,50,198,161,126,204,193,80,77,120,59,5,19,15,238,62,162,166,43,234,44,44,156,236,160,85,218,84,13,91,166,93,19,154,3,161,97,44,220,4,212,68,161,118,136,230,163,186,254,165,178,26,60,198,136,194,51,229,77,182,40,186,85,190,102,184,130,139,67,223,184,211,192,74,30,150,108,132,12,73,107,209,168,178,88,235,227,25,135,155,93,189,127,243,253,141,181,249,82,97,27,112,239,234,237,213,124,182,241,213,138,45,237,219,160,51,241,121,249,156,192,29,203,59,114,67,179,92,58,246,64,171,244,181,87,180,205,148,251,108,29,255,180,255,21,112,87,78,172,185,175,77,16,35,77,35,91,95,247,27,24,226,75,35,248,191,43,70,145,37,21,105,196,123,168,47,196,38,6,217,131,69,254,157,230,192,85,65,192,219,66,62,7,229,5,196,84,26,94,121,246,20,118,22,52,231,160,193,130,251,23,241,132,101,121,219,2,66,28,202,79,126,188,38,77,1,222,114,58,69,188,73,132,31,216,91,244,253,81,140,45,200,29,165,51,89,222,44,2,216,190,208,28,158,150,150,111,167,4,11,142,47,243,251,193,112,221,78,188,221,13,10,252,110,104,197,32,247,21,20,63,192,152,235,138,186,84,158,63,111,106,57,125,135,33,190,246,106,224,44,225,81,201,50,183,218,57,192,131,216,241,107,230,94,39,3,226,18,135,118,26,115,134,132,142,81,178,2,229,231,94,195,18,202,222,24,91,211,139,207,46,100,206,74,192,122,163,150,111,150,127,148,27,85,196,177,232,62,90,11,209,199,108,21,6,142,0,143,2,5,154,58,7,140,206,128,101,131,188,139,84,60,97,64,219,50,252,207,31,176,11,25,122,246,131,225,127,200,222,107,178,244,207,193,17,255,42,179,6,190,214,34,90,141,149,154,141,185,54,166,252,73,74,88,62,140,61,232,152,240,159,226,126,110,251,133,121,46,120,232,29,156,224,76,92,54,13,208,40,158,160,129,46,236,121,171,174,172,63,231,63,188,61,7,39,65,20,26,236,154,190,178,189,225,246,133,162,14,142,133,138,171,46,32,196,195,162,134,223,245,6,31,52,140,148,51,242,19,83,93,67,14,185,221,120,5,219,153,46,123,239,168,123,158,41,144,168,111,119,188,60,246,116,168,56,150,230,41,60,250,0,144,39,196,221,160,236,86,211,242,183,28,56,186,18,184,14,178,43,17,130,163,83,195,152,247,66,135,87,124,251,177,66,25,138,221,138,154,92,219,125,232,99,163,148,2,128,93,56,126,236,173,3,7,111,210,6,94,102,236,130,61,211,49,219,89,184,139,141,34,41,35,70,88,58,138,191,53,213,161,122,255,228,42,96,93,114,248,21,143,128,51,252,19,159,42,14,211,153,27,187,72,106,66,5,135,118,192,146,157,105,27,208,130,145,222,65,253,72,123,150,79,48,115,110,249,252,187,223,106,196,13,189,103,77,6,119,217,7,5,86,80,184,159,253,114,203,100,201,197,118,200,42,13,10,63,89,124,114,121,149,88,35,242,184,83,25,240,187,229,102,177,243,65,59,240,105,28,35,99,126,232,26,180,209,208,31,62,42,16,31,125,238,101,83,186,71,155,196,61,118,107,100,155,218,47,149,198,174,131,190,28,123,149,200,14,134,177,211,148,130,68,125,122,0,212,191,16,40,194,154,222,242,87,3,221,123,230,215,91,233,92,113,42,202,63,197,135,146,52,173,97,248,134,54,156,191,240,218,43,66,161,248,170,244,62,83,76,74,105,127,122,112,198,81,178,60,195,11,84,57,228,175,26,14,19,41,118,60,138,164,190,103,207,202,42,88,146,54,84,13,78,110,252,181,176,47,67,71,251,74,41,60,142,53,79,202,117,105,237,204,116,72,200,93,138,179,13,77,214,197,123,255,195,54,98,79,186,210,152,21,97,169,177,190,194,193,221,47,33,38,32,108,151,179,81,12,116,185,93,218,203,172,22,32,188,230,214,129,234,124,155,18,173,202,52,63,65,22,28,228,1,120,20,214,147,112,142,94,13,99,223,237,109,171,244,103,97,108,160,165,227,4,199,154,139,192,173,134,28,96,21,242,193,212,226,180,228,251,110,32,238,66,194,209,130,238,13,44,125,242,197,138,39,66,240,223,5,193,60,26,252,89,97,51,36,123,216,66,220,182,83,179,34,227,169,7,228,88,5,83,69,245,42,65,164,83,230,36,198,202,237,248,142,170,218,152,69,247,212,4,200,24,125,21,139,44,180,52,196,86,47,234,15,139,29,131,186,200,19,229,139,18,159,79,184,1,234,62,193,114,45,35,232,146,3,143,169,251,12,26,169,36,77,145,90,202,229,72,180,163,236,248,200,37,4,149,8,59,122,218,97,20,148,97,240,37,121,241,152,240,106,63,43,93,132,30,52,174,247,40,221,244,235,238,46,240,223,38,60,5,229,178,175,12,40,126,68,150,205,0,6,113,23,62,72,100,188,194,117,17,129,137,149,105,172,106,249,124,37,215,211,84,244,1,222,244,203,223,43,212,224,81,71,173,222,118,76,228,230,101,242,119,184,237,91,176,109,246,145,194,81,6,218,58,194,245,117,244,169,121,255,4,241,93,91,93,167,64,97,254,197,176,128,197,14,221,9,0,110,6,13,10,225,198,105,40,254,37,20,193,154,144,11,46,128,51,40,9,0,210,45,49,90,71,228,109,27,162,2,46,146,192,254,204,43,88,178,143,133,80,51,109,161,75,158,193,103,63,171,4,187,122,82,45,122,34,224,29,133,237,143,28,86,8,135,124,95,102,167,92,118,145,183,42,212,66,189,102,211,54,57,12,59,165,136,123,180,207,107,232,166,138,23,217,49,118,43,112,29,39,44,109,52,223,186,156,218,96,17,165,211,252,162,77,9,9,246,139,237,102,41,140,167,111,48,18,215,254,131,3,94,60,245,142,77,44,2,238,128,94,143,36,59,211,2,160,238,50,233,111,114,16,206,36,103,19,227,238,13,10,154,135,20,75,162,51,128,214,210,195,194,29,154,64,132,18,135,174,94,207,62,195,28,48,145,174,65,39,180,32,178,247,122,195,85,1,185,176,45,229,178,153,224,2,203,211,123,145,73,211,174,98,254,148,40,212,133,92,21,163,192,250,135,154,22,199,109,134,139,175,4,82,30,57,0,184,249,178,84,122,40,239,208,123,156,92,101,222,175,62,245,222,233,87,161,167,51,134,193,17,253,88,14,115,86,126,21,142,184,17,103,213,243,42,91,205,69,145,162,255,202,136,122,132,221,80,125,153,252,197,169,78,72,62,159,42,28,241,120,52,14,204,154,92,50,186,116,18,117,211,206,82,88,254,155,58,185,92,224,45,164,154,1,25,156,98,53,185,160,16,9,17,37,248,232,215,188,247,142,211,31,34,248,176,193,208,158,122,101,125,113,235,151,54,103,203,51,110,152,69,169,68,113,178,146,73,77,9,161,123,224,121,80,66,165,220,61,186,150,108,145,191,131,175,70,50,198,145,95,156,126,71,142,73,67,154,86,163,207,245,6,110,142,56,3,20,89,233,28,234,91,183,193,59,232,7,34,147,148,122,68,5,210,194,196,239,100,111,20,155,97,65,113,218,16,184,248,165,203,173,138,179,36,200,218,25,24,103,3,139,246,162,151,147,138,60,152,110,209,135,34,30,2,158,45,200,46,145,25,41,210,3,242,248,100,135,208,173,184,206,201,186,193,79,51,191,151,135,177,24,251,140,66,135,44,66,36,94,35,252,103,94,104,157,12,29,31,151,217,64,183,171,18,148,204,52,164,232,227,36,190,68,196,113,249,93,205,235,149,185,94,62,148,126,224,148,96,227,61,176,102,184,157,232,132,22,186,16,168,160,161,252,90,27,174,34,72,248,72,59,52,240,14,156,107,133,186,250,28,184,52,99,76,9,151,241,174,201,116,56,76,250,242,228,102,132,25,251,20,179,243,89,169,99,156,192,152,129,64,23,19,71,127,31,219,227,47,148,116,59,119,38,211,202,229,188,105,98,41,46,186,103,85,227,88,240,237,74,251,184,185,28,49,135,161,33,126,4,154,158,50,156,181,154,81,152,96,94,121,11,69,136,90,100,227,61,133,224,156,136,173,235,173,181,18,14,222,99,81,109,168,106,40,158,147,242,27,219,44,87,15,153,21,13,51,119,150,4,150,125,81,112,183,249,210,84,195,109,76,188,89,20,26,186,5,219,159,50,101,194,2,45,181,249,48,53,116,242,243,44,148,98,109,17,246,182,43,123,133,243,145,232,128,83,149,199,0,40,82,65,57,182,151,192,116,94,49,206,22,38,216,243,78,140,103,25,240,143,176,182,46,136,96,71,99,206,183,55,26,24,77,177,211,189,228,44,18,178,106,34,149,233,0,103,52,54,125,63,129,182,201,184,120,144,126,182,95,167,67,80,177,164,116,78,146,253,213,75,221,140,127,132,72,235,177,132,190,75,207,31,93,109,88,158,185,110,189,187,3,55,123,187,192,153,50,78,110,129,145,241,181,255,252,228,105,244,150,193,222,229,208,163,253,164,16,151,72,242,85,99,37,211,26,30,165,127,138,160,114,141,30,139,134,162,121,236,156,2,228,48,5,40,7,8,63,220,61,152,172,88,161,216,82,217,233,223,53,170,169,110,78,57,219,22,171,11,95,36,76,238,164,24,120,113,83,7,237,154,146,193,65,128,237,143,28,218,45,73,215,205,56,52,162,0,75,54,78,218,91,114,222,253,204,220,29,21,94,88,187,6,181,33,213,57,246,2,81,124,232,181,154,165,202,131,209,82,141,142,245,180,51,243,64,227,11,200,135,238,166,176,136,84,223,195,209,50,179,86,152,156,97,148,24,39,40,43,227,63,222,76,254,242,117,246,46,114,4,157,16,171,55,187,47,40,238,23,237,255,67,80,144,212,143,61,111,95,91,186,202,93,100,201,79,83,51,62,111,13,109,147,26,164,229,31,65,216,12,133,249,75,208,82,35,57,84,128,80,102,55,93,176,45,94,130,14,243,249,84,127,77,154,164,223,153,191,195,238,95,42,3,226,118,218,59,251,117,153,176,46,90,129,48,244,51,149,69,32,173,77,185,198,167,52,252,223,222,125,218,167,41,146,193,152,172,180,126,62,248,187,26,167,157,249,203,19,118,144,60,216,151,199,252,70,51,208,228,30,164,93,65,197,238,242,90,7,42,109,92,249,242,145,201,54,207,76,49,228,93,93,226,174,190,132,233,228,116,29,182,152,84,55,97,213,34,120,21,157,19,52,229,138,140,130,55,141,0,135,220,201,240,51,232,196,98,132,197,219,213,46,100,250,164,55,206,143,170,233,85,147,47,205,181,224,133,193,206,116,213,216,152,108,12,165,56,200,87,39,198,79,86,68,103,22,100,208,189,29,205,194,86,205,221,245,57,64,17,66,94,5,67,180,33,208,121,243,116,27,41,215,213,214,58,236,86,27,216,99,45,194,174,213,23,38,126,176,100,255,203,186,178,73,122,185,80,92,118,238,188,14,6,223,49,52,217,40,170,185,5,187,253,246,131,4,151,131,68,56,176,96,61,190,117,50,146,89,199,105,147,170,48,209,171,50,183,21,239,166,1,157,106,88,35,225,61,131,204,132,3,154,113,189,166,9,184,65,166,134,113,179,37,178,29,147,231,121,69,149,235,57,64,3,15,92,173,132,54,146,233,164,139,217,231,138,133,23,194,210,204,160,84,200,171,123,95,155,172,26,232,30,166,100,180,153,208,140,245,245,240,80,109,152,215,251,143,167,158,144,5,12,231,225,32,98,102,213,116,217,223,50,45,2,77,31,224,1,173,247,97,243,33,83,75,72,55,197,30,54,12,73,185,204,134,210,255,228,196,18,156,45,52,44,167,84,26,215,75,38,32,0,50,90,232,234,95,25,167,218,238,255,206,139,12,240,231,67,68,76,63,176,176,63,130,249,145,77,219,206,232,237,186,33,55,239,59,111,154,92,111,25,8,48,76,7,100,199,100,13,78,180,121,238,238,32,102,136,13,10,31,41,77,188,56,200,95,153,23,210,50,138,91,139,200,187,164,236,167,144,171,239,13,10,149,51,52,176,180,172,192,173,191,76,49,111,134,33,188,13,80,103,123,71,68,52,208,76,50,244,144,62,246,232,216,79,108,234,211,30,233,25,138,49,1,195,79,209,128,179,63,100,84,105,252,71,107,50,37,163,83,76,173,88,232,156,55,80,128,143,45,246,163,182,104,28,99,188,104,167,66,61,70,28,58,168,193,98,198,147,176,243,164,67,101,104,14,210,56,124,224,145,208,99,80,119,15,244,225,237,14,81,231,150,68,55,32,87,67,233,177,94,222,187,120,161,64,96,19,162,84,81,127,116,172,205,125,208,132,156,75,30,19,250,196,24,224,89,220,33,174,236,59,106,135,193,171,160,136,214,213,26,190,238,114,3,75,111,133,208,100,31,48,252,82,194,46,27,4,192,96,26,236,141,52,124,142,246,74,75,53,136,79,249,169,101,188,105,107,109,191,220,123,253,44,224,182,5,144,59,66,143,149,85,195,44,13,24,148,89,108,128,12,244,106,124,105,182,188,176,13,242,192,161,199,104,252,242,58,141,142,255,243,133,217,120,108,110,56,180,79,51,211,127,95,22,219,223,201,238,19,6,81,12,247,85,253,30,8,253,178,17,142,228,201,202,139,240,127,18,174,157,130,254,118,21,233,232,13,34,232,94,218,62,79,216,12,197,20,239,58,238,198,55,93,226,61,93,237,83,198,92,203,237,53,231,185,141,192,215,160,208,254,249,112,96,129,44,59,118,220,121,91,84,90,98,85,237,39,137,189,211,144,44,43,35,132,49,159,138,38,4,168,54,242,229,217,59,138,4,45,182,32,16,86,198,84,118,94,16,161,52,72,154,15,189,97,81,66,229,49,106,122,70,175,203,169,27,114,215,68,13,10,123,12,30,202,98,148,77,43,145,84,162,169,79,124,63,65,134,149,28,209,221,151,112,173,211,90,6,76,177,166,74,69,42,201,13,10,220,211,71,194,0,38,225,54,137,116,172,52,226,85,2,184,110,143,154,5,98,102,188,106,181,150,116,89,79,239,117,187,3,227,227,137,221,81,54,217,185,128,112,39,59,92,50,105,107,0,165,109,30,188,170,181,40,67,185,179,63,207,237,55,100,209,252,96,84,228,202,222,38,232,13,150,16,13,12,233,78,102,247,57,186,209,247,1,101,168,219,123,62,128,248,177,193,186,88,52,246,162,120,212,112,120,214,116,24,45,86,168,72,72,96,167,4,238,213,29,140,176,73,108,143,246,173,56,13,251,3,228,13,10,81,199,74,250,102,39,127,118,226,142,99,184,57,184,2,89,100,135,112,85,69,201,64,211,244,89,24,216,214,71,7,97,225,47,174,44,250,226,109,178,203,58,128,87,141,7,37,165,13,10,218,40,194,220,53,79,124,114,2,235,107,120,8,217,98,54,69,245,49,79,100,138,175,208,172,151,145,249,97,40,16,219,76,199,163,204,52,248,82,166,166,150,129,202,155,214,60,219,205,158,208,5,174,133,115,171,165,138,18,49,99,59,228,224,90,36,51,189,105,142,251,242,166,91,65,30,239,20,182,222,162,29,160,242,152,18,11,151,20,55,42,206,129,191,236,77,198,218,207,130,63,197,209,107,26,209,21,39,167,28,48,202,200,58,20,210,95,192,109,141,34,134,26,18,48,235,64,192,28,218,167,7,30,77,93,78,40,127,204,163,74,148,161,175,171,209,159,132,194,210,219,205,91,240,2,92,29,20,55,238,203,15,150,84,124,58,181,240,67,5,124,15,231,110,160,136,192,43,220,8,151,117,70,103,67,34,30,54,4,115,119,149,155,193,87,48,46,207,185,181,241,249,114,82,220,221,9,1,13,10,113,243,7,9,119,175,143,207,66,100,15,189,59,234,185,98,194,173,42,246,126,145,236,43,145,130,68,160,252,155,55,4,42,195,219,232,90,223,207,47,210,67,44,141,132,227,22,39,241,94,249,39,9,43,91,22,142,120,6,175,241,231,241,97,7,167,22,81,202,110,59,172,124,42,3,207,245,169,142,185,83,200,25,253,40,51,9,233,6,100,87,164,86,90,189,66,43,2,199,13,10,84,14,214,50,187,196,77,206,61,103,187,34,117,216,170,17,179,144,229,128,232,156,221,49,78,88,233,233,198,14,152,197,19,86,107,198,169,162,78,47,197,186,30,92,49,72,238,18,176,132,187,197,26,89,210,166,66,48,172,109,20,131,65,99,84,193,122,154,254,136,77,9,147,227,68,124,146,110,32,75,236,206,242,133,226,198,201,72,175,33,138,168,69,131,95,165,226,145,224,137,60,95,163,34,141,28,33,130,82,223,84,101,215,51,195,236,120,5,98,179,187,24,116,149,221,184,147,157,21,246,201,13,6,86,219,61,8,28,233,205,120,175,46,234,148,41,149,14,65,54,152,4,79,119,201,239,19,199,127,25,139,220,2,168,40,222,5,195,155,127,226,63,47,60,38,153,36,13,10,144,100,27,231,47,200,174,157,131,91,227,89,59,213,247,196,195,203,111,113,121,96,3,75,239,216,233,9,49,30,178,247,14,38,61,96,78,83,9,31,123,77,67,126,239,128,49,180,249,203,75,70,208,42,176,94,33,175,147,164,92,187,80,94,238,189,65,107,230,65,7,13,10,225,129,180,44,55,170,123,169,160,180,168,118,199,17,136,82,78,42,87,233,221,190,30,86,30,160,140,86,85,223,249,197,147,43,13,10,125,199,110,185,254,112,106,49,116,115,31,62,24,173,186,51,8,167,135,124,239,22,118,95,229,54,70,141,153,190,7,116,139,140,135,45,184,57,136,29,162,86,92,123,82,35,122,55,82,115,31,53,21,63,64,128,115,84,236,161,85,73,128,225,59,55,254,25,38,14,184,87,2,80,228,115,42,251,128,191,69,36,55,115,16,121,232,118,136,115,210,233,192,133,187,176,131,26,20,144,24,144,48,242,111,125,60,19,173,228,226,246,238,170,7,228,196,103,172,150,4,72,109,204,250,73,172,234,51,71,179,37,202,188,66,236,13,243,227,163,116,131,53,124,185,59,15,254,225,208,35,41,42,161,33,225,123,197,239,174,155,155,149,2,244,160,31,83,248,183,182,234,177,110,164,182,177,193,83,88,122,12,209,60,144,13,75,222,92,2,126,95,250,231,104,19,156,201,42,50,120,100,172,133,100,166,0,134,154,96,134,50,217,46,217,132,196,42,87,165,137,138,224,151,71,211,119,236,9,236,213,24,58,34,148,205,13,10,202,25,190,58,167,128,153,194,207,143,74,66,98,96,63,123,3,176,194,154,200,117,249,204,118,153,247,90,113,83,245,38,0,92,96,211,187,192,249,236,5,128,157,221,107,102,195,88,192,177,250,176,18,98,75,131,4,243,44,88,217,114,215,129,45,82,162,167,89,126,127,25,14,90,125,3,45,214,213,104,71,235,245,253,220,100,5,142,28,159,250,181,42,19,150,83,52,94,23,235,135,59,55,221,240,97,8,25,112,251,202,203,124,1,170,67,219,147,102,8,46,154,100,130,19,244,59,234,100,30,4,154,107,106,247,212,107,135,69,125,96,157,97,249,189,58,225,129,174,227,17,7,20,230,227,32,73,51,80,2,132,67,198,234,28,177,109,101,231,192,251,85,211,42,131,79,176,166,170,118,217,106,138,219,95,12,126,203,205,6,138,186,59,15,238,117,15,48,41,99,110,248,23,143,75,114,222,7,29,235,57,119,165,19,138,120,87,168,250,79,129,120,176,40,202,27,195,238,60,126,125,97,255,13,214,128,207,82,212,222,236,69,227,147,201,199,193,148,232,180,134,19,46,123,241,149,144,84,4,13,10,98,49,115,20,37,132,189,177,79,214,82,190,228,166,30,35,30,19,74,55,126,22,48,183,192,231,238,123,53,109,63,238,200,23,254,196,34,62,152,175,79,35,195,32,218,85,171,215,124,48,251,82,165,35,166,164,56,107,114,148,135,119,43,145,190,148,139,122,155,246,244,12,158,113,102,80,188,22,82,222,247,255,33,105,54,238,203,212,45,130,66,33,110,196,222,124,211,41,215,187,122,187,144,25,128,14,184,184,121,71,41,214,225,107,173,109,51,11,127,23,123,235,188,158,1,170,113,114,168,97,157,14,94,56,169,151,104,190,226,185,191,64,192,110,75,87,111,112,24,254,85,0,25,149,250,28,69,85,39,187,169,80,229,106,50,246,212,58,176,132,150,118,251,66,9,3,1,213,221,123,8,210,234,217,85,123,181,171,163,88,102,255,89,113,170,195,115,38,85,17,154,15,196,169,205,102,202,123,118,40,228,47,135,20,135,99,159,130,77,7,130,7,221,146,116,9,240,4,119,15,142,235,42,77,81,141,245,254,150,219,187,98,220,182,185,89,216,196,7,67,2,214,52,156,237,251,207,148,139,173,186,29,54,64,16,76,135,21,30,236,156,176,205,222,249,183,238,41,244,68,127,216,166,80,205,1,195,148,85,0,25,89,253,255,99,147,205,133,109,103,126,200,167,209,120,2,26,131,254,115,121,162,103,66,252,247,133,200,148,0,8,46,26,144,238,139,11,210,240,81,132,237,204,181,60,158,17,110,201,48,191,25,217,230,254,106,31,243,123,191,89,149,239,48,233,209,202,29,214,97,63,58,17,240,198,149,39,28,235,210,74,57,153,139,136,237,141,206,13,46,189,75,179,84,120,117,186,79,160,147,113,28,91,31,6,116,21,216,144,254,89,213,163,173,39,71,234,50,254,180,28,97,246,142,72,216,75,108,255,226,184,34,217,36,230,123,16,241,121,122,70,134,178,130,95,254,238,183,219,184,93,126,68,100,136,115,214,87,79,22,201,74,142,136,179,2,208,110,18,43,248,103,170,11,69,141,142,244,130,65,167,203,195,17,55,123,121,223,85,230,35,154,44,231,169,231,135,12,62,236,198,195,236,245,207,43,156,169,39,252,38,173,193,206,197,213,133,132,197,0,156,171,194,20,163,137,22,238,162,17,112,16,223,194,185,225,239,125,111,240,0,85,133,108,193,1,239,226,77,104,30,119,180,85,162,125,170,225,67,42,18,209,115,118,146,82,56,176,62,136,229,209,240,170,25,255,230,162,77,89,54,170,160,206,182,223,254,112,111,56,26,103,142,54,113,120,13,54,244,102,196,250,128,135,163,244,141,222,227,154,101,210,187,76,15,167,128,109,172,153,1,153,131,247,122,203,39,92,95,241,122,49,36,140,199,88,196,66,27,19,141,44,60,151,96,78,211,1,173,63,169,226,184,163,49,246,58,242,86,79,58,204,213,205,252,77,59,197,137,230,199,188,126,252,61,8,201,151,250,158,247,91,60,26,54,201,153,111,245,70,37,208,83,99,62,163,229,194,128,168,86,223,231,160,132,18,103,47,6,48,166,34,21,134,108,172,119,143,120,62,214,194,32,123,26,66,149,119,67,231,163,107,247,16,212,163,229,6,62,83,217,36,233,185,86,130,104,252,48,41,19,16,165,245,91,199,114,13,54,242,162,41,73,237,111,169,252,220,59,39,5,163,119,142,251,122,54,228,18,37,158,96,11,80,173,149,154,193,125,86,96,141,109,251,214,185,90,117,77,127,213,219,200,198,246,199,219,199,106,28,242,154,186,186,255,47,85,37,20,195,180,70,156,217,87,154,70,153,61,27,62,202,213,63,101,200,125,80,213,207,51,73,149,110,131,57,230,219,3,128,160,217,193,247,31,90,21,26,71,11,7,174,135,129,115,46,164,136,93,49,41,24,167,77,132,92,209,143,171,236,246,37,62,254,226,236,193,163,43,84,69,237,119,251,47,152,143,103,70,251,235,37,187,190,209,99,234,68,229,205,4,163,199,209,84,76,244,24,13,191,68,8,106,62,95,83,163,172,113,214,2,192,87,233,33,29,37,199,45,243,116,104,115,78,163,96,27,124,70,196,191,2,240,114,235,220,123,145,11,187,171,168,240,84,199,103,24,210,124,85,33,22,218,216,210,96,6,53,186,61,6,211,109,81,249,20,208,206,154,230,255,107,153,111,243,190,238,59,5,94,240,68,51,162,234,86,39,94,168,55,48,30,159,237,60,240,246,251,251,215,249,27,87,248,94,71,139,207,226,102,70,137,189,29,86,71,168,0,218,145,158,112,7,229,30,24,53,217,14,209,214,18,71,177,207,115,36,82,58,163,3,200,244,49,221,42,180,116,207,37,164,202,144,143,86,217,247,237,117,144,145,6,46,113,250,67,167,142,232,124,37,145,43,69,124,196,113,76,165,85,11,58,249,243,185,100,212,44,200,254,131,196,79,24,173,5,91,75,111,102,204,163,149,61,67,4,19,80,237,44,33,249,31,35,70,88,17,252,113,28,224,120,212,19,6,236,199,122,92,60,151,51,198,212,17,66,47,2,161,205,137,246,141,145,51,29,173,118,113,28,223,82,217,182,45,68,2,241,161,224,15,156,163,64,119,20,48,239,84,165,82,237,32,109,105,202,66,183,158,82,250,87,48,228,120,54,158,47,200,8,229,153,35,216,253,169,246,26,89,88,33,11,254,215,214,37,121,114,231,82,156,143,21,196,1,47,194,143,45,214,180,30,130,238,199,216,5,138,131,145,104,25,96,164,84,45,68,28,179,170,208,242,66,168,34,44,14,31,216,71,177,242,139,54,86,187,194,126,132,4,180,123,228,194,173,206,198,48,6,221,186,228,162,197,181,212,29,94,3,14,253,136,204,37,40,44,4,127,193,125,87,167,8,59,149,236,167,126,155,200,87,42,71,106,31,89,11,128,91,52,81,38,77,210,205,83,131,166,146,255,72,193,66,20,250,9,100,41,109,156,177,22,238,170,233,223,202,19,184,5,242,187,226,197,20,213,52,128,95,130,193,145,62,133,185,86,167,103,21,157,133,152,115,96,29,9,41,205,58,4,186,113,226,6,15,124,22,120,232,169,174,68,158,147,91,135,187,184,206,76,1,215,126,13,21,195,170,7,125,152,25,172,149,65,196,61,61,157,226,124,107,184,101,242,108,208,165,223,142,135,201,47,102,216,188,189,169,59,104,109,248,24,20,190,203,39,31,68,63,82,252,46,104,239,171,80,166,132,136,47,90,250,231,74,1,45,43,13,10,67,8,49,46,188,106,156,153,97,100,47,83,149,14,144,205,161,2,86,41,197,112,235,81,25,128,179,92,86,38,193,175,195,64,185,159,237,64,99,151,237,255,238,222,50,247,171,236,24,36,151,16,194,216,227,225,154,160,215,86,99,175,92,23,55,200,243,94,133,216,186,127,223,2,166,77,106,5,31,248,100,93,145,218,177,167,2,201,86,181,40,224,214,217,44,137,188,85,129,238,107,179,117,103,35,13,10,224,215,88,49,127,102,63,180,119,125,70,30,152,161,151,51,161,211,200,78,193,201,199,254,208,60,192,107,239,11,138,6,141,244,69,22,208,166,126,209,151,200,36,127,143,161,121,210,29,209,65,52,156,100,7,237,66,255,31,51,49,187,84,163,17,181,156,147,48,99,9,220,41,100,163,81,42,192,30,209,101,152,154,75,116,16,37,195,194,4,231,177,53,161,136,66,226,235,180,246,76,246,99,200,227,23,118,42,190,153,184,144,235,195,26,30,134,28,237,239,180,148,26,203,100,66,54,191,55,59,17,61,75,55,93,218,86,62,41,211,55,3,74,253,2,50,240,180,252,128,81,48,36,12,182,31,86,246,86,190,178,55,222,205,157,181,170,199,67,1,241,49,86,39,80,181,64,204,75,122,166,1,69,69,203,133,56,114,85,14,160,66,202,129,245,12,250,37,26,138,188,119,137,129,5,198,239,16,12,132,9,95,175,210,30,81,72,119,47,89,181,33,127,154,223,60,95,220,161,139,218,145,246,47,172,47,46,31,41,239,210,90,120,24,88,195,93,14,159,24,155,135,125,5,216,166,55,99,206,12,128,57,202,8,180,199,63,39,166,104,68,47,93,13,108,86,127,157,91,21,82,161,92,69,14,81,136,247,14,51,189,222,240,210,0,32,8,17,199,129,62,175,185,173,253,130,245,207,133,248,60,194,190,246,203,1,151,161,231,221,164,188,250,46,146,97,163,37,159,44,20,242,110,102,11,23,75,49,228,174,143,66,117,61,117,42,143,221,0,205,235,58,62,136,136,36,119,56,166,247,127,138,46,212,44,161,155,254,103,244,136,216,147,199,50,242,25,172,28,46,237,68,229,180,227,206,94,97,63,203,142,120,150,94,156,211,197,56,38,71,17,189,143,195,157,91,173,182,223,126,1,25,158,158,56,55,220,49,104,72,118,64,34,184,92,54,65,27,171,61,114,124,85,73,136,131,112,47,94,107,41,121,56,83,45,11,0,200,156,111,17,123,36,222,67,238,62,160,93,181,144,108,12,125,105,51,78,0,26,162,231,89,227,74,167,187,171,222,129,250,215,124,48,49,181,185,98,178,58,198,157,245,61,215,194,195,2,63,132,28,23,2,123,182,237,230,141,180,175,29,209,194,56,225,200,95,87,250,21,167,137,190,62,36,234,46,191,223,108,19,101,144,71,113,146,8,133,108,4,69,196,45,179,192,93,167,95,131,20,212,40,7,2,43,35,148,196,144,163,160,178,70,67,12,109,112,237,158,97,2,144,91,215,89,126,156,134,73,50,70,59,191,195,56,41,167,24,116,29,75,246,222,140,249,57,3,99,156,32,52,58,95,202,248,32,90,102,217,89,190,31,57,58,27,144,194,234,239,63,242,15,103,235,227,19,155,235,92,34,168,32,94,158,182,56,253,226,60,55,216,89,26,74,102,235,42,108,133,124,90,30,249,15,6,251,121,71,97,147,83,47,100,173,90,238,23,85,29,95,52,187,247,94,24,210,71,51,63,246,240,181,208,204,13,16,71,146,210,166,73,230,45,249,19,177,194,28,214,144,156,217,3,58,69,17,135,160,219,126,60,151,25,44,230,93,6,90,85,141,231,110,77,188,152,125,146,204,73,42,183,145,240,171,101,50,199,241,69,249,48,102,194,103,21,161,91,77,6,237,117,111,23,246,115,83,52,48,98,234,9,40,208,141,44,17,247,105,195,136,48,45,0,6,67,27,191,138,38,254,212,157,233,6,27,40,191,176,64,247,242,12,113,130,96,13,10,216,70,0,21,230,150,85,192,92,253,106,247,5,116,139,239,131,78,77,252,230,248,142,154,196,166,114,189,99,199,14,81,93,0,50,32,176,122,48,224,14,83,3,130,58,47,223,134,170,48,184,193,247,225,85,136,243,172,193,245,2,88,148,29,228,207,105,139,66,232,60,55,248,40,212,215,196,240,90,235,244,30,141,182,247,61,25,5,118,140,196,142,208,202,89,4,155,209,251,228,109,166,135,80,9,82,40,3,222,19,150,236,13,248,222,86,30,31,61,178,243,96,29,162,249,13,71,25,81,179,146,68,118,46,75,102,254,215,212,113,61,254,65,160,48,186,237,63,215,133,184,86,254,166,177,181,171,133,245,86,148,184,139,79,215,49,206,164,53,69,57,139,158,174,29,117,140,53,46,135,245,50,177,116,251,117,161,174,30,92,165,213,249,51,76,196,112,77,49,99,243,43,204,255,176,245,14,4,203,169,162,145,18,58,39,111,52,131,171,144,108,171,201,228,61,225,246,46,236,4,250,179,222,64,152,131,100,159,161,186,53,96,198,93,218,240,132,90,29,90,233,99,55,173,150,189,100,109,140,250,228,249,212,183,184,55,6,110,98,22,249,74,248,20,105,202,248,194,44,172,43,221,123,217,181,201,76,196,113,235,202,43,169,144,250,215,242,126,3,176,159,190,134,251,227,207,171,244,107,90,205,89,223,180,54,22,143,75,78,45,202,158,249,87,166,126,201,134,67,138,205,126,13,10,161,12,230,106,189,50,201,136,105,41,157,186,69,33,223,233,13,10,138,119,212,141,13,142,67,105,86,195,200,186,63,115,180,114,95,117,119,183,189,36,231,139,110,51,76,184,59,64,86,193,153,23,213,69,13,96,114,126,167,133,158,254,106,73,110,124,119,23,58,12,96,150,12,105,157,75,123,153,229,37,74,131,219,0,195,184,194,8,20,155,128,0,207,48,189,69,235,125,247,200,49,253,58,210,53,94,239,220,221,123,187,98,0,84,163,85,118,58,67,238,250,23,224,125,198,6,157,86,7,192,229,160,82,89,134,213,74,233,190,108,179,121,205,132,17,20,115,74,81,9,79,155,69,186,106,166,122,123,90,151,183,191,120,34,108,106,53,56,27,80,69,151,57,243,4,183,51,118,1,196,90,16,104,176,105,5,58,170,108,61,152,66,2,23,165,50,99,101,7,205,199,23,29,187,240,79,24,50,80,48,37,168,77,16,207,94,230,110,193,135,236,161,204,228,82,152,141,99,31,15,33,38,110,112,127,8,144,16,22,22,93,104,92,69,118,103,13,194,26,15,8,22,117,175,119,47,221,70,177,35,248,35,67,174,91,101,174,69,24,159,185,197,36,100,144,80,179,86,132,137,82,74,216,52,212,85,68,11,38,75,191,185,143,241,131,84,116,205,217,51,179,207,255,135,216,203,178,176,73,176,82,159,192,152,171,106,213,209,237,173,255,33,135,117,219,205,232,184,175,11,61,194,11,100,249,63,243,105,146,140,64,184,98,173,68,239,154,66,39,243,241,56,63,157,42,230,234,85,205,176,162,78,80,175,240,242,208,203,118,166,252,89,88,0,56,128,208,106,199,229,231,151,249,209,253,153,77,254,132,98,26,251,7,165,157,193,28,201,27,149,181,211,247,159,46,80,186,220,134,38,119,74,29,219,76,163,232,41,229,44,32,76,75,207,153,221,133,184,181,237,234,210,80,18,20,185,121,186,53,121,190,176,81,69,114,158,249,215,134,159,196,179,216,177,41,32,213,18,159,162,138,67,84,41,110,215,177,228,207,30,243,174,148,122,89,252,31,219,181,55,53,52,159,133,102,208,31,130,231,157,250,15,144,152,63,108,191,226,68,177,169,192,131,208,222,210,66,30,204,29,224,236,195,197,55,176,122,52,167,241,165,41,29,233,190,187,234,66,226,246,130,0,139,112,136,18,158,70,60,197,236,181,187,234,141,91,29,232,114,32,148,70,144,114,11,249,106,214,35,13,199,8,67,161,191,21,14,55,53,38,207,85,9,218,243,234,124,61,122,52,13,10,245,212,41,220,24,253,179,78,140,18,228,75,67,77,47,230,99,60,126,81,208,56,248,229,101,90,83,96,184,91,157,56,12,157,141,66,87,106,156,22,148,166,96,104,206,102,75,204,94,158,196,143,181,7,163,17,122,241,194,161,97,155,13,216,32,68,179,196,232,76,111,117,228,7,9,220,20,74,80,138,65,28,45,159,209,196,85,74,96,137,43,185,0,19,171,177,97,137,228,140,241,211,201,69,200,181,202,75,108,110,231,64,51,214,184,157,160,226,44,242,107,169,72,168,194,96,146,9,91,212,160,15,102,225,204,208,34,65,146,111,226,174,205,20,101,137,219,195,23,165,167,121,116,69,154,120,120,70,122,233,95,60,170,70,59,172,4,51,246,58,87,139,4,98,161,40,24,161,4,197,122,79,178,194,202,78,137,246,180,123,135,43,250,120,5,165,96,174,171,23,133,243,14,131,164,171,114,81,57,88,16,32,200,16,6,199,13,10,228,208,250,17,125,8,77,167,231,182,101,172,124,212,190,148,155,55,1,221,139,56,115,16,168,74,42,124,97,60,180,77,44,132,24,105,139,83,204,95,233,27,214,122,25,51,55,156,153,9,107,83,137,185,141,218,36,76,78,11,183,118,254,97,39,151,138,186,102,82,187,219,198,180,200,196,129,235,143,223,185,216,50,169,112,88,6,134,188,183,233,122,31,62,158,152,176,71,234,206,195,123,200,16,120,81,114,31,249,168,63,158,47,158,98,49,226,108,152,108,111,74,205,119,102,166,227,171,32,254,226,105,104,107,89,218,105,67,79,27,71,204,190,203,173,171,129,112,6,146,197,110,139,204,5,35,54,192,81,0,33,11,90,47,126,106,250,44,141,196,182,133,18,144,22,66,96,2,87,119,164,147,245,222,122,229,77,62,215,107,204,176,8,64,3,235,181,69,100,112,185,86,202,229,180,153,174,88,107,207,42,7,128,90,185,222,119,54,26,245,251,68,143,184,187,215,215,28,241,176,72,48,190,67,130,119,13,65,169,158,94,9,8,122,137,100,36,47,145,191,174,95,244,57,239,83,25,76,93,57,128,26,240,33,155,105,226,102,80,16,217,40,47,198,137,138,143,92,177,136,238,159,40,15,198,186,98,102,231,64,197,113,79,129,54,135,223,84,237,122,14,210,86,88,239,157,175,236,169,88,58,201,222,255,137,247,195,138,180,80,181,14,207,23,78,170,4,80,241,164,198,109,13,216,27,143,27,125,215,213,40,237,202,162,140,219,16,190,81,197,44,97,159,173,239,243,247,157,159,73,251,88,94,181,24,2,80,218,57,13,206,250,143,22,226,132,234,228,201,217,162,54,178,192,187,51,110,36,80,189,119,122,231,17,5,173,147,146,62,176,35,189,66,2,36,163,161,110,254,6,100,51,42,159,93,4,124,175,221,8,130,1,114,66,54,52,27,20,209,138,40,139,229,178,65,168,164,61,105,62,245,22,96,6,68,141,186,122,165,184,153,220,118,87,162,248,99,60,44,65,204,169,245,99,153,152,201,176,181,198,215,178,119,249,129,79,105,160,184,247,191,103,75,178,179,18,112,147,55,14,148,155,231,26,254,48,209,80,27,247,125,54,37,28,9,180,13,10,32,44,141,107,95,25,145,219,251,231,99,224,96,221,218,189,246,165,119,194,214,136,171,255,120,216,99,52,192,236,192,109,109,182,105,197,72,243,40,15,86,80,133,170,76,250,9,94,56,103,198,253,188,109,4,250,147,187,121,93,255,74,22,53,116,238,114,242,255,216,253,197,14,11,16,179,113,139,23,177,105,36,207,125,141,50,225,117,19,28,140,196,135,247,122,14,140,156,127,157,90,243,151,11,99,115,207,173,90,94,88,212,166,146,164,59,186,214,84,188,97,116,157,152,25,124,251,186,147,68,100,188,120,167,254,230,47,140,53,99,4,135,65,35,122,219,119,53,9,35,135,201,174,115,116,4,148,237,121,245,0,200,116,115,118,109,76,102,53,125,124,120,225,204,197,177,221,3,25,170,102,199,185,14,46,92,28,36,136,32,134,30,213,55,215,144,149,58,156,11,179,41,20,176,25,34,241,206,117,117,196,103,179,120,112,203,102,98,40,228,2,15,152,200,58,107,148,78,160,208,47,73,88,31,104,76,53,71,102,49,45,122,243,57,212,248,167,89,237,12,252,145,86,115,127,32,109,172,112,171,67,85,79,108,17,122,174,152,228,196,200,103,123,226,135,81,4,142,134,57,196,83,78,171,56,59,117,148,124,89,246,198,26,173,16,16,47,42,157,7,183,248,250,64,207,140,6,103,143,184,196,74,33,51,145,205,118,218,248,45,182,27,35,99,213,22,13,10,227,69,178,245,219,208,202,150,105,58,209,214,101,242,151,239,150,37,229,29,88,173,234,57,1,160,194,100,109,63,37,0,20,35,40,49,56,16,188,120,28,241,209,220,116,197,30,242,234,87,109,38,170,41,137,130,218,191,83,113,225,123,232,85,101,123,161,90,25,7,70,229,134,176,76,122,30,96,223,137,109,216,220,119,182,205,29,194,189,162,34,91,171,141,84,181,62,164,176,28,19,123,33,11,138,192,47,250,77,90,91,29,31,149,186,46,224,36,238,23,114,128,194,5,0,111,83,189,53,73,92,155,181,20,100,158,27,72,237,203,62,39,195,174,4,244,239,139,129,47,19,99,123,230,78,19,85,116,19,63,194,196,37,221,235,56,38,16,33,221,188,222,147,114,21,159,77,99,25,195,26,218,212,220,188,89,40,174,104,64,58,199,210,235,253,222,124,191,223,144,39,115,233,159,137,90,225,84,45,249,186,229,154,234,120,235,225,170,67,252,222,159,242,41,101,158,157,190,175,171,113,20,111,18,255,122,23,146,66,163,27,105,180,216,46,199,99,169,121,110,150,117,58,168,185,212,15,99,4,49,150,186,162,87,4,110,19,95,178,255,175,253,182,13,1,13,228,59,178,32,104,246,175,228,195,187,239,139,109,19,68,44,132,84,192,214,91,233,58,83,17,220,254,246,7,36,18,21,134,59,226,2,138,246,236,179,86,23,75,253,231,50,74,60,157,128,201,113,23,205,177,20,209,237,251,138,56,91,55,137,231,207,183,65,80,149,182,218,36,105,254,237,83,191,197,84,18,162,239,7,0,111,225,30,255,240,222,190,21,102,6,130,64,254,30,102,188,46,167,56,231,183,47,250,8,217,99,125,65,148,204,75,93,239,50,142,144,101,181,124,51,219,104,135,252,40,22,34,3,34,12,212,105,27,142,140,220,38,134,156,73,239,52,26,113,180,29,216,81,224,167,231,37,86,187,255,204,171,196,150,31,96,188,226,21,158,203,241,46,196,227,163,81,66,187,178,156,108,109,88,178,198,68,218,176,38,22,42,254,217,226,188,147,44,99,156,154,220,124,191,179,221,21,31,42,56,151,70,7,118,164,100,28,212,202,80,53,252,69,160,109,244,87,75,144,31,245,72,61,8,114,203,183,187,206,77,25,70,2,162,125,56,123,64,179,11,106,188,114,199,157,39,235,54,155,174,169,153,242,32,64,81,74,35,179,252,254,134,57,146,239,187,15,136,40,157,102,237,211,9,101,217,39,44,108,240,209,125,27,27,22,12,187,62,205,29,171,127,200,251,48,174,49,136,130,225,243,216,65,169,173,141,101,132,119,116,140,254,54,124,30,184,77,65,224,83,72,127,174,188,24,178,161,161,151,207,72,232,17,15,110,91,192,190,128,101,76,127,20,203,2,104,181,212,240,197,126,193,189,59,166,54,76,112,253,68,79,54,48,37,39,132,245,254,64,13,10,60,96,71,16,47,101,197,73,138,214,103,185,94,37,78,189,176,191,100,109,70,153,193,61,188,46,180,72,142,212,224,139,119,44,191,29,174,121,81,168,25,56,43,113,47,179,59,252,52,19,141,16,177,80,7,254,41,175,65,66,116,188,194,132,93,218,170,174,104,104,128,21,193,65,128,195,68,152,104,93,91,30,227,22,96,183,98,25,18,177,45,136,252,86,243,157,207,179,235,94,221,143,76,31,100,160,8,212,185,207,72,220,228,182,80,22,128,247,8,214,9,9,203,24,41,80,137,176,176,12,245,155,182,140,167,174,236,226,107,28,22,94,114,123,222,14,194,21,95,183,243,193,182,214,70,199,81,34,134,110,156,121,83,149,116,194,196,158,95,4,164,96,23,162,153,13,136,70,104,193,110,87,65,134,238,68,244,252,51,158,162,240,16,136,243,237,49,164,212,83,32,189,16,217,207,88,199,30,141,163,212,71,81,119,189,5,110,35,93,82,53,104,113,84,150,109,139,66,135,143,161,40,145,218,145,171,135,118,26,124,7,14,167,81,64,224,57,205,139,228,29,179,68,57,209,7,92,141,58,121,144,249,250,197,86,192,91,6,7,167,45,20,44,132,75,170,13,46,247,50,250,211,129,210,228,97,200,177,211,232,85,128,186,208,194,80,129,79,85,36,220,243,56,250,234,26,124,97,195,166,24,241,174,148,137,26,42,47,80,58,33,179,240,20,110,23,149,23,136,152,73,48,67,145,120,204,202,89,51,131,186,164,74,33,3,149,235,168,94,109,40,194,55,130,241,198,81,168,232,180,215,128,183,13,203,78,170,222,38,214,61,227,23,193,13,10,193,139,147,35,238,76,134,15,230,246,88,34,25,37,180,113,85,105,7,32,158,129,148,175,248,153,77,99,8,116,184,248,1,105,82,233,123,39,252,170,78,117,81,38,195,21,194,142,121,2,86,29,41,194,167,245,134,218,244,120,103,2,198,23,101,47,110,110,198,119,138,181,208,77,142,73,30,6,96,19,96,184,114,250,43,193,34,237,246,108,24,9,55,110,235,75,205,23,133,209,105,133,20,5,74,245,83,5,158,214,1,255,174,5,35,81,233,254,58,69,106,44,161,46,125,209,167,242,3,42,53,72,76,190,13,10,164,168,50,175,123,155,106,253,77,187,128,150,103,250,115,249,31,105,114,248,207,72,151,187,187,118,160,176,97,5,113,22,128,17,135,91,121,33,136,183,110,254,110,107,242,115,108,76,143,116,86,54,132,165,168,52,57,193,30,8,148,52,156,205,251,168,90,151,196,90,161,217,137,70,75,162,28,224,82,43,139,114,250,196,165,102,218,46,2,147,101,17,242,197,193,26,58,154,82,224,124,137,29,62,148,211,237,75,189,27,94,179,241,104,227,2,94,235,141,224,62,209,171,61,128,57,112,118,178,16,217,249,242,20,248,186,35,209,53,212,159,113,61,75,229,139,1,103,24,125,60,107,9,93,204,124,146,252,20,242,202,37,8,49,238,158,166,74,199,212,174,180,244,206,241,192,22,20,44,26,139,51,122,226,244,86,213,161,147,242,253,63,70,60,164,171,59,242,195,38,150,48,193,188,89,201,170,192,40,167,33,133,191,17,238,192,160,118,120,98,123,178,12,43,57,173,85,162,247,144,13,10,62,37,72,87,98,98,41,2,138,188,8,251,39,254,42,33,249,114,5,11,242,145,194,201,232,87,157,195,215,231,156,49,14,231,43,74,140,97,245,93,143,149,83,233,29,97,6,34,172,200,188,248,33,249,67,231,222,11,191,142,244,126,129,208,14,189,220,217,32,55,43,228,97,13,227,112,180,214,59,120,0,24,221,180,200,0,136,24,35,186,17,254,255,47,234,128,35,93,236,179,242,18,94,198,233,65,120,204,19,221,135,190,140,147,87,101,137,213,42,161,74,33,79,180,232,71,59,66,155,13,64,115,165,99,196,167,217,115,255,54,62,60,124,13,10,117,105,212,103,37,24,145,47,168,173,152,100,184,171,220,138,201,21,123,49,243,243,107,221,161,9,40,9,97,35,253,216,193,226,189,29,75,94,210,156,26,70,25,37,106,235,186,120,40,108,223,71,149,184,193,29,149,223,43,67,194,72,28,35,136,3,196,3,195,201,145,6,192,37,55,46,206,189,209,220,119,38,126,119,227,26,43,13,160,131,41,119,34,168,87,119,58,39,208,53,99,208,28,31,254,99,25,13,99,39,241,95,71,38,53,36,69,139,252,6,13,10,132,223,224,26,35,13,10,198,127,20,36,5,237,113,59,53,61,207,136,5,129,191,208,63,103,231,59,193,114,30,187,189,123,154,129,101,152,76,201,185,118,227,1,95,114,0,17,12,118,68,141,44,8,219,103,13,10,195,75,120,173,142,121,113,174,91,168,199,43,2,23,84,226,255,6,189,96,126,69,176,5,70,152,142,63,56,179,61,233,164,106,201,113,16,208,227,46,111,165,102,104,166,127,64,237,132,119,150,235,75,120,185,3,20,175,149,136,223,232,13,162,55,161,21,4,157,4,142,85,73,140,45,247,254,49,50,45,30,141,19,125,12,147,33,67,138,196,200,235,231,205,255,105,83,209,138,209,194,87,51,212,3,81,22,158,226,34,95,205,34,90,177,252,4,215,238,204,58,230,238,208,68,198,35,126,157,136,122,25,25,220,148,151,142,170,58,30,172,203,70,7,102,79,209,40,213,143,72,207,73,211,62,191,202,199,189,48,196,173,20,109,100,52,50,247,154,173,84,170,182,41,18,19,96,133,152,136,13,10,12,209,85,118,144,44,104,156,83,90,70,96,157,96,93,56,166,77,128,187,0,244,140,81,166,7,23,245,245,221,210,159,253,213,11,16,86,44,166,114,101,111,227,112,185,108,96,125,196,151,89,115,249,44,53,131,130,185,76,42,4,139,99,54,168,33,12,104,117,87,92,8,226,12,2,63,243,165,193,39,16,78,171,23,6,227,39,127,207,207,232,6,206,242,63,142,76,15,86,177,145,153,88,162,223,6,154,1,82,173,87,12,14,248,240,227,133,116,81,52,21,110,56,172,101,110,207,161,97,152,147,102,205,211,56,65,23,130,99,80,14,255,149,226,9,238,65,89,202,193,134,53,127,27,60,48,136,79,78,208,3,8,168,54,6,99,210,11,245,133,62,93,154,89,15,56,160,13,152,215,226,142,32,143,52,2,212,160,196,234,56,176,20,131,170,66,217,13,16,85,240,109,44,231,244,48,152,222,26,217,201,102,149,254,80,49,149,218,223,12,151,244,97,137,189,89,252,105,59,2,58,20,195,224,136,165,65,95,50,25,13,217,174,70,155,136,211,149,21,14,194,208,88,18,128,191,29,155,109,90,54,105,147,27,82,216,133,160,112,234,178,63,65,128,79,173,95,221,236,50,214,215,197,156,76,31,127,8,131,224,144,102,108,176,22,218,128,195,171,250,98,73,2,62,65,69,127,152,44,83,1,149,31,204,143,129,229,48,128,162,169,241,41,188,209,142,128,178,22,194,115,39,223,248,90,197,215,68,181,176,97,122,215,15,232,130,185,235,201,121,103,205,189,174,30,174,159,31,1,14,33,243,160,100,217,114,136,157,42,185,90,60,182,221,165,185,32,251,33,8,193,153,213,139,60,239,107,149,254,90,36,155,89,250,80,27,99,247,90,50,108,64,144,196,222,103,161,198,59,14,181,68,137,54,23,217,57,136,33,64,255,112,110,117,46,227,169,222,92,118,8,161,120,242,199,5,239,52,66,17,146,156,197,74,21,148,22,228,177,79,51,139,69,244,58,236,250,162,0,241,223,145,28,229,127,137,53,222,246,106,100,155,220,197,164,57,205,152,149,63,103,193,228,56,75,141,155,142,248,41,201,116,167,118,170,3,40,27,144,82,197,144,187,32,76,150,190,72,37,145,73,200,246,119,85,235,162,241,13,10,151,202,215,16,160,51,111,198,171,96,138,92,211,74,159,239,244,223,219,77,223,46,4,110,124,123,53,134,59,59,147,22,97,144,27,242,108,135,15,58,104,72,157,237,239,29,52,29,217,186,220,107,97,37,97,131,51,15,33,11,139,15,237,74,57,64,119,175,204,205,130,207,194,51,198,15,151,105,57,81,98,208,57,6,57,243,25,81,108,226,184,209,242,118,207,79,153,146,106,135,43,15,27,115,234,191,246,25,201,179,247,149,155,232,154,67,211,240,214,217,172,29,164,251,15,73,222,102,240,6,167,195,73,176,13,10,221,118,132,54,247,142,155,193,210,34,30,212,23,63,7,185,40,249,110,69,19,68,188,236,31,123,186,180,129,208,92,105,8,138,14,161,219,232,182,162,125,8,47,27,135,135,97,198,138,31,171,178,106,33,115,20,199,46,22,78,137,52,19,219,27,163,98,100,99,107,112,57,190,19,215,72,102,74,252,102,116,59,65,147,16,32,14,128,187,63,62,96,194,113,87,236,160,110,90,128,15,9,66,53,207,2,21,237,92,30,243,220,244,236,124,3,108,53,248,134,23,14,36,23,205,57,23,30,23,41,220,50,203,223,92,248,238,13,10,134,253,9,54,232,221,100,153,175,57,74,63,245,247,234,36,105,20,94,202,214,233,40,234,232,58,85,29,110,80,196,145,16,59,108,45,76,20,57,143,50,146,194,227,14,9,27,12,61,190,202,237,238,163,38,226,164,61,191,200,97,0,254,153,79,18,203,101,208,68,148,172,160,167,176,97,92,54,157,82,125,135,211,12,78,24,162,146,34,155,98,225,246,117,116,188,52,158,151,188,14,241,3,86,127,152,251,165,28,238,80,250,203,73,141,208,92,119,39,5,34,241,68,86,151,173,198,54,212,189,195,245,79,17,97,87,169,89,30,16,42,115,181,98,179,34,249,195,106,86,80,184,199,125,36,25,100,142,132,81,179,169,51,36,140,144,167,206,215,81,197,235,97,45,239,69,159,216,248,195,134,177,102,161,35,74,223,57,17,130,255,60,184,125,19,84,52,134,124,101,9,63,183,103,137,5,234,213,212,120,29,107,78,46,175,9,114,1,113,202,169,152,238,75,163,244,251,97,177,25,194,50,21,75,63,74,235,208,175,118,42,49,30,104,210,243,83,46,133,183,187,58,233,0,179,0,253,190,94,119,236,65,20,220,145,139,209,34,159,91,216,84,148,194,166,188,145,88,175,153,198,31,152,203,144,199,18,35,132,100,85,121,200,143,136,142,110,245,57,94,7,115,65,181,25,35,108,107,44,81,225,181,228,183,251,92,166,105,138,82,98,55,94,134,249,158,14,47,134,104,145,224,19,51,54,3,128,198,180,227,88,139,238,125,27,147,178,225,253,251,173,54,67,201,99,199,28,105,123,171,141,40,177,48,34,190,172,172,199,24,245,144,94,20,158,200,201,132,129,139,102,201,138,96,181,190,237,144,215,14,150,102,201,34,52,29,213,3,245,47,33,246,159,70,207,212,176,68,49,35,102,217,79,59,45,192,94,121,246,148,252,70,53,222,254,107,139,41,8,197,171,235,233,102,17,231,222,235,219,195,230,195,87,205,59,115,150,13,212,27,151,97,153,156,188,167,165,37,227,245,243,43,80,29,157,134,35,183,231,220,64,36,121,225,213,229,209,255,240,221,164,61,81,115,58,106,132,143,85,221,235,5,151,32,96,66,192,56,118,179,221,173,196,13,10,8,85,59,40,21,85,245,48,37,49,0,161,197,201,128,205,65,171,189,192,232,50,68,55,210,230,52,82,120,27,13,90,65,34,35,175,173,4,226,39,175,240,72,65,12,18,238,107,66,211,238,121,165,101,147,227,241,89,86,13,10,52,49,45,160,251,192,26,189,235,161,21,84,73,174,71,145,253,9,45,166,115,183,60,8,113,253,229,135,39,239,164,171,121,197,103,87,106,147,31,181,65,157,227,208,57,0,43,240,254,17,241,120,169,172,90,199,32,137,131,102,19,137,171,170,87,50,20,107,223,234,220,194,245,3,138,72,74,2,231,160,153,123,92,190,26,66,98,129,92,113,233,6,159,253,133,72,194,79,206,180,83,184,30,203,16,195,204,37,172,97,221,151,91,33,149,207,248,102,0,198,68,8,152,27,148,45,34,242,28,172,16,57,128,51,61,115,248,184,40,217,220,90,121,13,10,37,6,147,13,255,34,180,29,141,240,78,206,110,36,155,68,73,125,22,70,79,0,105,167,221,4,180,22,39,111,152,112,144,71,195,102,208,227,5,27,177,59,162,250,139,155,171,126,77,23,173,85,68,211,249,186,116,101,53,246,38,40,112,178,243,95,204,43,129,156,236,26,174,1,237,174,97,89,152,130,176,2,93,37,118,36,179,238,90,48,189,14,213,121,2,129,222,136,240,37,220,3,62,231,66,82,202,21,50,178,84,112,28,209,211,101,226,83,28,48,106,39,103,6,232,50,11,111,240,251,92,179,52,45,232,254,149,115,88,163,94,184,77,183,82,131,184,91,30,68,204,172,121,195,147,243,143,115,92,23,223,56,173,103,203,197,24,70,191,220,210,148,111,8,95,134,117,208,61,83,22,144,255,242,193,125,99,249,9,18,70,178,102,73,186,214,18,54,119,167,172,234,244,184,185,161,137,90,233,105,197,248,88,173,76,163,77,215,122,41,62,248,89,57,150,4,75,193,246,38,123,159,78,160,220,79,170,34,115,239,172,221,185,219,174,26,24,32,27,158,225,4,209,131,74,6,197,48,225,236,43,192,215,96,218,112,171,47,248,214,80,206,60,228,223,34,207,64,206,117,183,214,157,2,26,55,199,155,182,175,185,249,234,175,98,28,91,241,32,153,4,139,146,100,219,166,45,229,70,49,215,151,77,104,164,243,188,47,176,56,252,2,185,150,144,237,143,53,72,87,98,212,80,245,206,240,99,35,255,99,38,77,194,246,198,117,193,138,159,254,77,41,131,3,166,17,163,20,54,6,32,12,174,76,197,169,3,67,17,92,105,72,17,22,3,41,183,72,113,229,43,179,169,214,167,89,99,26,85,231,84,49,77,28,0,53,133,232,190,62,192,14,59,9,148,118,104,47,53,105,49,13,10,98,31,182,123,179,75,30,69,215,211,222,60,92,99,123,171,23,145,195,62,154,122,87,99,81,60,125,32,5,168,205,254,150,9,182,161,221,100,227,112,170,189,38,166,224,57,80,105,103,216,210,1,249,3,159,61,7,235,220,173,45,28,69,159,184,130,78,186,240,236,61,195,172,167,74,83,30,58,172,124,138,33,128,16,88,58,112,15,190,246,224,199,168,138,175,199,241,151,235,191,192,156,94,115,145,31,17,18,2,117,244,8,218,143,94,232,98,117,31,125,15,209,184,49,6,150,204,171,14,54,170,66,170,219,118,152,45,237,33,50,73,209,15,7,58,70,19,133,122,141,197,63,4,181,226,164,41,123,64,41,29,186,7,167,137,198,139,60,227,98,98,24,124,244,154,133,69,167,98,207,29,120,62,199,177,91,67,240,55,85,101,197,115,27,96,204,163,172,98,91,122,169,32,199,96,29,115,54,244,189,250,110,170,163,102,186,114,47,121,57,183,82,217,44,38,37,193,51,226,185,61,163,112,197,104,100,162,223,121,217,65,247,213,37,162,232,151,254,127,60,175,177,119,188,24,169,95,156,168,253,58,157,110,162,110,204,54,241,199,139,208,254,50,178,98,120,253,190,92,247,45,75,240,175,120,238,77,89,208,237,200,181,184,102,191,5,71,197,255,86,248,226,1,88,24,125,212,124,222,196,69,151,100,248,214,176,211,225,88,200,47,22,112,227,32,129,169,244,131,232,146,6,39,187,105,38,209,6,168,154,45,237,54,145,87,20,21,29,41,206,157,237,72,57,43,123,242,225,125,33,148,54,203,218,214,174,226,205,153,65,228,85,146,170,177,77,126,201,86,229,67,177,226,195,228,189,205,244,252,6,90,60,70,226,95,31,125,177,183,115,115,44,237,183,147,121,19,157,71,156,134,168,232,188,228,90,209,112,66,73,255,206,186,220,69,71,145,27,250,13,136,37,110,136,212,125,194,161,90,35,41,39,31,240,106,123,241,201,40,209,76,15,204,130,202,147,183,123,176,40,166,204,103,39,51,248,222,23,50,152,14,194,173,240,55,87,229,93,168,19,73,98,218,175,160,3,204,228,246,155,156,120,189,217,0,140,171,2,185,127,18,154,205,248,213,207,8,126,124,100,93,175,148,25,60,80,43,92,219,150,249,7,215,173,233,223,107,16,109,45,147,155,204,145,118,254,79,170,129,201,4,116,200,15,216,145,154,232,79,138,13,10,57,219,223,240,190,97,24,144,169,43,69,217,163,126,77,118,135,114,93,126,59,249,65,233,110,168,196,244,234,32,136,133,87,69,59,159,89,88,169,211,237,144,126,205,93,31,129,108,88,67,229,245,209,141,201,4,215,148,41,250,1,124,175,165,248,227,225,97,36,32,181,156,73,63,173,229,160,218,73,228,212,152,249,135,242,121,138,87,27,176,80,254,228,84,161,231,216,14,38,87,50,160,148,202,2,111,15,9,165,78,223,228,110,137,71,26,56,237,62,237,190,140,3,117,117,208,16,245,129,176,225,151,102,174,79,71,60,142,251,215,34,138,142,91,162,250,2,127,92,63,166,195,53,233,198,227,47,188,85,201,19,161,233,11,230,129,235,63,36,182,13,61,167,150,198,93,63,182,233,122,196,137,81,245,28,72,246,104,58,35,153,43,174,3,149,85,110,242,190,174,33,194,8,43,150,86,231,99,77,175,29,249,185,2,79,124,185,32,233,151,76,41,155,91,184,244,217,24,209,42,38,105,214,41,230,123,23,67,228,9,19,22,15,24,67,154,176,216,67,143,24,193,138,214,240,121,36,141,111,29,89,113,229,235,166,127,236,71,81,31,48,193,76,50,92,106,14,213,36,35,28,240,202,15,152,176,34,169,109,49,163,142,228,232,156,209,152,57,243,143,169,65,134,5,149,13,234,98,119,34,96,112,173,101,131,33,159,104,61,112,129,156,224,20,178,213,97,114,153,59,242,29,169,57,53,79,187,238,51,69,16,222,60,202,159,181,79,114,81,221,195,83,18,111,32,137,150,3,167,30,11,171,239,182,115,167,196,72,140,227,0,7,201,125,102,143,54,236,79,103,140,39,177,74,253,6,68,248,76,185,62,37,125,68,107,71,204,125,189,220,205,102,249,180,77,249,63,83,102,132,200,68,24,156,46,225,32,47,165,34,75,167,137,248,61,142,253,98,80,44,28,37,46,86,186,59,43,46,196,227,56,167,90,111,122,33,174,218,241,139,39,221,237,93,241,156,61,202,211,75,17,157,238,68,212,163,82,157,241,233,127,28,40,206,39,141,13,10,125,92,124,94,126,177,229,185,251,23,90,57,117,128,116,42,112,2,232,92,131,7,24,212,197,39,61,60,236,153,222,4,251,44,187,224,144,217,238,133,222,231,42,123,120,3,123,175,32,73,40,222,202,35,33,81,159,200,17,5,102,90,12,13,141,45,27,61,149,113,208,243,120,224,154,115,127,205,161,209,161,71,44,135,63,176,9,103,107,60,250,66,232,94,119,47,76,196,26,60,40,1,219,73,32,184,250,46,75,139,122,231,26,63,67,233,96,59,181,13,203,28,59,101,16,136,58,111,191,209,241,82,57,30,152,28,221,162,235,166,43,26,163,222,241,103,161,139,60,7,179,33,207,160,8,125,40,200,130,231,55,103,70,201,207,159,119,154,239,145,27,129,244,255,52,30,69,83,168,83,157,159,14,93,136,111,16,99,150,200,139,60,9,91,150,23,183,132,47,123,237,234,108,75,63,5,194,182,246,56,169,21,128,231,172,51,197,80,189,7,98,113,237,8,68,251,82,181,211,2,9,0,216,73,163,226,141,101,190,95,230,69,106,8,163,29,7,151,199,208,223,141,45,231,251,45,244,23,67,192,80,100,147,196,100,178,68,86,173,167,34,156,227,20,97,207,49,50,179,98,83,226,165,87,127,188,69,139,56,159,206,66,35,69,119,111,14,85,61,27,237,156,231,220,5,127,150,25,93,4,96,103,69,46,35,229,102,98,13,7,155,60,71,103,221,168,51,102,225,152,236,238,70,57,212,28,237,218,80,250,150,157,62,196,134,197,183,75,234,24,244,82,71,65,88,111,230,107,166,46,53,170,214,124,81,21,173,108,155,179,195,86,243,6,46,232,181,253,163,7,248,250,254,49,221,191,65,100,30,188,135,250,12,149,199,108,221,206,169,255,178,35,155,59,188,74,97,2,168,141,32,2,202,69,151,3,8,38,199,58,232,192,207,64,216,180,117,15,32,152,164,71,48,220,228,167,150,127,101,169,204,205,214,107,18,217,228,182,247,93,236,177,178,146,5,59,102,142,163,252,38,177,116,35,203,228,54,66,9,154,13,84,183,73,247,251,241,210,65,105,174,117,154,154,41,19,158,231,96,188,27,175,149,197,150,137,92,156,175,93,184,42,195,205,104,250,86,89,17,209,79,66,92,87,147,179,56,149,245,60,154,132,224,195,60,221,197,70,69,154,163,127,19,167,156,68,76,55,194,19,2,70,167,182,145,67,115,189,36,7,228,98,23,66,117,139,81,177,223,191,110,74,185,49,183,23,65,221,62,161,194,183,32,20,69,196,132,239,56,232,38,58,238,94,98,48,7,248,117,252,252,31,56,211,20,212,214,184,190,243,192,5,74,198,128,79,56,252,48,192,77,159,116,186,226,163,121,117,77,103,125,38,137,12,18,56,35,233,244,199,190,43,88,158,249,43,32,30,88,182,185,73,253,209,189,245,252,72,66,209,200,128,205,107,252,120,136,11,120,33,232,89,184,240,74,173,117,9,185,208,141,222,141,203,154,33,255,3,130,115,70,109,112,62,76,56,185,56,192,37,110,177,16,87,9,29,246,19,172,68,191,143,187,172,177,215,25,234,210,147,5,192,227,44,64,151,152,88,85,211,76,226,81,98,205,170,52,183,7,246,45,62,41,174,79,89,169,250,159,131,144,179,49,176,153,103,109,25,0,225,63,233,232,52,212,142,244,100,135,172,200,255,173,93,130,92,91,243,217,65,8,192,123,154,226,227,32,167,186,4,169,43,98,134,100,48,213,40,224,109,95,194,126,1,174,159,69,103,105,98,179,22,132,188,75,134,37,172,186,205,253,180,16,57,210,29,65,186,30,175,138,137,211,103,202,14,64,105,230,201,240,224,91,82,83,49,104,168,169,188,159,84,74,89,72,143,24,169,155,182,167,2,24,20,229,110,120,158,52,170,162,173,79,93,197,228,146,223,154,238,225,44,109,180,251,112,134,161,73,95,68,159,161,99,61,184,181,136,245,77,203,159,165,56,81,240,47,38,35,78,53,3,72,146,223,191,81,115,84,54,178,170,28,7,85,233,140,87,89,86,60,231,59,231,83,98,93,214,85,4,69,226,79,76,44,103,192,40,200,139,137,56,179,166,11,175,126,41,140,133,198,198,40,131,196,207,72,109,213,182,234,112,5,226,38,41,101,248,227,213,53,21,13,10,106,178,72,236,251,169,145,222,185,100,86,37,226,36,226,150,115,193,223,235,244,14,99,105,68,3,203,231,109,144,238,64,82,50,86,108,238,203,190,62,220,160,203,153,34,180,163,239,154,71,97,249,198,158,101,24,222,2,90,208,66,109,8,73,180,105,80,212,99,55,97,159,134,175,206,165,161,55,98,0,63,86,105,9,143,65,129,219,82,98,196,36,241,142,163,250,99,81,114,211,255,54,209,154,181,105,173,228,209,228,165,145,26,188,113,206,32,145,206,152,59,141,230,48,117,128,2,137,37,189,120,130,209,246,164,219,21,189,192,38,96,91,48,244,175,49,185,62,13,112,13,10,166,114,91,89,5,121,235,137,227,75,63,149,164,159,223,21,18,88,106,154,241,3,49,139,55,189,150,201,56,223,145,230,179,166,21,221,66,178,239,163,157,245,15,165,223,150,193,237,213,204,122,152,139,204,76,29,26,7,119,65,76,53,15,170,106,200,16,102,177,176,248,53,34,230,136,234,109,204,67,58,20,236,33,205,5,41,244,62,12,230,255,0,249,54,33,15,173,70,167,174,238,74,39,242,169,150,27,182,113,64,193,216,203,77,143,127,242,22,249,194,166,176,207,152,111,217,36,129,247,18,89,164,36,41,13,10,32,163,118,52,2,248,35,2,37,207,101,113,241,23,34,24,213,117,187,48,56,206,91,72,205,235,92,193,23,226,26,164,227,164,79,172,103,187,14,101,201,144,202,82,101,95,156,253,195,125,180,79,120,151,129,227,102,53,77,2,255,161,169,7,132,171,126,218,8,241,76,182,250,108,117,147,46,47,41,140,93,255,138,127,69,171,238,107,130,151,1,202,227,92,238,22,255,104,240,232,175,127,3,41,86,111,244,11,117,79,76,79,253,201,148,192,66,84,86,118,183,247,27,208,18,74,212,237,36,39,235,14,5,14,72,79,195,149,58,133,196,51,81,225,109,5,190,13,34,236,109,25,61,243,55,253,238,23,43,29,241,195,240,15,46,28,177,202,196,81,225,251,229,61,83,28,6,162,135,127,48,23,130,31,176,127,231,29,253,138,56,200,147,129,176,252,123,119,134,203,146,229,185,168,213,113,145,186,125,183,46,204,28,216,158,44,111,59,70,204,190,52,101,4,78,38,84,233,207,235,213,150,237,33,105,131,188,102,118,59,128,13,95,137,112,78,137,54,169,238,64,34,100,5,130,201,114,101,242,156,248,173,237,232,13,10,179,133,55,145,45,17,62,95,43,130,141,104,110,138,90,122,185,128,50,50,87,74,66,160,48,127,193,134,139,95,61,22,108,19,173,53,187,41,5,17,54,145,106,181,38,51,93,210,43,13,10,128,128,28,192,171,195,17,109,247,201,32,179,167,115,111,14,213,19,223,69,72,140,98,208,242,45,176,82,156,57,125,184,216,50,137,108,209,76,8,177,116,218,240,126,235,115,178,144,115,180,82,126,82,89,121,34,60,136,80,94,173,110,239,82,112,91,251,131,100,58,193,1,51,122,229,255,197,244,98,84,23,190,136,109,168,9,123,30,61,236,146,101,154,97,93,247,197,202,37,227,202,236,36,254,69,68,101,216,62,104,206,94,253,105,111,94,23,174,81,171,213,1,141,31,146,252,158,88,76,107,200,130,136,31,6,118,148,124,249,110,215,117,233,187,78,128,118,31,124,236,115,37,244,136,208,116,34,105,8,106,85,164,226,174,202,61,220,96,51,174,58,24,60,254,13,10,184,145,209,7,153,74,104,161,30,247,18,142,110,18,60,49,90,21,27,61,56,65,29,188,100,116,33,29,103,98,15,65,35,95,29,74,112,128,225,221,176,229,244,245,150,190,2,236,23,221,217,56,142,69,171,191,166,98,91,129,161,65,195,218,230,17,248,183,68,87,30,32,216,128,89,55,77,207,170,161,250,89,138,58,46,251,49,176,172,100,82,110,160,167,130,143,129,7,224,109,170,28,166,124,89,70,13,10,73,246,22,76,244,75,124,24,215,142,16,196,86,95,74,101,110,14,6,219,217,17,74,216,173,73,212,143,47,89,145,80,103,240,13,156,38,43,38,71,170,220,143,226,159,193,143,176,32,62,60,31,220,87,14,5,227,195,254,238,140,48,62,172,187,26,216,197,155,108,63,176,50,29,68,26,107,188,18,194,108,138,214,225,186,195,49,173,31,58,247,143,2,11,229,25,125,17,162,98,98,83,92,53,134,66,72,53,107,180,179,72,91,192,171,184,167,187,197,86,5,67,125,55,205,96,65,157,64,151,111,251,224,15,37,194,209,151,128,192,164,44,48,32,187,63,190,24,80,8,26,168,21,5,163,101,130,163,162,51,21,212,63,92,161,98,186,223,118,225,7,84,139,92,84,80,6,116,48,161,164,25,140,224,23,185,248,11,124,225,229,75,55,180,140,109,175,185,47,193,68,73,25,109,245,73,86,78,200,99,45,111,34,28,157,64,207,91,158,158,96,199,229,126,65,115,215,29,15,0,170,170,216,68,180,165,196,238,44,170,121,148,181,138,36,35,57,243,252,215,113,145,73,163,139,186,90,110,21,26,44,103,239,85,202,60,239,244,150,69,248,238,149,61,176,124,132,131,9,194,5,248,20,183,178,250,178,211,218,184,49,48,21,211,241,152,236,238,218,74,194,27,65,126,49,136,127,137,165,118,45,19,234,170,132,210,53,3,12,113,102,74,244,159,24,23,137,253,253,102,147,3,234,233,37,177,129,190,136,196,211,181,107,104,254,214,187,214,42,201,157,80,51,91,38,156,178,79,45,51,30,32,24,87,13,34,119,238,21,8,247,214,105,197,164,157,216,0,144,206,215,26,173,44,222,119,116,100,44,187,1,161,205,226,184,26,183,217,15,243,191,242,17,76,7,217,53,110,199,64,65,216,47,84,90,241,201,206,14,238,194,90,212,73,53,185,107,141,19,214,236,131,217,197,255,226,70,99,22,151,5,140,20,206,208,159,156,39,4,233,113,49,45,221,226,183,229,133,45,76,231,121,119,52,149,138,24,184,208,59,255,87,137,119,166,108,210,39,123,53,139,186,130,109,8,129,230,251,149,4,115,240,235,231,6,48,110,26,215,251,197,2,177,118,165,237,208,40,32,45,242,129,38,70,130,215,94,30,143,222,54,11,56,24,196,199,241,194,249,70,15,146,178,161,31,153,62,155,103,182,110,90,102,188,182,194,16,175,104,240,32,162,124,106,117,171,33,75,51,153,68,33,42,226,6,171,215,164,43,15,41,202,175,100,36,182,250,165,22,149,73,88,240,27,78,255,130,159,179,4,170,7,211,231,210,214,116,83,193,255,133,44,133,153,104,115,201,121,251,114,175,81,70,206,99,101,218,187,135,81,240,212,220,88,160,107,115,45,167,215,49,171,13,10,138,36,167,100,118,236,139,251,162,166,63,125,143,90,75,188,226,76,83,39,31,132,214,20,49,115,209,202,239,193,93,93,123,165,68,78,13,10,247,48,230,160,158,142,64,249,148,168,90,49,250,101,158,5,148,54,154,167,19,249,13,10,149,13,137,18,65,56,72,24,66,100,252,0,58,21,88,64,205,128,250,154,106,22,119,83,148,163,206,120,9,150,201,234,103,57,55,204,58,149,84,206,56,52,207,97,236,1,48,146,199,171,157,52,198,109,76,236,167,57,96,156,27,58,106,157,51,39,28,124,215,71,174,39,44,154,212,238,129,64,45,230,25,224,201,229,133,195,167,254,152,157,243,170,238,147,24,80,109,147,4,91,25,73,192,76,97,182,60,68,134,148,7,145,237,253,27,200,160,25,23,228,149,26,237,17,90,233,212,198,98,40,223,6,107,96,28,76,103,208,139,75,118,186,251,71,15,218,144,229,201,130,92,122,210,80,154,33,190,41,47,149,1,180,44,226,212,181,101,246,230,58,139,249,185,40,33,79,3,66,125,12,30,208,99,110,168,7,55,148,121,23,31,155,179,38,98,99,27,8,228,172,24,244,116,95,239,167,201,181,104,79,149,71,228,175,166,253,65,60,145,47,41,208,203,174,153,213,82,55,40,141,116,118,93,147,54,151,147,115,65,90,202,214,231,149,12,107,27,134,148,52,13,10,113,109,9,22,179,44,89,26,115,136,67,187,98,24,94,102,228,60,53,124,80,71,199,69,51,198,93,59,238,43,139,111,223,153,220,89,173,173,213,221,228,251,248,123,133,155,105,129,76,5,202,147,133,0,107,37,182,116,248,5,62,155,169,13,10,104,96,220,147,158,199,135,5,55,98,59,147,75,194,16,68,135,207,44,79,182,199,194,64,239,171,214,124,172,94,110,81,85,233,21,126,180,58,186,132,148,206,133,58,12,6,107,157,9,57,146,14,143,58,82,75,185,240,51,227,65,170,147,47,195,95,155,4,33,209,8,92,113,150,227,65,87,24,120,228,4,102,243,173,91,159,141,11,204,123,14,102,53,37,121,73,215,143,230,49,127,129,219,49,122,24,106,141,253,82,189,84,158,222,180,151,48,122,198,7,90,60,220,91,2,65,31,249,181,67,235,66,42,1,137,107,252,53,13,104,216,225,193,115,124,83,252,113,95,113,124,3,216,150,249,88,98,71,124,221,142,70,153,199,191,48,152,73,141,120,152,111,151,64,166,98,149,51,171,71,212,191,133,255,166,35,90,181,49,181,83,121,106,53,97,235,129,147,189,210,7,39,103,151,166,80,44,20,239,29,95,76,244,40,111,73,234,106,119,244,149,92,71,200,100,133,144,233,51,2,141,216,2,250,196,66,87,19,151,66,154,118,191,118,184,119,66,13,10,37,39,111,67,245,7,177,91,168,170,186,149,219,146,107,65,140,187,146,191,230,137,156,0,151,14,202,52,122,221,27,126,190,84,127,16,244,241,253,168,198,151,8,248,95,153,20,76,75,30,84,252,22,128,74,60,137,171,84,99,64,154,129,83,191,217,198,68,34,35,68,136,45,73,146,250,50,251,165,69,39,197,83,251,154,128,45,188,126,215,40,93,199,14,65,233,75,102,181,206,30,174,161,70,54,48,251,25,63,203,235,7,58,130,18,21,160,41,111,150,56,21,206,151,170,102,46,125,137,0,221,95,62,48,168,35,100,201,215,3,92,232,7,114,250,123,129,49,65,231,244,120,94,4,87,25,156,190,149,42,184,175,123,123,106,168,160,60,144,21,153,109,243,129,243,136,118,195,201,103,149,29,253,204,3,207,229,83,236,75,5,168,112,110,39,21,128,239,237,18,201,249,83,236,212,224,224,99,85,217,178,4,16,248,139,208,85,167,131,174,78,127,31,233,7,165,183,175,235,100,240,234,253,198,75,173,17,72,114,13,10,214,165,179,122,142,40,254,186,41,210,251,93,188,17,3,18,63,107,231,160,114,73,225,68,45,208,54,89,190,209,95,19,193,126,21,131,206,62,105,162,251,26,139,248,13,16,6,51,85,11,8,107,147,36,48,158,224,80,172,99,122,201,30,81,138,109,153,200,46,223,165,212,173,30,3,37,38,176,122,42,35,82,11,51,240,164,110,34,212,18,43,219,91,203,209,166,125,192,216,231,2,213,207,96,40,4,193,40,209,245,110,128,45,67,124,51,252,143,218,219,196,59,61,81,55,167,12,124,71,184,43,71,218,124,180,171,217,180,16,66,45,246,35,184,217,22,81,212,246,95,66,99,7,136,2,131,45,63,63,85,103,120,186,238,178,132,43,133,227,95,242,61,7,71,255,53,189,48,208,4,130,172,168,220,34,125,27,62,203,213,152,147,24,228,149,196,4,151,195,143,40,108,61,67,72,155,22,227,153,0,42,134,105,60,14,97,180,92,22,203,80,198,89,85,57,210,101,214,187,112,52,199,227,52,117,114,135,154,153,214,233,223,211,84,89,107,96,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen019003l=36187; +} +#endif //_PDF_READER_RESOURCE_FONT_n019003l_H diff --git a/PdfReader/Resources/Fontn019004l.h b/PdfReader/Resources/Fontn019004l.h new file mode 100644 index 0000000000..34e82eb952 --- /dev/null +++ b/PdfReader/Resources/Fontn019004l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n019004l_H +#define _PDF_READER_RESOURCE_FONT_n019004l_H +namespace PdfReader +{ +static const unsigned char c_arrn019004l[]={128,1,87,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,83,97,110,76,45,66,111,108,100,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,32,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,53,53,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,54,57,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,83,97,110,76,45,66,111,108,100,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,55,51,32,45,51,48,55,32,49,48,48,51,32,57,52,57,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,48,52,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,230,131,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,110,101,146,229,163,183,159,104,201,109,130,16,205,54,207,53,116,76,61,55,66,121,35,109,234,174,99,119,87,243,21,164,1,123,205,170,135,176,21,245,198,180,203,145,212,238,71,240,56,110,113,46,33,152,94,49,38,217,58,75,52,33,125,213,85,14,176,182,113,82,150,24,133,91,209,190,250,39,110,4,25,132,166,207,215,95,154,243,189,243,146,167,248,207,163,226,156,8,16,2,231,65,153,123,251,19,206,122,238,184,153,12,47,166,127,12,193,149,188,230,219,81,206,168,197,21,54,121,226,107,200,119,98,224,255,245,81,92,101,64,7,172,76,144,237,111,4,249,7,247,234,34,195,199,128,229,42,162,198,131,87,156,48,75,203,68,134,84,153,167,90,126,134,131,67,50,53,207,60,18,176,43,99,118,208,110,22,210,72,37,155,215,131,164,145,143,94,215,139,23,190,189,20,242,32,9,40,20,180,175,246,183,54,83,224,99,124,62,84,9,208,43,198,132,172,231,170,79,18,35,94,45,21,81,58,176,228,162,15,78,48,186,114,38,236,21,197,8,207,16,217,200,27,102,244,215,169,11,46,52,31,107,13,119,200,162,50,243,162,201,154,102,83,76,106,239,45,19,15,64,63,190,13,10,203,103,79,237,32,98,172,152,155,182,184,129,156,200,70,31,80,230,8,234,150,244,207,210,39,120,186,157,18,173,132,192,220,120,247,0,148,186,239,229,140,209,133,207,150,152,251,104,231,131,73,4,230,76,188,34,86,248,221,16,36,189,128,213,71,23,77,218,161,71,124,104,172,168,242,127,122,2,197,20,103,33,54,160,8,225,144,100,213,84,107,45,222,6,28,239,31,198,232,150,13,10,77,131,100,203,242,94,67,147,54,54,40,253,21,146,191,197,197,255,142,64,206,238,96,16,6,151,123,57,216,11,69,44,237,229,124,90,115,249,111,165,225,224,68,136,101,159,112,169,114,205,127,153,163,123,199,1,158,253,144,170,250,192,55,91,198,201,22,39,151,100,28,152,72,167,14,139,0,157,180,48,61,36,137,128,253,62,145,122,70,247,0,251,125,72,102,13,10,41,27,132,44,12,155,18,209,185,255,121,14,23,94,122,166,162,145,13,31,189,179,120,190,243,128,139,135,211,200,235,196,88,222,199,44,165,118,53,137,19,90,21,186,96,176,170,245,206,122,211,74,206,164,76,91,180,174,94,219,140,160,220,5,11,225,87,157,116,170,124,2,82,187,131,107,246,251,15,223,227,244,225,187,233,233,190,109,94,226,16,44,210,92,189,67,203,253,251,159,162,209,59,209,149,18,28,215,3,81,12,178,210,117,193,123,79,249,5,30,120,103,251,1,6,161,106,29,198,119,168,156,32,176,157,238,78,153,83,13,137,160,238,142,7,164,119,29,4,160,122,84,127,20,100,107,144,83,108,117,159,29,38,240,68,247,144,2,74,170,82,87,0,4,34,8,161,161,204,174,72,71,226,65,115,210,1,79,11,171,27,61,104,3,100,149,165,141,32,188,226,59,202,59,147,15,167,52,102,184,72,188,79,255,73,159,36,56,177,105,249,230,188,156,24,88,186,9,214,20,198,121,103,102,32,196,210,212,207,110,24,214,60,244,109,172,187,166,93,255,7,201,102,182,27,1,24,131,246,229,164,181,60,154,188,61,66,82,234,66,41,25,172,218,175,44,249,74,109,254,135,215,17,226,154,57,197,114,208,185,203,96,245,165,141,132,103,50,46,182,90,47,139,198,107,216,58,51,194,113,101,51,198,195,138,28,61,118,107,72,18,27,210,132,165,146,228,89,195,156,119,139,49,249,73,176,126,241,189,70,109,196,157,179,109,241,101,234,221,8,49,202,13,234,190,33,57,143,218,239,61,210,123,120,12,120,85,158,198,141,250,105,142,183,0,247,252,156,16,149,15,147,77,173,187,103,239,151,205,221,77,144,98,72,254,170,34,104,227,101,176,192,229,85,202,164,156,79,169,2,41,253,218,177,102,5,128,128,212,47,98,155,222,130,165,162,55,252,108,85,17,133,159,61,175,171,165,7,105,105,249,154,128,202,164,15,226,227,11,106,228,18,56,215,22,83,178,103,173,217,211,69,14,101,2,160,237,255,8,13,241,27,227,178,117,152,107,184,49,109,38,175,235,152,62,113,87,87,197,148,252,94,236,190,128,244,240,48,122,54,145,148,27,216,94,178,63,100,91,24,142,2,147,39,58,193,72,237,182,46,134,228,224,107,207,247,8,182,220,213,196,127,125,117,85,24,72,240,12,149,198,132,38,89,45,7,99,125,201,14,138,152,163,112,57,255,147,130,119,174,132,143,212,15,138,88,128,61,135,72,174,65,31,93,255,226,45,50,75,32,61,59,200,116,28,148,85,180,128,148,210,146,102,199,203,73,253,159,253,38,15,86,63,25,131,82,254,20,205,61,224,14,155,175,40,34,78,11,88,140,198,254,38,136,64,64,11,134,133,131,252,80,98,228,114,63,197,27,179,71,47,196,138,30,149,195,238,28,200,23,161,184,73,116,228,225,84,166,18,201,92,119,97,87,178,100,76,36,194,169,195,133,92,236,235,95,42,127,219,161,8,120,79,124,81,168,11,199,51,37,50,67,32,2,181,135,64,220,196,186,152,76,194,118,60,35,32,13,10,145,26,225,71,204,90,148,206,236,122,108,156,103,201,90,81,138,78,163,68,166,96,203,5,222,220,73,36,244,131,59,54,11,246,123,152,150,56,163,120,151,170,118,30,126,121,89,110,202,195,116,164,249,84,128,4,100,45,4,13,10,140,28,45,157,146,106,113,78,90,233,110,236,56,164,215,76,120,246,85,95,136,169,90,25,228,140,93,176,173,247,71,222,68,86,13,203,125,99,173,71,107,238,123,21,136,94,186,97,158,191,248,153,161,70,47,134,134,97,195,86,198,169,136,120,6,160,108,11,184,121,212,92,229,76,146,214,27,220,107,227,253,152,197,239,8,95,255,177,32,211,107,13,249,159,38,21,51,36,129,233,129,70,167,243,170,129,18,106,127,80,6,33,245,173,140,244,80,92,69,163,141,91,56,203,200,93,171,146,163,177,168,118,111,80,182,140,208,141,216,202,236,93,220,98,131,22,49,0,59,14,106,220,204,66,177,105,76,57,254,15,186,172,96,237,136,187,164,208,241,251,176,199,246,182,137,69,4,208,143,67,204,88,2,19,190,181,226,131,102,11,131,192,44,215,81,96,243,82,112,57,83,13,10,60,155,22,13,34,92,21,174,132,166,64,244,238,80,141,25,176,47,143,6,61,63,98,209,212,197,39,68,52,222,44,45,78,40,54,171,123,128,220,128,56,66,17,8,192,119,207,9,137,177,61,131,203,7,198,106,109,253,193,168,188,80,97,21,243,54,242,15,247,21,145,57,28,161,45,57,241,148,19,235,161,156,156,214,221,177,13,157,120,108,95,151,162,229,133,18,80,17,71,126,221,153,216,109,200,143,17,253,95,161,213,207,127,60,174,130,64,119,25,241,62,125,223,118,99,48,182,88,76,207,69,100,208,4,58,21,226,135,3,121,146,246,109,46,117,228,56,152,252,235,113,149,246,7,9,11,39,134,229,132,141,125,12,127,132,114,250,58,231,34,73,204,178,108,20,230,59,206,138,147,99,210,250,123,243,14,135,213,41,171,99,133,153,100,39,122,154,253,35,57,189,80,6,185,61,174,185,20,154,59,191,144,55,161,93,182,44,183,34,254,42,92,219,187,67,84,2,127,121,173,48,136,55,114,172,107,17,169,174,207,16,148,36,155,173,128,67,144,224,242,216,41,103,21,2,179,131,127,53,94,238,15,198,134,7,38,225,137,63,89,34,20,16,193,115,44,198,121,186,223,175,109,27,48,201,73,158,157,53,65,40,237,126,232,247,255,109,138,227,158,106,127,253,111,71,187,202,141,142,140,154,179,113,76,58,187,128,136,101,109,62,202,203,183,229,112,231,70,173,251,185,111,200,68,21,167,113,13,187,39,118,251,180,24,59,157,232,202,27,154,229,68,157,188,244,210,180,123,151,175,128,78,105,177,173,160,76,11,185,35,169,13,160,184,187,63,97,101,51,92,46,223,36,66,253,250,229,237,140,196,143,29,190,70,1,74,53,45,75,63,207,178,201,124,6,222,40,118,120,136,210,59,42,5,212,38,147,56,252,124,152,108,132,241,53,161,8,107,133,64,108,196,177,177,229,238,83,21,195,22,58,94,26,105,191,226,82,134,217,169,84,59,122,129,30,249,72,207,116,167,35,219,209,170,46,47,29,20,29,218,96,70,23,67,18,244,211,155,109,95,197,225,187,18,208,129,30,235,174,43,31,179,174,41,99,238,134,219,159,94,248,147,183,76,25,131,242,47,247,111,145,164,129,95,254,183,110,234,175,222,144,88,67,70,219,150,139,83,86,86,227,151,39,136,246,254,0,136,221,2,172,200,13,10,90,75,229,74,212,83,86,251,90,251,5,241,12,136,152,131,160,7,177,186,202,238,186,184,50,239,47,2,68,96,26,24,72,119,104,63,40,95,1,153,70,97,106,53,97,122,161,217,53,11,18,227,132,59,95,193,179,15,49,172,250,215,85,19,170,86,55,4,128,13,99,139,78,26,82,88,88,85,74,70,162,55,58,181,77,203,144,183,73,146,179,79,251,98,115,239,79,1,125,120,219,24,184,128,45,182,26,109,30,79,145,172,217,202,58,158,53,156,100,20,37,165,131,169,24,211,57,193,223,73,23,68,151,72,98,207,16,29,211,46,107,14,231,8,2,196,63,95,82,49,13,10,85,153,101,143,149,91,247,63,56,54,224,235,31,70,108,155,61,147,159,111,58,42,250,209,92,36,231,158,203,243,51,48,109,77,128,239,196,27,134,54,150,254,31,80,125,166,65,108,231,213,137,248,231,1,241,248,193,135,63,162,171,241,173,52,50,76,247,169,68,63,53,135,189,212,205,150,238,234,168,250,57,39,230,49,177,243,74,212,68,197,250,110,35,162,235,137,52,227,222,203,2,198,224,161,155,131,176,253,116,249,85,75,111,170,43,182,121,168,60,197,187,27,255,95,212,69,238,227,181,206,214,33,118,252,32,84,245,129,112,41,255,196,207,12,187,39,126,193,216,25,117,2,153,38,99,157,56,232,17,110,139,57,1,248,70,71,49,156,63,184,30,109,73,212,244,217,47,125,162,59,207,180,251,90,82,121,4,62,104,255,185,222,219,7,23,113,165,69,181,156,39,253,194,248,51,199,214,2,5,71,47,66,140,133,39,210,9,131,4,97,164,234,209,145,60,121,84,181,198,11,163,80,199,206,92,27,67,235,150,35,219,54,226,234,12,228,167,77,85,25,181,82,166,201,175,246,39,246,119,168,102,146,6,4,118,19,239,199,218,34,134,23,4,177,52,81,27,216,177,63,250,174,193,164,159,61,218,4,96,4,62,151,148,155,105,238,116,78,178,152,185,185,106,62,0,175,157,42,242,114,106,177,110,39,194,222,149,15,117,157,242,232,123,93,161,115,130,192,59,253,141,148,63,109,120,143,83,106,216,4,231,218,16,171,71,49,140,55,105,212,143,87,55,117,16,44,22,20,175,185,168,19,58,156,201,170,178,35,48,8,201,213,103,56,31,25,77,86,2,118,30,249,59,190,198,68,38,22,162,222,200,74,175,189,146,0,127,114,247,15,33,30,9,246,244,207,128,49,169,164,235,43,220,13,91,146,67,236,183,57,69,232,41,116,208,189,3,6,64,39,153,92,137,235,62,68,183,140,80,49,108,225,98,87,145,56,55,126,254,57,241,204,214,89,186,169,220,101,27,79,154,35,69,188,161,199,34,49,240,196,232,88,117,41,140,251,138,208,219,99,53,252,74,107,39,26,195,211,88,38,84,194,117,73,192,56,60,76,14,7,210,23,58,183,45,249,180,64,19,113,170,84,67,177,228,212,89,119,120,7,22,132,140,137,2,73,123,108,95,69,156,32,12,199,237,49,65,95,58,132,7,163,45,158,149,151,28,169,177,3,240,255,125,36,161,96,39,118,172,193,217,120,139,121,248,251,137,127,79,12,60,15,160,25,67,189,96,191,7,158,42,183,20,164,233,77,236,251,227,232,181,125,115,8,141,192,113,228,195,88,114,127,33,245,229,70,207,85,83,110,162,185,70,79,71,93,3,118,80,70,174,76,204,145,237,124,174,178,243,90,44,152,48,49,235,209,227,25,151,60,120,134,229,93,59,165,151,110,77,144,197,173,92,71,84,191,11,2,138,189,111,223,179,139,104,136,253,227,195,173,71,44,155,126,253,157,64,159,108,145,184,80,58,133,138,124,225,37,211,150,149,98,138,32,73,59,204,154,76,85,31,128,189,56,121,13,10,13,31,207,17,90,39,250,186,240,240,13,26,197,220,37,153,165,4,222,76,192,242,159,87,56,15,154,13,10,220,92,211,26,166,189,236,100,204,174,220,23,109,195,8,248,55,43,195,62,176,203,101,23,254,84,242,137,141,77,130,1,70,183,96,70,226,3,86,16,24,240,206,113,158,196,120,237,12,135,112,92,25,40,203,200,203,57,225,224,65,178,159,57,189,180,35,253,164,83,159,28,196,213,23,68,164,93,152,89,210,134,41,222,199,93,42,14,139,33,74,59,227,228,23,29,49,169,143,0,12,133,92,211,100,171,33,250,98,205,84,130,101,38,169,171,187,73,28,65,59,92,196,236,238,194,129,25,74,132,169,236,239,149,189,131,156,20,38,178,11,182,204,122,95,152,75,117,78,203,21,185,158,66,151,136,124,88,3,53,100,124,70,248,31,113,227,126,106,12,90,254,1,99,33,113,143,46,152,139,44,73,115,113,30,100,116,82,13,10,207,234,31,76,234,130,90,77,219,181,104,244,157,69,172,158,73,100,40,160,74,207,202,147,109,139,32,78,155,218,220,177,82,126,112,141,146,227,220,120,165,49,97,203,18,214,174,48,79,105,110,85,176,139,103,42,17,152,158,195,185,7,99,188,52,73,171,201,58,117,35,0,150,128,189,162,132,8,163,72,46,143,4,11,34,243,126,143,235,212,26,50,114,170,114,244,123,196,52,186,234,76,77,20,235,252,64,50,125,139,46,58,142,255,92,120,12,99,18,155,5,145,44,46,33,178,21,196,24,228,94,133,254,142,13,205,180,31,143,159,87,135,55,5,28,114,137,165,63,110,133,67,8,204,32,116,133,158,180,147,19,184,232,215,170,109,160,64,28,84,86,7,27,62,70,3,213,29,191,175,178,145,216,126,251,30,135,126,255,242,13,35,18,52,233,204,83,85,6,249,96,163,35,55,177,5,95,205,251,216,19,78,122,143,38,57,54,116,91,167,159,203,119,98,17,117,218,129,52,219,152,15,145,25,250,198,163,149,115,230,206,104,150,141,236,72,61,77,205,221,23,200,142,225,219,197,61,196,136,50,102,11,170,95,237,190,100,50,117,79,35,235,119,30,41,13,158,23,116,160,149,175,124,24,68,143,198,57,227,33,159,45,121,2,156,29,51,204,149,64,83,28,13,60,160,153,222,183,26,159,253,161,83,237,114,56,246,130,14,24,20,119,135,187,194,1,149,241,102,32,230,255,101,94,117,238,136,74,130,72,85,210,113,253,3,118,254,89,215,158,36,239,19,214,89,31,109,129,254,151,85,87,140,52,120,221,95,135,41,243,168,45,72,202,130,154,237,222,206,195,219,12,219,57,48,127,189,189,250,98,159,126,84,57,23,247,177,165,86,115,72,126,249,64,105,221,5,243,244,172,168,118,86,126,206,195,216,31,221,87,220,37,160,50,176,80,154,98,150,19,163,167,102,84,221,122,214,146,115,184,57,248,61,163,201,61,211,173,178,0,198,189,30,27,78,38,70,165,201,11,170,184,137,233,64,138,85,50,12,92,198,132,228,114,223,84,93,33,27,82,159,77,55,125,77,183,71,52,250,209,80,79,50,220,41,15,213,34,43,119,181,27,148,217,180,167,6,147,120,88,144,208,242,76,25,157,178,181,18,69,134,58,50,77,24,140,142,26,72,170,195,128,95,223,206,197,168,188,212,41,199,4,33,191,155,95,58,126,126,207,88,207,59,72,127,229,91,182,87,24,60,191,115,242,251,202,36,202,139,104,140,6,100,56,198,218,44,140,138,208,213,30,111,51,36,233,104,29,13,10,210,61,199,9,102,146,240,42,206,81,158,219,184,172,33,41,223,19,96,103,97,128,194,153,39,226,46,51,204,230,81,206,36,85,125,163,26,70,253,95,43,145,22,69,65,92,33,200,194,173,190,59,2,126,185,21,103,5,213,195,102,76,89,242,229,21,168,159,113,69,214,45,216,180,32,100,63,45,136,149,21,4,119,140,198,202,209,66,33,133,242,94,42,233,136,91,33,224,244,254,38,224,8,17,49,17,67,166,187,190,55,44,84,238,122,196,251,120,156,117,49,255,95,112,223,223,102,75,166,219,19,117,83,33,211,13,77,6,76,71,112,103,190,51,238,239,252,249,70,198,218,219,193,166,151,32,202,219,89,183,124,183,168,89,43,128,166,71,53,186,198,81,137,186,11,211,102,149,173,153,18,160,218,85,104,109,143,89,190,181,49,160,118,3,119,85,73,108,205,22,222,210,226,111,120,93,250,126,150,136,126,248,23,25,231,240,198,25,22,194,145,32,102,8,167,145,13,106,249,133,71,29,34,253,23,137,147,197,216,37,143,198,239,16,152,223,149,88,37,164,205,162,25,13,10,124,74,14,187,86,233,183,180,229,183,104,234,75,31,206,151,134,88,242,41,168,89,204,55,21,147,187,242,190,230,173,113,168,20,197,108,197,34,20,77,182,188,14,87,149,17,224,164,56,71,73,167,216,142,5,18,214,13,10,69,90,238,179,12,221,110,97,250,8,184,87,255,229,241,199,195,118,105,205,135,64,1,156,3,114,125,224,171,86,23,96,230,135,195,191,137,207,177,247,56,8,35,17,2,226,23,220,193,198,203,93,49,12,186,213,135,51,41,178,74,38,70,73,95,156,99,44,6,191,142,37,192,61,55,13,108,187,134,89,183,38,2,196,196,169,27,199,136,252,145,76,234,252,145,190,204,86,113,108,32,110,119,245,207,176,16,128,166,216,47,236,147,7,41,250,51,31,149,134,39,113,102,232,222,161,24,98,226,18,48,149,226,93,117,143,126,227,128,140,126,86,33,134,24,31,140,42,48,213,80,66,202,181,99,191,136,172,210,110,193,155,121,64,177,134,194,161,54,129,127,197,199,85,42,245,65,91,127,48,177,202,187,110,9,233,167,132,135,203,197,96,179,37,119,125,82,29,161,64,196,147,231,44,7,22,198,121,1,207,26,180,221,244,57,45,216,189,183,4,208,50,196,233,105,113,230,53,69,123,160,149,13,203,213,169,69,68,126,251,161,246,98,209,36,52,85,125,35,238,151,144,163,101,77,8,150,119,106,60,215,20,190,120,108,164,109,52,22,177,71,77,234,180,9,108,27,145,182,101,126,46,70,45,224,71,115,154,12,146,239,110,199,190,119,121,72,228,71,168,206,62,141,78,243,249,55,74,119,82,113,35,18,184,115,34,220,45,125,237,181,131,178,9,77,117,72,189,13,10,79,235,61,205,248,53,212,154,29,110,51,126,53,80,109,191,111,66,155,107,148,58,44,113,40,66,185,83,96,38,40,250,23,234,66,196,13,139,62,211,222,46,250,217,59,187,47,41,189,38,52,74,21,97,219,174,169,138,15,230,79,173,47,81,210,33,143,128,24,52,226,95,215,229,8,26,133,164,29,131,6,214,224,4,121,247,61,111,182,233,224,43,32,200,231,253,159,171,162,34,173,15,209,238,45,116,126,81,144,82,65,62,241,254,164,206,207,84,202,13,185,31,131,233,2,91,132,136,1,61,204,175,28,62,24,175,37,118,47,145,26,85,3,253,46,134,33,162,5,69,22,70,76,111,189,65,73,198,86,103,236,171,86,23,96,230,135,195,191,135,88,144,141,81,62,185,103,0,43,148,217,244,202,57,184,222,196,197,72,202,247,207,155,173,7,97,107,108,176,221,43,127,27,133,159,19,207,98,122,219,195,0,183,57,187,47,125,123,150,73,212,129,220,145,34,183,203,86,29,177,232,169,255,40,52,19,164,19,169,255,232,180,92,37,254,54,178,134,126,11,136,22,154,170,82,15,203,8,125,11,171,27,82,200,55,235,64,78,38,74,17,0,123,207,218,8,48,101,188,1,60,193,251,250,216,53,52,146,8,182,180,129,213,73,232,193,179,120,169,137,183,206,94,167,228,120,115,190,173,164,145,222,125,246,56,45,21,248,119,80,248,108,116,186,74,114,188,137,22,254,79,95,148,114,76,27,66,20,75,222,136,26,101,224,172,1,35,94,129,0,100,2,241,146,123,125,228,38,231,194,231,238,230,209,78,191,185,193,108,139,221,94,151,99,164,175,121,158,177,165,102,4,157,88,143,128,116,255,219,113,35,104,133,101,101,98,81,126,44,121,37,149,165,44,155,63,186,187,144,23,230,233,210,176,9,176,142,129,223,107,55,96,128,67,183,162,35,4,119,67,253,241,18,82,93,144,204,207,216,168,126,199,209,203,65,0,78,217,102,1,177,144,47,35,55,54,121,172,142,123,3,103,41,218,184,62,140,136,79,190,229,60,86,174,74,170,170,163,240,0,84,146,204,63,95,43,72,56,138,234,52,112,231,118,102,243,3,84,52,22,101,43,69,107,3,107,214,17,237,182,228,207,40,130,132,153,117,35,169,20,198,156,136,174,132,7,54,48,31,232,86,117,202,122,6,119,43,143,79,51,90,140,165,13,232,170,134,164,110,185,9,77,69,67,119,7,180,141,224,103,248,180,204,60,41,27,145,186,184,22,67,69,119,17,55,226,6,38,167,67,7,105,32,148,222,0,6,129,145,43,25,18,44,153,43,115,36,141,190,251,224,224,245,236,192,127,1,43,185,226,147,81,201,14,171,205,182,90,32,170,128,22,134,211,234,72,138,56,157,15,53,29,60,116,160,62,17,30,231,210,66,222,126,205,210,46,39,123,166,206,13,10,87,58,129,132,139,82,49,125,118,251,235,161,6,221,160,209,223,246,185,175,250,62,153,80,145,76,176,75,115,54,54,183,220,225,115,128,248,175,47,229,35,32,191,9,74,44,4,50,107,68,196,240,187,193,100,150,244,212,198,181,54,115,227,243,140,53,30,123,24,191,8,61,68,175,84,144,190,106,81,195,253,113,204,254,32,177,135,74,243,39,15,204,103,193,48,194,162,15,196,74,40,236,139,140,37,234,128,173,167,142,120,166,84,219,122,14,14,47,198,126,186,7,116,179,32,9,192,247,149,56,90,86,178,31,165,123,85,188,161,13,10,168,215,223,20,158,142,62,206,132,190,0,38,83,201,4,199,105,166,126,129,132,40,204,21,133,227,52,39,178,37,184,118,144,167,89,226,173,25,129,1,59,31,147,212,155,71,219,176,186,173,121,177,170,144,136,239,135,181,22,5,176,140,132,179,164,103,26,74,245,125,128,128,251,120,188,216,0,238,242,98,123,175,16,190,80,174,35,205,214,188,101,127,191,107,83,195,200,28,217,231,97,204,187,105,104,97,239,24,100,78,128,229,125,73,233,92,3,185,133,21,41,245,111,181,39,163,83,183,30,130,209,165,60,207,158,15,185,155,76,12,15,226,158,109,210,201,207,140,70,219,35,122,185,138,250,8,103,69,216,35,35,253,198,64,66,140,115,56,6,246,229,12,213,224,47,3,147,123,176,228,173,101,62,6,159,162,240,132,188,122,187,138,25,164,61,137,172,216,237,234,163,148,93,195,222,48,5,173,229,157,246,201,26,8,223,158,226,22,150,63,147,28,109,218,187,194,124,59,252,113,89,143,204,230,104,136,100,2,173,59,31,230,251,118,241,25,121,199,116,78,84,22,149,183,61,15,117,22,116,146,5,220,39,162,236,223,137,121,194,199,114,145,164,165,65,41,223,42,52,202,156,251,219,169,207,226,222,103,254,190,76,176,81,124,206,21,210,98,211,38,139,255,234,184,200,38,216,17,114,140,177,72,45,86,14,117,209,172,174,66,67,232,230,235,167,165,134,204,72,13,252,255,204,108,207,69,207,99,214,188,91,235,0,41,241,244,236,210,192,89,152,189,171,23,165,158,123,70,202,200,44,96,55,98,54,194,18,30,240,211,27,64,101,196,28,66,129,198,125,105,208,224,198,216,13,137,224,234,231,187,38,130,76,205,189,230,172,23,83,231,217,133,94,1,128,58,46,186,99,41,115,0,205,40,229,189,178,154,154,164,215,161,217,116,180,239,103,99,181,198,36,24,216,189,227,111,69,153,188,141,165,134,2,202,205,237,132,127,107,138,237,153,64,168,26,43,86,224,113,193,253,128,194,47,2,31,13,239,78,245,251,49,97,81,13,16,81,228,133,5,137,16,134,97,128,68,68,140,92,130,135,190,210,19,225,162,242,213,125,192,220,151,110,193,101,168,228,211,87,230,144,184,165,216,120,167,189,108,171,94,166,42,46,179,209,102,53,34,15,185,132,149,178,100,25,207,182,174,57,238,202,21,55,181,163,183,40,35,222,31,124,102,255,120,77,195,250,221,213,35,254,113,15,246,29,118,157,32,44,4,9,189,192,95,207,15,141,196,126,187,93,63,146,254,210,59,29,97,240,131,42,70,89,182,12,226,242,78,53,38,97,148,77,225,3,185,42,62,29,240,193,201,146,174,119,101,123,135,48,90,144,20,20,103,167,18,7,173,102,48,20,121,33,69,220,181,94,145,61,49,56,236,47,121,150,123,237,191,174,188,136,208,19,142,111,175,200,240,146,197,59,128,201,109,245,23,180,234,155,43,224,130,201,132,252,216,245,26,140,220,252,68,175,24,154,5,212,45,233,198,182,20,146,107,235,205,174,46,230,234,31,191,151,28,202,228,135,21,78,76,33,186,59,47,217,221,14,185,56,19,26,250,29,138,250,104,76,37,42,162,231,205,5,192,250,15,75,56,3,81,18,82,132,74,25,85,82,165,48,130,211,244,176,181,69,84,98,254,82,189,255,193,216,207,42,184,86,162,49,46,67,83,177,34,200,225,245,23,162,46,56,199,137,67,139,165,7,2,169,201,239,168,203,196,208,35,76,50,68,151,73,152,104,128,38,199,30,105,181,54,253,250,79,250,53,190,16,129,167,193,227,216,160,100,36,155,217,111,90,77,11,117,123,96,59,208,163,34,44,61,216,186,137,133,237,189,15,1,176,119,124,49,101,41,181,193,79,76,251,118,20,200,89,9,155,179,230,243,6,236,18,246,32,131,175,49,205,45,198,175,101,228,33,134,31,146,236,52,36,62,200,72,45,232,189,189,245,201,151,125,130,14,112,203,96,5,53,118,254,49,95,248,98,90,220,15,104,145,169,186,128,105,164,107,115,120,19,25,215,81,84,100,152,143,2,90,90,56,169,249,62,74,74,42,6,31,93,64,158,206,102,72,72,36,198,204,223,162,81,101,34,63,176,51,190,248,229,130,123,182,142,166,227,92,80,174,60,177,188,221,65,32,227,42,131,136,119,215,217,156,24,191,150,55,177,171,210,49,105,65,227,211,215,161,228,249,6,52,19,38,23,156,173,155,121,157,111,242,143,254,152,36,45,162,91,85,208,88,208,81,147,78,183,161,182,131,133,177,196,191,223,232,8,130,133,249,101,86,38,137,171,66,55,2,220,85,66,75,21,167,109,196,164,252,204,41,56,98,84,222,38,96,97,68,176,95,243,13,156,41,235,187,243,43,229,246,112,246,17,72,56,179,51,239,17,175,193,132,195,188,77,112,168,83,132,73,52,216,67,250,192,101,64,43,102,7,239,161,30,224,29,237,14,93,70,24,117,99,167,123,210,163,15,113,45,179,59,228,25,118,119,174,114,36,176,202,1,136,15,185,141,142,64,5,105,155,11,61,125,80,45,113,156,243,7,13,10,243,111,59,191,74,147,111,8,88,116,21,174,137,188,218,124,18,43,123,70,232,32,108,4,183,197,42,58,205,200,250,12,255,22,20,122,133,155,130,164,216,105,87,109,68,51,37,228,202,87,172,101,73,136,57,207,215,179,170,247,41,11,51,197,48,241,76,68,230,100,31,56,220,230,12,202,105,125,221,40,122,75,142,191,243,104,157,168,93,9,214,28,160,222,103,27,32,191,251,60,121,249,72,151,56,71,42,143,26,148,169,26,139,77,89,224,185,168,30,65,100,248,39,243,89,36,202,199,248,90,162,225,3,252,237,137,255,161,48,52,184,207,248,111,84,204,101,102,242,168,127,144,47,40,54,21,77,226,218,211,241,98,222,111,44,88,122,95,91,151,116,159,139,135,154,66,45,191,250,43,124,245,43,140,120,127,107,209,67,107,129,36,168,11,191,38,193,185,26,73,131,226,122,232,122,24,121,248,138,86,37,46,193,155,8,69,210,232,186,42,26,39,120,223,24,36,235,76,240,221,149,152,169,3,107,132,200,189,175,69,80,91,82,235,191,238,92,143,7,76,183,5,44,130,193,126,31,202,58,253,101,218,69,45,123,100,64,171,104,190,52,80,54,192,168,239,91,223,186,4,134,171,124,180,237,152,143,89,61,83,86,226,154,225,77,162,31,53,147,176,193,30,186,96,90,221,77,254,116,15,15,85,54,253,116,17,197,101,131,125,203,143,204,241,202,66,200,237,183,101,82,100,229,165,203,255,253,170,210,220,233,217,161,183,45,70,176,79,68,218,108,206,42,114,161,234,235,176,0,146,221,213,5,201,219,226,228,37,6,171,26,193,138,230,38,145,21,43,2,44,6,216,188,88,76,232,48,13,10,131,129,43,237,222,170,62,23,124,81,177,69,102,219,132,69,186,218,64,13,10,186,64,173,255,151,156,140,187,164,95,131,46,52,133,164,194,27,56,159,65,189,14,9,100,144,225,231,79,231,215,201,50,132,214,18,222,204,11,22,118,121,75,254,8,223,72,150,71,250,255,54,77,39,16,49,187,72,34,94,17,6,64,168,28,143,180,239,78,14,169,19,141,83,151,87,103,125,147,173,225,69,206,96,131,197,101,220,201,224,127,34,138,212,112,128,178,224,46,117,229,33,84,127,24,112,92,132,179,21,168,44,74,136,183,102,35,240,122,53,2,218,58,162,177,31,53,187,231,236,221,218,110,127,48,230,30,112,253,166,69,6,87,146,251,95,58,72,223,94,12,123,199,160,145,252,146,96,57,98,213,62,200,144,49,118,250,238,159,13,10,11,74,233,150,140,79,145,161,11,213,87,208,164,93,29,253,198,159,167,89,20,69,233,53,85,37,13,10,70,47,22,199,64,69,187,135,247,68,217,101,73,177,169,171,72,150,5,145,158,251,96,75,220,61,121,36,74,104,49,54,142,101,57,100,230,94,45,158,199,184,97,147,153,140,154,246,70,225,156,227,169,236,76,148,63,87,68,87,67,231,41,178,123,50,207,194,114,189,126,137,139,163,162,53,231,149,162,211,33,147,220,174,175,143,76,101,61,46,129,66,197,115,185,21,119,157,122,93,97,249,91,149,216,179,81,228,215,224,39,98,166,86,192,225,230,45,201,218,196,235,106,162,37,54,6,80,63,161,231,4,255,206,50,223,255,98,218,213,96,209,31,160,67,154,230,76,134,185,194,251,203,95,21,208,34,168,71,44,40,29,174,46,249,138,99,45,162,227,188,39,249,199,44,238,63,231,132,150,146,108,203,25,5,178,169,59,61,124,82,246,112,45,101,199,165,144,214,200,23,66,74,171,135,119,81,225,191,225,220,213,186,39,100,83,24,223,66,72,109,29,124,199,44,252,203,199,38,191,57,149,134,154,177,102,201,97,191,70,143,37,168,40,98,101,248,92,70,182,215,14,176,23,251,222,185,65,124,189,16,111,177,165,145,223,141,100,152,143,170,216,91,167,175,110,55,91,42,175,138,75,191,190,238,186,184,246,63,43,3,53,179,76,117,134,74,168,7,27,191,209,156,26,57,177,159,86,45,181,111,67,193,163,167,120,194,102,231,225,25,162,194,85,22,192,138,201,163,16,41,248,228,93,90,32,234,211,205,45,133,155,85,185,35,177,111,153,154,203,226,43,21,220,119,187,215,9,149,223,0,59,119,236,115,37,131,51,237,94,114,83,101,240,7,230,140,179,83,177,139,92,61,47,149,45,191,119,31,248,148,208,47,87,135,183,108,30,225,8,222,44,121,102,88,41,55,37,211,106,229,88,119,174,199,104,110,114,57,174,152,43,206,160,100,103,255,25,156,115,252,143,151,204,251,240,2,75,185,96,135,242,54,176,73,204,131,108,151,88,8,150,59,210,150,216,4,33,173,141,94,176,145,26,214,90,94,24,77,115,131,212,180,137,155,2,21,76,88,230,71,31,192,74,32,65,83,185,74,47,230,195,146,52,223,91,214,35,43,11,115,75,215,165,92,204,42,237,222,247,251,162,84,106,178,215,27,233,222,99,3,208,86,205,193,250,158,191,96,43,62,46,19,123,29,182,255,23,178,34,148,85,70,208,71,42,1,254,147,234,20,200,146,70,6,50,134,226,25,3,163,139,11,57,15,65,213,217,204,235,189,125,243,157,47,97,252,151,226,159,166,152,180,133,93,203,243,66,165,59,62,92,14,176,160,66,228,105,215,120,205,88,206,221,91,109,230,55,159,78,203,118,37,133,144,245,243,40,79,154,24,246,87,244,157,2,88,130,206,1,166,189,9,99,233,14,250,59,211,251,90,83,8,51,161,145,189,69,49,139,107,199,4,69,249,42,66,241,50,51,200,117,62,125,12,22,248,14,42,187,139,113,3,234,144,18,173,61,158,243,196,134,153,51,187,61,55,58,237,199,138,192,206,153,103,217,231,2,38,95,132,188,104,179,210,59,14,31,65,28,126,104,230,205,246,241,96,91,242,151,135,119,239,33,244,123,168,125,85,197,36,49,125,235,171,44,158,155,214,80,103,2,63,225,171,220,17,32,191,84,134,106,76,127,211,212,211,166,139,120,34,211,221,219,46,213,130,20,177,97,40,41,130,201,96,3,243,204,235,250,65,161,62,243,228,84,108,168,64,105,214,104,233,13,185,152,95,29,127,3,177,23,213,103,176,49,24,194,200,138,149,90,96,84,220,16,83,2,132,4,202,29,5,77,89,106,141,232,93,222,166,67,85,200,93,144,135,128,149,64,196,2,32,189,12,190,219,12,234,58,248,14,24,38,51,48,13,10,199,237,150,144,178,215,14,42,60,165,226,119,177,220,86,139,170,226,108,231,136,191,174,255,13,10,88,79,107,204,13,129,155,178,127,246,110,219,8,103,70,121,163,158,191,226,39,123,145,105,211,243,108,98,150,154,103,203,14,125,153,36,122,168,91,188,228,200,221,244,34,50,80,150,38,121,196,148,212,36,215,100,117,91,45,45,214,110,178,65,217,38,183,108,87,114,214,8,94,142,81,67,13,10,187,120,21,109,88,9,166,141,70,250,129,173,40,168,159,185,9,136,11,153,217,181,43,219,140,223,250,224,21,78,134,137,232,203,204,4,251,173,113,45,103,178,190,35,115,200,80,123,121,178,27,48,53,154,102,105,249,233,221,56,85,5,241,165,137,178,65,133,88,194,194,41,183,67,25,142,129,27,40,251,124,199,131,32,245,194,78,43,54,94,83,14,65,183,86,121,226,3,195,81,100,220,201,224,127,34,138,212,112,239,138,165,133,144,37,182,37,96,248,19,192,178,95,114,184,244,50,93,71,56,105,94,237,66,224,44,233,162,126,139,190,114,137,228,240,155,207,48,176,222,64,206,41,251,186,184,214,90,217,47,214,98,13,0,65,30,95,53,69,41,76,99,151,0,11,7,56,43,4,138,185,72,135,49,184,203,71,183,71,57,217,20,229,105,240,76,84,213,144,119,184,130,122,242,101,200,219,114,24,151,24,25,197,134,36,244,15,148,94,7,68,161,237,89,41,146,202,234,31,123,56,84,254,24,77,163,79,39,112,25,192,82,184,179,206,175,92,234,124,69,255,80,32,94,147,169,237,254,130,238,51,241,54,218,187,18,79,140,191,16,165,116,88,169,51,7,197,187,0,31,243,123,41,35,126,198,177,179,65,134,85,104,118,97,104,198,87,44,85,199,234,176,62,35,105,130,84,59,169,246,12,234,40,84,229,49,218,205,37,170,173,130,121,187,52,2,225,125,81,85,123,31,101,248,223,222,184,75,37,27,58,82,39,133,247,59,78,236,38,81,197,36,12,161,21,177,128,57,210,195,149,105,35,201,45,219,242,44,215,133,114,133,99,105,238,129,174,41,178,110,151,213,202,61,61,0,4,5,123,249,220,50,142,161,175,128,17,245,240,139,131,11,201,73,54,126,100,160,81,231,39,11,236,198,87,116,58,109,134,13,84,121,167,1,187,228,200,9,168,183,249,254,4,43,149,54,44,91,121,118,177,170,157,244,180,205,161,142,28,247,196,126,113,184,232,66,68,202,203,206,154,193,255,105,248,239,148,41,89,45,192,27,208,55,246,231,252,182,238,221,219,209,167,94,68,234,8,140,29,41,43,26,200,148,47,240,137,235,146,125,218,222,47,90,243,218,34,5,126,22,199,48,146,23,213,188,69,252,208,5,118,86,130,98,178,40,155,167,225,41,237,135,250,26,49,150,192,79,123,90,191,130,183,45,126,7,54,247,4,232,23,210,77,228,145,5,132,68,68,73,219,118,163,33,237,229,127,149,108,11,16,177,120,25,60,165,251,29,133,116,243,94,41,212,234,249,164,94,84,84,134,73,148,145,51,84,199,100,111,241,215,88,218,128,42,94,145,33,134,169,35,203,233,198,137,84,15,131,58,55,92,5,141,97,53,74,197,247,76,231,147,232,186,185,181,6,165,169,112,43,228,37,248,98,36,208,4,227,90,184,6,11,44,13,10,139,123,84,146,17,194,93,179,109,70,239,29,208,206,38,61,106,229,161,132,244,100,208,8,125,110,111,18,119,237,159,94,127,147,169,183,74,239,63,93,56,32,42,80,168,145,45,234,117,205,26,236,182,191,164,200,112,121,206,154,30,48,132,91,81,194,93,11,102,74,97,106,54,80,142,171,227,125,164,214,74,187,89,184,84,83,36,45,0,111,53,123,23,79,134,48,108,78,94,140,43,27,128,225,203,245,16,172,119,103,178,118,158,163,179,194,12,169,172,222,221,169,91,170,51,7,184,149,104,122,63,13,234,139,209,177,130,64,169,9,5,160,33,18,254,60,243,6,248,185,93,141,104,47,177,52,139,84,33,50,54,249,120,211,112,139,116,128,253,238,62,70,221,88,79,170,177,189,182,144,142,69,175,227,16,164,159,115,196,80,115,83,178,25,251,17,100,146,215,185,102,153,244,139,16,109,84,32,225,0,153,127,89,202,73,194,246,208,102,97,236,182,198,38,242,54,184,25,238,242,167,27,169,55,2,42,146,207,187,49,217,67,41,46,35,49,207,56,92,178,232,2,102,160,197,82,3,40,217,61,250,88,55,201,110,126,43,163,16,175,250,87,53,90,178,213,29,178,75,191,53,24,16,161,154,207,49,171,123,28,213,229,90,71,124,24,93,227,128,1,33,98,36,87,45,63,108,39,249,202,130,115,172,255,242,243,8,183,13,10,130,243,129,44,183,9,172,62,91,155,194,213,90,115,42,188,198,139,216,215,95,141,51,104,65,25,128,223,179,169,78,23,173,106,225,219,101,147,53,246,34,14,103,124,88,200,201,203,211,217,195,148,255,218,139,160,176,2,65,69,36,89,250,123,111,2,138,222,156,157,4,69,74,9,250,30,230,5,67,3,102,227,50,245,213,255,125,239,213,25,153,156,123,68,117,169,204,11,200,43,215,81,80,207,168,6,148,202,131,80,106,20,90,200,247,127,234,157,47,66,253,111,200,138,9,248,218,167,136,61,199,179,255,223,235,113,177,122,182,18,108,186,19,28,197,73,13,126,171,140,99,14,6,164,112,194,136,175,101,90,20,168,160,137,166,31,152,174,227,48,195,144,234,161,150,115,218,140,101,173,23,86,223,244,77,54,181,230,23,95,17,11,40,78,211,113,88,91,125,153,254,190,186,254,230,20,4,35,139,149,119,34,180,103,13,10,109,118,9,210,230,28,70,172,126,183,201,191,180,71,189,155,113,96,65,144,95,109,108,243,33,194,72,185,203,225,31,58,236,69,163,66,22,191,14,124,99,124,129,112,21,236,0,182,28,84,32,240,17,127,204,236,93,204,250,142,209,196,224,170,2,112,107,178,194,199,208,93,235,112,58,36,0,64,201,231,239,147,8,118,64,46,84,201,242,163,114,36,46,9,240,253,119,136,94,70,112,9,222,85,135,34,173,245,75,253,204,147,109,99,93,116,150,73,181,130,192,99,237,110,156,138,255,159,106,120,22,214,9,15,26,205,41,60,123,108,95,95,248,24,67,189,254,95,21,178,75,40,248,189,63,193,152,161,49,2,50,40,98,225,28,157,206,127,80,81,53,231,88,175,39,182,70,131,140,191,50,216,57,206,7,166,6,183,208,220,11,154,94,114,95,146,13,165,177,177,155,254,186,82,170,99,2,38,186,48,141,52,158,11,163,49,54,158,36,246,15,241,239,175,37,252,132,31,204,60,88,62,98,187,245,217,2,247,176,144,8,93,159,1,20,32,239,13,10,149,46,142,193,220,197,23,66,171,63,184,79,72,249,21,193,226,128,29,56,61,175,195,3,196,118,243,88,140,85,40,25,77,165,141,151,31,87,168,7,12,168,244,86,47,50,29,0,219,154,210,2,183,122,243,5,54,224,197,249,13,10,163,15,7,70,120,143,229,68,120,183,180,47,43,195,155,106,57,178,16,112,36,78,106,77,59,56,85,140,98,86,124,254,55,83,32,130,252,21,102,108,23,232,105,165,177,107,228,100,58,190,184,126,210,152,237,72,145,218,178,46,50,97,166,162,217,224,128,158,135,241,7,234,83,153,24,91,225,167,252,230,40,38,101,156,122,135,210,54,202,118,95,130,229,17,113,219,48,243,216,90,255,81,78,84,30,160,47,187,170,130,197,144,75,210,23,9,240,199,220,44,194,168,249,125,100,141,122,212,136,124,87,11,178,99,208,117,171,146,37,76,180,94,132,200,215,76,206,206,227,149,107,33,210,225,230,190,105,9,186,23,24,157,40,49,11,92,179,146,153,70,57,129,40,13,70,113,77,239,55,156,25,66,205,194,201,80,229,9,63,119,53,77,45,40,210,140,203,183,42,12,237,176,243,170,190,40,101,95,143,37,200,158,101,7,155,218,135,94,75,90,96,149,195,241,54,44,218,62,218,96,40,208,220,238,137,115,168,28,103,102,18,174,45,146,5,1,63,100,88,174,61,229,205,147,72,78,223,227,98,20,203,38,31,214,31,30,229,229,57,173,104,37,220,97,156,112,242,82,209,29,107,192,222,171,190,54,160,118,176,47,185,62,47,232,219,62,145,203,133,39,211,249,242,79,155,96,154,12,71,7,116,75,205,101,179,124,21,125,208,217,93,142,255,186,149,37,77,152,143,59,134,89,221,92,232,198,194,104,25,6,189,87,60,122,71,137,224,89,113,93,177,248,58,66,129,20,92,160,171,103,74,54,40,14,182,59,162,32,234,55,47,144,249,63,102,125,134,196,176,120,255,6,183,139,218,116,145,156,134,109,154,164,110,137,153,107,244,235,62,13,10,189,90,31,60,197,154,152,48,170,217,253,148,137,212,197,72,158,100,83,223,208,41,146,94,20,93,136,202,118,46,202,206,245,186,65,21,217,47,231,3,50,8,15,23,26,14,34,216,159,186,214,91,98,69,176,186,18,53,52,206,47,247,149,229,41,48,110,6,119,240,129,4,59,122,176,133,87,173,72,154,90,57,126,206,203,121,224,37,195,213,71,67,163,113,18,146,158,44,125,2,88,224,86,252,209,183,58,131,135,131,192,7,103,136,9,20,123,126,179,127,123,4,222,240,167,230,115,15,196,56,16,142,189,232,131,18,172,161,73,114,92,227,81,215,208,230,168,62,188,200,81,138,36,8,158,21,60,137,240,228,64,148,35,13,10,204,191,240,20,46,190,207,95,119,246,1,140,207,67,185,103,203,24,136,193,65,16,48,102,18,140,4,9,65,182,32,217,201,124,13,10,248,251,235,139,168,168,215,224,66,70,58,51,29,208,18,133,223,106,5,52,163,27,9,199,22,191,69,167,36,24,116,106,115,22,175,56,142,197,216,63,28,212,152,69,8,35,5,239,148,225,126,108,81,203,186,113,61,227,51,59,170,119,13,10,219,235,139,145,121,217,133,92,95,17,12,73,46,113,221,173,15,22,145,196,30,51,161,246,111,147,31,235,107,187,166,106,30,214,179,24,178,218,153,64,3,167,57,65,177,208,74,243,26,95,93,164,98,105,90,196,248,96,91,8,89,146,138,229,242,144,87,140,77,11,136,50,53,86,188,140,241,135,97,205,109,143,94,34,149,153,81,67,198,36,55,251,70,25,207,159,208,221,179,193,154,6,123,154,5,73,72,50,130,24,7,70,50,246,187,6,57,50,201,167,56,92,156,74,47,67,46,117,56,153,57,93,106,31,219,3,130,58,211,251,77,221,13,157,6,224,146,143,122,154,253,171,70,210,186,61,123,120,9,252,37,19,120,222,198,202,5,152,133,152,1,81,145,246,144,8,170,192,239,61,120,44,187,90,154,173,105,100,1,158,136,125,75,166,135,193,66,208,198,227,81,249,146,95,185,99,73,60,87,19,83,13,42,250,177,224,189,204,4,82,181,244,128,3,144,41,159,79,146,244,153,97,251,165,88,16,111,175,226,6,37,250,227,137,161,176,178,194,174,246,167,60,85,22,161,24,166,214,183,247,121,125,108,51,225,191,191,135,15,80,24,229,32,208,197,86,148,48,105,202,76,14,24,108,84,236,238,140,177,154,240,141,54,101,181,25,205,183,226,55,55,129,127,58,146,217,84,92,190,60,43,1,24,84,96,26,147,236,202,26,134,195,36,212,38,44,129,156,24,73,98,17,253,220,228,202,253,228,102,122,166,236,119,253,62,239,220,21,230,218,118,57,69,42,100,4,162,135,220,253,241,179,100,203,66,58,7,46,234,162,104,94,18,164,131,125,209,65,141,232,163,240,80,77,198,9,46,83,249,39,131,88,20,70,53,66,28,233,26,14,101,164,19,248,190,95,91,83,167,5,174,87,162,230,104,243,141,101,122,77,137,193,19,138,74,22,146,38,152,189,174,221,251,154,213,43,34,189,242,92,251,86,32,18,25,112,163,31,151,36,117,116,144,5,101,238,96,244,13,211,144,161,33,189,155,99,189,89,132,63,224,136,248,196,193,84,242,22,49,8,6,142,66,82,63,125,152,44,130,53,142,213,113,186,12,102,6,157,248,191,220,153,105,109,190,115,150,131,81,85,128,229,118,30,235,0,177,170,121,197,243,243,129,176,5,87,223,122,27,212,34,19,117,126,22,206,71,195,252,198,208,192,157,46,225,197,120,169,22,115,150,169,208,118,114,245,209,133,131,15,240,227,174,18,193,195,204,70,25,92,9,98,186,177,45,36,118,166,198,52,24,66,90,99,205,102,229,156,29,25,197,109,46,239,142,125,105,69,181,221,151,41,16,185,164,112,56,56,172,73,0,126,158,175,175,205,60,130,120,98,134,109,99,247,35,28,94,228,80,197,22,42,67,200,43,206,145,95,148,243,81,222,175,83,245,40,103,213,95,224,189,31,173,208,176,175,206,190,202,49,110,181,126,105,3,79,112,73,52,16,6,127,39,221,58,25,42,7,107,99,21,20,125,191,226,170,52,127,163,158,236,30,62,47,20,56,255,44,152,207,30,110,232,157,175,79,111,6,236,164,179,32,189,164,91,252,117,186,134,54,132,60,224,199,7,195,5,11,46,121,20,163,131,244,231,87,74,161,84,45,123,35,211,108,203,104,66,151,40,227,0,86,205,218,154,118,75,43,235,170,207,59,67,16,113,131,48,64,34,81,45,182,34,221,33,187,26,237,151,217,119,91,118,93,235,68,52,41,36,129,29,104,254,138,60,132,24,179,2,19,119,54,3,251,69,110,110,214,167,112,103,134,122,90,170,241,243,185,231,86,63,159,3,24,138,168,65,232,110,239,232,20,52,73,16,99,189,148,46,136,169,192,237,153,51,90,101,221,182,77,14,242,203,26,126,168,211,71,108,129,160,222,236,167,242,47,189,90,135,159,2,94,220,243,168,144,22,220,205,110,181,194,193,142,25,13,10,149,111,60,68,135,94,112,143,30,147,166,41,181,4,26,173,85,131,203,7,165,249,232,244,251,83,151,74,238,60,56,48,59,65,218,138,56,170,141,117,135,18,162,144,84,229,187,184,214,174,83,16,37,235,218,85,132,80,248,13,10,210,220,111,91,125,124,204,189,86,108,214,135,39,113,78,188,218,35,94,123,205,76,140,80,156,142,149,210,72,188,134,19,64,141,231,197,25,240,65,4,101,213,16,189,232,109,180,236,148,128,134,26,235,46,149,226,100,103,204,241,129,244,87,212,95,75,144,160,235,149,35,217,55,31,147,132,128,250,179,101,221,221,67,90,147,125,239,197,182,221,62,148,65,37,155,136,127,230,114,25,207,205,173,6,116,75,174,117,139,71,142,34,155,31,180,141,68,157,80,233,98,36,25,100,143,53,194,188,67,29,72,124,94,86,157,209,69,199,93,45,222,25,94,154,130,13,190,187,69,237,69,77,240,108,217,106,38,30,144,136,153,142,93,173,190,140,141,132,201,56,81,134,234,180,86,179,11,239,130,37,60,27,6,56,143,87,23,13,75,172,166,3,230,146,46,243,14,237,184,96,206,30,191,42,106,32,20,36,253,138,33,67,17,19,30,69,149,100,143,176,198,14,0,188,171,179,8,245,140,234,69,254,208,46,33,251,34,156,34,38,70,129,40,244,192,207,236,44,84,116,41,42,20,178,119,212,5,133,33,209,84,176,226,153,150,237,18,145,17,52,139,33,143,247,120,94,114,203,236,62,178,108,155,53,81,164,102,227,136,199,193,147,200,138,4,76,243,63,182,236,172,212,232,75,234,97,169,240,114,74,114,184,190,16,137,121,102,61,223,42,33,28,227,80,214,58,8,239,11,150,112,209,210,115,235,108,94,116,200,177,44,7,31,213,74,152,144,86,124,220,172,77,2,60,205,167,234,65,208,58,88,195,146,199,215,163,153,189,175,219,151,23,112,185,110,98,194,252,90,8,186,157,18,137,135,153,151,134,72,108,40,241,190,170,135,77,11,24,95,166,253,115,195,133,118,254,53,193,5,130,176,29,83,2,16,235,216,231,123,212,183,250,237,217,13,10,228,1,151,107,9,9,5,116,223,156,15,99,31,225,39,187,185,57,184,88,243,18,51,241,192,131,145,129,77,230,151,5,26,157,173,228,182,78,211,22,216,225,175,115,154,225,85,232,227,92,189,218,148,94,56,184,92,183,38,178,27,156,166,95,6,228,63,170,4,15,32,19,19,147,177,7,239,194,238,241,226,42,229,56,185,164,75,96,9,243,20,87,11,208,111,99,243,108,53,42,169,69,182,242,104,248,239,204,230,101,210,253,250,59,13,10,207,107,13,10,54,243,134,96,113,187,13,10,27,102,239,167,63,24,123,173,150,72,212,71,201,196,251,136,190,31,44,7,170,13,10,72,250,147,153,214,111,32,116,16,99,209,5,167,211,234,74,98,53,121,234,240,20,51,203,149,69,0,55,159,43,31,15,130,174,81,46,149,175,221,104,249,157,41,166,89,117,106,34,8,132,34,219,203,170,29,135,139,232,242,183,209,44,72,24,143,220,233,52,71,197,118,186,102,227,205,241,135,97,176,13,18,112,38,150,153,90,66,170,65,180,71,230,191,244,96,130,197,253,187,119,83,181,88,63,8,147,23,115,140,251,245,73,136,214,166,170,104,4,191,96,15,192,0,200,248,207,254,86,169,97,156,33,204,136,81,114,163,251,213,196,59,216,191,87,193,147,94,250,137,131,202,187,176,111,72,21,156,244,105,105,133,57,211,154,42,0,176,79,186,251,234,96,232,244,69,66,252,169,168,87,177,211,109,108,60,177,127,43,42,9,208,128,205,172,40,123,179,238,229,7,222,230,244,13,10,109,114,175,152,130,145,177,228,214,169,105,242,182,205,171,134,204,77,49,187,195,197,198,5,227,191,160,185,125,8,95,230,141,5,22,160,247,171,85,197,155,122,207,115,238,92,73,91,142,236,211,255,11,223,145,103,94,79,128,42,222,183,120,17,140,221,218,252,118,123,243,198,184,215,150,4,44,12,95,241,196,85,191,103,43,163,103,67,79,3,178,0,100,78,81,81,42,195,225,61,52,118,236,90,3,249,72,186,154,145,174,49,165,194,235,107,190,26,216,40,220,118,149,203,47,241,13,145,83,126,206,38,71,239,230,230,242,119,232,3,87,61,137,113,215,169,124,121,146,143,75,227,38,105,54,58,210,141,206,184,155,224,53,57,36,167,76,13,124,113,44,19,103,8,111,222,13,10,230,189,214,133,106,92,66,73,147,224,61,211,107,238,192,81,32,88,221,166,13,10,171,209,85,215,108,201,80,222,42,194,93,193,180,186,23,183,254,246,200,200,50,224,26,163,48,177,62,86,111,68,16,75,21,80,202,243,61,109,60,186,187,246,241,149,57,46,56,176,98,13,10,149,51,185,218,98,118,49,63,14,217,4,58,18,59,14,229,134,145,37,237,150,126,40,31,210,25,132,210,85,218,171,173,114,13,84,214,48,24,28,150,34,199,14,86,204,181,187,134,114,175,68,145,86,135,210,54,151,236,99,212,141,124,91,19,12,58,56,184,119,76,187,146,184,115,3,84,96,213,250,147,68,103,112,195,221,116,49,41,235,71,239,5,113,9,138,207,174,40,79,74,154,114,188,96,47,251,224,224,204,106,173,113,106,76,111,221,86,100,219,150,104,153,13,52,83,104,82,70,48,104,197,27,198,18,252,202,144,215,142,41,157,221,216,80,78,86,73,22,109,9,114,215,208,60,173,69,147,211,79,162,255,197,250,96,255,82,242,220,93,209,144,232,75,231,119,190,38,162,5,249,111,210,27,16,164,147,94,217,46,41,13,129,98,170,229,106,77,42,214,203,50,93,156,67,191,25,87,65,89,113,96,249,235,123,191,135,191,173,78,25,159,19,221,71,147,107,101,217,66,56,17,230,127,25,97,220,193,64,62,169,76,155,150,204,141,36,79,181,172,69,29,79,182,175,105,216,192,161,51,143,159,236,162,156,247,140,101,15,224,102,27,224,76,241,49,18,107,44,140,40,36,232,91,98,193,202,102,162,246,152,65,107,87,79,28,146,46,191,141,4,219,7,146,41,37,72,18,211,89,5,42,101,234,248,113,55,92,173,53,103,196,189,24,87,196,120,65,23,170,27,5,211,146,223,243,171,207,204,108,200,205,238,143,168,171,47,110,171,232,37,155,1,142,8,42,166,79,127,143,140,208,114,81,24,115,198,186,174,53,105,170,233,49,239,250,182,193,3,249,202,219,114,90,150,157,224,227,35,14,69,133,32,18,139,156,7,218,82,15,238,235,53,135,156,56,216,135,202,130,172,3,159,119,254,161,19,14,109,110,244,132,24,252,207,201,190,196,254,253,244,59,142,200,105,81,82,101,22,101,55,109,187,13,191,152,49,179,127,18,29,26,165,217,42,209,123,99,229,67,68,248,13,88,56,56,133,94,88,161,93,200,169,230,145,237,81,91,71,25,104,189,130,244,238,195,24,113,190,37,200,193,156,205,145,16,218,6,111,22,88,62,49,237,22,73,83,231,88,138,11,145,100,54,90,67,129,32,31,103,191,179,11,177,182,147,176,164,201,153,26,125,149,163,56,5,224,241,200,252,40,19,231,156,8,144,138,0,48,249,230,71,21,39,181,192,139,153,206,255,237,202,38,4,13,10,203,75,77,67,4,9,12,235,57,54,121,78,84,242,53,66,66,183,49,243,178,153,121,237,101,248,8,77,150,13,133,223,76,9,147,234,17,63,54,242,243,4,185,164,242,17,22,25,245,44,174,15,215,19,83,24,104,6,70,94,62,67,237,61,224,132,100,129,136,28,7,120,149,54,29,71,235,220,127,226,223,75,28,52,154,93,25,194,214,242,45,92,3,248,193,93,59,59,227,137,128,146,178,35,205,29,4,123,81,67,218,53,90,36,30,106,149,170,64,23,220,169,35,253,39,217,32,168,144,23,65,63,226,143,115,12,130,124,38,222,172,241,165,62,179,37,61,147,200,123,58,17,146,249,187,198,205,121,202,178,146,165,197,228,79,130,54,245,89,56,195,98,181,254,74,226,26,22,43,133,61,184,165,197,157,236,114,236,178,3,247,242,37,252,223,3,50,182,85,126,90,224,38,87,208,222,19,91,19,185,27,235,135,114,223,197,66,228,113,9,231,120,7,200,85,134,59,120,123,249,85,62,230,125,55,30,133,96,111,18,48,39,223,59,253,213,151,71,143,138,16,90,252,158,71,120,32,193,24,185,34,33,255,140,85,17,175,226,199,2,53,235,3,47,182,253,182,181,148,206,159,26,209,170,138,77,104,123,203,27,170,230,74,115,120,180,244,192,233,9,78,124,67,13,10,229,209,175,149,121,23,120,185,50,231,26,9,15,118,243,152,187,38,236,108,150,64,201,172,138,58,194,167,113,98,166,74,48,244,11,39,9,206,244,62,83,158,243,109,154,91,198,163,192,246,85,136,53,65,9,186,119,183,171,102,26,206,74,250,113,155,130,179,60,68,58,181,140,208,50,116,128,28,31,78,8,54,50,241,88,183,224,108,210,40,92,233,8,143,7,95,76,117,215,185,66,111,65,154,151,29,193,16,171,126,188,189,181,34,100,199,233,240,253,150,79,179,87,6,203,188,87,51,165,254,91,152,114,223,169,41,254,195,198,131,138,193,32,79,52,0,102,228,235,26,216,36,27,240,195,54,185,33,138,171,50,169,246,17,164,21,168,168,76,128,12,95,160,13,116,198,204,203,101,93,218,34,191,66,28,152,32,84,131,189,21,114,16,13,10,81,114,117,212,117,235,125,50,104,254,15,32,150,227,217,248,251,96,56,238,14,34,248,77,128,35,197,241,244,78,216,156,220,81,91,174,231,53,15,112,240,142,137,0,201,196,247,169,215,254,175,214,244,46,197,164,20,130,245,46,69,114,208,206,166,143,231,83,191,14,72,255,182,115,11,246,41,73,239,36,92,148,251,250,255,201,171,211,183,33,249,35,221,235,202,160,57,75,28,216,7,71,162,209,124,1,162,172,11,15,116,204,117,134,52,82,61,84,65,87,203,58,230,223,208,53,39,29,238,211,236,184,5,168,150,109,252,44,120,18,230,133,43,147,135,19,202,189,1,161,125,176,193,43,107,167,33,128,179,86,150,210,242,123,55,137,202,143,147,113,133,101,179,184,86,201,228,21,210,224,145,132,199,33,200,192,166,146,241,128,97,47,223,215,56,79,217,73,227,60,41,196,195,123,237,102,211,49,102,53,110,62,128,175,163,121,243,106,180,234,147,126,221,13,10,252,62,108,144,245,201,44,104,111,18,45,243,181,253,97,105,185,193,183,58,163,194,84,192,235,186,190,244,6,163,30,154,88,123,165,100,254,87,128,113,15,94,42,179,141,167,73,180,54,26,66,227,219,3,174,48,56,179,78,200,86,152,59,199,173,135,105,195,227,20,211,31,231,64,100,3,9,189,91,137,28,254,248,218,168,15,114,166,188,68,162,168,101,72,23,120,97,77,55,43,4,55,203,6,242,0,58,13,47,221,87,102,97,101,5,56,104,186,185,114,243,119,2,192,138,0,224,66,247,221,63,44,179,155,245,0,39,136,33,176,42,76,14,41,255,95,217,135,12,255,223,97,45,52,92,254,198,227,46,44,219,41,216,223,85,233,150,229,229,109,55,156,101,126,231,35,185,180,36,146,100,9,151,49,244,165,53,192,237,67,54,107,7,235,173,202,196,89,103,161,94,29,206,67,182,61,142,253,158,126,190,32,4,199,11,48,221,223,186,21,144,218,71,173,254,109,55,212,29,190,236,117,35,78,74,189,130,242,7,22,97,202,80,80,193,38,3,47,202,238,73,158,83,86,119,122,46,174,237,162,45,116,58,99,210,166,216,24,21,46,159,254,124,118,219,117,31,172,101,40,173,144,232,51,243,151,36,197,238,16,210,41,141,199,35,251,1,197,67,167,160,225,252,153,199,21,233,212,102,38,212,205,175,239,179,209,214,183,14,163,11,230,244,100,88,83,16,49,209,208,190,105,58,80,214,217,232,58,108,64,217,26,163,214,138,96,124,243,204,98,196,203,8,90,40,130,168,220,143,254,199,34,204,153,125,93,98,163,140,246,216,80,39,89,145,156,239,45,45,195,105,12,1,144,210,205,221,187,21,127,208,62,191,0,114,119,233,213,114,119,168,220,210,242,97,213,180,91,106,72,238,48,101,228,19,52,201,104,69,33,211,33,52,190,81,183,217,36,108,28,146,54,229,163,218,151,239,229,110,4,73,123,74,48,169,20,182,100,172,238,184,73,173,157,135,50,160,147,134,60,114,75,239,60,236,78,213,140,135,111,37,119,8,168,212,57,17,250,200,6,8,72,44,44,205,148,92,11,254,224,154,81,255,19,86,213,204,66,67,241,237,210,234,223,153,248,110,180,173,130,42,219,194,95,4,6,127,199,180,88,185,193,135,243,198,250,14,12,185,125,127,160,8,247,75,224,46,85,185,168,241,2,121,142,12,250,242,141,103,63,255,0,3,225,148,15,253,109,78,28,42,58,235,77,241,213,168,111,106,61,192,140,226,152,152,89,58,170,13,243,38,31,130,51,114,255,171,243,150,72,151,164,207,135,50,197,161,77,55,151,9,59,202,230,241,4,13,157,237,191,238,226,53,241,34,162,207,163,72,80,152,73,238,204,97,180,255,168,175,181,188,68,207,210,137,209,60,218,113,255,61,122,100,181,214,247,227,226,1,137,136,224,58,13,197,164,22,178,170,223,23,117,14,83,230,26,116,190,12,137,215,42,33,224,35,207,55,121,63,186,112,181,178,71,89,168,2,242,92,130,149,40,42,112,22,26,162,115,155,138,40,173,53,125,183,113,14,167,212,12,111,12,111,220,173,186,106,2,27,16,221,102,39,126,196,128,247,202,168,47,183,197,32,96,101,166,4,190,240,239,243,14,254,115,105,247,199,167,226,150,166,222,158,197,176,27,107,127,11,41,39,244,108,230,39,114,31,16,69,238,72,68,171,251,109,196,84,25,144,149,117,162,185,42,3,50,131,100,31,191,233,67,111,206,101,121,153,143,250,147,112,214,98,128,214,48,36,158,155,222,111,17,141,196,64,97,89,247,33,194,246,165,221,198,49,1,143,48,177,87,126,134,19,115,161,136,79,44,183,83,4,102,253,118,245,148,187,67,194,222,130,48,89,165,22,152,137,208,221,8,213,144,117,149,87,157,177,229,232,66,24,62,137,6,70,109,181,178,123,91,77,31,184,85,102,29,31,96,101,116,35,61,235,67,64,99,11,229,218,60,69,145,178,3,254,201,60,42,85,184,155,241,102,124,6,74,103,167,196,42,163,199,143,70,142,14,204,61,161,120,161,175,212,31,56,70,221,244,99,77,141,165,97,241,195,137,205,81,231,178,188,45,108,12,72,183,135,29,150,249,50,201,35,141,69,42,108,57,18,37,57,44,136,211,212,49,148,19,197,201,166,255,40,57,25,167,7,74,193,246,44,252,119,139,229,29,154,90,70,87,222,223,188,67,102,87,240,208,68,232,221,90,120,194,54,189,139,249,142,79,100,175,99,194,211,68,32,183,140,219,134,70,210,4,55,13,10,48,205,122,177,103,248,37,58,75,102,13,10,155,31,70,222,128,140,53,214,189,240,131,80,49,89,198,223,45,11,172,114,95,58,165,233,252,123,155,118,21,128,79,76,206,187,215,120,252,157,64,130,151,48,33,36,193,2,65,79,198,91,29,14,222,111,142,26,220,190,90,216,155,223,166,193,29,211,123,32,237,12,255,207,191,224,1,149,171,63,83,30,125,188,199,115,205,170,111,68,189,218,55,97,73,209,249,125,83,69,190,195,39,109,84,16,23,251,243,111,188,222,236,232,141,221,107,197,196,115,59,72,198,97,78,158,156,233,54,110,70,156,165,105,21,98,12,191,47,67,220,149,71,231,92,23,49,241,45,201,86,37,218,100,5,142,78,166,249,31,15,117,96,193,26,134,187,97,178,22,236,164,34,159,131,88,253,99,231,236,133,246,55,137,244,230,186,148,156,171,143,143,15,33,57,131,104,152,72,99,162,28,46,226,150,89,230,231,106,242,224,154,246,236,63,25,70,89,98,122,181,221,64,70,70,145,180,218,221,142,61,76,251,182,215,19,50,203,122,29,102,110,184,83,128,96,9,14,192,209,69,27,154,144,130,159,130,145,52,7,215,17,130,44,198,110,52,116,137,21,133,111,229,13,68,234,241,250,87,248,117,72,210,185,203,62,140,25,9,232,33,113,154,25,88,237,185,204,37,132,222,74,50,71,42,2,99,145,12,145,230,223,21,64,15,53,84,240,67,87,255,181,80,228,75,49,178,39,77,203,88,230,139,137,242,199,141,186,146,77,25,163,205,182,241,53,117,88,214,87,57,162,157,218,213,25,112,253,223,119,206,227,51,89,31,101,213,38,54,210,39,56,7,87,12,239,203,43,247,146,102,244,190,106,185,185,20,15,93,201,174,141,125,120,197,144,189,59,9,140,206,83,223,102,16,106,39,90,101,212,73,218,14,122,22,117,194,38,244,82,165,29,81,80,107,236,106,169,11,11,102,253,65,75,252,219,238,28,26,168,87,96,202,36,241,93,115,158,61,105,31,87,244,32,230,67,253,206,64,168,171,151,128,9,29,1,135,202,86,5,40,29,130,197,96,42,149,130,156,145,196,49,78,56,236,192,223,18,169,96,12,61,21,25,24,156,87,216,225,194,95,199,69,205,57,25,113,190,212,129,179,201,205,78,253,133,76,128,130,117,76,177,25,144,197,193,135,225,77,94,121,154,207,221,86,41,6,123,108,65,80,25,137,66,24,228,115,249,55,188,92,209,253,78,130,141,50,56,130,251,144,119,5,225,245,243,99,228,242,239,33,117,205,166,134,157,249,89,66,66,43,88,83,192,172,96,92,42,169,223,134,191,79,116,15,177,53,58,181,156,164,199,162,51,130,97,109,209,199,217,151,137,140,46,207,28,234,224,110,130,221,41,121,1,171,110,97,203,254,173,249,62,23,203,71,73,64,28,238,67,163,156,91,215,159,141,65,145,73,58,53,201,214,70,223,44,180,203,207,195,3,56,73,120,129,104,249,134,56,241,83,54,96,254,197,243,123,241,155,61,25,80,4,179,100,34,238,194,40,30,77,165,247,86,4,123,231,246,220,94,162,110,217,213,34,114,98,143,18,243,231,67,76,183,243,62,60,100,219,250,26,199,170,139,224,113,195,89,194,33,208,255,136,42,6,102,140,230,135,91,179,82,165,198,17,165,42,225,42,70,150,172,71,198,108,150,227,57,38,23,221,58,200,217,231,57,51,147,56,59,232,172,192,227,76,132,252,200,25,181,25,166,137,168,62,170,77,142,187,38,226,11,47,14,60,180,3,200,205,96,182,172,76,93,62,245,150,187,188,145,173,183,152,228,154,17,93,100,140,143,132,167,231,176,104,19,194,95,72,62,105,35,101,110,146,74,177,153,162,139,121,127,107,212,108,57,250,55,46,90,162,200,245,134,49,252,230,242,141,224,26,80,80,40,194,107,77,211,50,78,111,16,58,245,126,208,245,182,174,62,28,117,78,235,197,74,78,95,58,8,124,159,170,199,70,168,78,148,94,194,36,3,154,186,249,198,183,30,61,176,192,111,180,4,149,24,155,40,57,87,156,193,217,74,213,155,100,14,239,131,241,79,156,96,77,179,189,54,93,83,214,136,241,41,227,141,66,155,142,146,8,159,6,75,88,72,112,247,253,102,204,145,202,117,224,128,123,220,186,56,247,46,124,238,51,207,40,16,100,118,34,171,251,1,74,154,31,212,227,164,37,72,138,129,235,196,111,209,13,197,49,247,22,28,253,217,27,151,129,146,50,112,32,16,163,113,206,183,77,16,42,91,197,166,93,8,148,197,96,1,75,241,42,173,150,36,122,57,77,117,47,206,88,136,41,192,100,209,151,166,53,201,44,127,151,227,239,101,40,114,241,28,109,53,8,46,76,244,7,76,232,228,222,30,81,238,136,217,207,166,238,234,227,99,63,210,185,142,131,20,253,2,116,13,143,231,149,87,157,254,249,59,73,47,238,245,105,254,181,179,140,203,183,46,16,164,103,63,225,74,57,137,201,184,77,142,55,4,128,245,79,218,146,237,247,215,210,18,205,228,11,218,121,1,21,122,245,192,133,250,145,19,154,44,157,77,2,4,246,170,39,103,35,26,138,200,12,9,139,95,175,105,169,149,249,211,118,14,100,155,13,10,218,103,50,110,147,110,214,210,106,91,0,208,119,79,11,219,63,151,138,105,120,134,181,125,88,113,154,67,141,127,18,239,123,132,92,133,207,102,73,164,13,194,117,152,15,125,85,218,56,25,57,124,126,22,155,119,218,134,43,30,46,242,26,13,85,31,148,237,41,13,10,84,141,34,140,212,32,13,105,225,161,15,89,24,171,11,37,181,196,61,183,139,220,187,175,250,62,153,80,145,76,176,181,24,6,253,218,126,98,76,105,192,223,118,191,228,75,87,253,254,230,209,140,182,23,215,33,151,50,34,181,159,27,130,52,107,231,55,86,148,220,228,158,97,53,13,10,251,185,71,23,80,19,202,79,240,138,37,182,178,66,227,109,111,201,209,69,46,158,60,92,65,32,163,246,15,114,233,163,155,160,197,105,30,170,72,23,33,149,238,73,228,231,88,135,49,144,192,128,186,87,2,254,205,109,80,183,222,115,189,185,119,227,152,164,142,87,97,217,13,10,0,208,18,243,179,15,194,86,117,13,10,6,237,156,206,170,50,144,78,122,197,53,15,89,201,151,5,123,146,201,212,77,131,21,112,169,141,207,7,46,201,180,180,111,228,189,209,190,203,79,8,88,224,217,182,64,214,209,92,242,240,47,238,91,186,122,95,157,214,241,255,150,167,45,136,231,27,78,104,245,131,112,111,244,73,130,224,115,91,76,158,81,89,34,70,211,138,115,91,248,11,9,192,236,95,67,220,146,179,155,5,177,72,192,90,50,226,29,236,187,209,103,253,82,225,251,9,172,97,24,31,102,51,30,253,169,250,162,118,225,68,172,79,110,69,118,13,241,45,105,69,175,181,25,26,81,114,51,0,234,152,115,90,237,136,117,50,204,60,111,11,97,196,174,172,218,2,193,147,17,187,156,244,132,8,176,46,137,107,138,86,44,175,26,199,180,173,60,61,212,60,32,30,174,149,172,243,178,128,74,204,6,109,66,46,160,6,208,91,186,77,154,147,221,53,167,111,31,41,112,207,47,252,138,145,235,169,254,142,187,40,229,78,59,188,28,162,31,237,4,44,8,88,182,218,36,185,7,227,198,183,140,44,242,179,175,164,72,137,222,18,177,165,8,70,151,198,178,82,16,131,170,73,152,171,20,65,234,95,222,227,189,114,3,25,213,131,149,75,123,220,209,212,180,184,44,154,36,181,253,94,197,106,120,48,111,129,64,221,218,46,191,217,7,227,31,106,98,35,228,31,213,77,42,179,220,135,162,204,34,3,214,73,217,154,115,82,75,95,187,186,177,118,232,108,63,165,247,235,208,167,222,218,89,51,28,127,114,84,197,224,188,3,221,4,155,78,198,130,163,213,112,72,158,65,106,100,6,55,86,88,193,55,81,221,17,131,121,39,15,57,242,192,220,11,94,113,166,41,241,28,28,181,240,124,87,218,229,11,105,147,164,149,167,64,65,37,161,115,246,19,164,74,54,181,147,111,86,90,44,13,10,252,185,198,21,153,224,49,4,227,121,140,227,4,200,9,169,159,225,112,1,213,76,79,172,249,100,53,194,147,3,90,75,207,175,145,93,100,154,200,63,184,48,17,85,160,91,122,41,18,13,10,206,125,240,70,198,73,161,43,183,174,26,85,126,24,28,142,41,18,35,31,209,42,128,209,198,115,222,171,246,108,255,243,230,0,9,248,4,146,128,58,77,52,34,167,116,180,217,174,100,64,127,195,74,60,94,188,13,162,120,157,168,118,194,252,195,171,213,37,186,219,201,77,48,144,233,188,178,153,217,243,232,0,171,161,89,44,90,109,174,142,89,216,232,83,1,183,77,111,121,26,106,84,43,222,65,137,124,15,192,174,151,39,245,85,250,102,106,26,101,97,195,5,62,204,65,205,44,109,114,238,52,17,159,21,158,156,234,233,149,51,101,5,176,187,35,85,146,122,222,51,23,57,104,125,28,169,251,28,19,27,241,238,244,167,35,13,10,161,231,139,117,50,248,32,219,76,112,218,132,24,188,115,188,216,22,64,28,96,151,94,97,183,248,144,191,232,176,112,6,108,41,178,33,73,42,9,63,245,136,103,49,0,72,240,76,11,234,178,13,27,73,206,123,64,20,67,156,138,159,246,186,53,207,30,29,64,19,189,172,181,153,171,214,220,99,179,209,37,192,16,128,23,107,34,123,70,166,72,161,81,74,188,196,166,203,212,8,171,138,38,221,46,9,33,149,76,123,127,242,185,88,92,248,97,62,49,175,101,69,91,191,252,122,227,58,234,131,92,107,67,202,217,106,84,196,46,8,108,189,54,83,3,86,73,189,12,192,77,9,251,109,21,48,29,53,89,150,82,232,197,113,112,149,56,227,178,225,234,15,112,131,166,35,56,223,166,115,141,125,141,254,61,145,113,189,46,77,163,162,179,54,172,193,99,65,84,254,184,97,43,69,17,176,42,144,149,98,117,50,246,163,200,203,139,99,210,129,46,17,232,62,193,243,238,124,1,192,242,139,71,100,26,67,191,236,194,195,145,136,205,75,52,234,58,233,34,13,10,69,49,171,58,156,232,195,100,146,233,58,255,39,187,218,134,31,7,7,166,180,33,156,105,227,62,195,88,112,9,242,122,213,178,172,227,118,152,43,29,50,25,169,23,108,22,122,83,77,14,70,111,31,181,239,201,139,70,230,27,221,3,64,164,156,65,183,174,195,6,158,156,249,201,22,90,34,101,197,242,130,25,216,176,188,17,114,204,73,220,31,36,124,142,188,75,216,52,45,133,229,218,208,139,37,223,15,173,254,211,38,84,28,189,13,10,165,223,221,194,165,85,225,233,132,145,240,139,0,127,152,1,201,87,61,198,36,200,4,159,16,249,203,48,109,133,126,209,13,10,240,174,227,179,92,109,36,59,235,41,97,190,127,213,0,107,143,220,160,223,60,92,215,39,9,32,171,17,30,151,95,57,102,13,10,22,19,106,197,142,229,152,209,68,237,81,204,4,2,62,57,6,62,96,217,5,225,60,138,152,130,79,5,229,91,120,130,214,163,183,36,217,113,172,103,39,47,146,83,119,202,81,161,66,220,230,96,171,126,31,59,43,20,23,69,161,253,132,105,130,25,253,153,166,157,194,252,79,50,26,242,96,234,255,95,76,227,11,62,53,74,143,145,223,68,35,9,147,124,130,242,81,165,7,150,61,31,120,143,98,252,36,235,203,65,190,113,172,109,102,186,9,113,67,209,71,204,211,239,125,218,70,38,91,233,73,99,221,30,218,156,67,223,65,71,78,87,242,130,161,222,32,73,111,226,185,55,75,15,2,224,80,61,175,213,163,198,110,244,244,124,238,214,195,44,183,144,118,125,183,212,223,123,14,63,89,235,181,121,24,142,186,136,141,106,73,134,81,152,205,92,230,40,50,158,37,226,192,39,148,90,44,44,28,150,253,92,216,202,2,174,54,58,7,221,135,244,20,177,221,127,22,218,239,120,244,79,101,219,166,221,33,210,210,97,242,4,230,86,246,89,198,148,140,220,4,155,39,186,155,203,151,184,200,222,195,184,198,102,33,117,74,197,23,122,17,196,176,102,159,201,66,116,227,248,23,110,50,116,169,185,173,139,221,118,152,120,255,94,110,245,146,213,35,7,107,120,238,46,172,16,52,40,18,205,49,35,160,174,230,243,48,38,153,235,66,40,161,13,10,98,227,190,248,169,66,184,164,184,192,118,226,206,70,84,40,93,34,115,68,159,231,210,186,211,65,153,14,36,174,141,235,81,253,78,246,67,190,158,192,125,103,132,5,93,197,237,101,67,76,220,143,169,192,184,116,107,175,134,62,164,146,240,157,133,108,220,239,132,204,71,226,197,142,125,141,29,245,188,150,233,1,12,214,195,106,194,44,55,196,194,95,255,245,144,92,246,2,233,124,168,123,186,200,20,183,113,140,52,76,187,31,87,153,203,95,65,146,33,73,75,77,162,227,227,250,73,22,188,132,27,88,107,64,16,45,177,182,44,117,94,226,236,13,10,226,100,247,105,236,151,66,212,138,140,132,128,217,19,127,229,255,6,247,51,104,8,166,48,138,170,156,163,9,35,42,92,199,111,55,67,17,151,23,76,138,224,171,52,121,236,196,22,244,84,17,39,195,59,16,140,25,89,104,240,69,89,176,173,118,74,127,189,145,157,128,215,160,197,125,217,200,46,72,93,41,217,234,112,35,72,173,71,35,65,198,49,156,80,160,107,255,165,214,73,71,3,219,57,195,6,69,154,250,57,109,54,111,5,202,174,161,169,229,22,241,19,232,171,121,195,229,243,205,138,92,234,131,63,180,110,56,178,61,183,95,79,204,142,55,126,2,152,197,147,13,174,74,150,161,158,241,117,33,78,179,146,170,210,33,214,168,32,229,13,101,166,150,177,55,31,74,222,120,202,185,57,86,222,41,159,225,101,218,172,137,196,86,243,216,73,88,209,77,19,113,106,229,200,65,234,6,183,110,188,97,205,212,203,223,215,51,44,149,70,83,45,132,226,240,67,121,0,81,11,99,219,42,89,71,255,82,185,231,250,217,224,249,64,227,156,211,212,219,15,182,55,76,163,247,0,241,69,125,229,119,65,229,244,184,82,243,78,72,98,43,109,83,94,113,128,123,69,168,241,248,167,106,54,123,178,234,131,44,172,166,47,162,254,189,168,216,190,98,197,186,215,110,169,120,219,109,93,8,90,81,30,234,110,141,37,179,142,63,102,227,61,144,160,160,118,240,188,116,196,176,66,171,168,42,20,6,122,225,70,52,0,108,248,117,78,179,198,39,39,180,125,208,240,168,118,133,21,228,248,243,52,0,234,104,169,169,244,202,102,248,57,70,219,175,58,229,111,229,117,1,2,70,167,78,56,52,206,150,32,96,57,49,84,215,77,168,238,235,147,188,223,32,173,30,149,244,125,210,113,165,239,5,118,199,221,210,235,186,222,108,84,234,147,109,139,49,230,159,26,81,167,154,115,214,174,36,193,81,17,174,232,96,231,237,185,54,46,83,178,163,135,102,66,130,142,170,85,199,234,142,159,101,110,67,219,224,37,54,228,118,186,123,151,207,170,150,175,117,176,135,181,125,227,91,193,203,251,4,206,23,240,40,68,213,160,111,52,222,35,53,98,242,110,165,133,79,45,164,179,90,189,39,154,86,179,91,25,220,50,235,156,123,78,218,159,62,76,192,119,54,6,165,172,212,184,243,41,245,95,124,195,34,41,1,75,231,213,231,83,250,131,90,46,183,247,204,124,201,191,163,220,45,138,155,211,33,127,212,30,48,28,3,154,187,48,84,66,42,110,56,126,146,91,135,32,36,184,59,128,230,227,44,153,197,56,11,34,204,39,147,146,18,219,210,201,107,141,78,46,4,229,182,78,211,22,216,225,175,115,171,121,100,91,98,241,93,57,30,242,69,4,177,119,48,248,1,195,111,44,7,105,206,94,135,6,17,51,249,32,23,237,218,28,35,247,80,38,58,146,200,194,136,138,233,55,148,67,76,99,81,46,11,37,116,217,173,233,234,246,0,141,75,174,109,30,227,168,39,117,139,34,15,219,73,20,242,21,72,209,122,197,232,116,201,113,35,124,127,0,241,243,195,46,91,110,1,160,19,53,72,138,195,187,72,16,220,208,97,65,145,66,127,191,6,172,112,227,38,62,66,101,20,26,20,105,5,14,47,229,29,42,150,9,150,66,27,133,67,18,208,100,165,124,62,211,152,76,249,103,237,39,169,4,145,33,247,65,47,42,145,123,151,169,32,42,5,5,183,233,55,137,138,46,220,154,149,249,54,5,188,231,181,128,11,88,11,130,122,178,97,143,116,241,196,99,203,123,42,7,65,174,244,58,206,191,188,200,11,82,248,148,128,108,157,6,162,160,234,139,171,236,223,17,252,31,254,224,90,99,51,93,225,225,87,171,200,81,36,102,194,203,185,247,35,102,192,76,175,11,53,173,138,124,248,245,228,79,253,221,185,98,98,199,239,203,54,9,100,223,137,66,106,77,235,135,238,152,238,12,77,130,49,160,240,175,154,111,145,17,218,124,43,84,163,211,158,200,123,174,77,230,32,74,174,17,253,196,130,181,78,165,35,149,222,120,6,180,162,73,99,132,23,152,169,164,121,124,198,116,122,39,133,235,43,91,247,126,55,20,59,46,88,34,241,40,65,21,83,85,143,96,37,242,215,235,13,216,104,78,18,21,76,88,6,30,24,201,168,102,9,199,92,42,33,184,30,190,103,77,13,10,170,255,81,212,128,205,84,123,22,58,33,167,237,228,103,178,255,2,138,135,214,75,139,208,153,185,39,152,31,47,167,111,220,115,78,83,179,9,101,62,214,38,60,209,120,46,88,97,11,231,155,234,183,203,187,126,219,138,171,141,233,141,115,66,170,255,64,121,90,78,66,72,66,89,19,141,60,54,6,174,246,74,83,220,102,69,94,70,37,62,127,18,184,16,172,55,236,99,222,41,93,6,18,94,130,250,95,245,33,116,126,116,150,197,104,106,26,170,7,144,230,90,238,5,110,66,133,115,84,30,63,125,75,125,195,113,131,103,197,138,83,120,55,215,131,206,54,40,12,138,179,210,206,195,217,32,149,72,207,82,207,48,69,137,204,57,6,200,58,192,116,69,71,159,128,132,83,188,28,129,84,208,199,9,79,69,14,255,32,29,183,89,62,46,250,170,58,200,217,198,84,18,159,173,60,162,249,196,146,200,167,110,113,234,70,62,177,46,77,60,15,51,116,54,219,88,248,180,148,35,204,158,250,231,22,85,139,144,165,63,219,60,32,99,253,196,236,149,78,153,222,36,118,160,100,137,154,45,106,22,239,64,37,133,243,22,127,147,40,71,119,132,245,215,139,186,66,141,34,32,220,55,91,240,197,103,190,174,123,247,210,124,221,201,202,115,77,95,245,118,70,6,96,12,250,3,145,92,247,169,55,190,177,72,46,171,45,166,95,145,55,74,43,114,119,110,157,35,60,35,253,39,59,251,87,77,77,25,229,65,8,254,77,103,31,197,26,236,99,228,61,251,59,218,163,56,163,224,193,147,119,177,26,85,108,168,110,208,225,129,70,29,201,104,199,227,140,201,165,85,28,251,240,142,16,25,221,195,137,52,149,208,199,54,55,19,31,126,124,203,245,155,231,205,90,100,246,7,161,140,209,214,62,92,54,14,11,78,194,141,26,188,146,7,236,36,214,85,153,71,117,4,83,185,103,43,222,131,240,35,42,171,115,217,109,3,43,211,90,107,29,195,125,56,221,226,177,189,136,77,218,149,9,61,6,75,14,105,28,138,6,19,191,66,70,47,82,77,203,169,170,223,153,176,59,120,184,185,232,62,55,68,61,201,44,149,113,116,49,40,209,167,221,157,117,185,167,198,115,131,202,227,104,162,206,194,125,157,205,53,4,226,55,88,32,76,7,154,137,68,171,176,85,3,137,118,96,44,120,212,246,238,162,58,85,183,167,193,175,74,187,24,73,211,30,121,102,45,167,38,145,74,187,152,125,35,78,80,211,63,27,119,85,123,200,114,97,238,152,64,168,20,223,197,196,197,224,229,137,90,74,20,46,140,33,222,251,21,249,159,189,164,173,182,149,103,149,128,150,24,168,74,49,56,52,233,227,73,211,58,89,62,231,218,116,98,40,142,218,96,132,12,84,156,106,246,154,210,254,117,65,57,23,213,53,193,135,122,130,144,121,180,192,87,62,13,116,23,181,67,191,13,10,87,36,175,217,152,82,127,6,148,103,220,251,239,1,98,108,184,180,89,238,123,45,154,67,149,79,220,235,164,159,160,219,237,188,236,85,153,198,145,55,3,254,78,179,214,122,8,37,0,158,29,239,58,90,222,166,21,31,27,64,216,223,130,88,244,50,123,119,163,31,17,7,156,11,142,146,108,175,51,70,8,55,14,232,160,139,250,174,19,119,105,236,170,24,33,111,120,182,129,160,223,116,27,178,128,94,51,8,243,225,107,177,210,255,86,209,134,148,166,75,49,2,157,74,109,54,70,151,41,251,236,91,11,190,183,0,144,231,247,13,10,210,231,148,126,79,97,231,236,103,207,212,188,233,182,154,23,89,86,114,49,125,135,140,29,11,44,158,29,186,39,137,1,227,62,22,213,159,96,176,109,184,66,222,97,106,146,192,27,199,129,101,83,135,2,205,244,153,7,33,188,220,206,171,237,66,119,43,51,42,171,206,8,36,254,1,55,107,166,100,42,255,137,231,162,53,8,24,250,29,94,97,225,30,88,115,34,118,159,237,228,66,214,248,24,238,68,115,130,144,168,252,220,44,187,91,77,243,15,219,243,182,179,152,186,19,212,237,138,197,52,101,210,126,64,129,206,95,133,66,58,229,113,196,27,210,234,7,138,125,84,182,182,112,243,245,239,218,124,160,71,104,208,156,192,214,36,109,21,72,207,55,111,71,243,234,156,142,196,40,22,129,79,161,97,71,88,154,45,61,173,125,77,172,184,137,94,2,92,214,11,43,2,253,104,98,129,18,141,117,220,22,168,123,78,8,202,229,158,131,169,180,86,26,176,144,180,167,208,226,181,49,213,251,230,40,209,153,29,231,113,122,87,137,66,194,38,120,153,114,110,101,198,18,17,152,98,52,150,81,24,78,160,26,85,24,3,208,54,128,32,240,123,1,207,187,193,38,193,66,226,115,142,112,193,247,136,247,242,27,14,139,27,74,170,106,207,92,159,13,10,55,194,138,234,210,251,94,252,25,188,205,154,41,116,122,201,8,0,215,86,115,67,255,63,211,17,145,94,148,13,10,113,57,141,180,99,86,32,11,172,216,201,158,120,168,219,81,230,64,114,86,160,19,215,140,182,209,3,205,16,202,180,238,207,125,236,0,253,120,35,3,129,167,35,29,144,148,255,177,147,21,30,63,170,193,241,17,162,57,188,187,188,9,199,129,64,24,60,63,235,208,69,76,76,36,97,49,112,100,21,33,154,220,147,102,238,212,74,64,69,225,83,108,90,98,207,70,155,98,93,196,70,70,99,158,233,139,31,91,182,65,149,123,14,103,36,189,249,12,130,121,32,177,246,128,97,114,57,63,192,23,3,163,54,232,101,223,225,145,17,74,249,236,42,60,160,208,4,227,159,13,136,197,51,245,156,17,135,101,1,221,59,135,32,93,15,3,7,153,135,220,1,250,125,123,82,231,85,25,6,189,193,206,144,50,215,191,28,82,67,248,77,196,209,166,242,150,153,170,73,124,249,244,9,223,243,63,98,80,130,180,167,136,209,245,82,132,171,63,154,205,251,198,108,97,82,156,82,200,84,93,139,51,146,223,229,6,228,190,234,113,244,88,8,53,209,144,31,222,50,112,206,160,116,115,105,1,23,124,208,25,201,37,168,121,128,191,35,103,13,10,135,107,255,185,68,115,57,27,95,89,155,246,241,77,178,3,192,105,78,3,16,223,45,100,241,127,104,248,1,69,79,121,144,197,115,215,67,121,103,17,192,161,114,144,142,20,131,221,215,148,19,210,187,182,144,87,4,207,240,55,208,129,73,179,71,42,42,90,117,111,6,115,91,200,122,89,83,103,203,145,186,158,151,208,242,117,33,0,72,215,148,17,161,158,12,92,200,92,41,73,180,139,14,111,9,172,35,54,128,122,90,35,55,167,41,132,210,78,93,104,252,13,242,232,9,237,124,205,23,223,6,35,39,177,236,196,115,104,166,58,110,14,60,232,152,251,248,149,138,252,176,67,62,138,57,94,15,247,104,133,249,223,74,88,137,57,251,64,54,36,80,190,102,41,62,93,141,77,33,141,12,13,16,17,225,245,105,164,192,14,232,31,25,158,89,85,245,175,248,12,29,168,56,143,212,7,240,62,77,32,135,54,233,63,43,101,26,63,215,37,145,158,43,96,58,3,233,23,0,207,102,190,75,189,70,232,8,26,92,95,20,112,250,19,121,224,152,2,191,75,228,165,123,219,57,240,47,104,200,19,207,29,61,105,251,121,133,66,211,84,8,92,59,177,54,94,24,70,7,220,26,96,193,211,66,201,67,34,238,143,150,252,207,146,133,87,111,79,71,206,17,161,120,106,44,158,129,123,144,235,67,223,88,102,56,181,196,159,86,65,233,254,242,66,50,66,125,91,15,66,61,203,151,215,118,17,205,232,68,182,14,137,70,62,226,19,92,45,52,207,175,29,168,11,193,166,203,244,110,91,138,223,124,81,46,227,233,0,148,169,45,86,77,173,191,7,168,51,35,172,242,5,11,177,153,79,57,21,4,161,13,103,180,179,45,180,171,216,206,247,13,10,185,209,188,148,145,109,94,242,169,151,227,117,95,206,37,126,133,13,10,240,144,26,216,253,137,183,219,56,21,209,101,82,194,51,59,196,161,167,50,97,149,95,60,132,44,223,159,141,233,200,191,75,171,47,228,242,182,235,101,11,184,140,3,146,255,253,157,51,167,123,225,187,161,30,219,107,206,51,106,253,97,74,152,111,83,157,74,185,9,121,23,165,152,172,220,52,30,203,219,47,173,116,72,238,211,191,180,75,240,63,24,212,87,13,93,187,152,153,251,61,241,139,55,92,128,37,131,220,234,144,172,56,62,68,135,131,91,219,125,170,147,112,206,211,253,226,167,2,186,103,67,151,99,248,27,208,244,154,34,129,25,21,196,0,159,149,135,95,52,98,43,177,219,194,84,65,158,30,54,198,54,188,50,26,60,31,118,93,222,116,41,222,161,80,11,114,87,244,144,181,60,26,101,191,85,217,88,208,44,6,230,223,139,231,46,157,224,116,123,184,19,133,127,136,132,245,56,24,67,18,183,160,196,73,187,149,14,44,119,144,255,75,24,182,121,1,79,3,3,55,240,173,197,234,221,18,247,104,139,2,144,156,209,1,49,183,240,75,136,139,107,64,145,111,65,109,249,37,59,67,8,237,239,217,176,47,26,236,142,160,32,178,41,18,94,224,95,33,3,168,79,17,137,96,7,93,241,180,27,218,1,215,119,134,28,199,254,180,80,40,85,64,232,13,10,252,202,248,224,189,253,218,179,30,196,78,93,37,195,131,162,107,230,46,29,65,41,225,99,217,141,44,150,145,133,161,226,31,218,64,246,29,213,156,222,191,86,161,165,96,28,231,40,24,154,250,98,204,243,239,178,142,148,164,86,106,31,246,84,169,199,195,75,124,52,215,198,49,214,107,170,72,235,229,26,70,252,201,99,16,211,25,211,234,27,182,155,20,208,5,175,115,143,177,226,7,190,63,249,181,109,62,8,7,232,199,188,78,78,41,114,48,130,56,72,250,171,229,80,22,99,78,87,81,40,89,184,76,71,96,217,224,157,32,153,248,98,113,24,239,77,197,241,36,253,247,65,205,191,55,44,198,64,207,169,28,247,191,6,143,45,126,127,22,213,124,49,100,118,59,176,217,157,245,20,112,51,159,2,184,147,63,39,240,246,79,246,130,172,142,222,195,243,176,67,81,4,83,96,83,172,197,192,255,98,6,31,140,158,235,113,61,188,181,181,223,4,217,79,153,243,20,80,29,254,108,67,20,70,8,57,248,148,204,92,191,135,110,78,223,105,53,179,178,226,187,87,16,37,241,81,35,213,138,11,43,77,93,60,38,161,40,227,174,91,103,204,221,136,76,80,122,90,55,253,111,216,246,117,159,157,146,122,253,138,130,176,170,120,73,140,224,153,248,231,11,177,176,136,189,143,233,11,236,112,79,142,132,232,225,86,233,96,190,60,108,188,161,191,51,246,161,187,193,173,69,204,229,207,223,170,93,86,236,53,244,32,181,145,198,87,198,59,88,81,169,149,178,103,191,86,9,52,98,168,138,24,17,6,211,197,209,34,182,132,78,135,2,184,12,127,155,151,203,133,131,161,117,60,38,134,135,127,85,65,49,201,190,36,231,73,85,144,81,19,35,78,248,61,220,242,156,36,111,247,0,68,22,183,248,94,154,145,182,5,207,174,54,145,112,40,92,97,54,51,88,159,114,74,43,184,42,128,95,62,213,179,16,161,144,86,202,249,127,98,214,32,240,48,105,246,9,19,38,0,134,61,100,199,38,201,131,179,55,255,9,71,143,143,246,57,137,142,11,61,202,248,77,12,111,226,155,218,171,252,177,182,53,100,118,155,236,246,213,221,146,162,136,3,76,5,45,180,99,149,45,37,225,83,156,219,38,100,107,140,92,175,68,92,25,144,211,134,200,87,4,247,97,221,238,211,17,124,42,163,112,45,66,195,173,207,155,194,175,177,75,32,197,32,27,52,234,84,159,123,133,139,85,173,77,96,133,237,179,30,101,46,230,41,28,242,254,235,50,4,213,227,166,110,49,121,146,100,188,156,86,95,5,110,14,47,38,178,55,100,2,26,51,250,129,52,124,58,231,145,174,141,53,174,196,29,205,137,36,89,54,53,226,141,170,90,3,122,196,132,107,0,206,88,120,227,78,236,254,236,137,165,73,170,77,3,179,192,3,76,84,100,96,1,34,100,37,251,27,115,187,33,235,131,42,42,226,95,212,249,241,163,103,37,243,24,245,46,22,229,183,129,49,157,143,175,109,87,176,80,156,165,92,64,250,248,197,152,82,82,56,3,185,135,33,229,239,50,96,133,1,242,217,166,79,146,184,160,205,47,18,248,133,182,53,28,183,130,219,197,153,238,214,22,212,86,237,16,16,6,152,28,123,13,10,250,76,131,185,103,174,201,108,147,248,165,228,237,62,107,189,144,97,163,193,2,49,194,209,229,103,145,127,98,101,106,94,163,69,120,87,124,206,209,140,213,238,31,160,179,247,221,21,178,157,193,228,20,113,193,113,57,97,211,201,182,100,169,4,184,138,160,135,102,2,150,36,12,251,237,21,119,176,205,233,164,238,107,122,115,115,175,168,44,62,6,178,221,111,255,239,255,146,108,101,50,93,40,151,64,241,153,110,58,33,66,71,204,40,74,84,90,198,195,211,143,98,131,51,172,15,253,25,173,82,210,52,140,168,56,179,100,66,214,155,41,107,128,230,0,186,230,50,227,240,88,219,67,228,17,7,113,148,76,172,169,144,102,221,204,125,184,203,49,191,27,172,71,48,134,234,15,235,104,14,73,221,235,150,13,13,10,238,5,77,178,173,199,186,200,108,170,170,192,143,140,144,134,45,225,248,113,5,193,35,247,87,58,254,105,51,173,243,143,48,26,245,15,210,31,181,220,114,39,41,104,229,203,14,124,186,212,92,216,68,155,215,173,26,156,181,238,128,169,76,65,173,56,158,103,152,213,83,167,65,166,41,243,115,21,219,146,226,73,155,71,57,95,54,66,146,39,226,116,217,122,52,133,61,44,207,22,211,124,173,162,11,209,30,126,252,24,28,160,4,46,34,191,4,28,213,72,165,14,89,124,2,32,137,20,213,115,175,133,72,45,246,217,193,100,187,72,229,93,171,253,179,139,213,69,30,243,5,225,202,211,34,175,168,20,68,136,107,74,63,148,124,177,81,65,154,185,2,48,38,195,189,239,16,84,111,154,190,86,112,14,74,196,103,232,86,255,31,161,104,33,13,88,92,87,123,237,39,58,203,7,107,67,13,10,226,75,57,231,59,109,171,26,4,157,253,161,146,246,198,52,97,1,81,180,20,172,72,30,131,144,87,111,189,14,63,27,226,178,175,154,223,115,13,10,24,97,212,108,224,58,41,137,118,23,172,246,85,255,73,76,120,55,251,133,177,185,52,109,116,199,86,161,171,206,205,71,102,49,80,18,17,235,172,101,137,200,21,73,65,27,243,101,87,91,236,127,32,158,103,15,239,1,192,8,13,10,189,43,133,44,75,207,164,43,12,74,185,15,223,153,227,222,25,86,35,19,232,170,214,151,190,37,188,162,186,158,134,13,156,151,2,16,142,128,221,7,1,164,136,102,63,175,139,33,80,215,104,56,31,172,243,152,135,60,217,180,108,217,60,155,234,45,87,108,171,221,145,191,14,60,248,6,54,155,212,195,233,223,224,97,112,135,235,3,61,32,100,128,97,16,160,86,177,81,193,95,137,91,108,154,198,24,63,23,218,201,65,241,6,14,109,18,118,160,206,212,209,126,132,75,198,162,88,115,196,255,131,241,181,165,91,211,235,246,229,101,154,250,8,35,112,11,97,49,185,155,154,146,175,49,230,128,78,14,93,136,82,74,84,101,100,103,15,162,122,107,211,192,253,182,80,188,119,225,214,135,210,233,177,29,119,165,109,4,65,64,160,227,140,154,180,105,246,169,89,125,47,217,113,133,200,98,107,236,17,131,241,100,17,193,26,25,54,221,185,79,14,184,110,160,52,44,72,217,115,143,213,209,220,251,155,36,81,219,68,188,99,197,229,12,29,95,103,240,93,95,104,105,15,80,95,31,208,154,38,5,179,37,184,64,200,254,151,225,202,245,66,134,143,101,187,236,190,199,23,29,104,154,15,143,173,69,124,96,95,165,177,68,41,153,103,1,100,142,161,111,15,89,203,40,188,209,162,192,119,211,197,199,38,123,239,225,244,99,55,253,35,75,200,43,131,25,13,10,107,87,203,247,65,117,174,240,211,144,173,156,48,167,159,50,135,249,255,103,19,17,63,67,165,182,13,159,33,235,236,46,61,121,187,201,74,208,91,87,98,19,52,157,226,56,223,147,81,253,72,246,105,21,122,164,83,193,6,44,143,73,162,109,207,170,160,92,247,26,105,129,171,185,57,148,2,195,50,120,253,34,74,15,167,111,62,9,28,80,134,149,204,122,252,13,246,148,154,67,100,30,44,145,172,206,12,44,102,252,181,56,23,62,209,195,181,23,208,124,49,109,216,206,56,164,238,228,129,41,213,122,27,152,169,17,15,60,100,16,94,134,105,127,5,81,238,60,159,110,109,78,204,32,240,234,254,154,216,138,36,144,145,175,23,249,128,250,207,55,214,77,142,151,2,106,188,77,35,35,56,239,252,200,246,39,63,247,236,233,62,19,237,17,112,53,123,190,173,251,208,248,228,211,226,204,250,204,32,58,247,181,75,165,191,185,219,48,84,163,159,214,129,145,61,216,217,4,250,68,51,182,37,105,188,8,53,99,253,25,157,142,41,243,234,22,217,13,10,216,122,246,228,75,75,24,5,210,221,194,84,39,215,86,243,141,42,191,121,205,207,51,31,55,97,38,192,185,39,70,232,38,127,167,139,87,150,93,11,35,125,228,86,232,75,143,50,20,78,216,93,245,235,11,101,156,35,165,66,213,63,35,142,50,192,30,202,93,253,219,5,66,239,69,254,100,45,141,252,17,141,198,136,121,170,72,161,212,197,183,100,88,58,153,214,161,255,219,14,125,245,105,231,203,29,35,241,241,231,147,229,97,136,45,231,52,218,119,151,177,45,5,127,87,39,107,109,248,89,209,233,34,215,242,106,56,28,149,229,4,231,139,202,173,84,110,198,76,234,150,137,43,239,135,241,30,4,179,37,35,118,110,214,192,251,23,156,136,117,184,32,20,156,248,39,181,136,238,218,203,75,186,239,227,96,49,137,214,59,165,79,176,50,207,164,46,82,52,205,209,218,13,124,194,106,208,147,229,9,115,193,216,60,26,148,115,221,246,37,239,120,94,133,157,174,206,213,150,16,178,193,234,145,128,186,165,76,143,13,23,140,163,236,57,99,94,216,157,204,197,65,225,199,247,30,157,195,67,203,254,162,139,160,165,224,110,62,120,227,172,163,211,185,115,29,117,98,243,36,27,53,108,233,177,164,250,159,79,106,2,151,222,210,117,117,187,215,13,211,83,169,155,212,42,204,107,158,15,226,102,251,26,69,148,12,149,247,187,94,68,16,89,164,96,43,221,46,190,50,163,54,64,125,176,110,133,3,236,58,249,128,146,49,72,102,50,0,100,190,54,65,78,242,252,110,254,253,173,31,55,151,149,222,92,110,161,131,169,182,208,15,175,99,44,40,194,19,234,199,90,80,182,26,16,0,19,170,97,67,188,214,111,129,219,222,25,100,203,22,235,13,80,202,175,124,245,57,149,76,231,62,27,85,182,48,217,182,241,34,206,151,130,161,93,176,6,24,123,242,4,199,146,32,244,71,116,139,63,225,74,76,94,111,147,121,101,94,177,67,123,242,134,228,125,140,137,152,202,65,165,24,181,248,208,101,207,93,247,132,110,220,238,133,226,46,150,14,132,83,156,162,68,190,179,222,246,71,212,121,164,212,13,132,200,173,190,164,49,164,187,84,107,192,254,11,251,83,202,116,97,91,224,124,44,135,173,103,22,12,161,154,180,160,108,14,3,186,201,187,240,98,132,154,98,224,57,130,176,28,231,41,236,133,72,125,47,34,44,223,133,150,143,203,79,31,135,246,177,38,63,169,160,79,34,160,101,0,250,133,82,218,51,46,247,153,24,16,165,178,154,231,141,28,75,83,96,123,12,84,9,226,204,173,167,49,55,42,215,243,110,240,147,108,219,39,44,140,200,246,226,153,25,147,95,95,255,87,217,46,120,250,142,178,208,77,67,112,249,237,67,192,207,238,225,184,134,69,166,245,106,196,248,250,221,179,64,227,160,59,62,80,185,144,87,78,235,85,8,231,136,76,60,39,180,5,142,38,62,108,152,158,198,163,72,148,148,135,190,79,74,136,232,88,89,0,239,64,148,192,219,109,39,76,192,85,170,148,100,120,183,137,115,224,100,140,117,250,11,70,116,9,70,20,207,216,5,175,188,251,179,204,24,6,81,173,21,173,73,6,59,79,29,111,80,177,83,253,72,97,178,199,66,245,206,196,238,123,23,84,205,223,5,211,251,48,84,223,244,111,32,203,181,175,44,93,30,16,238,144,125,246,120,127,100,28,183,123,200,232,46,179,254,102,93,220,196,142,200,43,208,27,222,90,189,32,30,169,51,99,170,45,242,68,77,31,24,174,59,230,84,18,163,175,100,162,30,103,184,209,70,223,177,97,124,249,202,200,63,239,121,97,87,18,63,235,230,215,28,207,224,150,86,180,200,122,187,226,49,21,1,120,24,250,6,95,42,107,69,153,241,76,239,34,144,231,27,155,229,28,185,235,208,194,240,94,252,72,129,172,19,41,46,106,74,247,110,209,76,180,234,111,220,240,115,63,76,37,158,245,45,114,188,17,201,163,228,194,144,223,39,16,152,63,106,255,172,175,0,87,239,86,165,73,8,27,47,116,202,7,223,154,4,216,133,91,28,170,235,21,149,177,9,76,99,201,45,24,72,43,26,179,35,221,41,35,102,99,108,106,219,156,8,201,203,32,162,153,237,241,207,38,154,97,174,196,82,219,61,212,160,87,174,188,7,25,20,178,140,228,119,29,72,57,23,117,124,83,190,210,135,234,218,181,168,179,36,174,233,129,238,248,140,24,193,138,152,232,217,134,72,176,144,122,98,80,139,30,25,234,250,76,103,201,41,222,178,204,25,238,239,61,236,63,123,145,111,193,107,48,109,181,57,145,31,118,166,232,120,113,223,164,145,132,47,120,62,40,117,133,131,254,36,117,146,2,46,86,21,157,215,110,160,110,170,173,185,101,190,131,157,127,146,99,109,242,152,56,207,50,253,58,252,84,89,93,203,42,109,4,167,17,88,244,110,204,218,219,206,242,219,139,167,12,148,168,208,254,159,126,171,224,38,42,244,149,137,158,14,239,152,105,64,168,65,78,94,227,56,43,190,209,69,77,11,104,2,177,199,219,242,104,235,209,130,16,130,197,216,199,103,12,49,186,156,29,151,37,33,86,152,68,1,43,171,22,158,187,117,245,5,237,38,83,215,178,185,245,37,141,78,78,50,190,185,213,183,87,146,224,145,206,205,138,193,17,151,50,131,66,219,23,175,62,202,162,255,121,185,15,147,246,181,210,169,234,24,27,60,123,1,188,226,143,104,246,166,233,34,100,78,74,140,133,57,246,192,189,125,174,145,213,155,201,169,109,147,75,42,91,109,251,123,208,197,145,8,236,210,33,16,163,174,0,162,75,147,22,105,56,48,192,199,250,254,174,79,14,192,135,185,120,128,100,240,59,248,198,59,85,140,17,187,24,77,144,47,213,67,24,107,160,188,31,223,214,60,55,38,103,113,122,91,222,212,6,111,188,50,145,50,162,225,21,229,48,82,61,104,118,64,141,252,199,230,124,148,101,144,246,193,43,229,38,120,79,237,142,107,85,6,22,23,58,95,104,186,38,24,150,91,26,62,6,236,153,255,96,136,143,5,157,78,95,234,113,139,128,185,147,227,231,235,215,137,35,85,127,212,184,1,37,154,0,4,241,116,184,11,20,6,111,36,51,188,224,121,44,167,62,244,92,113,53,195,12,44,85,163,175,156,58,28,218,140,115,149,95,126,225,214,33,181,196,117,160,182,166,21,156,183,150,29,247,18,209,237,24,53,223,33,137,75,157,80,90,87,179,218,255,246,204,9,29,107,199,51,215,71,2,96,69,28,32,211,198,165,56,74,64,96,55,9,143,212,160,22,180,49,4,197,13,10,51,64,41,16,128,200,239,18,194,47,64,142,201,120,22,195,128,226,13,23,157,234,190,50,190,8,112,70,54,97,117,23,142,210,226,110,170,196,2,203,67,108,84,95,161,52,208,191,240,17,77,24,173,29,108,84,129,196,52,111,43,29,52,21,110,64,229,46,215,48,233,187,129,154,105,221,179,188,223,236,235,169,33,104,156,221,234,31,193,221,208,205,60,102,194,20,38,99,114,69,207,160,78,121,120,236,235,247,27,211,53,244,168,179,250,11,249,69,236,233,77,63,7,38,64,251,52,105,104,145,188,145,89,254,205,204,250,83,114,130,166,242,30,58,33,60,199,207,80,27,5,186,227,224,102,225,66,144,255,204,163,245,92,206,242,244,141,124,12,147,141,174,24,52,73,7,208,57,237,220,248,253,74,168,90,73,76,194,110,46,65,244,68,13,10,53,31,90,50,124,122,100,211,141,154,67,154,132,177,188,183,237,155,134,132,226,88,21,137,192,178,12,247,0,142,252,92,83,144,26,11,158,155,177,80,82,198,186,238,87,26,215,120,235,5,136,177,215,56,99,218,51,21,11,89,226,216,245,93,115,166,153,180,135,23,171,73,81,13,43,15,114,76,101,160,39,49,209,245,56,2,131,112,80,175,194,109,208,179,67,122,191,33,54,96,173,99,166,242,28,218,238,156,183,195,23,144,92,17,101,92,22,192,113,197,186,158,8,180,101,163,98,100,159,33,127,13,10,100,108,164,202,36,62,124,221,98,83,17,231,145,145,9,243,66,95,122,212,31,173,93,145,69,246,83,152,32,145,184,44,22,224,222,138,181,0,136,246,145,115,84,77,158,9,142,161,196,151,172,70,112,197,117,38,170,131,237,74,96,104,102,207,43,173,12,151,217,191,180,48,207,203,31,227,18,150,183,96,194,84,244,213,98,20,241,185,211,53,219,232,67,222,117,198,140,16,89,34,203,71,99,241,154,5,216,138,103,114,6,180,217,77,221,176,244,130,231,233,205,200,241,250,192,91,198,222,61,93,6,207,135,39,0,143,67,227,44,69,116,3,138,158,32,133,126,208,170,57,57,149,47,39,240,3,68,173,54,119,179,106,156,145,205,66,254,221,234,170,51,93,134,102,243,215,72,6,250,78,211,92,195,154,206,38,161,45,137,24,204,204,9,220,160,109,94,136,43,37,192,137,227,84,154,233,41,131,187,28,162,8,104,73,7,15,148,132,145,224,244,56,63,119,150,149,201,169,105,68,193,69,147,130,229,66,167,1,237,158,67,42,133,104,247,243,184,143,181,181,240,155,158,162,198,244,62,58,128,37,158,38,137,249,188,95,90,166,35,84,185,183,121,76,64,33,230,85,233,140,183,184,147,195,13,159,250,127,166,64,173,77,222,160,16,101,164,197,31,210,132,41,144,194,176,215,204,38,142,217,152,157,121,115,83,130,40,78,171,208,190,81,240,181,95,159,62,206,38,131,142,214,237,78,86,214,100,48,160,52,243,148,135,186,144,208,42,175,146,142,34,170,246,243,212,45,79,173,80,165,98,245,115,132,77,210,33,200,176,236,21,153,16,139,16,68,222,174,60,245,146,14,201,61,248,55,200,80,33,119,238,231,185,123,17,109,148,251,38,147,20,20,71,94,158,228,151,46,149,191,164,180,117,245,205,153,178,19,187,221,106,248,240,217,232,16,129,179,166,153,165,194,44,136,167,9,29,110,81,204,239,93,20,49,158,17,225,38,160,127,240,17,103,32,109,226,144,225,112,110,95,49,104,243,242,37,106,215,75,95,90,138,249,118,43,137,140,252,11,18,40,69,53,31,30,133,43,140,217,197,148,157,108,121,134,149,75,241,211,208,8,163,202,144,103,220,174,90,37,18,251,154,118,156,57,97,102,4,159,157,252,180,244,111,26,206,156,43,133,104,203,55,19,255,124,216,103,110,130,26,214,114,72,248,25,216,30,135,52,144,58,118,88,210,229,41,153,204,53,115,183,138,205,151,79,36,247,30,53,85,211,74,197,25,90,173,233,169,93,158,152,29,175,213,3,80,109,119,115,45,62,23,253,40,164,159,41,5,152,130,56,11,102,183,239,195,86,92,88,220,108,223,115,173,39,37,56,154,122,227,131,45,60,50,185,209,167,155,144,77,227,154,14,212,150,193,229,226,171,191,110,134,219,108,22,29,173,235,222,221,5,98,144,69,184,58,134,136,150,231,49,22,126,113,244,207,235,82,92,108,192,218,215,105,105,177,239,158,45,166,167,136,46,228,153,123,145,196,116,223,225,164,231,239,198,179,203,60,78,82,237,21,116,117,137,103,72,222,179,152,217,28,92,231,40,132,244,226,108,205,193,37,112,152,225,111,218,234,27,156,193,243,119,242,167,96,188,127,120,158,228,117,231,106,111,0,160,46,58,225,163,82,233,31,186,181,41,234,146,204,107,6,114,245,106,143,188,146,5,244,41,89,85,120,250,48,181,186,115,82,38,207,58,215,128,157,152,96,22,61,249,30,5,216,164,43,141,13,10,234,113,21,47,223,223,223,87,213,78,159,119,212,249,175,119,203,192,219,240,87,133,24,90,215,208,23,19,143,30,51,82,122,241,12,87,20,45,117,64,110,67,127,27,209,210,59,94,151,63,245,218,111,29,50,249,105,241,243,99,227,238,134,106,23,243,80,184,239,133,32,62,77,107,15,91,254,228,84,255,197,65,236,15,46,43,134,158,206,205,209,134,122,227,73,174,175,230,53,29,222,158,168,23,45,190,95,201,61,72,214,127,16,113,162,229,214,208,198,47,13,10,64,11,13,10,229,61,122,107,102,200,48,243,88,117,76,27,84,240,34,246,255,65,219,149,134,88,201,79,22,124,244,9,102,177,103,219,34,137,79,147,213,94,199,254,85,193,63,30,218,92,106,118,25,163,187,163,212,230,237,200,150,30,157,215,185,12,167,248,22,73,56,41,169,239,91,37,61,26,155,93,116,26,159,208,193,199,142,240,41,211,72,125,247,140,41,253,197,73,36,189,140,227,172,184,39,63,98,145,39,218,218,88,69,252,32,27,77,165,39,43,177,57,131,76,148,136,178,97,170,241,141,155,235,117,150,6,71,1,88,126,157,52,186,182,217,14,108,168,155,232,77,1,142,240,132,245,212,193,253,230,75,230,206,224,219,59,187,89,246,90,135,26,71,179,170,106,184,163,4,112,209,185,50,226,102,56,80,108,144,172,55,152,47,117,102,208,75,144,201,204,32,152,209,96,93,204,172,118,167,85,35,24,79,129,138,90,89,61,180,137,116,226,140,73,23,242,86,142,39,168,72,75,3,46,104,102,7,133,122,107,223,46,30,252,3,107,237,8,61,232,251,254,227,5,148,68,150,174,253,9,13,241,191,201,188,199,150,137,108,110,251,166,133,21,9,124,110,32,246,43,209,68,213,154,162,58,38,93,219,227,149,176,100,24,67,188,103,13,10,104,49,173,51,235,118,90,224,156,156,255,123,187,183,156,235,145,43,217,183,66,64,68,192,218,232,54,159,46,78,83,80,117,200,110,67,248,224,160,81,72,98,253,53,149,56,76,53,232,240,68,234,255,206,84,174,22,46,166,164,89,131,106,146,78,75,201,215,44,78,36,191,232,67,204,33,44,105,125,145,250,99,214,32,44,253,41,142,185,80,121,67,135,41,231,94,129,147,43,81,109,249,13,219,156,26,253,123,101,81,109,35,246,215,253,239,36,63,57,119,182,84,111,55,100,117,204,208,213,248,84,216,61,101,184,227,5,13,10,109,8,127,206,101,66,105,179,76,186,150,149,118,132,22,248,109,147,228,57,78,105,43,142,218,177,60,245,115,148,30,149,96,3,209,161,160,121,86,54,39,7,96,163,227,33,63,29,155,183,240,155,171,129,60,151,219,141,171,129,196,209,104,124,95,13,10,188,202,139,166,95,93,68,215,23,233,139,127,136,197,97,144,76,22,85,67,183,254,76,150,159,23,207,233,205,93,44,211,76,49,76,182,222,177,147,31,213,119,131,181,210,9,248,146,174,160,102,14,25,92,115,102,78,228,129,136,56,230,78,51,166,203,55,107,49,97,171,157,68,108,240,213,76,167,254,79,78,120,226,250,192,221,19,94,86,212,37,215,76,48,126,188,221,187,38,91,204,229,250,213,162,212,202,151,245,202,44,233,229,89,206,255,180,247,205,85,18,91,228,56,232,181,21,171,2,114,53,148,250,51,71,73,1,54,203,79,221,91,194,189,237,112,121,182,189,207,124,245,75,157,186,242,207,42,59,153,159,203,129,89,86,229,121,205,113,3,171,38,49,157,48,130,179,237,105,158,128,72,240,187,190,225,39,248,199,4,242,20,160,162,177,177,90,16,65,88,41,9,105,40,27,137,1,130,4,110,52,246,68,90,146,132,190,98,254,76,244,57,200,185,99,150,230,164,139,230,143,2,191,229,88,125,16,119,215,148,110,145,99,230,134,16,161,230,169,28,55,22,96,53,152,69,241,100,146,244,1,59,196,88,159,213,118,163,37,0,176,1,153,42,153,190,215,152,89,107,159,234,197,198,208,79,27,35,53,39,189,57,197,97,235,121,181,69,84,91,175,22,86,222,1,117,70,178,198,197,155,245,1,183,80,188,135,11,128,215,117,106,218,110,208,152,47,79,39,161,218,250,43,183,63,99,148,64,39,159,90,94,105,189,16,243,116,136,85,198,227,27,104,150,179,20,121,215,254,146,34,5,181,12,67,165,130,14,16,36,171,250,199,155,242,32,150,134,12,27,238,48,111,155,207,229,98,199,173,123,125,200,33,141,117,114,246,231,235,15,67,22,123,47,5,85,203,74,182,199,155,98,15,201,240,20,183,16,121,248,240,106,222,54,85,232,236,161,246,124,175,39,134,40,83,251,183,208,220,249,42,174,58,181,166,229,15,222,100,8,58,167,13,52,139,120,130,39,246,158,28,59,216,11,252,169,117,77,79,138,15,26,247,229,113,158,98,252,54,11,48,141,249,188,12,145,70,12,138,109,183,47,123,203,137,68,20,93,207,196,44,60,1,128,25,75,3,155,165,183,152,146,197,51,162,159,105,180,129,101,141,191,100,104,71,130,228,214,216,243,55,110,178,244,197,176,20,211,102,207,28,11,255,36,190,13,195,6,93,87,156,99,25,137,199,148,181,100,106,162,109,158,103,86,149,160,152,224,223,117,56,77,8,6,231,139,232,114,108,45,167,21,81,183,31,146,107,67,147,160,68,164,246,228,6,149,198,144,250,20,127,127,2,66,161,143,26,186,95,143,144,95,174,230,235,96,243,231,148,59,223,142,173,140,203,171,153,170,179,35,142,137,79,150,46,35,54,134,203,187,147,110,134,105,234,162,33,61,28,46,55,90,5,55,69,75,139,142,245,176,31,64,91,23,144,25,159,11,185,64,228,82,159,101,234,12,31,111,79,63,55,175,189,111,65,142,48,102,20,163,208,61,212,216,119,18,127,34,13,10,51,143,26,115,63,148,85,138,15,189,46,218,145,169,226,67,186,50,126,205,203,86,57,55,255,48,86,90,156,50,253,136,79,221,125,38,78,148,146,84,71,131,174,204,109,159,47,208,87,49,185,227,12,37,35,253,88,40,123,100,208,123,93,46,214,50,158,182,94,208,236,86,111,65,215,244,148,160,241,238,127,152,33,225,155,192,174,163,251,26,135,138,22,96,138,247,121,228,200,196,159,39,70,148,135,36,119,222,121,216,193,57,181,209,208,50,43,8,198,248,206,27,146,53,112,96,40,248,234,243,82,110,128,162,176,33,199,232,140,183,248,17,74,160,60,248,183,160,162,166,245,117,246,179,127,104,195,223,67,45,33,122,160,134,247,185,124,79,249,220,191,152,121,6,93,11,254,138,139,162,58,230,33,202,119,200,90,29,180,0,176,25,81,133,126,142,65,236,101,4,212,25,115,244,135,212,193,101,241,202,211,233,54,77,45,58,85,158,8,169,231,168,221,154,31,133,249,165,123,240,41,66,24,151,9,92,243,97,209,216,244,8,93,97,133,85,224,45,67,23,243,37,122,136,2,177,204,23,212,172,188,243,140,196,161,115,169,173,134,79,220,179,74,32,212,80,240,33,100,172,132,166,200,84,161,59,159,19,243,15,231,108,54,74,221,143,88,31,134,105,192,89,126,15,148,17,233,200,240,184,226,241,229,32,224,240,245,12,40,252,136,58,85,13,93,164,97,248,229,59,75,164,146,167,200,84,125,20,101,151,136,211,70,238,226,248,61,240,166,162,74,175,170,2,76,38,91,1,142,88,74,76,165,176,176,94,158,8,65,19,93,4,110,40,65,228,77,201,135,61,5,28,102,251,186,41,103,91,128,206,26,133,192,213,84,230,1,142,125,134,115,99,228,225,111,242,210,131,116,207,173,86,40,111,85,239,240,86,94,136,220,102,75,254,156,219,250,86,195,241,191,60,156,89,100,194,99,204,66,64,131,194,186,155,21,107,66,213,119,39,211,139,158,226,83,243,148,121,158,176,182,19,28,155,51,182,77,3,51,94,71,248,64,172,142,1,13,241,46,229,82,120,104,167,194,239,222,92,0,69,16,63,103,146,131,54,138,142,8,125,101,52,60,31,248,19,222,238,150,202,246,60,100,42,109,128,151,98,152,139,127,176,213,98,135,60,233,168,149,206,9,23,97,105,201,96,154,14,208,61,38,40,111,121,3,150,76,104,103,0,73,196,146,57,246,110,253,131,72,40,107,216,9,33,203,194,101,211,152,159,190,154,51,225,152,206,50,198,124,125,73,83,83,57,54,219,232,4,71,185,109,212,128,107,130,215,167,35,14,202,73,190,153,149,83,244,102,189,108,97,76,130,92,9,203,16,45,144,254,92,31,68,169,90,170,26,172,61,88,211,92,120,229,100,19,173,154,226,161,64,136,245,57,54,204,208,170,26,130,70,233,98,63,90,76,79,155,184,137,182,56,232,48,145,185,175,7,61,121,236,169,155,158,122,235,218,200,125,94,37,127,111,139,236,192,33,139,140,220,67,144,136,129,119,235,35,139,215,253,3,252,64,136,210,158,147,202,178,19,120,59,16,197,23,150,168,31,227,92,19,120,203,42,172,13,10,53,98,111,45,81,227,221,185,182,103,2,13,168,192,108,127,4,216,43,165,34,158,159,141,35,189,235,230,108,50,192,3,29,133,226,211,137,241,214,145,27,153,128,117,61,83,181,122,126,183,45,210,148,243,88,241,67,183,206,44,33,250,50,101,68,205,87,133,73,233,139,142,193,89,54,128,188,118,20,204,43,36,251,32,247,71,236,153,67,29,92,24,133,59,98,147,62,159,186,234,87,185,142,175,0,11,214,124,88,206,93,30,166,3,1,153,164,62,134,196,1,96,210,79,106,48,212,90,38,255,179,9,6,169,168,14,47,162,63,14,206,76,182,62,59,26,169,148,207,105,137,51,91,175,108,189,227,129,190,189,89,178,235,106,86,69,162,229,126,136,139,14,162,95,28,142,146,68,189,2,83,0,202,106,95,6,26,146,192,173,199,214,0,180,233,221,207,151,126,131,73,33,109,126,211,207,136,41,31,90,209,113,120,102,11,36,189,21,82,75,140,7,50,77,57,72,200,109,117,234,115,1,96,81,186,181,6,149,83,119,44,20,161,201,178,60,212,52,76,223,251,141,206,30,170,120,169,20,100,44,233,47,5,153,216,71,102,235,146,15,30,89,230,73,49,55,67,41,130,97,12,132,209,38,108,193,107,12,137,153,47,222,138,242,248,112,76,66,214,142,25,19,63,169,197,41,9,233,145,106,55,255,238,51,112,152,111,67,201,187,41,219,245,157,171,32,7,150,247,97,178,185,103,153,228,152,190,27,134,143,109,212,221,46,243,162,148,254,199,7,218,85,206,89,220,174,93,167,132,173,255,85,253,222,126,35,209,253,196,31,115,83,2,70,126,116,50,192,50,69,137,189,202,29,158,84,33,40,70,32,119,234,84,90,9,236,45,44,197,84,208,13,119,143,162,156,194,126,139,118,190,75,116,118,74,29,183,61,130,159,57,240,83,14,224,50,117,59,121,141,61,108,87,229,232,144,228,121,42,76,125,67,79,132,250,41,211,154,34,12,104,145,54,107,246,20,18,127,64,112,211,64,33,43,95,21,255,161,20,156,1,63,184,206,23,194,105,104,204,43,51,74,36,200,255,36,192,57,179,97,152,27,21,155,76,200,234,74,58,122,116,155,241,154,227,48,61,55,63,85,108,77,246,186,109,174,80,173,238,40,167,197,250,22,74,185,57,34,248,117,137,196,24,1,141,233,84,188,39,26,67,106,231,163,216,248,128,32,80,24,248,76,160,227,71,29,58,215,200,27,25,97,21,66,227,68,125,12,1,163,240,183,250,137,142,42,53,13,10,168,58,116,46,170,109,226,51,202,118,217,142,93,234,42,69,154,109,177,234,216,210,12,147,152,70,139,80,253,163,93,37,235,124,16,174,252,206,41,58,251,139,226,218,63,235,197,246,250,142,0,179,148,196,167,141,105,254,67,11,79,119,246,225,45,171,33,161,145,35,157,224,210,102,53,67,89,158,107,219,51,148,213,139,208,96,29,136,121,79,118,161,62,156,234,87,207,252,206,25,196,20,66,153,215,81,42,123,124,82,67,32,147,90,39,73,243,233,154,165,237,43,171,246,177,207,217,131,54,127,98,50,214,231,232,105,239,241,43,125,131,251,42,6,63,32,104,70,208,94,15,191,249,192,137,70,183,67,255,144,219,82,20,5,99,221,146,100,51,220,172,195,248,154,169,171,31,140,2,208,117,209,92,142,225,199,201,55,237,130,55,133,113,127,80,253,247,37,25,203,144,135,197,134,239,255,8,235,177,97,75,23,56,210,147,21,150,88,109,164,197,12,183,141,109,13,10,200,31,126,9,212,11,90,223,95,53,195,225,218,118,21,184,228,232,229,215,26,108,134,92,12,54,200,53,198,27,4,148,142,150,66,96,255,120,98,51,123,180,162,117,7,51,13,30,233,198,69,197,95,72,114,151,132,47,162,158,139,110,82,106,208,189,1,200,71,33,32,194,158,76,174,25,171,5,67,81,105,51,191,21,9,21,226,64,251,185,114,131,221,28,88,188,81,226,95,222,222,96,70,245,55,213,82,236,241,122,210,139,244,132,13,10,96,252,58,238,24,197,141,238,251,44,1,252,246,39,163,123,98,150,51,71,197,85,97,169,157,9,26,34,30,80,129,107,58,122,15,186,189,220,224,22,162,118,37,118,255,138,40,42,88,34,129,174,6,105,88,26,141,157,211,75,37,67,8,59,130,168,108,177,178,199,198,183,40,214,58,220,130,231,44,171,135,135,113,193,211,136,71,87,186,246,107,128,7,48,166,195,28,59,16,145,193,25,87,153,115,197,190,7,180,79,193,15,67,42,199,179,218,148,255,209,33,224,242,214,148,205,219,209,128,103,41,16,59,232,202,188,206,54,16,255,207,154,17,119,61,99,105,168,9,148,52,149,35,34,57,164,27,138,166,43,2,240,234,212,52,134,176,49,80,4,145,243,14,34,254,2,44,111,160,94,242,201,177,46,20,215,8,119,15,190,19,155,141,131,58,145,170,72,108,81,73,198,254,177,100,71,154,110,60,249,91,142,160,221,204,23,5,55,244,166,205,170,107,121,148,255,139,2,220,146,48,234,225,26,135,63,184,60,181,21,89,38,162,53,255,129,91,46,101,204,163,172,29,196,42,205,210,218,126,93,158,222,67,147,174,1,226,202,126,112,162,38,78,114,115,177,159,144,193,53,101,111,238,245,132,30,123,178,185,109,138,196,78,201,237,92,60,17,108,224,0,140,193,228,153,108,141,226,188,163,119,63,114,26,5,158,201,251,119,198,83,174,182,100,253,159,4,109,192,250,33,33,9,200,75,59,150,167,244,207,89,44,27,66,60,60,71,153,14,70,247,1,218,13,92,26,192,138,211,30,150,124,102,218,157,207,64,96,219,127,66,243,57,46,139,213,116,187,128,107,187,207,141,82,21,148,138,33,174,11,15,132,140,187,188,130,25,231,203,31,240,129,21,122,26,43,172,151,3,119,83,181,91,157,34,245,42,115,207,8,219,157,118,166,213,172,137,213,248,134,212,105,150,150,137,128,140,67,105,77,247,243,1,68,111,231,109,171,141,130,194,241,204,209,108,149,177,203,239,199,77,31,97,215,136,218,103,163,111,43,156,175,133,79,100,81,244,81,1,144,225,123,142,147,201,37,136,46,26,204,50,11,227,95,237,251,125,244,214,14,166,187,87,166,174,194,29,240,45,60,184,78,182,130,66,63,25,212,231,92,182,209,79,107,127,224,133,149,127,242,132,160,22,11,84,180,137,111,247,35,24,203,247,6,107,229,254,245,238,254,89,45,61,246,195,94,101,154,208,189,35,18,123,102,85,129,60,217,177,146,230,161,117,5,69,84,220,204,23,224,109,211,153,153,58,231,21,72,252,119,3,173,94,27,72,34,74,91,222,233,152,44,139,185,6,45,176,188,210,55,37,83,152,2,163,60,192,239,136,87,35,45,71,197,8,207,235,235,121,247,54,75,156,114,167,46,179,78,100,28,138,48,195,238,180,136,131,222,162,232,107,187,52,40,114,41,163,139,33,149,24,39,115,88,246,241,54,154,1,232,31,211,16,182,179,39,40,54,104,133,206,14,78,227,0,168,29,203,75,110,230,30,117,94,196,222,37,17,40,139,199,138,26,135,31,32,123,208,80,168,140,11,230,54,205,222,136,62,28,101,193,12,161,5,111,202,107,2,75,51,59,95,184,213,43,105,111,207,135,162,49,79,14,8,114,84,5,205,87,117,196,76,195,141,233,57,97,64,14,129,253,88,182,37,247,72,129,232,234,220,51,49,249,22,156,17,220,43,86,1,255,15,145,13,10,245,64,202,80,251,201,68,160,157,87,59,176,119,8,80,48,209,29,242,172,213,193,174,38,212,53,51,160,225,160,203,37,79,175,188,160,20,29,116,1,168,45,6,20,150,213,50,55,53,69,233,17,76,52,19,3,67,163,206,126,163,252,59,224,2,115,254,46,235,224,44,53,130,169,7,250,238,98,55,64,198,0,102,241,32,161,149,1,181,13,10,188,225,36,139,242,222,89,204,41,107,216,214,154,227,82,138,254,187,14,246,172,112,71,106,246,105,138,14,189,168,129,168,124,90,40,110,125,177,164,227,196,130,46,84,98,124,81,131,122,171,101,151,236,204,111,40,71,124,102,115,229,207,54,61,162,128,29,83,3,143,1,251,16,183,229,184,131,228,247,88,31,74,206,71,48,138,56,166,170,37,58,29,174,229,105,232,3,0,135,23,119,184,76,243,58,186,231,196,141,145,146,179,82,147,192,6,228,193,200,93,125,227,126,248,7,65,152,246,155,164,196,105,175,72,229,221,94,83,239,174,71,192,62,152,85,161,194,23,84,59,16,238,94,71,81,252,157,176,11,35,107,21,113,252,0,160,247,18,203,33,33,98,39,194,145,104,66,51,152,228,131,143,117,1,105,28,4,37,167,91,175,163,217,29,50,208,246,183,187,152,81,189,211,61,129,119,97,97,246,235,195,98,242,63,7,140,55,77,132,22,3,238,233,94,253,13,32,87,7,14,174,44,66,221,115,253,120,233,190,105,125,43,9,187,168,55,208,35,184,187,148,246,191,139,137,238,200,145,75,130,34,62,247,77,233,73,213,227,224,82,89,167,144,255,35,238,116,117,206,38,150,24,199,39,27,182,102,88,151,164,6,65,209,224,219,147,189,106,45,135,236,221,76,226,250,23,229,15,43,255,123,20,98,17,129,251,43,134,59,213,219,58,155,57,58,172,26,126,214,149,153,177,214,54,28,212,71,17,232,162,186,241,14,118,156,193,216,127,126,211,188,84,211,66,47,59,201,174,154,86,154,145,188,73,153,130,178,206,210,214,132,231,204,121,23,99,228,200,116,251,111,35,110,12,95,33,76,69,68,177,37,186,85,67,48,77,79,247,179,250,47,188,48,2,196,232,48,252,217,171,86,228,243,199,184,97,114,198,255,46,123,158,161,140,99,185,130,186,140,17,111,227,145,21,9,87,16,51,245,152,40,217,56,38,19,93,136,216,171,115,116,228,133,233,130,113,44,229,220,136,99,53,13,10,125,157,244,103,210,6,187,40,213,250,207,242,141,7,168,167,96,241,124,251,98,76,72,144,187,247,113,59,196,138,89,11,240,68,26,110,229,40,251,5,130,124,194,156,0,103,245,70,241,226,254,33,225,217,128,143,2,131,137,122,174,247,186,235,174,129,206,169,245,199,88,240,0,16,134,13,75,59,109,16,196,68,63,152,45,212,87,99,52,151,218,203,213,178,163,64,175,37,96,151,205,2,68,251,54,221,140,223,163,172,134,134,68,75,128,223,118,134,70,155,246,183,189,172,118,22,170,94,167,7,54,224,179,194,157,190,118,38,233,193,120,250,157,239,162,83,210,93,149,47,8,156,6,45,35,108,35,78,92,87,78,241,155,32,42,138,180,165,64,140,89,173,103,124,72,214,200,180,17,215,32,212,101,241,79,166,175,37,187,44,194,133,9,159,94,4,187,207,206,255,1,180,127,163,62,75,56,28,49,63,128,112,160,78,45,87,226,193,14,147,195,178,13,10,237,123,108,0,184,101,35,148,148,50,86,146,107,229,32,135,26,27,200,224,40,49,160,15,161,144,103,120,171,106,13,247,123,14,115,24,13,10,40,152,92,67,49,97,25,209,228,189,101,142,158,109,20,133,126,177,131,61,210,151,59,62,125,68,79,34,236,137,50,128,128,84,91,183,14,175,221,74,226,156,79,20,12,21,222,145,12,34,12,152,141,62,121,233,19,29,9,225,20,46,61,104,150,48,136,210,185,202,5,214,220,42,25,34,216,23,53,22,216,128,65,114,141,186,95,164,211,20,173,248,252,26,128,225,184,128,68,61,172,139,172,213,101,207,170,45,193,202,78,65,128,68,101,59,113,4,52,1,240,126,210,16,147,199,202,33,54,199,81,242,99,252,121,102,24,253,142,101,201,79,224,123,59,79,77,137,198,4,119,2,45,61,114,253,216,139,158,43,169,181,202,219,74,229,181,132,195,17,75,190,178,208,2,69,51,229,229,179,125,129,215,192,5,232,82,24,207,228,149,22,48,243,208,160,129,57,75,54,146,107,147,148,186,91,121,55,69,50,78,81,78,47,105,232,121,148,55,251,6,148,141,163,15,116,217,139,137,173,147,97,241,29,128,160,60,41,46,183,94,51,147,167,185,25,88,251,15,241,252,50,122,138,88,226,14,3,168,205,48,160,105,6,131,206,165,206,241,104,202,239,27,117,29,210,228,4,5,165,24,160,107,87,108,195,226,192,248,22,78,195,26,98,126,167,241,237,224,42,181,164,213,249,7,141,14,76,152,112,174,154,144,230,82,14,73,109,166,14,139,71,248,243,115,45,223,232,11,143,227,124,255,219,152,62,64,106,153,116,249,214,102,93,245,22,0,177,38,84,204,236,225,219,165,78,208,138,189,251,236,45,130,35,224,117,96,115,157,13,105,186,40,156,239,197,54,137,122,66,30,104,7,18,28,239,130,136,176,140,182,226,84,13,10,169,171,66,241,191,238,216,129,128,7,208,222,245,137,198,17,128,26,247,135,12,165,133,154,187,80,94,6,212,89,89,124,210,187,78,252,166,133,97,155,171,243,42,68,190,108,156,234,26,30,89,5,223,18,41,78,57,140,107,88,55,152,159,172,181,180,52,33,135,171,102,25,12,138,32,255,18,199,86,191,162,191,64,96,56,8,36,133,18,181,227,35,187,150,253,34,157,197,165,162,71,140,70,241,213,171,248,173,118,179,234,180,156,106,99,14,141,74,40,235,98,227,160,190,41,35,98,43,189,195,222,221,59,190,6,66,45,28,7,93,132,237,162,214,239,164,27,174,28,207,150,68,198,143,133,35,76,154,224,6,142,46,229,199,231,190,122,134,163,196,205,107,210,223,174,142,82,173,67,82,95,22,89,23,134,180,169,165,201,223,200,157,134,222,181,211,225,191,243,18,42,154,157,149,52,199,191,254,22,173,233,146,155,86,88,255,190,16,235,246,111,122,61,103,90,245,90,171,24,110,190,137,17,36,35,66,251,186,143,39,132,199,128,188,219,178,250,219,232,27,27,92,217,47,244,39,233,102,239,19,252,138,209,102,219,239,31,18,141,63,55,7,129,35,143,152,204,163,66,78,249,7,238,170,66,162,154,245,53,189,80,66,137,34,149,122,225,131,77,180,176,11,229,247,184,67,139,141,233,198,92,185,251,13,137,63,121,243,155,22,251,231,198,119,11,246,76,105,136,108,2,2,185,205,167,18,140,91,67,127,27,128,76,159,204,231,192,200,174,182,192,29,215,147,232,55,61,2,30,126,184,16,248,233,15,88,255,1,5,180,36,226,71,225,124,179,169,127,2,102,0,25,157,119,253,236,148,143,1,92,232,227,247,147,89,51,20,99,241,201,202,86,245,199,18,32,71,80,246,133,176,220,14,65,60,122,163,190,76,197,239,141,13,47,252,130,125,155,179,244,60,90,122,213,250,185,44,197,237,115,96,205,93,229,168,52,3,24,249,7,70,146,197,202,143,104,4,8,5,117,163,105,118,139,153,37,242,140,32,23,70,40,179,49,159,221,27,11,21,230,78,153,192,226,228,202,29,225,95,185,248,243,70,192,193,167,177,244,126,226,126,206,108,217,219,89,11,130,208,23,155,181,63,200,130,146,138,17,131,203,76,230,201,202,137,23,191,15,194,245,104,208,123,25,126,52,55,75,158,106,109,30,234,85,106,103,129,254,1,255,188,183,34,152,179,21,178,123,51,223,145,128,52,246,139,226,51,183,248,109,63,9,26,22,199,54,175,71,102,17,84,110,72,206,44,151,104,180,209,216,208,56,229,131,103,86,50,54,127,47,183,80,215,41,43,192,168,162,219,138,40,8,149,178,16,2,101,36,204,114,217,131,6,84,83,38,189,69,167,8,177,55,80,190,22,118,77,52,239,142,23,45,143,39,220,237,162,194,247,254,183,207,155,80,51,46,206,197,133,55,189,217,27,167,14,132,17,89,217,39,71,97,177,114,200,142,144,7,93,41,5,44,194,185,243,154,147,156,176,250,239,177,52,37,172,8,112,240,48,31,158,42,215,222,82,142,52,140,18,236,123,135,2,75,182,181,32,179,85,93,121,178,202,141,228,53,190,82,230,46,141,133,236,200,1,15,188,234,108,7,214,235,72,170,4,115,33,253,117,42,190,188,156,186,21,198,89,210,247,253,84,121,66,209,253,124,1,9,155,239,233,18,125,17,152,145,157,150,87,137,211,255,104,6,103,160,176,39,97,28,183,132,78,164,103,193,69,186,242,212,195,223,138,157,239,83,29,123,130,227,16,58,249,250,111,161,210,5,136,249,135,29,219,91,65,29,113,167,137,110,198,96,105,111,95,231,92,223,204,53,37,151,202,127,199,191,95,233,56,165,118,199,179,199,72,110,122,30,136,16,221,223,21,247,223,142,184,23,130,16,196,81,200,218,107,211,117,15,79,22,131,143,93,113,60,108,7,66,249,115,145,152,101,136,125,78,248,170,122,123,255,99,89,250,139,107,67,88,23,213,185,173,1,212,127,184,7,237,146,247,181,54,113,82,27,19,6,132,197,228,89,140,229,178,129,157,252,145,18,250,122,214,86,81,30,181,211,123,212,147,210,43,157,84,200,116,146,211,233,131,30,203,140,92,134,166,128,221,49,19,108,176,106,208,86,180,1,160,102,199,138,247,55,104,212,200,221,31,12,0,216,28,166,45,173,34,14,236,76,223,181,64,154,19,90,93,243,50,208,4,139,172,156,86,3,235,114,149,135,246,245,253,95,94,13,187,119,163,75,223,150,134,61,181,70,249,55,43,73,25,215,199,98,221,127,144,44,84,136,152,130,199,80,64,81,163,230,12,132,21,83,158,222,52,44,86,240,150,139,85,0,57,192,183,195,206,185,127,214,76,208,210,69,173,218,63,160,146,95,1,133,213,130,3,15,20,19,13,76,219,139,128,95,83,45,41,209,154,158,161,32,100,207,93,141,13,10,128,182,69,43,136,150,101,37,139,31,13,238,145,88,178,140,27,64,23,193,171,223,125,53,18,216,229,81,53,2,188,76,50,227,251,123,133,46,190,33,100,57,205,180,239,195,13,10,218,112,227,40,71,179,206,91,111,27,194,185,8,9,150,58,177,184,125,161,55,89,180,106,235,251,206,125,28,158,109,183,190,173,60,31,212,58,13,10,54,215,14,225,46,168,129,251,175,247,235,193,13,10,19,1,88,198,93,1,136,128,36,232,146,28,206,17,64,149,229,28,245,104,235,155,90,175,23,177,127,95,166,64,160,197,164,117,220,16,9,28,33,254,169,96,6,214,227,68,104,66,239,74,221,248,139,187,13,10,85,245,89,61,20,36,162,123,136,105,11,38,234,81,70,143,161,247,58,109,8,25,186,18,171,111,61,62,39,215,82,179,61,32,61,49,144,238,146,163,125,171,219,68,76,233,56,189,222,120,63,98,3,240,50,211,193,142,132,222,250,94,36,20,71,32,40,205,90,210,164,114,72,186,170,42,109,219,129,35,223,234,140,41,52,213,247,70,247,44,43,25,247,210,197,209,201,6,208,243,168,95,42,223,248,22,214,86,25,68,184,168,63,65,78,67,210,249,172,179,0,173,117,161,86,166,135,66,140,69,139,83,162,36,12,9,110,161,36,253,165,29,88,189,165,65,5,28,157,212,171,180,59,49,167,162,189,146,74,64,149,202,207,105,127,97,18,206,130,230,124,240,150,163,127,58,159,250,217,98,144,16,95,242,221,208,18,0,82,148,246,253,245,157,155,207,239,132,133,175,233,39,157,86,224,11,49,239,18,42,193,21,176,233,152,115,141,142,57,152,133,91,202,165,11,146,27,101,90,40,160,225,91,118,114,55,63,153,76,84,212,236,209,249,70,168,215,182,118,33,135,173,17,6,55,212,140,99,94,52,51,50,152,130,200,156,117,179,217,14,63,53,121,68,179,11,3,238,132,136,239,45,102,254,254,235,96,210,164,0,152,114,84,166,131,193,63,129,205,89,236,240,49,164,92,110,94,184,239,81,162,70,88,159,103,181,252,239,32,41,112,213,132,69,26,82,246,9,11,250,66,206,191,204,192,187,176,40,13,34,162,229,56,252,140,15,67,71,211,154,4,250,185,224,58,237,148,145,17,31,163,153,52,21,45,90,173,226,114,145,115,17,57,120,191,71,143,13,185,124,69,63,245,76,170,115,247,155,66,51,44,72,72,46,244,147,202,97,208,191,181,28,62,252,156,213,114,214,111,88,30,239,108,196,202,1,62,98,206,162,139,110,218,164,31,16,188,126,149,56,88,16,245,232,229,176,178,43,25,116,6,77,133,148,30,37,124,135,77,80,179,196,134,60,11,123,187,145,101,38,167,203,154,130,231,16,81,40,80,56,79,43,15,71,30,252,131,164,40,187,2,43,73,229,18,206,179,132,108,75,220,21,219,26,14,224,119,75,121,12,182,34,46,16,250,124,183,46,23,32,248,3,179,38,248,182,4,201,95,122,106,207,2,132,50,169,4,137,169,208,180,147,117,208,172,148,18,132,59,130,201,13,10,148,102,129,21,22,24,136,119,156,49,13,10,127,176,23,165,202,162,138,110,233,144,8,89,55,197,196,130,73,59,27,211,191,35,212,135,113,62,196,82,106,104,208,60,17,136,161,45,38,247,209,86,248,81,193,194,163,214,36,46,169,118,99,61,141,184,124,167,230,255,88,26,233,185,237,245,230,152,52,116,144,229,226,135,233,242,62,14,105,71,220,135,169,247,11,235,161,223,170,161,214,152,249,98,166,50,209,79,53,62,205,230,62,194,90,78,69,229,156,183,30,98,24,26,77,108,60,236,7,177,253,110,55,233,81,52,49,224,161,214,182,51,207,42,127,138,177,39,138,205,135,197,117,168,24,165,45,212,245,138,187,161,108,95,29,235,225,156,28,81,124,100,91,191,229,182,193,195,212,33,87,125,55,118,192,183,90,54,185,124,30,36,198,36,0,100,129,129,149,106,134,81,2,0,216,29,83,86,180,106,56,180,75,120,11,197,79,50,190,30,85,226,132,199,31,44,124,85,210,141,13,102,37,48,67,215,110,143,177,32,56,172,160,147,209,57,94,46,101,223,166,101,234,215,85,9,212,109,147,208,60,95,13,10,141,189,239,32,242,116,45,115,176,53,215,219,123,88,226,152,88,108,31,19,219,129,111,83,1,30,77,89,209,41,131,150,121,37,15,63,101,211,100,86,145,119,74,28,200,232,254,174,4,102,128,158,52,198,41,102,111,6,160,204,153,113,87,197,200,127,133,227,97,147,205,218,66,241,125,26,236,226,156,66,195,209,158,208,99,196,30,72,5,205,78,68,12,138,19,80,221,73,25,51,142,189,86,221,105,63,22,238,175,184,18,200,62,170,152,0,173,85,166,147,147,137,231,242,172,168,218,54,37,39,27,240,181,55,229,23,206,195,174,23,102,242,158,125,26,215,254,35,175,124,224,177,38,191,52,193,76,254,98,248,236,13,156,205,74,200,104,120,201,212,161,198,205,93,145,25,179,174,181,51,99,152,206,4,137,62,97,232,212,217,163,67,147,32,88,39,33,131,119,69,210,34,221,127,181,197,188,111,31,1,152,191,213,222,110,16,218,99,186,139,116,79,132,197,75,44,245,75,62,177,151,108,99,179,180,12,102,235,184,143,146,126,25,132,32,7,233,72,112,186,71,79,100,137,157,64,46,103,205,95,253,52,37,69,119,225,213,203,80,220,44,4,154,45,42,91,16,87,114,131,207,169,8,50,235,6,97,236,59,55,31,231,206,207,39,213,122,180,45,229,115,17,7,108,82,129,95,66,164,204,86,217,180,108,125,248,193,235,20,132,224,40,4,57,114,60,217,205,164,128,159,60,239,31,106,111,6,53,121,235,143,18,252,50,78,138,57,6,115,58,146,150,108,153,0,127,69,151,173,225,231,65,176,44,172,239,174,251,116,116,216,164,80,87,164,109,171,178,230,102,63,240,59,3,128,175,236,127,52,95,144,84,29,220,125,137,184,38,109,29,82,118,86,242,102,240,47,59,103,3,163,6,47,101,61,67,113,192,109,168,248,93,110,97,65,222,182,196,8,123,78,101,63,167,43,46,124,91,250,237,105,73,126,219,146,83,109,158,201,243,191,15,52,146,8,231,115,156,177,172,167,8,163,42,90,199,169,155,160,63,203,8,170,96,89,43,200,178,61,23,11,179,167,76,206,199,1,30,100,201,157,17,24,229,60,131,73,53,173,39,21,61,23,255,140,31,67,78,63,242,77,3,24,184,73,24,50,97,153,170,205,98,114,75,16,87,217,28,102,40,173,66,99,168,88,164,111,13,10,30,132,46,120,163,22,126,19,145,67,251,14,218,204,100,52,132,2,7,106,128,3,99,186,237,41,190,95,13,10,246,254,20,13,10,106,229,14,72,126,35,254,232,181,234,159,169,22,177,143,137,12,202,202,69,201,104,111,212,175,94,102,140,93,16,39,52,206,215,197,139,11,121,6,102,21,62,59,84,252,217,171,43,28,43,17,35,41,62,162,223,77,117,61,125,135,190,129,44,117,106,158,235,253,217,165,44,46,192,89,107,4,212,153,61,203,135,119,113,30,109,9,163,247,209,166,231,103,151,122,142,88,228,187,193,172,176,52,76,117,247,25,27,139,104,155,241,149,206,214,212,223,27,137,68,8,245,59,54,65,222,16,138,118,3,116,163,117,208,74,42,203,71,183,138,213,38,86,200,158,133,31,253,222,97,68,156,231,172,168,232,13,10,81,108,149,148,183,193,192,235,125,103,107,176,129,245,240,33,104,28,1,64,47,138,82,31,86,232,192,15,223,222,12,97,189,25,66,32,156,185,170,117,14,103,171,161,243,109,203,194,149,3,107,184,153,32,91,219,115,54,24,240,49,125,184,254,31,129,171,65,254,171,1,139,25,219,53,191,182,146,136,241,159,75,9,177,162,254,45,115,178,146,142,201,193,197,48,220,237,203,40,128,223,31,3,46,206,203,117,236,203,73,240,129,18,157,237,185,166,85,238,163,233,138,95,162,180,55,85,136,24,251,240,94,154,132,138,58,253,68,114,144,29,177,123,221,196,192,179,57,30,18,158,81,48,227,153,13,10,23,228,140,138,213,225,174,165,187,36,228,175,151,64,84,119,94,174,82,216,89,228,187,6,152,94,59,237,4,71,85,208,17,49,47,159,20,70,228,169,145,120,95,78,159,43,199,20,56,76,152,254,231,8,64,88,249,213,218,77,121,160,165,253,207,9,152,135,173,162,2,13,146,73,91,204,239,106,199,55,15,105,169,212,43,175,218,144,40,189,0,43,113,198,208,225,74,20,26,82,115,83,111,99,175,113,50,157,135,124,37,196,233,84,126,18,161,54,197,160,93,82,68,209,70,174,211,5,165,140,65,47,25,61,154,84,3,160,219,233,21,65,65,70,31,189,86,22,171,168,28,24,106,45,237,48,126,225,102,64,123,195,58,117,141,11,16,7,218,142,195,160,166,177,127,163,117,173,121,151,67,73,154,97,164,31,157,152,144,226,230,229,154,139,183,179,114,230,19,1,67,31,252,17,210,128,241,213,115,90,89,73,68,122,115,215,35,140,111,190,176,66,132,52,113,234,118,180,162,92,22,116,225,109,29,220,214,242,146,147,77,204,116,187,3,0,238,202,177,251,146,251,116,145,204,100,136,185,151,117,200,141,143,230,21,73,124,118,56,119,134,186,115,191,45,98,109,33,0,213,120,142,141,48,229,75,155,159,150,63,169,104,230,147,60,111,180,201,159,118,61,96,163,203,148,249,177,196,1,74,8,194,139,233,231,173,15,39,163,69,210,174,179,144,227,113,92,214,141,218,229,6,149,253,8,159,142,70,231,44,184,134,227,70,241,194,149,234,193,165,212,43,26,14,187,210,7,134,42,200,217,121,89,25,117,185,224,141,228,215,143,139,170,22,178,68,51,126,116,137,149,167,78,157,217,102,200,110,131,217,22,161,179,128,132,237,128,99,145,22,144,204,231,28,60,156,93,18,147,148,121,41,254,52,11,241,252,240,109,3,170,119,47,119,190,56,123,204,207,9,34,166,249,175,49,25,222,61,50,236,125,217,138,198,137,241,31,80,253,82,117,65,23,119,200,79,49,229,42,190,86,202,34,227,249,226,157,213,108,244,82,228,24,144,101,231,41,129,51,48,76,67,25,98,226,64,67,132,203,112,112,127,79,195,238,198,53,57,248,227,21,67,79,42,33,123,173,183,221,117,154,146,39,166,109,138,169,89,100,121,33,210,244,77,120,223,93,221,205,252,189,143,188,203,250,144,127,37,186,79,63,248,70,68,235,193,31,94,79,219,237,48,3,81,127,198,14,89,206,102,246,130,54,18,107,74,236,143,245,57,198,173,44,102,146,35,184,93,94,55,240,53,50,21,139,48,227,60,189,176,37,140,220,22,7,172,104,196,29,233,118,12,37,62,154,212,11,40,178,103,65,124,83,176,195,226,123,179,44,117,64,147,93,177,195,100,116,107,85,249,172,247,202,107,158,195,90,195,36,141,66,168,207,81,161,216,249,51,25,105,139,146,255,113,126,17,23,240,224,114,96,80,146,219,71,0,171,171,126,244,137,191,195,94,198,138,214,61,149,250,22,182,162,240,24,62,92,59,91,27,221,186,49,230,4,130,38,122,91,242,222,36,68,82,253,8,215,217,2,156,15,66,158,118,213,196,214,200,82,248,237,119,29,138,198,191,38,127,240,152,108,102,185,63,214,28,129,11,9,28,168,80,88,173,99,169,142,134,79,194,74,37,170,255,56,147,70,190,56,100,66,120,244,187,219,11,78,33,33,95,81,173,11,28,64,8,216,241,91,96,235,47,193,7,136,62,36,228,81,31,158,239,186,156,209,109,174,126,69,120,68,3,183,198,156,96,199,73,77,192,35,170,86,39,177,114,142,129,149,203,27,222,52,248,253,33,160,145,4,100,102,93,202,165,124,130,118,103,113,158,208,124,35,64,238,15,190,33,245,152,19,128,203,130,215,113,64,247,2,84,146,167,222,8,0,205,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen019004l=36087; +} +#endif //_PDF_READER_RESOURCE_FONT_n019004l_H diff --git a/PdfReader/Resources/Fontn019023l.h b/PdfReader/Resources/Fontn019023l.h new file mode 100644 index 0000000000..cad9f1f3cc --- /dev/null +++ b/PdfReader/Resources/Fontn019023l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n019023l_H +#define _PDF_READER_RESOURCE_FONT_n019023l_H +namespace PdfReader +{ +static const unsigned char c_arrn019023l[]={128,1,110,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,73,116,97,108,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,32,82,101,103,117,108,97,114,32,73,116,97,108,105,99,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,50,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,53,49,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,83,97,110,76,45,82,101,103,117,73,116,97,108,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,55,56,32,45,50,56,52,32,49,49,48,56,32,57,53,51,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,48,56,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,20,141,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,110,105,203,133,212,139,90,39,112,200,65,225,207,6,149,244,156,94,135,11,21,245,23,115,21,168,73,78,19,201,207,140,100,119,117,78,80,166,152,5,116,21,162,191,15,221,200,221,1,216,116,212,120,26,31,220,156,218,224,157,234,218,118,29,46,181,77,131,203,60,42,92,204,146,239,122,14,162,85,120,63,212,121,117,184,152,196,54,145,199,212,234,218,121,133,209,70,255,24,161,201,9,46,228,59,90,27,15,253,17,234,34,40,29,208,208,138,59,172,25,9,83,123,152,42,141,13,10,239,2,227,82,19,45,23,65,191,19,92,60,117,148,232,131,163,146,150,141,112,75,21,1,116,54,145,183,76,72,117,108,127,77,49,89,122,186,111,23,13,87,203,68,199,182,32,145,15,53,196,122,83,198,78,174,111,65,110,56,191,92,182,7,143,180,99,58,253,38,37,17,64,128,171,103,17,159,85,254,168,248,42,140,142,93,29,207,243,150,232,130,254,146,143,62,202,238,14,51,45,128,136,79,56,148,52,20,115,169,91,235,61,89,77,124,226,212,7,140,203,71,137,145,192,207,120,245,131,82,150,250,41,51,103,163,28,194,119,136,79,5,60,146,112,57,219,83,66,213,168,254,34,65,191,251,105,127,2,205,164,53,213,52,232,204,196,73,244,96,50,234,90,217,105,35,6,28,56,94,148,13,10,34,197,209,55,108,242,127,160,81,18,170,18,127,5,255,191,73,235,205,140,39,157,46,175,103,230,196,173,147,74,117,21,186,34,144,18,6,5,66,102,95,8,213,242,89,190,237,187,94,151,214,227,202,231,110,203,243,219,1,172,101,62,7,169,34,3,125,92,228,129,158,126,180,228,56,205,152,158,177,100,87,59,160,99,109,22,232,155,65,206,215,171,45,215,172,76,247,116,146,130,221,72,43,229,153,56,96,124,99,38,210,217,184,82,202,111,152,227,254,67,226,175,223,214,9,231,93,118,116,245,169,243,102,99,81,154,74,186,125,4,5,88,200,128,28,2,72,61,41,134,129,64,198,2,5,25,67,17,206,188,238,255,162,95,31,155,146,118,77,169,114,73,204,142,236,239,117,146,211,243,255,99,240,200,67,116,12,169,73,213,144,78,133,196,2,114,144,48,128,153,45,97,74,78,137,5,85,220,220,25,110,189,187,12,88,56,219,124,92,134,195,250,53,99,74,254,3,221,247,91,73,244,151,206,92,248,64,198,219,86,240,13,186,218,176,163,3,78,156,174,166,38,229,116,128,1,235,80,138,117,112,24,124,137,104,201,29,216,178,51,15,54,13,66,141,63,204,147,119,24,12,211,122,139,82,252,220,67,215,215,133,249,15,82,168,64,242,124,218,153,224,159,142,239,190,8,100,124,242,55,152,97,13,10,210,230,12,156,164,37,243,192,46,87,16,109,67,206,12,88,56,237,190,16,235,211,254,154,121,157,20,32,111,4,67,139,196,90,205,67,215,127,46,128,230,142,27,230,152,239,222,213,128,234,96,163,94,159,55,85,39,157,67,137,112,135,71,129,126,247,249,104,127,51,49,234,203,225,211,240,38,82,124,14,34,3,85,214,70,240,0,227,48,211,183,221,233,200,61,212,200,172,76,118,213,239,95,90,4,6,154,94,107,206,101,63,188,42,202,143,238,73,166,43,198,120,118,228,64,66,110,168,153,211,154,61,167,94,176,147,71,107,40,248,180,185,104,235,202,187,138,177,140,153,81,43,218,22,21,110,97,230,70,6,189,150,215,164,133,175,145,197,57,120,208,67,31,224,110,200,242,224,158,110,196,99,27,27,117,240,26,208,29,145,80,3,200,133,229,119,233,164,249,126,151,183,105,145,251,112,104,124,214,151,247,224,113,184,185,31,191,212,119,197,42,242,192,85,87,149,46,90,120,2,254,255,95,58,22,84,186,121,216,128,146,224,21,89,241,132,169,85,63,225,72,57,163,100,137,204,101,67,170,203,115,130,88,40,33,117,192,133,168,205,253,6,101,221,199,47,232,55,92,185,63,197,41,20,166,223,115,167,88,174,196,49,72,65,202,136,130,143,105,194,96,198,112,213,235,91,14,232,187,119,128,156,28,26,221,116,91,2,167,145,21,243,159,138,146,60,85,238,161,13,68,23,53,78,100,238,58,219,247,72,72,44,67,235,177,161,48,62,135,32,63,206,152,224,124,46,172,122,128,31,190,228,199,38,8,29,239,50,36,83,75,23,4,23,243,194,46,111,186,142,155,34,114,221,41,152,245,219,58,209,162,22,15,172,215,175,4,211,8,145,23,79,150,21,195,147,107,212,15,241,71,104,42,167,141,1,90,4,142,168,165,189,49,16,88,95,110,145,180,8,64,160,202,54,34,80,151,126,32,58,143,148,94,136,3,102,34,153,79,218,36,0,174,234,187,178,62,201,120,189,119,174,29,109,248,130,97,135,166,172,109,65,40,18,204,110,215,153,138,27,58,71,107,70,121,97,98,0,94,126,166,189,31,184,36,17,236,97,53,67,71,160,246,237,167,124,177,0,177,214,242,206,169,203,174,87,54,54,168,175,177,60,190,115,2,8,12,92,63,115,60,150,164,234,226,30,100,57,87,68,240,109,103,187,157,40,203,62,90,232,49,179,231,159,243,107,181,102,211,159,241,126,226,29,36,92,152,53,185,254,143,118,245,5,2,204,124,14,49,216,251,43,15,145,246,228,122,205,35,131,86,204,18,137,96,223,56,19,254,18,162,66,134,183,138,60,165,169,74,136,106,190,160,237,112,189,95,237,0,25,221,170,82,122,45,209,68,112,60,127,77,216,91,250,79,232,106,105,228,135,227,220,170,142,68,88,87,60,253,142,32,71,37,235,251,207,199,54,5,157,105,246,184,101,125,187,185,52,60,93,155,38,163,141,230,50,203,45,142,161,147,104,245,190,236,195,221,42,61,85,169,216,31,191,98,204,59,215,89,6,232,92,13,10,28,170,80,106,16,209,88,117,90,250,85,136,191,73,204,249,20,121,121,43,13,51,237,3,93,110,49,84,149,226,214,134,226,66,248,61,147,0,103,186,210,55,158,40,81,241,27,208,101,21,19,232,108,170,183,150,215,63,161,121,53,177,143,82,84,28,218,150,3,103,55,253,90,72,199,217,87,190,175,43,253,193,144,41,199,136,109,111,43,28,179,70,47,206,52,177,233,28,176,51,194,119,47,246,111,70,219,143,105,215,108,59,187,66,154,213,53,227,92,84,162,76,197,151,179,149,223,12,172,166,23,200,231,231,154,153,234,68,232,238,70,111,193,161,131,148,116,92,192,38,68,48,84,111,153,59,117,110,206,231,90,246,218,110,227,56,255,28,107,154,220,11,139,8,2,2,206,233,132,237,116,176,83,251,198,168,45,208,234,13,10,217,169,253,245,226,105,176,104,249,117,104,42,227,93,70,3,35,121,137,150,220,211,54,216,8,198,76,94,102,27,136,63,237,207,16,16,179,118,8,152,24,67,57,103,186,69,170,222,234,199,65,189,104,29,254,152,163,105,171,242,144,174,118,139,98,186,206,17,174,204,112,115,236,243,42,83,42,244,58,133,83,15,240,147,112,149,136,132,238,35,13,193,91,176,202,89,165,157,147,96,142,102,166,155,92,86,111,201,143,174,226,102,124,254,251,214,175,175,46,124,216,26,236,146,143,193,24,242,20,181,181,172,62,77,120,225,199,84,112,135,104,165,133,243,248,172,39,116,54,242,150,113,54,127,39,113,188,22,239,254,175,158,233,33,236,51,33,125,195,126,142,92,58,211,27,37,176,80,246,149,13,139,249,108,149,230,106,171,246,200,9,247,137,237,175,86,118,52,151,172,226,72,39,150,247,252,245,218,79,150,226,167,254,87,192,42,189,165,244,218,182,129,27,16,39,253,168,236,224,235,176,219,128,163,146,17,126,41,95,164,135,186,153,35,86,29,149,157,165,52,133,123,157,163,102,13,10,172,216,119,66,1,182,67,156,6,220,54,231,26,219,153,0,210,156,5,55,221,42,0,122,24,174,61,233,181,42,202,146,250,13,246,12,164,217,176,75,151,111,94,156,130,36,108,127,153,47,78,220,18,113,94,59,146,73,59,182,243,225,46,211,145,205,237,33,68,78,227,114,186,87,165,168,199,51,247,245,237,86,147,31,245,219,111,160,47,101,250,31,46,236,60,28,84,167,5,174,67,34,191,144,59,100,209,45,169,4,118,113,79,38,62,175,17,129,3,206,138,252,236,250,239,12,124,185,226,167,96,20,42,191,86,75,144,8,123,203,200,131,214,41,106,231,107,236,75,0,180,248,224,109,159,71,93,184,138,144,92,186,72,215,44,146,143,84,159,189,241,92,51,0,28,182,107,187,159,131,228,176,101,26,229,22,174,29,38,13,10,37,231,198,158,47,247,124,39,61,97,64,156,155,146,47,230,156,201,97,23,68,101,159,180,48,252,117,161,12,181,216,132,185,54,160,45,193,237,197,120,242,61,105,211,115,226,66,152,130,33,58,167,238,34,25,135,20,40,123,135,208,159,116,9,16,35,36,169,198,154,32,156,12,233,249,78,25,168,212,150,153,181,118,247,140,82,33,228,191,192,217,168,85,242,252,101,86,193,204,106,28,136,234,132,133,144,102,0,46,163,19,46,184,70,25,4,19,25,50,104,220,196,129,154,198,12,138,50,5,242,82,210,253,116,95,90,192,125,124,211,83,217,166,187,27,9,213,150,26,248,134,75,56,11,55,136,11,109,93,194,63,95,157,17,126,8,196,106,238,154,233,99,113,121,200,36,239,119,192,202,82,183,22,107,190,130,87,74,115,222,248,156,227,47,194,100,149,34,176,245,152,191,37,32,235,226,235,252,86,126,111,180,106,138,220,55,230,20,211,204,48,105,190,104,137,155,172,108,89,91,51,93,48,13,10,71,90,169,245,247,198,189,0,106,188,134,42,70,169,172,16,181,5,248,54,68,29,183,50,71,130,20,164,170,135,210,210,75,179,77,116,144,246,52,240,183,152,177,110,86,23,57,167,206,102,9,128,142,12,49,165,137,208,112,148,39,146,223,224,169,19,252,69,16,249,98,194,228,232,209,48,130,180,252,84,159,170,192,79,191,190,3,181,39,65,136,171,1,9,233,16,202,103,112,103,213,13,237,113,80,179,73,22,117,245,122,28,42,199,117,245,237,191,167,104,246,223,52,154,110,154,210,26,216,216,163,133,168,152,155,132,220,137,69,116,150,137,244,208,68,116,172,151,101,50,14,199,55,127,126,189,37,229,208,247,50,23,144,196,241,154,9,153,185,64,238,105,212,36,76,75,45,21,248,142,235,248,223,195,32,41,254,53,185,113,114,37,53,8,162,85,198,101,252,16,225,168,80,25,84,210,58,16,52,176,159,68,178,111,179,96,142,68,149,89,244,96,38,39,202,118,134,143,100,200,240,73,206,138,65,134,53,231,11,188,180,119,185,79,172,253,157,97,91,187,22,57,176,200,83,97,42,51,7,71,165,119,119,169,41,76,151,35,146,153,255,159,111,85,147,33,110,149,111,38,133,3,32,223,138,136,168,160,200,222,208,195,253,144,159,2,57,241,197,191,42,130,77,120,233,120,41,205,186,48,95,155,182,8,7,126,255,202,134,212,253,66,121,185,201,53,145,185,130,49,92,25,93,17,29,78,57,149,114,202,81,234,92,1,148,95,51,186,189,214,251,74,147,13,10,121,164,166,102,73,42,70,24,131,89,249,126,202,50,54,113,135,81,76,226,226,254,162,196,26,36,120,86,35,104,123,38,230,28,247,202,69,229,145,154,59,54,102,173,224,102,52,49,96,51,53,88,143,142,163,73,2,168,105,199,99,232,122,127,74,177,100,34,31,198,229,11,21,124,247,215,255,208,170,75,156,146,104,247,162,195,6,25,86,51,17,202,78,178,193,115,87,212,225,21,79,83,19,60,106,94,4,124,17,15,137,179,99,91,200,29,149,230,155,182,112,143,210,29,57,78,8,173,147,83,32,249,114,70,44,235,107,18,105,43,117,223,13,17,102,0,217,19,45,128,201,34,211,173,23,57,36,230,220,60,110,73,25,6,52,127,15,12,18,126,55,140,40,2,235,83,95,178,168,235,2,15,44,129,13,141,39,140,224,154,121,46,51,25,76,66,130,21,128,116,41,236,59,84,231,221,201,2,98,23,208,228,127,158,136,165,58,49,103,227,42,166,180,118,95,250,48,254,186,199,21,87,195,57,169,145,28,176,205,155,79,83,215,103,103,50,244,129,118,160,178,232,24,53,26,182,88,231,246,35,132,250,234,54,90,195,136,224,196,72,109,245,171,209,227,188,239,253,95,173,249,141,106,181,63,184,159,188,52,99,141,55,50,6,204,115,217,43,114,46,54,141,254,158,154,120,48,224,107,69,203,134,245,47,153,174,8,218,131,84,68,70,184,27,12,129,243,58,132,107,196,90,79,189,74,88,120,1,38,38,239,135,32,91,236,195,250,255,68,45,143,220,172,216,153,213,85,141,227,90,94,243,174,151,130,119,245,153,105,19,168,174,115,19,155,243,123,17,48,196,206,38,61,146,23,33,236,29,113,204,122,249,67,234,60,14,117,66,175,55,233,17,208,245,15,137,84,35,174,187,80,50,21,85,125,170,150,250,155,60,62,99,167,196,165,93,179,134,182,151,5,94,43,96,250,185,180,108,242,68,67,156,135,81,161,220,241,173,185,99,85,65,93,139,108,66,6,101,42,151,15,72,127,196,225,214,73,18,156,115,208,156,200,53,121,149,40,70,176,173,158,12,98,14,4,17,94,98,168,96,199,124,223,195,251,195,58,210,64,34,140,40,218,226,28,191,144,32,63,38,36,230,205,214,46,181,188,132,11,135,249,253,80,81,179,215,67,175,239,217,144,19,78,171,106,138,248,219,92,1,249,175,240,241,210,150,64,20,41,244,89,143,218,164,12,126,15,153,235,176,52,169,124,66,138,57,77,41,93,45,151,13,10,36,125,218,97,229,240,43,226,184,142,1,76,154,36,123,195,66,239,8,166,146,127,200,107,225,153,34,181,126,179,80,222,192,105,143,139,159,72,127,87,89,129,5,28,131,48,237,198,221,233,57,56,112,187,55,64,33,249,130,104,220,120,129,193,251,166,47,227,70,27,133,146,170,52,1,28,124,211,242,185,171,221,40,17,221,145,235,160,27,96,1,90,21,234,76,103,195,100,155,233,88,45,236,65,29,18,77,34,35,9,245,28,119,181,237,194,200,254,238,25,144,116,67,85,254,177,159,215,0,7,208,119,183,194,13,133,198,139,119,208,66,247,156,122,108,67,8,220,171,59,43,125,35,62,27,89,57,122,211,8,199,154,24,137,127,45,189,74,172,52,95,32,178,30,207,131,224,20,76,214,145,182,109,9,100,117,185,241,149,160,241,196,233,189,196,162,26,239,219,13,10,162,145,134,188,192,120,86,201,158,116,221,50,127,249,226,223,110,126,45,189,241,144,63,180,45,156,24,158,70,149,98,87,57,252,233,155,100,213,111,165,216,182,167,214,119,159,8,184,35,13,66,247,196,158,61,234,204,102,29,6,130,141,206,19,212,251,114,122,218,74,239,66,103,116,159,189,245,95,74,101,70,71,120,229,128,243,201,27,129,135,63,80,132,116,15,207,205,239,42,139,224,42,74,107,250,91,13,10,186,15,73,62,63,0,34,87,153,118,158,237,4,232,0,84,190,160,116,150,41,248,93,34,144,83,55,167,15,37,245,156,211,255,223,137,76,170,74,215,187,176,242,116,184,30,140,223,209,185,35,43,35,217,95,6,130,80,22,9,27,45,202,88,164,5,236,97,90,2,247,13,81,76,9,214,142,128,209,84,224,149,93,241,30,54,33,182,247,207,74,20,216,33,69,189,251,22,106,53,35,99,117,195,176,83,37,55,2,57,18,45,7,144,252,95,193,227,82,231,246,108,116,61,235,185,96,228,141,249,6,83,87,184,74,235,105,129,54,159,115,174,108,211,107,103,225,14,43,85,51,101,120,185,134,75,64,34,98,106,50,182,228,24,73,224,49,142,196,113,110,251,213,31,189,175,225,229,201,101,223,200,232,24,187,242,108,227,188,197,232,15,20,51,195,3,139,151,222,150,8,150,68,32,52,215,215,187,169,116,242,189,30,243,121,113,40,205,241,2,37,142,88,24,4,39,204,107,222,22,106,206,28,33,208,114,244,175,126,13,92,155,124,61,107,145,131,241,219,216,67,230,232,3,48,39,125,109,54,209,57,88,16,214,159,199,63,108,202,57,8,63,242,203,57,80,19,9,167,243,39,110,8,163,115,150,51,219,92,187,166,230,71,213,116,65,186,234,190,132,177,78,203,92,196,247,236,24,42,202,21,67,52,239,191,168,112,33,72,82,124,21,209,203,238,154,5,125,202,164,241,12,14,41,12,93,114,62,93,164,127,54,149,165,157,4,25,235,32,45,36,182,42,232,112,104,200,151,92,216,184,174,92,71,0,166,234,186,218,156,202,79,154,80,87,36,54,236,52,215,211,22,240,29,181,4,39,236,127,121,79,55,59,147,237,175,43,210,211,47,217,60,32,205,190,149,150,151,102,114,95,136,191,36,249,153,22,28,73,42,77,185,49,126,17,231,37,215,51,209,151,213,143,212,22,89,71,72,215,45,49,200,62,187,250,207,79,6,84,86,70,248,65,152,189,18,215,89,161,23,13,160,127,44,31,54,55,212,140,175,138,33,241,197,17,41,39,32,245,225,229,173,99,2,105,243,45,129,122,71,118,134,186,244,197,200,223,35,173,190,187,107,159,127,87,227,181,52,66,190,8,84,56,238,76,143,75,50,73,207,176,114,242,19,229,102,175,78,205,52,52,97,13,59,177,51,128,51,175,62,202,240,212,110,127,195,225,231,35,80,221,207,4,112,1,240,7,243,44,128,179,224,13,10,96,40,96,95,253,124,191,39,167,142,192,255,158,160,49,248,52,64,17,4,144,202,88,106,188,158,30,54,178,136,83,222,235,176,196,102,225,67,176,65,187,191,207,155,248,197,24,126,209,34,7,23,29,120,99,137,232,156,174,5,234,19,20,150,225,11,74,196,123,122,82,6,15,2,192,172,119,160,213,137,81,132,51,132,120,25,238,127,109,197,92,15,71,5,235,202,213,198,30,164,147,46,60,42,235,225,115,242,187,192,206,170,188,99,205,88,231,72,64,51,4,173,217,231,142,212,120,89,65,129,187,138,215,253,182,55,249,27,146,85,36,11,188,233,67,21,118,5,20,36,1,179,206,160,57,223,176,247,226,195,127,184,74,31,131,177,115,5,190,3,176,159,51,240,95,158,69,113,196,102,175,25,253,29,218,189,132,165,7,75,88,50,2,204,57,149,2,124,246,252,246,108,40,225,162,96,74,114,255,198,152,2,64,6,228,70,97,40,15,248,153,43,95,238,146,48,245,118,89,76,139,34,219,105,3,203,160,140,16,178,77,171,169,188,13,10,53,204,97,137,16,75,237,80,250,91,127,17,228,52,74,188,15,103,123,155,192,105,168,190,143,130,114,39,31,47,62,62,192,151,54,78,111,52,65,243,253,247,247,209,123,218,108,117,110,48,149,128,213,51,74,82,62,56,201,195,52,206,59,80,240,23,155,1,49,163,195,152,193,215,245,66,32,78,213,229,182,240,53,197,91,36,85,40,110,43,117,253,155,234,22,179,253,34,103,228,90,187,159,251,236,43,28,216,146,24,167,153,208,162,119,71,221,181,20,190,194,117,143,78,212,141,248,226,195,174,29,88,226,127,241,217,198,160,236,73,13,10,117,62,112,50,24,68,64,159,201,83,123,192,249,173,210,8,192,66,144,102,238,24,56,200,34,144,157,183,205,205,103,13,178,41,209,184,30,15,143,122,23,212,54,191,155,135,12,207,74,143,3,224,29,60,48,179,214,107,190,52,25,15,223,215,131,111,231,66,120,91,96,164,63,147,165,204,202,241,61,212,97,124,148,156,21,61,128,238,50,143,235,6,146,170,115,72,184,147,138,140,209,37,158,27,6,189,19,198,1,80,213,53,167,215,84,230,242,161,29,199,97,60,196,20,79,114,196,76,133,202,199,37,16,163,84,20,42,34,167,139,136,88,125,244,127,149,166,218,79,84,190,218,142,48,210,211,224,168,127,72,132,231,221,13,254,5,104,226,18,126,121,11,235,26,196,39,52,13,10,26,55,224,20,140,38,55,54,119,209,41,131,126,110,124,61,219,87,224,200,73,248,191,185,6,251,121,28,33,65,40,116,36,226,5,107,102,242,159,180,31,108,95,165,177,38,77,184,114,152,147,55,119,31,85,102,17,137,247,235,128,130,171,138,118,40,69,82,246,220,84,253,119,221,122,6,38,185,232,194,16,143,82,29,132,150,206,2,175,255,97,3,136,204,78,0,15,102,22,88,208,39,84,92,81,83,253,112,164,97,216,214,117,79,27,102,7,14,66,89,77,220,1,145,137,2,3,128,15,214,76,226,248,187,28,42,1,156,48,142,131,191,135,44,78,2,12,181,16,93,213,228,233,252,31,65,60,175,210,54,253,216,36,231,199,157,53,18,37,129,112,112,66,231,54,255,226,104,79,125,150,1,108,34,150,206,64,110,77,146,25,237,88,189,165,147,72,69,37,111,26,60,32,116,55,160,38,253,112,35,133,55,188,153,158,165,221,110,122,112,174,151,173,20,154,71,252,156,147,195,133,161,47,23,242,208,111,188,201,192,177,20,236,161,246,255,92,154,148,41,119,126,74,77,86,104,112,214,94,95,23,200,50,45,108,100,208,218,178,209,238,177,170,42,230,174,59,137,248,126,17,83,247,149,166,242,66,100,33,240,9,60,96,201,110,238,251,184,201,176,250,175,111,42,115,222,33,141,223,58,58,233,126,250,120,84,199,4,164,2,29,37,53,245,193,18,147,86,137,220,245,89,22,47,25,26,151,11,244,216,102,146,69,163,199,16,179,3,199,42,51,152,245,126,239,64,230,111,149,17,206,146,39,211,174,192,230,197,88,214,168,74,123,135,119,51,151,104,64,164,215,166,201,13,10,110,121,28,189,133,191,73,49,130,212,126,6,159,127,243,79,120,32,92,235,99,107,130,73,168,166,168,211,137,184,62,195,218,108,2,102,83,152,122,248,235,237,242,118,218,64,140,241,35,116,240,134,120,73,196,241,197,108,176,47,40,23,83,23,89,82,37,171,133,5,83,108,66,196,68,75,190,203,127,189,96,226,23,33,82,167,120,65,203,16,53,51,240,106,98,71,115,195,234,153,215,202,198,115,22,87,129,2,175,12,184,151,143,156,16,96,101,242,249,86,224,123,67,11,156,234,171,116,162,56,64,71,61,251,169,4,105,226,41,220,127,5,93,223,106,110,171,227,195,247,160,202,104,77,98,40,102,223,47,173,52,161,12,207,8,117,188,187,38,152,255,227,247,44,125,65,200,204,80,226,12,83,69,156,208,84,215,77,151,247,186,44,191,128,116,117,254,28,238,238,134,16,236,148,29,85,97,13,10,8,111,24,252,107,205,183,69,171,161,28,98,186,219,131,26,68,127,195,232,26,93,197,69,41,16,187,195,242,181,135,135,51,71,207,188,61,230,170,126,20,228,71,46,232,174,13,52,42,194,173,158,116,175,172,71,247,232,133,49,100,122,168,79,133,89,128,212,242,32,220,202,18,175,91,144,153,14,229,85,102,105,223,175,86,153,235,38,194,77,152,203,128,14,72,253,251,194,125,196,100,104,250,112,226,71,207,160,187,130,145,66,23,3,151,6,15,237,76,37,188,238,250,27,4,37,137,71,62,242,214,34,65,108,227,65,18,181,149,105,227,208,213,77,142,9,60,68,54,132,62,168,56,68,156,114,158,210,102,203,163,146,197,58,221,216,90,245,60,49,144,200,23,22,55,82,173,194,166,121,211,184,230,148,220,178,198,180,122,148,124,63,242,115,45,13,23,151,183,250,118,63,254,70,22,17,59,243,45,123,24,187,91,219,238,47,200,16,249,20,144,154,192,111,57,49,150,75,154,42,233,48,20,92,101,129,215,193,151,166,21,103,119,186,75,252,196,23,225,212,118,234,248,91,166,166,69,144,177,96,62,239,137,108,126,51,53,169,232,62,40,186,40,220,142,150,87,152,250,208,253,131,59,39,34,7,204,217,191,117,1,19,152,157,104,108,81,150,103,157,23,59,164,118,57,46,64,107,233,24,188,187,185,254,81,121,170,177,127,16,50,200,44,132,226,206,103,90,113,209,241,6,168,127,29,105,137,98,224,126,108,199,104,188,152,200,165,42,114,242,104,196,15,120,101,32,220,136,120,100,136,255,254,210,121,87,55,90,36,74,46,171,123,28,51,73,179,62,8,77,9,141,140,220,32,193,213,245,89,211,145,119,34,162,99,65,170,90,194,220,226,102,134,102,113,141,46,153,124,17,138,117,150,155,128,53,21,189,183,66,215,133,225,208,229,6,142,213,244,19,19,178,88,174,170,162,109,9,45,216,146,120,29,29,58,2,255,206,60,236,121,199,101,90,176,38,70,229,186,50,142,95,14,106,107,181,243,140,17,153,52,255,174,152,254,22,181,48,108,65,33,111,198,188,111,81,194,118,13,10,158,90,212,195,12,164,177,13,159,24,195,252,108,138,165,157,98,54,255,169,176,36,199,64,176,174,162,137,105,151,144,206,169,84,40,132,74,212,228,208,54,196,11,80,171,148,176,58,212,128,33,112,12,85,36,125,142,240,114,227,39,232,129,249,148,177,192,196,143,227,100,43,252,165,232,36,242,126,142,215,20,146,25,200,214,203,105,22,103,87,7,204,55,66,121,236,190,79,20,232,102,119,167,243,38,75,113,221,222,76,230,181,119,178,84,151,33,50,229,126,110,94,147,195,207,234,95,228,192,207,118,30,146,157,60,77,113,109,236,89,144,132,48,59,39,23,147,88,148,35,185,66,219,184,147,169,143,104,12,15,88,201,139,38,73,37,170,20,30,101,227,92,58,76,182,39,18,8,222,112,135,13,151,173,3,171,64,131,189,36,209,6,56,42,130,239,185,140,67,228,253,39,114,135,65,187,81,51,129,70,21,160,3,76,251,189,3,108,91,111,98,37,56,206,76,25,37,191,207,64,218,202,155,76,40,67,195,87,21,47,13,111,95,126,50,255,200,78,233,157,229,240,189,115,233,11,40,36,106,165,219,79,121,194,35,70,49,199,200,71,162,174,90,100,129,203,109,79,241,245,160,210,221,208,239,149,210,144,73,146,92,209,118,132,112,216,161,54,118,15,249,237,74,193,28,143,254,185,59,207,43,176,145,200,179,78,77,252,242,11,151,174,164,100,243,94,108,102,220,238,73,82,166,171,250,222,221,161,21,130,111,22,46,220,142,124,170,172,46,146,252,8,218,168,132,218,121,51,91,96,209,44,68,104,43,71,194,228,14,22,149,166,249,45,39,208,150,101,163,24,203,14,119,199,74,86,159,112,51,94,206,152,88,6,188,144,91,96,8,155,206,247,145,4,157,2,29,151,205,43,244,9,41,45,74,106,241,30,251,150,6,141,254,128,141,145,188,27,126,65,182,96,179,112,223,185,61,186,28,131,113,87,216,154,105,29,47,212,4,77,218,40,89,252,51,20,152,92,80,100,243,150,150,119,67,29,155,80,205,159,84,121,138,192,22,14,224,164,100,69,156,218,191,183,130,54,116,36,40,56,66,71,15,184,215,113,55,154,40,245,225,144,90,100,139,100,44,206,191,59,165,191,165,84,193,12,186,40,95,75,166,253,100,155,226,204,72,239,211,146,143,227,168,206,55,203,88,184,126,203,71,213,147,13,219,227,250,127,202,126,133,88,255,125,125,159,13,28,177,140,153,81,43,218,22,16,119,186,242,80,106,174,156,103,202,174,0,195,226,122,79,5,28,120,94,228,227,193,44,152,17,99,193,2,166,209,41,31,3,147,46,146,206,83,208,4,76,61,201,39,73,188,150,243,154,119,224,114,207,27,24,22,15,64,45,238,211,134,195,215,220,206,7,219,213,54,121,230,247,118,150,179,110,33,44,82,84,6,9,241,181,219,11,178,209,94,24,152,72,146,157,181,96,176,30,195,214,20,138,28,133,8,108,65,247,181,146,7,31,8,170,117,59,179,18,75,169,240,127,227,49,158,255,143,168,108,255,234,104,104,21,152,124,136,251,183,202,195,55,59,41,206,86,190,37,244,114,158,87,238,6,154,94,229,127,142,194,245,244,129,214,197,145,166,125,235,204,126,156,248,112,79,252,173,197,30,211,199,87,82,74,108,7,102,31,230,149,68,162,186,40,51,97,82,104,54,65,105,90,19,97,50,129,205,111,221,126,45,183,63,32,74,237,233,203,109,153,217,33,231,43,90,126,101,102,9,54,252,215,146,114,177,186,97,241,0,238,94,239,171,136,56,111,22,103,48,159,244,168,134,118,165,147,145,216,225,196,11,236,248,229,102,174,55,119,85,243,211,23,152,84,119,61,5,166,54,208,55,52,48,211,96,240,236,85,79,53,72,223,154,54,103,5,209,212,92,75,57,204,131,82,141,82,83,33,184,234,80,251,233,147,171,245,182,109,149,133,13,112,193,94,123,193,254,31,191,164,39,217,89,211,208,54,121,254,131,255,192,158,243,251,139,122,92,123,248,102,203,216,37,179,61,91,129,56,169,149,36,145,168,85,180,17,55,127,36,4,158,220,88,211,81,172,115,97,163,193,173,180,60,64,168,183,79,169,123,109,143,67,63,148,2,179,114,187,41,31,236,247,209,164,155,231,173,109,155,236,104,134,85,26,175,130,22,203,195,76,112,0,35,13,108,133,106,149,82,89,161,65,156,140,88,213,214,28,244,136,102,189,74,125,4,183,13,10,171,78,113,97,118,244,45,168,210,182,93,147,216,214,147,210,41,182,243,229,129,209,166,201,74,21,113,59,182,63,177,195,113,122,63,225,8,45,254,211,196,237,142,253,215,234,103,61,52,255,238,39,248,216,123,14,213,178,115,7,46,208,38,35,100,37,208,175,135,17,167,223,21,144,138,198,228,80,190,70,247,126,152,161,128,44,187,150,255,202,97,184,233,64,49,145,34,205,156,254,241,32,60,164,118,120,131,166,230,39,122,113,209,202,199,3,253,177,215,156,197,2,117,26,54,135,243,199,132,64,205,185,222,252,219,39,170,190,192,9,136,53,225,48,81,158,146,211,27,160,128,247,75,211,158,116,56,23,96,96,170,211,201,230,249,66,216,87,139,141,235,27,46,133,11,44,106,246,152,238,23,86,138,148,61,107,25,169,180,53,179,46,218,117,72,96,227,204,167,146,73,203,97,115,172,11,209,223,180,125,2,142,167,195,185,70,72,79,204,182,18,4,143,68,71,176,200,152,13,174,53,246,17,123,76,181,160,71,60,117,26,201,194,121,129,112,245,167,168,145,104,33,210,212,119,132,239,62,24,251,97,235,128,109,18,180,166,37,43,112,115,142,177,45,161,144,247,183,160,122,223,233,115,214,221,32,146,195,201,55,126,133,65,72,156,43,4,21,236,17,129,55,203,248,184,228,47,5,103,29,88,52,174,13,10,152,146,40,244,116,196,78,0,78,22,123,45,79,185,59,16,135,47,248,143,105,6,206,252,70,168,209,149,228,61,112,220,218,195,20,103,151,56,8,115,212,98,218,11,209,97,199,80,176,217,162,16,95,194,216,152,223,95,160,53,35,58,221,94,118,195,213,64,1,88,194,242,60,165,105,13,10,58,97,208,246,114,122,195,186,17,232,150,201,250,28,47,18,48,68,210,62,91,167,240,57,175,20,179,188,24,185,42,84,252,248,103,151,45,192,173,55,32,89,1,195,200,90,64,88,233,118,123,118,165,210,36,35,73,213,223,12,91,255,53,248,161,240,109,234,23,130,121,25,255,228,98,146,232,241,116,87,19,194,173,152,247,79,208,55,67,28,191,6,240,141,11,129,57,12,103,182,28,131,95,74,254,224,61,70,107,23,83,159,83,214,13,57,128,91,21,67,74,1,154,9,86,244,24,31,142,216,129,158,65,116,30,61,233,81,93,65,172,242,56,139,121,35,149,122,21,209,28,242,12,75,204,13,10,213,106,212,116,31,153,237,95,157,0,93,98,42,230,51,90,62,95,129,102,33,32,253,118,154,156,230,169,173,127,248,85,18,193,33,74,174,2,143,102,220,28,55,2,54,31,191,191,232,54,60,31,56,193,174,57,70,69,59,161,143,0,163,71,48,179,72,255,228,8,135,55,11,5,102,173,38,148,29,60,75,108,38,139,38,102,110,81,194,55,226,239,24,181,147,96,150,92,23,73,38,44,54,56,50,200,228,27,11,92,135,30,95,86,242,153,156,221,92,67,196,168,49,208,63,203,17,212,212,128,131,84,93,237,34,48,242,99,49,47,63,68,124,188,54,97,244,111,216,138,3,166,121,227,61,8,254,223,142,189,39,247,211,106,243,88,152,159,196,19,17,67,33,171,217,204,13,10,234,56,57,196,100,221,128,227,35,28,61,13,10,206,119,85,167,251,224,26,242,166,108,87,169,20,103,60,14,186,37,116,113,238,142,137,5,156,89,164,220,59,187,139,112,66,131,131,122,118,255,0,101,87,182,50,70,0,44,117,171,215,6,255,98,242,238,234,232,210,12,228,108,116,219,137,236,244,157,20,34,184,79,180,5,180,114,45,62,62,13,10,58,47,141,131,155,12,152,4,34,218,97,12,132,187,245,46,123,70,184,179,207,122,176,81,72,160,119,108,102,197,167,152,168,184,98,223,49,75,12,59,67,61,210,179,1,245,126,151,244,65,183,51,87,202,84,240,61,178,32,148,54,19,218,34,71,89,133,101,71,150,193,245,115,87,244,245,174,205,63,219,243,136,170,253,57,177,237,140,222,184,240,80,222,127,40,124,41,253,67,248,46,247,33,1,74,98,165,187,177,251,12,217,227,157,52,169,85,215,77,85,22,146,35,225,210,201,36,42,164,121,97,79,114,103,150,26,78,22,151,170,252,207,18,74,140,240,68,136,177,90,141,143,34,36,251,88,230,237,172,110,66,216,44,70,15,85,34,253,248,13,114,202,158,111,227,251,19,171,111,185,118,186,93,39,152,115,101,14,125,160,42,151,211,132,243,126,240,135,115,35,161,103,123,204,205,136,94,148,13,10,177,121,201,53,175,144,207,2,17,194,29,50,240,4,112,103,69,183,61,124,42,177,30,124,90,160,140,171,227,80,143,98,238,104,160,89,194,203,37,71,79,220,27,135,203,163,212,235,39,77,29,171,239,211,27,93,43,209,12,114,78,205,137,92,77,12,110,7,72,109,57,221,56,254,190,5,229,168,199,150,193,64,60,163,155,185,203,3,255,158,124,27,109,9,130,244,98,17,0,147,144,202,243,223,88,39,140,44,241,145,149,121,192,234,193,139,20,180,177,94,71,180,243,175,109,17,137,13,93,233,36,172,144,99,255,144,52,220,167,139,234,122,217,206,12,119,133,153,128,62,155,145,231,172,178,77,226,199,105,230,60,105,166,38,64,31,150,243,155,21,62,238,11,33,222,54,161,211,45,193,62,247,211,94,40,129,4,142,181,140,247,254,248,61,180,161,77,182,107,212,147,73,190,51,68,141,47,98,216,159,175,35,161,110,100,3,152,89,172,188,37,49,127,32,189,33,38,105,82,150,183,50,102,141,252,63,59,118,94,209,29,184,166,23,58,204,252,203,171,126,238,4,23,11,228,78,2,13,60,203,252,39,94,115,113,230,208,161,47,148,20,125,100,186,222,82,112,227,16,208,187,195,229,27,210,70,240,247,60,253,134,141,196,72,13,189,134,61,59,117,97,131,149,17,221,101,38,86,170,233,51,65,239,87,135,58,96,77,176,139,180,215,169,179,22,69,59,107,176,200,202,77,28,164,42,79,110,33,165,247,105,122,105,110,192,203,17,173,229,59,87,198,52,45,115,242,158,26,102,184,100,5,82,143,234,76,116,212,136,86,104,66,193,2,189,23,103,160,123,107,164,130,170,97,230,220,43,191,237,176,242,196,144,48,70,74,71,38,158,136,146,36,109,224,37,122,9,31,50,239,207,7,116,199,26,196,50,104,165,103,196,161,188,205,143,2,58,39,139,193,232,48,156,66,95,0,114,217,217,207,140,95,31,101,242,192,15,110,25,43,152,222,145,98,195,29,13,10,65,235,208,204,109,113,162,155,204,98,64,255,232,90,213,216,188,13,235,133,153,143,59,41,132,231,58,178,196,134,178,215,147,81,39,238,250,199,251,127,177,6,95,67,91,232,163,232,50,123,210,17,211,150,7,195,203,7,242,225,119,204,41,82,227,84,240,186,120,138,193,35,153,56,131,156,221,46,117,250,171,113,115,41,29,33,44,196,107,225,85,31,242,215,35,190,145,106,42,196,106,207,225,141,212,146,127,176,113,210,193,137,203,26,193,206,154,209,251,207,46,8,94,80,23,73,177,239,100,169,132,87,244,31,164,141,43,233,168,5,77,61,107,99,89,213,132,151,236,113,3,55,187,255,99,106,61,54,216,24,29,103,130,236,136,235,195,203,179,44,216,67,113,43,71,81,119,93,250,22,51,104,185,71,243,144,216,171,222,74,177,86,251,66,81,155,77,34,33,38,178,246,149,241,167,18,220,41,225,91,202,237,160,181,144,19,209,65,173,215,204,222,78,30,59,179,176,18,55,178,5,163,135,8,80,142,48,77,215,37,211,175,8,94,238,176,217,82,82,244,244,43,102,2,0,150,234,81,159,34,164,232,108,5,22,81,107,123,219,11,177,88,97,158,218,92,185,222,248,90,224,142,86,87,109,33,72,36,23,246,65,42,182,42,25,33,151,196,184,49,215,178,139,33,126,147,109,72,63,178,77,116,182,14,164,226,119,169,204,239,13,37,249,186,252,142,208,91,250,128,50,92,60,2,160,166,51,196,36,214,115,247,64,220,27,190,235,212,154,108,77,103,234,0,80,163,78,151,153,125,214,119,38,106,57,179,79,75,63,66,202,6,190,58,127,43,97,57,205,184,8,184,152,19,169,75,92,40,115,45,96,99,59,89,194,219,153,226,165,80,249,136,25,33,123,25,94,198,228,122,121,13,148,21,140,35,71,55,168,206,31,205,168,12,72,207,186,250,19,74,239,21,107,243,57,17,141,152,209,20,236,234,233,226,1,143,14,124,96,236,167,186,136,31,190,127,123,181,86,252,21,132,45,105,77,248,178,3,109,161,9,208,13,25,207,235,247,200,153,59,185,47,210,157,87,141,1,69,78,37,252,245,250,127,54,26,115,66,153,213,37,22,193,174,198,113,11,231,33,137,128,134,144,237,213,179,105,209,158,243,7,30,139,253,131,75,221,91,100,223,106,111,143,170,43,212,85,15,219,154,230,142,202,93,82,86,147,166,173,165,59,147,199,165,115,110,147,175,175,206,237,38,167,42,220,77,158,55,179,45,215,59,163,190,135,248,122,206,38,164,119,36,73,234,137,120,238,22,119,159,94,226,215,131,238,253,180,144,61,237,90,245,133,201,56,168,1,86,185,119,130,152,180,103,138,182,96,148,35,65,89,39,189,97,140,39,188,110,247,225,238,104,243,143,95,254,235,42,27,214,161,159,188,20,75,41,102,247,47,218,32,80,42,235,239,146,18,229,195,7,247,200,180,119,255,137,101,79,144,247,190,90,77,33,178,77,13,134,118,34,151,238,225,160,203,88,173,175,198,186,39,211,37,223,13,246,191,186,240,63,130,151,201,228,239,30,24,78,255,156,130,236,127,219,2,47,161,126,131,4,157,186,120,227,121,222,171,243,228,121,232,117,15,79,16,122,71,245,27,126,197,130,98,229,42,48,204,147,67,207,155,146,207,203,79,110,123,91,107,59,97,171,116,234,34,141,142,3,20,255,70,216,11,121,133,18,108,2,66,6,120,107,214,243,103,253,33,31,113,152,106,228,221,87,171,216,174,131,205,104,54,162,216,229,157,80,225,166,231,42,215,188,234,221,114,5,140,162,165,97,137,64,15,18,148,225,192,172,103,233,17,104,64,212,204,21,158,88,72,179,6,42,219,96,63,179,186,117,208,35,8,209,54,32,175,187,115,6,94,81,113,131,57,142,129,78,112,26,83,217,80,206,156,41,197,153,240,225,4,71,7,162,225,131,58,94,155,64,253,236,214,104,59,106,210,244,216,195,74,248,146,205,90,161,158,232,73,210,186,178,212,145,234,27,27,209,130,231,124,171,19,20,13,10,65,111,3,233,210,58,159,51,216,250,130,79,115,227,124,120,46,61,66,97,108,28,165,137,75,4,180,151,122,184,79,96,101,13,10,35,150,136,7,182,143,240,183,74,124,32,224,160,67,118,232,215,83,83,90,226,232,143,225,183,198,136,68,24,194,113,22,226,50,117,225,129,104,79,55,91,69,242,180,248,73,72,207,172,254,12,53,2,61,128,44,178,160,115,117,112,75,70,54,63,197,175,237,227,80,105,116,132,172,96,94,50,40,163,229,39,166,71,40,236,239,234,140,4,201,70,70,53,157,13,11,154,184,87,139,218,181,62,76,167,31,242,54,217,220,47,223,167,202,194,95,202,220,225,164,216,6,57,213,29,130,133,190,134,116,20,142,233,156,232,189,79,87,54,7,198,201,57,247,109,196,220,38,170,133,28,237,239,180,148,26,203,100,31,159,49,2,47,220,201,247,103,198,151,212,17,125,76,26,174,11,227,200,254,147,123,102,214,32,25,245,173,140,90,122,135,94,217,174,234,202,16,237,240,6,105,76,221,254,156,109,209,202,53,167,193,153,155,75,212,83,90,123,128,89,120,125,143,229,60,72,129,194,245,20,34,230,236,156,248,19,230,174,173,166,16,251,113,202,173,57,6,136,156,31,107,240,30,140,5,41,156,187,72,173,203,67,128,45,126,217,102,104,131,20,124,78,209,42,146,223,251,21,13,135,65,44,108,253,223,46,203,20,28,155,187,162,64,213,82,71,113,135,32,71,216,199,235,190,78,149,217,88,242,134,217,214,146,149,122,189,121,129,8,163,98,17,176,87,50,39,126,145,244,18,59,95,16,197,22,69,186,90,111,252,39,180,150,114,154,20,170,144,104,231,77,100,113,105,15,215,215,71,161,231,196,237,252,246,170,207,79,14,48,141,127,249,152,248,102,244,171,215,190,210,195,123,15,95,22,8,71,82,198,83,220,174,20,177,38,46,26,72,61,248,101,192,92,139,55,87,184,44,205,122,195,239,52,172,213,111,178,244,190,174,29,108,157,38,90,239,133,151,69,239,247,241,247,15,216,80,4,192,135,67,71,37,188,151,229,115,14,47,126,215,13,141,191,14,32,139,163,140,236,14,135,235,25,184,133,24,161,202,13,10,62,215,66,200,17,170,74,71,11,50,134,198,121,142,68,236,70,6,109,85,24,61,142,150,24,182,102,45,56,111,176,66,168,173,73,191,83,189,31,68,200,88,199,244,194,40,232,115,243,60,246,197,163,195,250,214,233,232,179,19,177,107,229,224,177,172,78,6,150,244,248,13,10,88,22,214,157,255,104,204,122,139,11,217,230,16,2,108,92,180,186,82,240,185,104,177,113,140,92,160,95,217,25,29,2,211,207,171,219,150,199,33,66,81,81,191,61,160,231,0,14,20,251,21,94,117,216,225,185,165,157,6,82,64,26,86,210,194,115,176,210,55,214,43,50,7,5,167,176,94,204,218,222,105,115,46,23,87,1,233,237,139,114,59,47,139,227,173,32,43,49,22,114,129,92,11,234,255,133,109,113,226,45,124,50,221,106,37,237,100,82,173,245,56,210,104,239,208,186,1,247,83,4,97,146,106,233,101,39,200,228,1,248,199,76,241,123,155,13,252,49,194,47,181,114,44,18,3,103,255,110,9,121,214,202,17,15,48,209,239,159,7,164,144,129,47,4,247,168,2,211,123,183,180,98,112,196,79,17,232,86,208,130,238,61,24,129,123,60,173,70,100,140,138,56,72,176,223,220,228,71,207,242,238,37,232,39,155,43,201,165,157,144,109,235,122,121,167,138,80,160,133,191,154,108,106,130,218,133,42,82,8,79,196,200,21,99,174,128,254,92,118,245,152,18,84,127,55,227,189,103,197,243,47,245,126,189,34,255,226,77,235,42,82,6,88,152,169,56,3,102,4,97,168,227,98,44,176,26,0,67,32,18,34,165,74,63,237,82,6,147,202,4,75,95,204,218,131,126,109,164,13,109,126,39,81,106,216,177,197,122,183,87,136,231,78,40,169,183,133,17,122,138,238,193,144,159,167,103,165,6,125,254,204,119,167,27,63,37,52,139,96,232,170,169,50,220,158,254,59,192,42,165,143,38,191,110,31,191,133,40,225,140,84,64,118,191,44,79,155,233,189,119,167,179,1,46,235,255,222,169,208,254,177,170,162,28,189,91,98,198,87,27,184,121,168,149,153,248,78,205,23,179,81,172,84,83,184,206,162,59,165,95,77,206,21,130,182,9,66,251,137,210,71,145,43,247,232,238,31,246,184,206,67,132,216,185,0,179,5,38,215,35,134,131,91,61,190,199,105,151,246,218,219,85,177,9,246,22,8,15,91,28,241,219,44,52,47,72,101,241,59,46,79,102,100,168,53,66,144,112,88,108,247,188,197,236,234,229,236,114,81,176,87,49,84,101,58,124,241,216,41,37,99,223,169,232,69,13,203,246,32,231,23,125,193,22,238,38,213,127,234,39,176,171,134,80,58,211,35,223,146,228,24,74,78,53,155,230,167,111,1,52,208,116,230,230,168,218,198,73,177,155,216,143,84,243,209,215,113,166,135,2,193,218,204,52,229,164,197,142,150,172,175,215,236,126,223,227,177,196,68,3,219,166,105,41,119,61,208,39,56,211,183,128,87,123,99,167,251,54,214,16,57,201,237,232,78,8,117,252,105,87,39,203,146,132,100,127,138,196,244,154,202,148,16,167,201,254,155,28,53,210,118,157,198,118,89,247,90,159,136,230,63,217,32,100,232,24,59,63,72,214,136,80,22,214,170,145,6,164,28,143,29,95,197,3,92,252,112,81,242,17,63,85,122,86,60,216,196,243,188,67,193,252,132,200,66,20,195,229,86,80,138,130,212,58,125,17,95,58,2,118,113,138,28,217,150,13,84,172,238,56,18,81,180,245,2,209,238,50,144,4,192,187,247,111,147,173,56,46,22,246,254,241,137,38,22,167,149,86,130,228,79,99,61,107,161,170,173,238,46,184,236,69,229,243,38,163,254,163,142,64,193,241,208,9,205,230,21,17,33,57,36,30,249,22,122,82,13,39,217,66,114,29,124,252,162,200,148,201,210,81,134,91,71,113,36,155,192,146,3,162,200,83,89,22,93,80,218,12,60,141,12,228,117,244,58,240,180,174,212,216,49,111,146,90,106,188,89,190,89,42,181,247,5,1,128,102,240,194,117,27,230,244,85,180,139,180,182,109,70,76,36,150,99,255,28,222,141,190,59,241,36,233,140,190,60,140,167,141,16,238,229,180,231,240,72,89,178,109,167,97,98,140,17,199,65,213,41,197,193,15,111,187,177,40,45,207,64,67,43,18,239,1,213,254,32,189,60,3,162,212,28,120,193,251,130,253,231,232,94,36,235,54,78,132,61,43,190,63,13,10,185,36,251,225,120,102,7,66,5,74,143,6,79,119,223,183,147,6,53,120,109,74,220,137,126,220,193,175,145,242,33,220,81,227,50,48,163,2,107,55,128,161,217,153,207,115,241,214,15,207,177,182,210,106,114,248,130,167,67,171,184,56,162,245,118,255,187,124,122,155,209,186,62,51,13,68,183,200,44,96,153,93,65,64,240,192,233,19,87,161,238,200,116,72,197,174,193,30,61,11,87,6,199,20,165,74,166,122,50,144,40,56,215,45,212,94,166,200,79,195,133,126,145,236,135,38,92,19,21,5,14,220,192,77,26,100,120,167,151,195,164,242,122,169,146,145,150,31,176,16,152,226,154,126,30,223,253,206,151,122,73,126,120,107,83,250,41,168,19,61,18,157,74,69,63,208,86,145,189,59,222,51,33,190,229,33,114,96,236,232,233,37,240,28,26,209,241,86,144,113,211,238,176,149,107,252,74,203,116,146,196,108,172,134,16,111,233,116,195,231,241,224,153,52,115,31,221,13,12,9,135,255,30,248,138,156,213,170,35,230,145,24,153,128,11,53,23,244,153,154,169,0,221,193,35,139,39,211,104,200,88,48,88,60,248,89,48,131,171,224,69,69,181,158,26,243,93,161,177,117,158,150,213,120,77,54,169,111,83,87,174,162,201,118,242,72,36,78,179,253,107,200,94,228,135,25,149,98,20,91,106,152,235,73,57,240,154,137,21,210,116,128,72,8,201,128,207,193,85,81,149,233,230,11,33,34,40,71,204,229,49,33,28,164,149,6,80,25,225,24,144,254,60,117,133,141,46,199,227,201,13,188,76,5,175,204,186,220,69,71,145,27,250,13,211,201,147,111,27,35,25,31,208,95,218,128,50,30,65,103,208,244,169,117,138,188,18,250,171,71,68,208,211,179,161,100,50,117,167,49,165,224,17,230,255,66,253,142,237,157,181,46,47,109,71,39,115,223,236,17,247,33,254,145,191,65,249,213,141,91,14,251,244,172,187,153,246,72,30,4,100,212,54,95,252,220,250,179,125,226,58,252,153,117,212,75,95,247,1,12,147,198,7,15,101,21,21,127,246,84,84,193,186,68,46,38,235,195,27,114,96,148,142,138,17,163,197,11,84,116,163,43,16,142,74,212,218,248,76,254,80,34,48,206,239,0,105,93,164,204,177,201,71,107,182,3,74,29,138,162,129,113,216,160,121,29,172,216,95,4,34,99,13,197,201,5,68,109,58,18,21,125,225,88,132,248,20,206,35,120,121,52,239,9,219,126,92,225,87,45,108,238,174,81,188,176,241,52,118,97,189,218,88,15,207,151,160,72,157,1,116,231,19,185,118,28,135,177,210,72,244,54,65,120,146,72,239,150,77,183,6,83,182,18,146,182,158,196,200,156,254,84,90,52,52,239,53,98,191,133,191,228,220,240,200,231,180,233,43,243,21,90,43,81,19,122,198,138,61,126,187,30,98,17,30,80,160,110,241,243,240,7,233,177,92,196,23,245,176,64,114,247,0,247,24,206,240,226,234,70,241,88,59,37,62,141,121,136,141,23,234,195,95,97,156,210,71,32,229,204,123,142,148,81,75,56,254,168,131,42,85,32,94,236,165,105,193,43,138,8,27,237,16,23,222,102,195,70,127,99,233,255,77,211,207,127,90,101,13,7,206,209,77,214,194,221,63,94,37,131,254,175,115,206,19,51,82,55,121,182,40,247,170,121,118,134,70,213,110,36,2,93,62,25,4,204,156,31,199,213,170,118,99,84,203,98,161,98,231,92,132,170,115,246,130,214,83,176,22,11,88,111,126,180,67,60,19,74,248,162,23,244,182,232,6,53,113,113,3,157,165,246,222,124,6,219,247,244,158,192,240,67,235,170,51,89,42,182,232,138,161,110,157,29,173,203,117,12,229,59,175,163,114,230,209,215,112,96,174,36,249,230,78,72,42,31,57,119,250,198,143,161,53,246,24,249,197,88,157,128,219,37,16,198,209,40,131,220,127,108,173,55,44,191,251,37,135,163,103,107,21,67,216,167,95,229,192,103,107,211,49,102,0,75,187,153,13,227,4,171,213,249,17,210,98,200,234,237,128,75,87,153,104,171,37,73,20,151,224,15,139,139,220,144,42,34,24,253,241,144,139,189,119,42,3,43,12,122,193,78,202,252,84,245,72,149,157,189,135,8,66,128,209,222,220,61,215,23,24,137,165,118,79,143,13,10,208,189,100,202,206,203,5,206,15,240,241,158,22,89,107,201,54,198,69,200,21,111,128,8,186,87,160,92,47,179,118,92,78,95,65,241,234,131,223,121,5,71,255,35,200,96,194,51,133,165,62,77,168,87,255,14,80,251,51,209,132,128,127,177,100,208,238,85,37,202,222,248,98,38,69,242,102,96,186,41,26,216,32,165,58,206,242,56,101,147,242,167,174,69,109,113,112,180,81,62,241,137,16,200,70,203,50,234,86,137,54,7,40,252,129,170,200,102,28,191,22,44,109,214,114,139,53,200,76,195,253,39,53,166,108,156,213,60,95,171,57,128,86,191,38,239,60,135,124,194,241,113,176,82,199,95,40,237,218,142,225,170,75,173,4,118,236,133,102,14,252,183,1,164,84,36,127,153,169,238,31,111,103,160,214,93,201,173,91,70,60,208,59,100,22,243,43,104,109,47,109,252,246,107,107,5,19,59,244,221,39,213,7,215,255,12,11,103,166,85,249,81,17,236,119,100,123,108,235,78,104,79,60,200,241,73,90,41,192,131,118,29,96,19,210,2,164,5,164,102,45,8,215,7,23,15,119,158,198,153,64,180,157,46,15,45,47,48,73,38,237,7,149,239,89,82,198,79,209,184,141,125,181,82,125,166,255,175,125,62,94,3,117,69,114,203,4,233,133,237,18,94,102,236,192,120,13,10,241,137,62,233,218,170,224,29,168,193,138,247,56,88,75,38,192,203,52,43,222,241,141,165,90,96,128,169,234,28,202,52,147,13,232,48,187,232,110,32,80,29,251,137,147,204,41,68,228,113,47,101,129,141,56,155,128,128,171,90,253,195,88,33,190,231,211,114,197,138,130,56,205,126,59,235,135,146,172,130,165,22,167,81,187,39,118,86,225,236,181,6,127,200,4,211,22,167,84,37,54,59,44,161,84,112,74,88,124,166,200,120,219,182,204,112,154,79,68,178,106,36,189,197,54,227,78,182,112,165,165,70,22,97,84,147,57,181,149,254,140,221,146,171,112,189,82,92,231,228,183,167,218,247,13,56,98,182,238,196,22,244,8,147,167,17,129,215,152,146,31,138,206,12,210,22,55,84,135,3,45,24,99,180,182,21,92,159,139,237,244,34,203,19,13,10,40,195,57,142,213,120,12,196,34,176,88,156,158,162,141,95,171,5,215,42,226,163,64,139,74,213,63,40,172,153,191,216,49,51,5,75,75,255,189,239,24,20,95,71,56,215,50,18,148,148,99,13,174,218,126,155,38,117,111,100,86,75,172,124,217,210,76,59,237,230,7,40,20,245,138,105,168,100,58,234,208,156,3,219,126,41,29,1,26,238,179,20,220,9,117,71,30,205,36,156,27,74,225,133,252,109,70,243,203,229,98,40,84,99,32,210,172,244,153,45,139,196,207,117,200,202,108,230,228,75,220,162,161,214,68,224,254,173,225,206,241,180,136,157,225,85,34,196,30,158,106,85,41,155,238,202,127,191,71,92,72,29,9,220,5,242,70,245,182,115,208,143,54,140,132,176,68,0,13,6,71,148,125,247,61,127,208,133,165,113,115,199,236,215,82,135,140,103,116,138,141,99,19,76,228,248,51,147,128,130,238,194,58,127,162,188,114,246,168,66,92,178,207,69,205,213,29,9,106,163,112,234,119,141,127,29,12,52,26,21,172,120,116,169,239,16,174,188,203,211,219,63,38,253,151,232,163,105,62,204,112,113,254,235,254,99,204,81,120,229,228,205,171,71,232,82,243,43,186,15,45,237,226,149,213,142,190,143,247,114,52,161,162,86,141,175,163,2,5,68,165,168,245,232,254,234,113,93,13,10,204,51,75,175,43,244,33,97,137,45,222,57,226,186,2,255,103,166,42,86,86,67,238,132,104,189,218,155,252,51,76,146,139,230,99,184,43,95,58,195,122,207,138,186,20,237,19,220,78,171,15,65,101,164,77,144,125,139,93,94,73,3,220,236,101,114,225,141,113,208,211,191,32,37,109,58,249,20,229,140,154,236,122,189,170,106,86,158,96,178,184,31,169,97,45,211,156,118,123,115,142,89,194,189,36,25,116,192,242,232,231,166,255,178,239,215,160,32,131,251,23,105,155,78,87,125,211,235,115,235,88,69,138,229,149,26,237,17,90,233,212,198,118,40,247,202,176,47,149,77,156,28,225,214,51,87,218,59,205,67,12,164,206,130,243,244,208,58,44,65,68,219,81,146,70,137,255,69,228,31,70,117,25,83,104,242,15,54,109,77,156,183,156,92,185,73,208,11,104,134,209,213,117,147,253,83,105,48,93,111,189,129,133,11,155,107,244,51,129,95,8,161,236,33,23,44,170,124,7,97,219,125,244,189,225,223,100,160,162,251,18,84,63,92,240,120,27,35,132,207,196,113,191,118,2,97,13,10,183,247,32,54,142,53,108,152,205,230,104,35,227,176,240,110,185,23,20,121,105,239,131,25,85,250,165,145,219,153,170,17,60,209,218,216,200,250,60,108,48,86,156,120,135,139,87,5,9,56,147,145,177,173,63,152,216,27,46,20,219,46,155,95,168,92,254,162,83,185,182,63,61,15,55,179,76,111,45,201,213,91,248,117,18,140,82,200,63,24,139,65,63,5,119,173,110,33,97,78,9,63,159,179,54,60,170,86,134,237,124,71,181,167,135,43,48,204,172,119,195,69,39,24,204,241,78,17,44,169,23,181,234,194,189,87,100,214,160,21,27,205,52,142,207,44,118,118,182,189,170,151,55,194,87,196,138,92,190,34,245,149,254,182,242,253,164,83,181,72,99,89,219,253,225,105,153,60,77,194,9,124,207,123,47,44,48,146,183,138,143,103,105,1,44,77,37,126,253,153,19,82,252,116,65,4,251,200,17,178,77,180,184,156,129,70,54,225,241,192,134,77,65,31,207,64,52,175,12,149,26,8,176,19,35,39,24,23,82,131,93,166,8,253,168,86,117,231,97,187,114,107,43,96,245,196,147,222,132,255,201,52,90,21,207,59,255,81,33,207,38,9,160,33,190,240,46,212,214,66,42,207,169,176,151,163,39,129,68,9,132,59,19,122,192,224,57,99,113,42,110,173,15,33,33,169,15,103,189,28,152,247,254,26,113,44,198,27,198,12,136,9,24,167,80,17,139,207,172,37,248,212,56,226,131,12,97,110,11,28,171,71,152,182,22,191,206,38,219,24,21,216,204,64,99,224,112,62,190,168,134,194,89,100,123,204,107,171,230,14,246,188,206,63,23,23,200,29,185,25,156,197,146,150,113,31,130,74,101,14,246,30,137,148,135,6,1,244,94,143,206,185,79,238,191,138,97,126,146,14,25,127,88,89,183,144,178,68,48,88,17,70,159,39,13,126,174,141,53,241,110,176,178,18,41,165,131,104,68,242,45,98,209,99,199,90,30,163,207,27,43,129,28,116,195,93,125,199,104,19,21,28,200,20,177,92,128,162,118,78,187,214,242,70,0,55,123,71,82,83,201,107,247,143,57,47,56,250,142,127,15,3,15,118,150,158,158,203,67,80,216,143,210,238,188,157,39,82,222,107,110,110,65,215,124,189,95,233,253,87,12,82,137,33,141,88,94,229,165,85,234,232,202,123,105,246,210,38,6,37,104,65,90,233,195,134,132,76,212,71,5,57,158,49,26,14,21,114,101,0,246,210,179,21,113,55,17,176,248,13,10,246,219,20,47,157,148,73,123,138,72,119,168,167,41,6,167,34,13,56,115,79,248,104,4,198,148,58,212,162,248,149,149,197,15,248,216,163,156,225,9,88,89,116,67,95,50,4,197,16,92,103,101,71,239,11,206,126,142,128,195,200,28,231,171,170,203,144,77,96,78,254,172,238,251,2,88,97,105,220,211,126,197,127,108,61,79,91,107,90,63,53,69,108,151,222,182,20,102,122,74,28,185,182,94,153,151,136,238,2,90,17,81,183,73,202,75,149,13,10,26,47,254,5,19,231,26,196,221,178,4,224,110,35,244,67,30,56,172,65,145,225,40,118,211,50,200,13,156,249,44,233,62,86,30,49,194,23,95,130,86,226,50,58,220,143,94,58,2,115,144,129,12,248,152,7,133,194,145,2,121,78,139,140,221,32,196,67,190,234,52,205,182,103,198,183,219,200,28,42,179,22,25,29,171,28,14,64,70,60,181,158,19,154,220,251,109,158,39,187,141,184,100,199,242,116,103,66,127,215,76,235,130,129,198,6,76,91,25,26,61,206,16,218,67,240,200,131,135,173,249,169,118,170,36,0,219,155,253,180,89,228,44,246,176,155,43,223,91,224,8,97,202,60,232,162,242,61,99,67,15,75,242,123,55,137,251,1,152,107,211,63,164,173,237,120,152,118,201,33,2,75,85,252,109,161,221,52,155,171,76,138,220,75,116,151,116,122,211,119,2,235,224,230,31,251,226,7,100,131,51,167,5,243,58,62,241,50,198,179,169,231,24,169,179,169,228,215,133,57,195,222,155,3,203,19,132,198,191,108,247,62,97,228,15,62,90,34,37,229,222,72,122,84,239,153,196,238,173,72,216,75,91,85,253,251,134,159,253,177,171,79,155,59,216,255,229,152,131,200,25,59,81,78,155,128,117,197,130,181,159,25,105,41,101,45,135,153,134,231,238,8,249,167,118,207,224,227,160,13,127,195,134,148,193,178,98,171,253,129,88,47,50,19,249,153,99,165,14,156,175,46,244,238,195,24,113,189,224,189,20,213,139,84,211,29,226,95,18,165,251,171,236,47,187,244,95,240,231,113,214,107,218,94,196,43,5,139,232,162,228,164,91,66,42,95,84,184,123,46,242,250,100,14,192,81,205,237,87,183,142,48,100,110,169,97,199,116,229,36,73,18,71,6,193,164,4,119,142,255,230,95,186,161,123,92,101,19,5,1,96,146,167,53,5,31,14,24,0,122,134,97,1,206,8,16,31,97,245,201,125,127,158,56,134,211,211,40,121,165,245,72,43,82,93,101,52,46,204,139,100,199,56,237,229,191,29,99,46,214,216,34,71,36,221,149,249,249,76,147,211,118,14,165,209,163,23,71,147,228,219,58,32,80,134,11,28,13,10,65,185,101,25,104,88,29,227,177,82,168,247,46,99,158,111,143,36,165,122,216,22,160,51,20,177,3,75,251,180,55,139,215,67,115,0,15,106,109,165,252,74,214,155,18,24,104,140,105,153,56,99,27,16,181,216,222,100,82,136,186,72,233,143,162,190,23,51,247,20,151,127,97,196,163,8,105,94,102,0,176,182,30,202,249,221,135,184,22,163,241,216,147,83,59,54,195,3,198,133,83,201,28,232,243,113,113,52,218,241,208,160,101,70,38,251,214,163,198,83,124,126,51,150,35,180,196,98,45,26,145,71,64,183,233,97,31,53,177,104,245,209,193,244,93,14,120,191,46,195,226,241,6,121,177,105,162,71,124,157,40,108,166,158,57,15,179,20,73,193,147,138,121,166,205,92,220,12,210,14,214,121,119,191,228,38,253,150,45,239,206,72,26,86,56,92,222,116,92,132,239,142,19,196,232,164,228,77,192,244,216,73,97,32,143,98,153,245,213,132,253,174,252,103,123,3,119,104,132,60,17,225,3,19,16,21,219,183,63,241,98,154,147,183,35,38,144,207,16,59,175,86,35,74,150,19,253,199,88,240,14,254,64,208,128,99,216,87,202,111,65,156,239,200,240,167,93,161,218,12,148,89,45,88,214,110,223,196,177,90,50,222,112,51,135,0,62,124,125,176,81,1,58,166,102,167,69,43,35,206,232,38,7,242,198,146,247,9,23,250,206,150,195,199,160,123,214,173,78,42,53,134,6,16,126,82,247,216,124,87,246,202,163,70,165,190,13,10,214,105,13,236,1,112,123,104,96,215,248,6,245,233,21,141,96,225,35,6,184,78,35,135,201,111,230,202,172,66,237,109,107,140,21,207,214,75,73,144,116,193,235,99,72,159,171,124,40,220,165,41,117,159,132,194,196,32,0,225,222,56,57,150,34,7,141,156,171,32,81,9,26,250,193,191,30,68,92,36,65,180,86,9,181,130,231,147,232,184,83,138,50,99,29,156,209,114,87,201,104,147,77,54,103,91,33,168,13,10,104,174,81,7,4,43,6,127,168,1,58,204,190,164,17,31,157,8,232,77,221,161,81,247,151,223,31,163,220,45,126,161,121,121,44,194,158,57,248,157,152,223,177,167,119,32,237,228,15,146,195,59,126,213,38,213,129,224,60,165,40,33,134,169,42,124,161,115,40,148,14,95,53,173,73,32,64,181,135,57,251,59,254,8,242,5,158,234,248,145,187,66,144,142,78,176,220,197,28,127,184,16,229,126,153,35,95,29,110,26,215,59,9,132,95,3,91,85,106,178,217,129,145,29,62,193,153,151,60,233,37,235,143,113,201,24,88,212,232,190,253,152,74,133,24,218,124,41,135,146,89,25,47,129,197,183,194,11,223,88,52,17,87,143,91,48,142,104,179,107,116,49,234,51,57,66,171,31,9,29,134,75,173,242,70,195,95,215,232,228,158,208,220,148,106,204,196,255,236,23,226,59,16,74,155,16,193,250,142,99,180,102,28,246,31,105,243,148,250,27,12,151,2,49,63,158,174,125,120,142,14,34,68,29,125,57,29,174,78,61,244,29,85,174,114,145,194,196,178,187,47,82,97,95,79,224,188,30,74,250,69,198,246,66,248,245,102,207,234,65,190,126,212,180,234,158,172,53,132,88,7,243,66,234,219,124,242,225,181,227,230,202,206,168,118,81,186,4,113,184,9,97,147,19,67,41,217,96,81,198,191,237,46,150,3,34,229,109,228,209,140,220,53,35,203,192,165,116,218,3,202,96,224,141,105,80,227,50,39,116,178,228,39,27,233,14,201,97,123,119,141,245,148,203,172,100,189,71,59,236,191,210,40,203,141,142,166,211,27,68,22,99,140,59,180,87,9,104,142,210,31,124,217,172,141,253,36,176,187,184,101,99,11,187,82,43,50,153,91,50,139,20,177,205,186,45,137,135,21,181,187,28,91,217,88,47,48,11,205,66,158,247,72,142,126,92,172,234,237,9,192,167,43,195,165,230,74,86,109,175,230,101,122,85,27,88,208,222,169,152,72,34,163,172,140,236,248,120,250,123,252,198,132,171,52,104,194,237,83,90,142,19,11,70,211,29,190,160,114,112,228,253,161,47,112,171,104,140,245,200,130,100,242,178,103,230,126,130,100,143,176,183,252,235,50,211,55,194,239,127,118,144,78,95,152,150,169,69,83,67,39,156,147,157,133,22,24,44,165,36,39,39,5,205,2,86,74,104,225,49,177,100,226,177,137,171,6,48,89,126,163,61,109,238,240,67,38,172,84,13,10,112,232,199,184,192,3,220,19,79,233,76,247,98,146,124,252,204,216,162,35,29,156,66,79,130,116,215,44,98,63,165,75,196,227,175,56,91,210,160,241,59,81,130,228,217,108,160,13,10,148,204,167,156,36,45,227,215,126,52,173,232,95,245,13,23,61,113,88,138,12,25,106,90,243,49,237,235,37,248,214,177,90,34,103,25,177,169,202,57,224,215,218,200,152,121,42,18,90,118,57,3,144,213,109,184,170,250,110,78,254,126,100,114,107,45,100,160,5,159,210,78,158,84,0,46,234,80,181,239,125,250,3,91,172,140,194,171,65,62,78,254,94,11,54,50,242,57,33,176,199,77,149,227,183,152,218,125,13,19,66,111,174,3,240,24,245,100,215,205,78,185,39,19,60,77,137,110,115,5,28,176,254,234,175,153,160,22,161,179,219,181,30,128,95,107,91,95,85,120,86,173,183,238,215,176,29,101,225,89,7,16,97,176,149,30,181,199,188,30,68,37,84,160,31,47,145,185,219,224,46,13,82,217,161,72,184,2,215,85,14,77,221,227,243,111,217,126,60,117,40,69,86,174,175,17,206,126,21,234,226,242,115,202,237,23,237,228,86,217,144,139,147,144,157,142,47,171,41,196,144,159,42,165,74,75,72,77,112,55,133,22,79,31,170,208,215,25,113,153,84,194,16,2,199,106,25,158,210,119,6,204,227,129,33,237,237,38,169,213,66,62,203,191,217,5,235,200,105,150,187,118,227,96,128,30,96,46,38,62,46,232,44,77,237,59,121,107,198,173,38,3,95,189,212,138,204,76,31,238,196,220,153,25,100,31,230,136,149,104,101,151,127,34,36,144,134,128,220,73,111,110,94,24,45,147,13,10,45,195,139,51,108,220,11,209,213,206,236,61,52,56,167,85,13,10,111,241,70,190,241,13,10,160,26,8,73,247,21,218,82,90,191,192,204,49,189,177,135,233,119,130,122,143,210,108,215,116,87,77,86,185,68,208,148,136,92,121,198,40,11,152,196,223,136,26,40,194,171,248,105,89,7,49,141,237,91,56,194,153,158,33,233,72,32,99,195,254,110,39,13,10,45,250,224,82,226,150,17,149,246,230,109,80,192,239,116,72,85,98,3,92,245,101,144,98,194,210,250,4,165,153,125,37,57,198,234,127,157,55,26,127,47,89,76,245,218,52,100,195,0,34,237,9,15,15,55,211,191,14,107,12,89,130,253,20,6,85,136,22,196,237,224,130,18,96,206,146,26,163,216,213,135,249,101,252,123,103,190,153,109,249,204,230,105,54,99,86,53,105,116,159,122,15,202,253,11,177,58,144,184,179,168,134,66,249,241,230,101,255,13,132,197,71,207,56,48,72,147,142,116,62,26,83,156,18,118,222,66,200,149,5,209,197,229,145,102,194,45,103,145,167,42,49,9,136,108,201,85,153,119,104,137,253,198,38,75,20,174,252,217,82,57,119,217,200,145,143,88,105,243,152,227,174,80,179,138,177,96,125,85,229,151,190,97,95,235,45,3,166,28,87,152,153,229,213,174,156,21,71,164,27,118,114,89,21,84,238,34,43,90,224,108,156,137,64,183,184,4,57,218,212,201,133,202,212,180,231,32,207,94,192,136,62,84,155,237,208,57,76,28,42,182,144,228,249,37,90,72,151,7,239,124,99,191,134,7,144,109,102,130,92,81,101,104,22,65,64,204,217,0,40,251,203,232,115,82,0,7,164,13,12,122,33,118,65,85,189,154,2,105,238,180,77,82,34,245,124,250,92,203,132,133,147,245,52,219,171,0,93,138,79,213,200,151,164,82,25,70,208,21,37,122,189,34,212,114,181,49,86,33,115,170,58,204,147,44,235,253,23,8,139,69,223,2,233,209,222,158,118,201,92,47,141,60,62,244,17,24,244,214,132,172,96,97,152,59,22,68,122,169,74,122,222,190,143,149,92,28,95,8,197,74,126,84,67,184,145,250,108,177,33,3,197,182,214,125,121,136,68,222,136,251,242,214,185,79,18,52,137,174,126,80,137,99,14,211,255,156,243,73,31,111,32,167,170,184,171,57,94,70,67,61,157,131,111,103,29,99,217,137,9,86,124,130,164,105,193,22,64,23,212,71,36,201,22,124,127,144,77,58,79,226,147,47,158,118,168,132,104,150,91,211,95,106,199,115,35,97,84,102,14,180,34,194,85,212,142,96,153,100,73,160,24,187,25,36,221,11,72,108,55,165,149,156,111,88,88,8,73,57,177,211,33,21,217,5,217,23,160,87,41,163,205,210,74,166,156,92,255,212,31,47,128,171,16,230,195,175,136,204,186,102,31,139,57,7,17,40,156,237,13,218,15,167,160,208,194,120,187,133,131,105,214,211,124,88,214,29,56,111,199,143,101,51,113,229,6,130,35,83,168,107,199,52,130,93,190,87,228,26,230,207,61,164,209,248,214,12,173,129,97,237,148,197,11,75,153,171,76,136,115,237,186,75,31,110,186,227,175,79,253,110,45,27,166,231,195,63,39,121,204,174,163,105,22,52,101,165,49,147,187,104,82,243,144,229,90,189,225,104,71,129,169,99,6,90,5,180,124,127,22,190,136,43,55,162,195,165,38,152,84,187,63,39,31,45,216,177,51,202,139,96,46,200,191,49,85,5,60,123,154,246,198,117,146,66,142,248,212,43,160,196,212,101,20,215,72,221,63,135,164,98,170,196,176,161,29,76,77,22,36,151,190,150,139,91,35,29,188,154,231,58,54,147,14,222,240,17,46,16,234,206,214,232,125,5,17,146,117,166,84,253,255,35,11,198,80,40,207,78,181,115,109,205,93,223,96,252,121,86,110,251,146,250,106,7,98,91,161,31,66,0,108,104,84,58,96,118,185,241,197,15,201,212,71,94,40,54,188,131,187,197,20,14,153,250,132,3,101,187,7,31,43,94,18,69,137,21,16,164,194,32,52,247,176,192,36,86,152,233,217,132,66,45,66,130,0,65,40,211,143,1,155,235,183,157,74,107,155,152,90,50,60,244,167,148,122,106,86,233,254,36,155,92,143,135,226,112,229,150,4,40,96,130,167,35,141,167,250,200,208,3,251,114,23,172,112,216,217,208,37,163,39,202,111,217,40,101,172,44,77,81,87,241,50,210,75,58,164,173,244,163,149,65,191,76,13,175,35,15,226,114,106,6,159,51,95,199,215,229,248,33,141,88,12,127,250,77,230,153,176,200,76,53,165,16,191,126,100,68,105,175,50,162,97,100,200,9,34,159,145,146,213,58,170,153,130,140,7,58,156,130,142,89,108,18,46,59,176,82,54,76,105,93,230,140,202,147,117,191,249,130,225,160,104,1,127,185,57,93,91,186,58,216,234,203,102,49,139,63,188,177,113,81,237,64,197,3,73,41,147,67,183,151,249,70,236,183,91,211,108,123,184,195,212,216,217,158,177,34,121,148,87,3,121,246,8,210,177,101,68,125,170,99,250,220,248,214,52,34,22,157,151,176,172,112,101,189,224,236,220,111,203,191,188,115,140,136,230,232,162,13,217,83,201,192,180,184,142,1,64,43,8,214,75,223,195,36,5,7,161,201,61,88,188,216,32,199,248,134,41,76,189,6,19,232,123,246,208,244,194,9,117,171,99,174,62,27,124,225,174,95,1,194,236,193,142,137,51,197,187,155,115,230,80,255,183,29,234,21,62,160,99,55,103,105,67,169,121,142,213,202,64,247,4,146,48,221,158,8,51,67,20,131,61,47,41,142,75,211,213,251,44,81,86,108,193,121,111,44,62,27,181,98,35,91,145,111,234,125,56,114,111,42,24,145,220,14,231,4,49,54,131,61,145,124,21,12,90,127,223,65,220,24,63,236,193,221,6,19,102,11,0,0,250,197,17,124,226,204,186,24,209,108,218,73,194,31,133,78,183,151,107,219,11,169,84,28,165,83,30,46,60,239,181,248,119,123,152,159,159,130,94,130,26,197,150,22,52,60,159,34,141,251,4,153,150,127,68,36,36,164,3,155,186,198,27,61,112,20,138,56,166,110,137,8,124,206,248,70,213,131,220,142,106,55,176,49,229,58,148,3,139,86,11,5,202,22,238,195,103,163,178,88,166,150,31,154,72,195,139,182,221,152,134,6,30,236,134,3,159,229,248,247,168,175,169,55,242,19,119,12,192,98,157,97,199,176,35,240,249,177,63,244,37,160,178,220,225,254,110,183,114,75,0,26,164,193,135,147,72,223,202,209,197,201,53,83,68,166,158,152,214,113,237,129,196,33,77,116,84,213,127,54,112,161,20,246,151,56,12,253,122,237,111,56,103,146,34,67,77,116,165,147,16,252,153,72,243,21,15,128,8,150,26,33,158,15,105,228,164,16,240,19,100,41,172,151,14,161,148,237,172,207,229,88,48,167,108,107,36,172,68,179,43,76,203,160,1,35,248,64,73,184,89,57,16,199,20,110,161,122,172,224,133,158,143,255,94,225,115,45,54,66,203,53,157,65,145,151,247,220,31,247,73,212,105,248,232,138,235,190,171,185,95,87,57,122,49,201,250,35,78,248,250,172,95,238,162,119,183,138,124,6,19,241,132,69,139,231,35,95,122,254,214,216,130,76,30,132,227,209,218,154,237,198,29,226,39,43,247,166,51,214,163,3,231,119,18,52,182,131,114,180,85,3,108,177,87,47,32,106,173,249,125,78,61,183,200,72,245,40,181,131,186,60,90,43,40,40,254,77,195,78,232,196,203,126,229,100,128,22,234,191,245,31,251,116,74,148,178,235,240,131,126,109,252,13,10,211,145,237,153,54,99,100,109,185,89,188,11,183,52,88,164,229,160,74,117,107,82,199,11,60,64,139,105,52,42,2,150,105,204,31,184,59,13,236,15,142,104,38,28,162,222,20,75,4,85,146,55,75,17,167,230,154,45,7,141,46,64,155,197,57,224,213,140,189,235,117,245,244,44,193,19,240,253,138,123,144,239,167,91,247,132,218,9,55,199,64,131,160,215,13,10,26,250,120,54,198,153,76,103,16,158,78,253,43,126,73,111,103,143,47,222,35,167,95,21,81,233,206,201,192,124,173,70,214,33,154,86,95,99,140,68,12,79,231,1,108,111,89,9,141,66,112,108,195,145,13,10,32,179,104,125,246,238,149,47,177,198,13,10,225,31,97,241,74,17,77,130,221,161,38,140,200,69,213,22,154,89,168,123,2,122,219,57,53,111,248,82,94,68,200,206,160,247,235,148,34,130,230,13,3,160,175,2,152,53,79,224,123,212,88,108,121,59,78,121,202,155,144,126,247,111,141,248,93,218,49,226,154,208,111,19,114,6,86,147,230,182,147,217,248,29,199,135,99,37,124,185,128,169,51,12,200,186,109,99,138,234,76,199,212,43,20,28,109,102,233,3,160,200,155,14,246,75,179,91,72,32,186,186,176,16,214,93,0,207,59,162,24,200,92,56,17,74,102,215,161,158,251,51,180,65,182,151,169,158,34,92,193,59,67,71,145,165,203,53,133,192,201,86,227,58,91,147,210,95,130,189,11,218,201,239,185,240,202,24,13,153,55,93,18,131,245,205,158,58,63,121,0,82,206,53,138,143,100,205,12,162,100,112,112,251,140,124,187,76,23,242,91,22,130,53,148,51,230,160,2,247,167,61,149,66,178,203,94,190,31,52,128,241,51,246,103,180,205,37,152,109,241,160,80,48,159,181,240,235,5,214,114,19,145,54,107,100,207,19,23,41,102,237,116,201,238,42,63,86,42,158,142,65,167,58,128,70,226,32,5,186,180,92,9,169,68,224,64,44,111,214,158,65,146,67,64,228,194,181,113,251,239,9,95,33,143,68,238,242,43,238,230,4,239,149,18,92,205,248,188,124,233,135,176,63,33,93,195,54,144,126,233,200,27,230,13,10,199,52,131,252,31,176,207,58,243,102,94,146,93,86,234,50,102,100,216,157,104,18,181,90,80,51,120,23,59,142,49,14,37,235,34,54,9,152,117,95,24,114,125,224,215,217,203,130,167,189,157,18,240,23,97,156,153,96,34,175,195,42,169,100,82,142,36,124,220,190,17,57,222,117,77,163,126,147,202,231,16,129,244,30,13,10,36,241,198,15,82,162,210,62,89,217,247,195,36,98,147,235,251,239,21,9,254,91,229,65,217,115,129,76,172,69,134,109,107,195,38,88,63,244,82,11,171,167,209,7,123,208,217,27,149,11,121,247,171,217,138,189,92,250,116,148,17,101,29,207,98,112,251,157,75,37,169,227,67,241,51,180,215,135,149,106,33,244,55,42,42,19,182,193,166,17,177,141,197,182,25,74,125,148,246,192,71,212,213,4,112,101,67,82,156,85,25,98,138,102,70,162,154,159,32,117,234,232,95,56,194,203,175,152,245,213,150,253,50,112,206,62,176,15,97,72,222,137,168,71,223,89,117,218,254,233,76,250,51,28,251,0,96,18,8,12,197,50,126,208,178,23,212,34,223,118,43,191,220,102,209,163,38,7,224,48,30,207,127,199,113,199,24,68,3,237,26,6,234,36,233,140,6,69,107,130,157,255,120,104,115,200,217,235,209,121,179,75,208,207,185,27,114,155,147,11,139,1,118,133,242,89,94,201,141,113,61,112,15,68,243,136,31,138,248,5,141,246,227,176,251,190,240,160,113,57,109,102,89,132,64,170,131,161,97,142,39,128,13,10,153,59,118,74,8,114,5,137,201,116,117,207,80,127,251,142,123,158,197,146,240,31,151,105,185,159,84,124,230,241,43,102,81,237,199,195,14,41,94,187,131,223,156,9,226,78,113,243,233,211,195,104,249,45,123,0,129,136,172,218,194,186,97,121,8,15,76,31,135,125,178,61,167,233,62,83,109,131,150,195,251,254,249,67,28,129,69,231,232,185,128,115,182,189,223,34,166,13,10,27,149,112,178,31,250,50,156,17,23,186,128,3,248,156,107,219,3,183,28,34,201,80,148,112,26,245,163,202,1,230,157,63,120,101,188,47,225,174,33,48,153,133,106,97,67,50,251,91,2,67,202,58,200,22,206,239,180,2,154,70,3,61,157,71,190,150,193,64,66,25,7,193,240,19,180,137,108,146,123,231,125,236,185,139,87,241,70,26,165,146,84,54,40,200,60,96,73,246,31,170,41,196,165,14,238,184,252,66,44,40,102,174,194,50,175,68,20,4,242,54,212,181,199,240,94,209,120,29,89,218,58,163,69,112,76,73,227,129,112,134,142,163,247,194,156,75,152,213,198,67,150,104,204,107,91,251,9,93,132,173,225,180,196,59,255,32,94,101,120,82,25,125,137,217,204,245,38,142,204,226,143,240,150,20,182,87,54,62,231,195,231,2,67,129,199,197,161,193,187,90,198,108,253,163,211,220,223,86,104,162,130,72,3,179,163,148,182,28,156,60,137,111,9,89,58,206,69,202,182,151,100,65,215,39,106,32,103,120,27,24,81,4,8,223,93,9,97,94,34,84,7,5,14,201,13,10,7,108,16,208,174,54,211,77,22,225,170,3,29,247,49,80,101,29,207,78,247,196,154,57,12,58,6,131,151,223,135,17,234,155,28,173,188,73,106,41,112,180,103,96,52,182,18,57,115,96,153,204,46,112,223,140,100,6,203,29,87,51,12,57,76,204,241,196,133,210,53,19,179,251,228,78,176,228,161,189,155,19,88,61,23,252,197,84,13,192,73,252,110,35,56,248,251,193,37,254,243,111,27,226,61,154,211,136,94,195,49,210,65,40,83,102,180,164,46,221,8,178,151,193,21,140,158,101,215,35,94,172,19,143,5,186,151,215,249,91,186,55,5,122,9,65,44,63,145,145,44,72,92,93,59,237,110,80,126,59,124,102,120,56,85,237,227,107,85,160,122,22,218,14,97,44,234,147,60,6,37,20,44,51,93,251,59,157,137,66,73,142,143,171,21,148,81,196,193,34,152,171,47,89,108,170,5,191,142,186,244,39,181,62,53,214,186,62,166,48,128,102,62,45,183,91,17,103,202,146,93,122,75,5,209,157,113,114,44,56,138,170,78,86,144,193,156,54,84,6,228,53,109,123,119,239,217,230,86,68,152,68,253,100,124,209,150,249,241,89,32,157,181,175,216,159,102,76,106,31,246,31,175,214,183,78,11,32,246,137,147,82,135,172,150,27,131,27,50,251,228,193,157,191,226,179,223,223,78,212,117,198,13,119,195,64,198,119,135,3,97,132,124,63,85,125,45,143,135,213,232,76,252,142,30,236,152,168,129,80,229,177,98,21,3,25,29,249,137,212,141,195,5,2,220,254,226,241,45,86,123,13,59,31,164,25,152,213,252,157,12,29,31,131,248,86,3,56,187,16,14,35,50,176,38,163,205,28,37,31,85,172,142,66,97,189,155,186,191,118,160,112,64,2,57,103,108,26,117,11,52,74,140,104,255,70,141,160,3,21,188,35,30,173,178,222,137,153,204,102,11,163,3,168,97,71,20,102,103,227,44,150,74,246,74,33,109,53,184,170,227,115,48,140,117,2,72,87,193,31,186,165,87,217,120,19,15,66,114,201,146,187,229,255,91,55,191,24,147,186,147,108,106,93,172,177,254,118,177,174,1,17,119,22,51,128,11,159,221,141,242,139,134,239,56,245,191,6,247,61,9,117,175,202,109,174,212,180,112,213,212,78,82,120,14,2,237,235,170,142,192,114,76,146,179,79,251,98,115,239,79,84,95,17,87,83,7,165,111,242,163,180,136,3,64,80,81,109,57,107,91,216,107,3,75,78,129,88,201,197,237,141,223,103,13,10,242,206,56,141,46,30,103,181,190,17,216,65,192,230,148,229,52,158,64,231,163,181,52,217,214,89,141,112,239,25,29,59,217,5,133,192,171,47,90,206,121,203,6,180,155,69,247,199,109,255,117,168,59,40,55,79,164,100,185,242,157,80,121,8,186,208,167,207,234,169,19,8,14,105,69,54,21,101,92,92,143,45,72,156,118,247,108,128,18,105,236,71,229,51,59,88,138,74,111,166,209,62,3,159,82,160,149,33,167,144,210,103,169,210,58,22,214,216,27,220,78,6,6,236,252,102,135,240,190,141,9,162,144,173,227,231,240,167,242,60,158,54,172,30,225,38,226,24,77,167,242,146,54,138,142,135,195,108,185,11,106,53,227,72,81,241,94,48,46,227,46,143,11,77,22,51,64,161,122,17,126,37,20,51,255,149,112,186,141,113,146,53,147,121,99,187,77,46,52,197,40,98,228,4,60,242,194,34,221,203,133,209,78,227,171,123,185,102,2,83,191,6,33,33,220,101,51,74,226,226,57,218,42,91,6,74,85,252,44,230,52,3,198,175,50,102,28,51,82,126,131,151,179,163,233,39,151,240,84,112,87,106,227,21,197,81,37,187,180,55,129,40,0,29,205,100,156,248,89,57,99,34,79,196,82,174,138,132,172,190,230,176,70,43,75,165,230,186,178,253,93,155,190,199,84,60,114,222,184,163,55,225,101,63,29,241,18,221,167,120,177,229,215,239,112,15,1,168,40,203,228,129,213,246,164,171,56,157,135,184,161,115,84,227,31,148,11,117,28,109,99,91,22,17,238,62,113,107,252,197,116,223,52,0,114,48,222,222,114,76,208,84,144,124,36,183,4,218,29,197,132,191,210,136,189,180,26,78,101,58,0,96,98,193,116,191,109,4,228,181,140,159,71,123,22,53,67,101,24,151,210,15,224,144,247,85,153,171,193,131,152,38,170,236,127,238,39,22,37,171,8,6,45,24,38,173,189,252,137,102,217,94,70,25,17,132,71,202,176,251,37,239,255,222,183,48,182,14,1,179,206,51,173,35,140,86,92,43,69,126,100,136,243,234,5,192,72,33,212,199,113,80,45,80,7,123,233,170,22,144,75,87,151,42,52,24,203,86,250,66,32,205,83,189,170,37,187,178,13,10,230,107,106,212,252,254,208,245,13,10,86,62,119,249,244,92,202,189,135,62,211,80,13,182,154,21,7,210,28,90,98,97,225,115,126,189,229,221,215,2,154,85,37,16,220,92,244,164,62,24,13,10,97,38,175,5,139,172,208,183,153,123,110,137,161,239,78,148,9,246,170,203,114,224,79,13,4,148,48,107,183,49,6,180,159,198,139,137,180,91,44,151,90,132,2,7,44,114,140,102,93,244,109,69,225,254,51,229,241,233,103,136,201,149,8,201,53,109,129,49,4,103,2,253,128,92,201,175,37,93,111,45,208,178,25,154,123,64,106,13,10,235,44,61,218,178,89,234,36,91,116,200,105,26,135,173,227,165,175,85,122,81,1,99,54,251,239,225,189,158,145,145,85,153,121,144,39,145,22,72,135,13,116,101,231,61,225,112,211,6,224,133,127,91,21,52,163,80,71,53,226,232,14,184,159,71,130,36,59,124,254,215,89,3,206,19,73,127,85,22,201,132,204,203,154,42,119,176,204,131,180,141,131,227,177,74,115,206,8,120,255,87,25,48,230,68,171,76,250,188,84,19,243,77,62,177,203,64,202,13,10,52,139,155,205,227,149,32,165,64,241,57,103,252,221,154,86,123,35,108,206,81,50,246,35,221,120,55,1,234,225,200,45,206,238,167,41,19,56,222,50,233,202,231,115,237,164,133,221,183,199,78,219,20,203,45,106,23,175,223,236,176,81,178,178,168,102,52,72,186,187,174,221,84,132,239,101,74,102,29,224,64,67,132,203,112,112,127,79,243,235,188,204,133,104,186,52,66,124,255,193,118,97,149,136,148,167,16,222,137,65,13,10,109,133,246,220,131,97,86,193,229,162,162,231,234,60,199,174,103,235,243,155,176,155,115,221,165,63,68,182,144,87,4,207,201,172,212,224,195,111,255,59,42,144,52,57,210,198,87,250,118,210,172,15,14,74,54,72,139,144,93,111,32,99,34,246,76,154,197,228,3,60,212,179,193,98,107,170,113,111,186,7,7,20,58,120,136,42,51,172,91,65,90,205,44,237,7,36,184,37,75,83,91,210,24,39,106,93,15,164,234,113,232,17,64,131,226,21,207,134,0,140,144,162,200,217,63,23,105,185,22,0,98,173,212,209,163,16,235,39,30,40,226,185,7,240,21,104,113,252,130,59,198,14,18,41,11,225,136,196,72,181,233,194,178,7,104,32,221,50,28,217,109,92,113,95,15,27,182,255,243,251,51,126,54,89,190,152,238,100,52,59,71,156,127,221,151,116,240,129,116,228,121,62,165,36,1,5,236,204,188,62,29,36,182,244,191,225,174,133,89,115,18,53,103,118,180,82,106,230,79,122,113,173,127,135,190,128,192,212,61,80,96,183,59,103,9,12,68,26,177,208,189,117,136,171,123,24,16,50,221,51,206,38,206,239,176,216,182,48,146,64,102,9,155,178,98,7,84,123,198,27,15,116,253,115,79,150,103,44,106,147,6,108,93,32,224,64,151,29,126,212,97,56,154,255,217,252,52,50,68,145,241,211,111,20,132,6,142,177,236,32,178,18,250,204,210,85,47,215,220,69,142,43,36,248,156,21,223,176,161,238,12,40,173,180,174,73,228,168,32,223,177,187,0,155,168,80,160,150,127,43,126,61,226,247,218,6,136,88,6,13,10,25,135,237,226,244,234,231,94,92,87,146,85,226,34,157,170,126,38,178,3,40,246,80,123,27,64,222,48,168,225,230,20,165,211,122,115,92,101,35,254,200,100,166,87,20,27,61,63,149,156,202,98,88,63,233,59,125,98,120,101,63,174,114,109,179,23,63,42,88,72,134,18,210,241,56,13,10,149,20,42,4,93,25,149,155,128,166,2,97,33,150,22,238,137,0,82,232,19,35,41,155,247,164,3,254,42,160,193,121,237,172,173,30,180,198,164,185,18,248,126,250,87,198,212,13,91,254,42,190,104,38,44,188,210,150,104,101,182,255,86,4,176,181,59,255,183,79,100,200,98,163,206,253,107,156,42,127,185,41,64,194,157,55,205,196,123,237,121,137,220,238,71,26,24,42,32,253,50,2,243,177,101,35,233,99,88,154,11,69,18,91,188,235,85,109,92,89,143,136,208,224,206,156,237,86,53,22,90,153,125,13,200,51,242,151,90,85,129,137,196,57,176,92,76,202,100,45,89,248,30,42,137,52,126,113,118,52,169,189,159,85,110,85,177,181,222,171,155,2,98,133,137,140,0,178,26,127,166,45,58,134,25,96,139,58,24,251,131,209,208,107,234,59,156,63,157,60,1,130,55,157,38,52,255,204,17,187,35,64,64,214,207,199,229,136,233,176,190,40,86,251,193,166,168,145,81,48,97,211,206,247,141,180,42,146,182,180,18,156,40,5,127,255,61,21,79,206,138,180,244,117,31,208,249,192,82,61,187,95,177,48,75,223,190,231,113,89,172,217,73,72,99,110,179,145,37,77,246,95,211,123,17,229,79,251,178,58,142,139,219,62,173,128,237,183,242,239,91,245,2,64,147,209,152,89,153,215,38,0,188,247,243,206,232,213,38,38,15,4,138,74,220,112,85,13,10,87,153,13,189,19,91,238,169,186,246,198,198,128,67,94,143,198,167,106,121,30,236,47,197,238,253,101,248,99,231,68,167,7,218,193,238,141,231,133,81,244,59,37,242,100,101,113,13,25,212,142,104,17,175,199,94,213,228,83,22,212,20,7,73,52,200,153,189,174,101,136,217,250,162,164,244,108,191,179,93,73,250,37,110,14,3,255,211,163,122,29,79,137,195,104,106,161,170,5,150,0,222,13,10,142,128,11,210,6,173,22,112,225,15,96,230,31,79,199,235,234,166,59,135,27,192,180,44,128,12,35,49,188,13,10,93,17,157,130,85,95,87,222,43,77,96,203,52,213,180,24,196,154,50,194,60,45,41,144,155,218,185,87,2,27,105,231,209,226,131,206,90,159,56,98,32,161,255,227,231,251,103,6,115,125,98,53,87,124,223,156,125,102,125,12,5,40,55,200,91,54,120,139,93,95,163,189,185,82,106,25,251,213,135,0,154,120,13,10,238,69,78,158,233,174,86,96,49,220,175,37,186,196,239,17,90,182,17,105,138,68,129,126,233,186,97,70,102,48,252,120,159,110,12,71,234,13,133,67,52,152,105,3,174,40,201,36,224,46,176,207,217,132,13,236,130,219,174,117,32,228,81,83,229,119,81,249,251,220,110,249,84,159,116,50,29,200,235,124,169,147,81,7,150,23,103,197,140,165,96,80,40,197,197,3,21,216,55,133,37,79,159,40,90,169,60,25,32,198,237,233,200,108,130,32,45,148,251,121,173,153,109,230,244,200,182,91,116,19,205,166,11,164,9,7,99,9,7,114,233,107,65,125,254,51,29,127,180,68,127,44,9,136,151,14,114,9,94,20,79,249,2,70,16,173,128,155,188,84,31,37,27,43,152,28,219,203,111,198,213,218,208,137,200,232,52,60,102,198,93,41,33,58,228,70,141,3,104,230,42,60,154,185,104,2,57,41,78,115,224,236,110,102,210,3,151,196,111,234,92,228,31,142,182,176,56,156,8,98,160,232,107,97,197,43,250,243,94,206,217,252,200,62,65,104,70,122,34,174,195,134,68,95,80,94,2,47,200,248,36,143,98,130,91,98,37,243,91,29,219,3,77,30,172,25,229,174,40,190,129,107,111,232,233,66,132,128,109,132,27,215,135,69,115,156,214,50,222,138,84,93,204,119,84,178,4,43,63,31,57,209,253,114,185,2,138,47,115,133,250,251,179,100,193,125,161,126,139,143,106,35,204,28,89,231,88,166,254,228,229,134,19,123,40,90,140,113,4,20,75,56,227,73,240,14,38,73,108,200,195,71,13,222,61,125,199,164,155,188,208,191,226,55,131,0,33,171,46,108,189,58,172,89,209,143,37,182,173,179,41,139,120,131,224,218,37,85,147,49,177,197,161,155,35,2,65,170,210,222,192,255,69,82,233,126,212,63,95,113,35,41,207,199,243,190,140,107,55,18,86,57,179,135,244,45,133,84,227,51,50,204,65,91,44,125,130,161,128,55,210,214,11,201,187,233,54,137,157,64,231,13,10,202,16,64,124,102,200,93,150,56,32,164,164,29,62,248,55,164,68,102,188,22,236,23,152,156,16,189,139,112,111,205,41,72,95,87,152,30,165,37,126,199,227,204,149,183,44,46,250,219,247,227,140,234,9,102,155,236,190,118,208,217,166,157,68,14,234,209,88,53,210,29,69,91,215,71,8,64,86,198,188,103,9,2,114,98,133,23,127,22,41,171,242,143,252,119,32,155,89,176,57,242,181,52,128,224,158,240,48,86,6,249,206,123,191,0,217,192,82,127,149,118,201,106,158,111,155,222,88,142,99,44,163,56,251,145,136,157,35,18,141,151,100,213,160,240,178,227,59,22,107,223,126,112,159,200,231,159,98,255,51,116,181,131,218,78,143,69,16,40,23,61,140,56,118,245,90,228,252,143,103,175,224,202,76,23,129,219,19,190,88,137,28,113,237,201,13,10,177,39,113,46,128,233,124,124,0,2,115,127,44,189,122,124,58,211,82,55,195,145,243,72,40,120,99,137,214,205,89,65,89,96,244,198,255,119,81,144,37,117,226,196,247,92,14,165,78,88,50,166,49,47,234,144,32,75,77,55,44,161,113,111,251,200,51,33,214,5,118,20,232,253,237,225,174,165,39,206,32,23,157,111,171,34,205,125,91,18,188,174,205,48,207,52,36,133,67,60,52,222,43,110,127,3,73,13,10,80,17,135,7,138,185,0,98,108,116,201,250,76,75,167,185,160,13,229,21,229,82,110,11,175,181,118,164,116,126,107,162,160,150,195,165,131,226,249,186,176,72,249,86,227,116,60,23,192,210,95,26,166,19,84,22,130,237,207,80,221,16,42,170,103,216,188,86,41,63,235,73,53,78,83,74,80,131,199,195,122,139,13,10,8,113,31,247,219,107,0,143,18,236,167,117,46,4,119,204,177,6,167,235,62,34,119,154,47,242,218,179,221,227,141,252,223,211,186,191,252,42,192,60,91,142,29,239,24,254,163,104,50,48,15,84,214,77,26,185,228,217,210,80,251,199,53,113,220,150,37,24,180,120,11,201,247,13,10,164,51,144,114,138,169,160,106,214,94,176,221,30,121,107,121,112,246,121,140,202,152,9,153,198,104,13,10,180,37,177,220,172,212,46,115,159,127,158,120,175,189,78,74,228,108,19,248,228,17,23,147,114,40,82,5,122,225,189,84,125,165,182,160,61,162,212,18,232,166,161,11,124,254,32,210,51,69,87,84,122,45,91,161,121,73,184,65,209,190,245,214,89,46,226,33,24,78,127,205,121,170,140,165,23,141,114,225,2,93,14,9,241,170,38,140,206,98,173,83,233,126,184,188,160,144,116,98,41,190,12,102,13,10,211,197,164,87,8,195,250,162,123,49,213,112,241,68,84,98,87,181,143,126,114,246,154,115,91,148,73,129,49,217,252,65,231,74,82,159,138,67,109,61,110,184,72,116,224,89,95,247,153,95,212,234,102,106,196,11,221,6,93,111,31,178,194,224,154,54,126,106,145,239,247,198,20,228,187,4,14,137,74,40,43,86,224,124,116,181,236,220,184,56,64,129,167,188,50,20,127,134,120,47,74,200,198,142,71,60,73,3,162,140,77,93,55,1,63,219,209,147,161,76,11,81,232,168,99,87,171,97,219,132,19,168,105,23,39,195,31,227,191,162,166,164,135,135,98,22,218,146,64,140,41,148,225,238,213,239,229,55,244,199,207,241,173,46,28,39,119,73,147,98,97,200,143,209,183,255,74,39,162,151,125,22,79,199,96,242,54,88,205,114,174,32,168,91,212,89,26,167,20,115,85,0,188,22,140,50,187,236,50,230,254,42,30,45,84,233,93,169,44,159,72,198,113,151,58,113,174,221,38,244,246,245,40,83,151,255,241,227,87,86,196,122,179,24,103,65,133,231,196,153,132,190,116,93,118,223,68,154,62,79,49,49,21,15,49,216,37,125,174,104,218,247,136,128,201,86,147,122,98,208,186,236,136,55,74,150,139,240,180,74,215,114,97,99,110,133,233,112,95,125,115,139,47,0,64,92,151,175,112,34,179,207,89,169,45,146,38,252,89,169,75,175,20,66,159,231,17,140,96,82,221,18,200,158,202,80,196,251,52,191,52,72,74,84,223,11,102,1,241,104,232,193,242,9,25,237,29,160,118,152,60,24,174,108,12,161,7,238,70,213,194,247,113,89,42,223,175,156,78,212,235,100,76,178,13,51,106,230,232,188,199,241,12,191,156,31,202,143,153,141,7,131,145,31,70,196,213,76,253,80,233,86,29,230,115,159,19,173,240,217,218,234,123,51,253,199,236,12,200,17,188,74,105,233,248,124,186,60,143,151,174,141,200,20,99,182,12,189,38,114,219,32,149,110,143,178,201,213,0,174,98,79,176,25,198,238,224,118,114,102,199,208,161,138,153,57,177,89,227,237,74,3,224,84,112,72,200,179,165,204,113,131,236,238,90,129,160,168,98,203,241,125,224,85,42,218,62,20,188,247,70,251,210,180,204,208,159,189,124,4,194,93,49,124,231,28,171,67,159,156,102,204,169,74,235,20,46,218,77,226,219,86,45,135,133,199,241,177,209,177,88,156,92,116,13,10,47,29,174,56,98,206,111,196,197,102,75,251,88,159,175,22,48,138,86,114,195,124,216,18,236,160,52,143,14,255,138,240,227,234,172,153,96,115,112,133,144,132,38,249,56,227,207,197,74,70,244,110,67,37,67,194,181,52,255,65,144,238,17,116,107,18,195,213,235,191,212,154,174,87,50,16,137,110,201,85,111,63,136,184,9,194,21,13,10,65,111,92,240,220,91,6,152,73,212,198,56,131,93,205,161,216,148,132,146,154,71,139,152,26,208,169,220,253,94,205,109,213,72,40,196,76,78,172,34,118,2,180,175,160,79,52,149,244,22,71,151,169,79,218,100,158,83,12,116,121,220,118,172,219,178,62,203,166,3,206,101,79,147,56,107,129,104,45,234,31,28,71,152,48,197,73,213,250,72,164,23,139,128,186,191,97,247,128,210,148,127,42,255,46,174,121,168,203,248,58,243,46,63,43,65,219,109,156,80,102,193,178,85,53,169,23,217,48,162,79,14,186,6,92,163,90,249,66,43,81,157,235,122,163,128,254,200,244,23,83,56,73,180,83,160,132,69,232,156,239,225,223,181,29,38,188,46,247,40,83,56,90,153,31,49,139,198,194,241,187,115,169,47,137,45,183,16,25,168,31,141,136,194,243,33,60,212,47,253,212,162,117,51,240,1,122,175,13,10,155,3,57,171,23,38,112,164,228,185,180,1,114,0,199,33,234,141,192,11,123,89,93,160,171,61,192,2,70,72,111,128,3,175,214,205,177,12,55,18,119,38,29,63,225,36,18,3,25,115,68,25,183,85,175,175,67,113,189,25,186,197,217,157,13,10,213,199,42,116,172,237,29,248,133,98,142,27,253,185,103,40,252,195,227,199,166,126,239,122,41,133,234,93,248,121,168,126,0,229,88,14,53,164,223,145,75,233,248,30,139,126,68,140,131,43,125,24,189,81,32,96,172,137,29,209,85,178,2,136,78,168,219,112,161,129,132,183,232,39,47,183,137,144,99,193,95,247,12,59,220,127,239,105,93,150,248,249,14,55,111,192,209,143,190,48,127,202,176,4,188,174,253,116,214,18,126,163,203,113,241,75,85,134,240,114,37,205,1,94,90,83,2,101,52,149,87,174,168,103,191,229,3,55,34,196,155,240,142,246,92,188,112,213,64,28,175,141,30,6,201,50,45,116,170,213,226,245,145,157,56,172,62,153,95,31,61,193,91,52,234,251,81,56,11,225,124,68,87,44,198,198,250,149,162,203,84,77,7,32,105,13,120,223,56,162,23,117,168,40,92,155,81,82,248,224,13,10,7,197,197,15,118,60,154,77,5,239,184,121,173,56,222,187,139,131,13,133,153,172,112,94,86,244,130,69,198,19,172,194,99,48,222,74,208,103,40,222,232,192,180,64,204,50,225,13,116,32,9,126,154,217,74,165,229,146,1,235,190,48,95,208,125,238,51,102,57,167,121,82,57,166,136,11,148,60,119,79,127,72,238,117,254,70,85,2,1,116,45,118,43,126,92,51,175,243,147,26,217,74,130,173,58,155,118,87,3,72,9,186,245,89,164,51,189,149,239,28,229,74,227,146,130,206,218,253,61,147,110,179,106,119,108,148,141,242,79,235,248,123,223,232,200,7,159,45,82,206,26,187,126,74,107,99,32,99,36,32,52,253,23,227,21,111,238,175,233,25,9,132,103,68,70,7,168,174,206,35,50,241,251,0,53,28,105,237,184,252,139,212,109,96,34,206,182,133,117,215,209,210,192,55,69,118,119,212,12,180,5,151,120,147,32,213,128,78,227,37,133,185,231,196,202,80,233,200,152,48,93,196,84,92,86,185,13,143,156,161,130,148,248,119,99,99,95,179,187,165,17,193,83,145,83,246,141,1,51,40,180,82,123,100,178,111,122,203,137,213,148,181,132,223,107,111,182,48,43,198,206,150,62,83,71,151,209,160,183,46,2,46,50,30,137,75,46,58,97,91,81,153,23,112,157,24,87,195,29,127,135,167,164,220,70,94,109,162,14,40,61,96,169,66,248,202,147,153,217,13,10,38,138,44,27,185,118,88,225,120,101,107,224,108,113,192,43,130,174,191,206,219,81,13,10,128,161,133,204,44,92,180,83,147,181,30,152,6,168,50,32,44,196,202,129,3,185,72,33,95,19,58,142,247,181,134,95,95,53,33,193,44,60,179,120,134,148,100,205,29,143,180,229,185,34,243,45,135,129,237,199,41,13,104,232,43,89,138,46,176,154,85,144,219,41,56,30,20,136,121,182,93,35,1,125,130,20,243,66,112,190,71,138,116,85,111,1,246,155,128,15,67,73,39,109,78,126,201,60,44,147,55,32,234,106,16,254,217,158,6,29,249,178,4,72,7,13,85,177,56,72,124,205,255,62,152,94,191,124,8,204,210,144,91,231,210,40,76,68,170,41,0,147,117,219,72,130,76,147,139,20,116,58,9,108,36,142,87,103,214,136,28,100,190,147,90,74,136,249,245,86,38,170,5,160,133,236,111,140,211,203,180,145,210,102,55,224,110,175,196,187,129,160,70,214,11,141,53,32,73,143,71,0,5,83,28,174,224,118,100,142,58,93,225,13,10,117,178,101,15,222,226,224,48,217,129,52,148,54,47,41,24,93,85,179,22,146,90,44,73,87,145,240,250,200,175,133,92,100,51,0,188,189,4,219,21,24,23,83,191,248,200,192,121,66,131,189,80,18,22,155,251,65,254,179,186,140,39,228,198,116,231,6,255,94,185,184,139,74,88,197,137,56,164,250,206,93,128,104,120,253,200,81,204,93,84,150,200,123,85,221,133,64,208,14,135,77,106,120,204,113,233,44,179,107,206,51,198,249,167,243,181,6,143,73,82,70,100,147,173,29,194,216,203,203,86,42,39,254,24,205,219,122,30,84,189,235,46,179,94,135,166,118,155,13,10,47,96,33,138,230,21,214,213,228,155,173,111,169,133,194,30,92,160,51,254,81,195,40,52,246,156,197,252,107,168,169,37,105,172,42,118,93,198,21,156,14,32,19,44,201,103,179,113,102,1,88,178,143,200,88,148,57,161,61,120,217,114,113,155,60,47,107,234,238,146,99,169,87,95,251,144,105,90,70,154,195,120,224,205,100,190,18,54,119,50,161,220,88,88,237,4,161,127,247,96,103,17,1,176,148,50,200,220,37,83,154,111,178,216,203,8,143,83,27,195,147,233,231,80,231,125,20,50,210,25,112,119,217,88,165,126,29,102,146,33,107,55,128,72,210,13,227,186,180,59,44,138,89,172,205,188,60,64,196,71,166,65,17,47,34,153,12,178,202,155,240,81,64,38,251,178,203,179,208,57,120,80,44,209,153,100,88,58,184,158,98,105,11,18,149,56,215,80,150,229,13,143,81,128,109,92,138,85,45,212,172,223,45,11,202,93,9,238,100,40,3,55,94,138,180,206,23,98,216,89,52,204,42,143,239,149,205,75,47,211,232,118,25,128,206,0,43,34,166,186,198,70,170,193,243,240,46,59,135,81,224,120,147,82,17,247,206,158,13,10,154,110,168,180,48,60,54,198,81,148,236,135,18,13,203,31,112,165,219,216,159,196,95,92,13,11,76,126,52,30,6,55,182,220,227,150,146,100,91,155,110,195,84,36,248,100,106,80,190,8,115,241,160,222,174,70,162,46,8,121,197,133,22,172,20,34,238,11,31,235,13,58,113,7,104,171,136,50,161,6,250,151,71,50,25,145,200,143,170,20,124,195,13,84,154,14,171,4,68,68,6,77,51,160,155,73,125,157,229,208,236,43,229,135,129,15,5,247,243,201,212,28,211,9,231,24,99,87,2,247,93,24,240,77,196,101,6,154,174,12,228,188,197,226,162,195,42,76,234,108,114,253,195,2,154,161,148,132,40,127,172,139,115,159,210,94,108,241,88,74,131,72,227,130,27,51,218,221,245,188,67,74,212,53,208,241,37,13,10,47,157,2,35,35,15,4,3,150,126,130,177,198,203,15,232,124,133,105,81,235,99,145,92,169,245,17,157,127,52,229,138,219,41,178,62,186,71,6,54,145,207,234,44,140,130,113,165,47,36,72,74,48,119,95,193,125,178,41,70,155,112,124,69,141,27,254,43,17,252,77,83,188,38,44,118,184,132,197,76,51,238,44,49,250,155,39,244,44,169,27,142,249,76,33,109,230,86,153,233,250,3,109,0,234,158,9,237,54,36,121,76,149,99,125,21,150,138,227,152,81,11,199,39,51,180,58,3,154,158,190,67,238,6,149,242,141,190,18,228,16,219,22,119,209,226,27,131,12,3,55,170,59,6,161,227,0,12,210,130,28,224,72,255,176,47,18,46,113,24,56,13,0,125,197,88,3,22,240,0,252,61,56,9,176,2,5,119,47,3,218,198,85,83,155,96,47,200,107,225,241,42,227,248,44,217,78,206,109,219,66,125,90,247,60,194,172,124,171,18,211,79,25,171,54,246,153,210,52,205,249,181,85,68,212,49,198,126,35,37,251,112,126,217,82,110,208,84,56,173,185,188,179,13,107,119,1,164,166,48,171,176,145,95,76,254,45,127,247,224,161,7,153,245,251,175,240,99,243,54,59,50,110,27,88,4,40,151,20,200,252,120,250,127,69,154,101,153,27,150,163,153,203,215,146,254,56,85,85,14,66,172,15,69,186,21,64,107,138,19,7,217,173,110,173,115,108,216,15,2,8,223,72,146,223,196,223,225,105,248,81,178,143,45,167,186,204,106,29,59,31,116,73,47,142,127,209,199,153,3,245,81,161,137,39,142,227,74,64,65,115,212,199,69,31,47,211,22,242,105,196,141,54,228,22,241,109,116,123,67,88,76,65,70,180,22,130,65,243,59,143,69,114,154,103,226,152,91,24,235,200,39,127,66,231,237,253,232,141,165,56,103,32,214,179,16,197,100,13,168,139,216,228,156,85,188,27,104,31,21,91,171,159,9,158,22,208,21,185,124,27,233,25,86,99,179,228,116,230,208,91,25,253,115,73,32,130,207,34,40,184,111,200,106,45,36,239,102,141,60,141,14,228,182,82,73,204,69,192,81,210,197,222,237,150,102,231,28,3,165,231,30,252,195,53,3,128,178,162,214,134,80,249,123,238,143,64,27,92,99,156,130,100,218,214,207,219,197,44,3,146,71,183,32,9,31,196,231,12,98,109,205,47,32,252,170,12,49,240,168,92,0,28,233,116,155,163,166,103,31,162,103,227,181,70,147,47,6,6,42,42,136,34,7,67,26,179,74,127,222,220,33,205,81,11,236,229,207,117,50,176,183,193,1,175,178,99,32,250,198,149,36,140,128,74,96,41,112,140,154,128,206,97,201,154,84,19,12,111,53,121,226,82,79,19,70,203,169,40,230,17,155,72,130,93,217,190,203,6,155,154,205,213,136,225,49,22,77,27,141,134,3,131,182,33,14,20,82,39,254,192,59,193,251,14,178,205,57,235,224,218,114,165,238,58,217,33,231,81,233,101,194,170,117,253,104,154,37,2,185,250,49,198,229,194,228,165,136,109,20,57,185,87,164,73,215,186,40,185,139,46,0,102,158,246,232,93,18,204,187,25,183,44,149,216,219,134,7,222,68,137,138,224,131,250,74,133,245,173,28,15,46,208,236,156,94,42,84,89,23,66,46,179,4,68,87,105,107,18,152,226,51,140,150,187,27,89,21,12,208,59,56,99,168,173,239,95,70,59,143,4,88,113,145,184,91,5,149,17,86,0,63,126,125,187,155,58,202,190,63,115,244,187,11,115,140,157,61,80,1,54,151,64,179,236,235,37,115,203,248,218,147,23,66,42,144,1,190,40,31,0,176,153,88,229,243,221,135,180,184,53,199,222,71,46,155,59,2,48,5,73,153,23,158,225,89,81,34,6,218,64,161,24,39,91,129,136,151,74,237,67,222,249,32,97,36,157,62,98,66,22,236,119,228,126,198,8,182,118,53,84,184,1,69,134,41,32,27,190,179,249,107,153,40,69,194,127,161,249,219,27,14,249,104,128,121,34,230,149,123,231,129,212,137,55,164,70,247,121,112,13,10,89,155,252,204,213,247,4,183,8,168,218,16,0,119,204,227,131,34,103,101,54,8,224,228,226,8,242,159,208,209,133,75,248,95,170,101,159,24,226,156,13,10,163,59,118,95,13,10,229,248,108,99,52,143,124,112,25,109,20,59,23,125,94,209,96,166,51,125,5,29,211,232,174,100,215,215,53,97,16,22,17,38,232,91,232,41,7,186,162,4,53,69,15,212,12,24,39,203,220,3,225,105,33,229,214,242,254,46,78,181,30,182,229,44,104,64,202,117,188,124,2,17,165,166,126,246,187,44,30,62,225,243,194,237,27,70,149,8,183,76,255,201,112,56,96,57,118,193,187,141,184,220,214,229,78,253,11,16,61,79,72,250,38,161,103,181,246,42,196,18,153,196,72,185,50,211,140,140,74,242,147,16,75,65,235,19,80,154,141,239,97,236,233,30,122,255,123,238,68,135,141,39,38,152,134,40,73,159,238,14,206,21,199,169,2,43,85,123,54,125,141,8,25,42,6,225,206,108,180,70,219,155,74,222,30,13,196,196,210,199,231,26,254,242,159,177,143,152,125,187,164,207,32,51,41,47,224,57,220,245,115,181,9,101,93,0,94,134,228,167,189,163,170,168,236,196,86,109,118,37,95,142,164,102,55,212,125,251,68,64,118,155,50,30,99,134,2,143,64,87,114,74,214,209,172,97,81,84,160,135,14,189,230,50,6,99,232,52,73,187,181,71,127,232,218,65,212,186,106,253,89,236,99,195,165,121,174,87,12,101,222,27,141,173,132,210,201,23,226,38,204,43,113,69,144,165,40,167,183,245,109,173,80,37,194,143,167,149,207,113,116,244,68,15,188,217,44,162,76,185,158,108,127,130,179,145,7,198,177,145,59,165,56,240,159,248,230,239,165,158,95,112,81,240,22,183,178,116,250,56,161,200,123,230,112,191,240,119,180,89,227,145,61,21,12,5,16,170,68,227,74,73,53,109,118,227,71,176,15,133,131,210,63,239,130,28,207,176,55,248,47,175,243,63,116,38,58,211,123,204,111,215,180,93,58,40,235,76,20,24,71,25,14,200,89,207,169,26,93,46,88,43,237,71,254,255,178,175,183,157,253,253,204,13,10,165,209,127,250,239,155,201,121,245,174,233,39,148,29,48,190,139,176,5,227,43,177,104,237,22,135,213,48,49,45,161,96,140,198,165,203,182,87,197,107,244,60,82,66,126,172,87,177,149,221,187,103,226,5,107,165,250,122,164,215,140,106,141,43,63,8,149,19,212,136,240,150,155,0,69,88,177,0,72,39,191,157,0,59,116,253,85,170,125,45,254,232,119,220,2,204,158,81,238,173,247,147,81,245,20,105,32,97,96,195,252,216,137,104,152,77,104,135,149,103,176,236,33,172,242,200,61,104,47,67,92,200,158,215,5,30,184,197,94,250,41,156,243,11,168,42,147,227,195,162,3,139,230,105,194,76,93,32,172,144,169,146,16,28,185,198,233,211,70,101,120,239,253,184,51,42,137,126,48,59,35,232,201,253,69,114,44,4,131,173,123,24,188,238,232,248,36,212,45,126,93,19,199,11,26,76,15,249,122,251,124,190,143,204,157,34,131,175,20,133,87,5,254,183,144,37,193,202,207,189,86,249,37,206,9,254,22,200,106,231,49,84,214,238,30,102,208,246,90,84,133,168,212,35,38,155,239,112,54,16,184,196,75,201,229,208,32,31,112,1,96,80,67,97,188,232,151,52,2,35,73,82,42,0,164,157,147,248,3,139,54,108,130,7,255,161,244,151,50,50,42,93,64,56,138,211,19,245,79,110,1,50,81,201,227,26,243,31,246,117,46,170,205,209,99,113,194,195,249,66,68,85,36,87,172,105,165,156,160,76,46,80,177,152,121,125,176,108,95,9,160,121,44,42,197,170,181,26,224,90,119,237,117,213,159,130,229,60,208,230,252,7,239,136,33,122,230,69,82,215,244,105,80,7,244,4,221,22,98,189,92,15,231,43,67,13,10,3,183,123,174,158,128,246,208,109,90,127,24,145,241,85,165,200,39,242,157,145,191,61,218,100,227,235,188,165,215,139,13,10,128,251,234,209,20,203,113,123,12,224,0,219,185,15,179,0,24,66,67,231,93,65,4,145,225,197,204,192,149,1,200,157,166,7,86,239,207,252,194,212,85,11,85,222,17,32,153,30,160,206,104,220,241,22,122,108,162,41,250,218,62,249,3,37,235,134,74,42,157,8,222,118,184,3,219,189,195,171,204,128,228,59,214,89,45,12,217,31,35,95,98,226,131,113,84,242,90,49,242,186,155,162,137,113,189,29,63,43,188,225,251,66,76,151,82,148,122,124,212,121,11,31,57,104,143,15,183,110,197,180,249,114,211,104,59,202,64,40,50,22,229,41,222,37,0,183,114,229,18,214,229,97,29,143,64,107,42,77,17,12,199,85,126,26,69,67,101,218,142,29,97,66,49,113,16,41,93,89,138,133,103,52,69,241,151,136,177,72,161,75,17,86,232,212,63,235,249,199,61,181,215,230,252,132,20,188,168,134,180,167,175,77,245,232,186,64,85,111,41,173,131,162,62,237,189,186,6,5,120,1,230,134,128,147,41,180,120,110,210,17,52,139,130,138,199,89,53,74,244,122,12,223,125,167,157,90,240,85,93,113,86,31,119,205,11,239,130,47,77,244,112,233,47,204,40,41,83,169,163,70,5,211,39,177,76,126,114,224,89,149,208,242,24,79,146,108,63,248,89,94,238,192,225,116,37,160,195,140,185,88,188,66,14,78,35,185,229,229,220,195,245,114,174,85,149,254,166,227,36,123,201,95,29,77,111,161,21,36,5,176,126,214,76,29,161,233,8,162,218,170,38,28,123,212,192,160,215,58,8,88,212,228,46,151,146,90,58,201,230,167,124,210,64,131,143,34,188,33,164,121,12,164,148,173,251,63,242,179,230,70,75,185,155,37,117,66,92,231,37,203,222,202,207,182,111,11,38,27,46,225,232,174,23,125,97,155,58,115,204,202,254,242,21,223,110,108,131,13,110,197,62,169,9,163,159,77,232,231,116,251,203,158,140,70,1,8,204,193,217,40,189,78,89,221,234,41,77,58,205,130,194,55,64,52,159,76,112,232,101,240,163,197,193,227,49,153,120,49,7,225,116,217,196,21,242,114,81,145,164,190,178,243,51,1,65,218,27,99,180,2,178,95,198,82,33,182,89,67,23,94,252,212,240,37,236,164,37,103,222,154,19,154,196,247,85,243,114,35,84,210,70,130,246,148,183,202,37,91,245,112,210,168,60,169,33,239,32,232,199,87,21,195,231,115,40,51,172,215,116,55,48,229,247,74,113,142,116,155,193,87,103,75,239,204,228,213,69,58,126,210,194,2,242,230,104,189,174,59,125,106,65,133,19,205,204,170,55,240,157,122,216,191,148,29,225,77,197,0,38,253,15,165,154,13,15,158,226,188,123,17,85,197,165,14,137,170,27,119,191,174,215,9,222,29,254,55,113,62,81,42,16,187,26,68,181,13,111,102,9,119,211,217,153,44,204,132,153,25,207,23,164,181,87,17,197,199,174,214,2,65,118,214,230,113,63,236,48,167,126,233,75,29,49,60,245,69,242,30,236,7,168,230,235,108,20,22,115,134,128,117,198,111,22,237,215,44,132,227,83,57,167,181,231,100,79,209,148,16,66,55,105,235,91,70,82,131,165,228,220,242,80,19,82,25,58,225,201,212,167,152,172,254,206,118,144,148,154,43,160,51,129,103,216,91,248,171,108,52,112,26,201,181,139,148,104,248,64,204,132,19,62,219,189,191,177,99,37,43,235,241,189,63,206,184,51,61,72,7,75,193,210,221,180,4,80,61,206,109,123,25,52,142,127,211,145,218,254,118,36,126,232,203,157,7,148,88,188,133,13,72,84,25,169,62,3,88,28,33,84,61,30,130,172,138,175,65,161,155,71,113,80,21,34,109,118,143,230,153,248,61,138,20,66,221,45,161,105,201,255,150,216,155,51,166,249,237,217,66,245,0,11,53,104,203,108,44,244,80,124,125,252,101,129,42,118,138,236,19,173,183,76,13,16,254,20,220,222,97,174,172,109,187,159,163,29,164,251,194,67,75,110,108,5,169,158,51,22,55,111,187,57,171,206,243,168,149,150,180,149,0,213,102,204,123,242,179,238,66,47,71,245,228,231,102,228,164,121,192,177,160,9,220,56,140,108,26,157,90,78,64,130,30,12,58,194,189,200,179,220,177,135,58,187,233,98,151,109,16,148,109,51,233,86,126,163,5,202,12,138,51,207,200,146,253,34,156,27,160,223,250,146,16,132,8,169,155,27,154,61,15,84,116,103,198,222,222,161,79,167,71,124,33,30,124,196,218,111,248,18,16,99,216,186,85,46,178,184,39,151,127,220,192,13,10,12,114,253,89,185,155,90,80,223,241,186,226,93,85,48,79,109,253,123,32,105,217,156,216,234,113,61,129,22,213,211,223,208,51,146,247,255,54,174,168,188,8,60,115,231,201,230,249,102,144,231,178,124,209,99,227,115,215,248,183,160,24,151,201,88,196,52,154,227,175,154,80,245,238,175,29,132,204,215,80,211,235,118,237,167,39,53,147,105,157,9,211,244,93,112,144,167,160,94,197,211,46,45,28,1,222,4,94,92,97,95,168,140,98,126,235,127,187,45,119,20,210,184,224,174,254,61,75,15,72,43,144,182,48,229,129,245,224,8,238,252,121,69,22,96,80,223,215,226,167,233,82,65,90,47,245,23,143,174,16,63,215,69,241,132,236,173,250,176,59,240,19,254,74,237,74,165,215,221,94,112,216,134,126,233,147,116,224,16,42,240,5,139,249,134,51,141,91,245,115,89,173,233,242,27,180,126,208,185,247,119,175,202,102,0,197,245,232,208,96,4,43,218,121,169,52,123,174,171,117,62,230,120,147,88,124,215,76,236,156,46,4,42,108,106,82,88,202,142,47,44,73,53,168,209,248,31,210,125,18,98,229,132,86,162,144,183,228,226,43,50,215,252,116,124,217,98,9,116,152,241,20,75,157,179,166,124,229,37,63,229,178,228,32,53,183,75,228,89,179,122,104,141,102,12,25,101,95,204,84,132,173,35,15,188,78,77,205,195,164,177,108,96,20,97,138,174,121,246,81,230,245,54,213,230,120,40,163,55,246,101,80,138,80,240,28,108,212,189,232,153,39,242,101,155,146,250,143,235,100,54,242,86,148,201,99,86,229,151,185,188,63,137,103,185,60,70,168,41,30,206,252,157,208,174,88,72,18,74,186,80,113,219,11,5,38,231,55,20,60,165,35,81,191,41,234,144,192,171,14,74,97,93,207,82,71,59,25,139,13,184,202,178,87,103,100,173,112,198,181,101,64,183,188,41,226,163,38,254,103,116,174,179,126,36,37,208,215,19,109,133,124,106,186,25,110,13,10,30,223,21,48,217,102,29,200,176,20,251,156,200,169,189,22,154,254,125,250,123,13,10,60,146,216,164,161,6,224,129,184,200,30,24,12,54,204,98,252,49,235,102,220,46,228,132,120,156,153,187,76,247,77,251,63,229,235,239,169,118,203,84,241,95,133,221,80,207,141,216,11,108,39,212,18,242,190,71,38,55,206,202,94,197,53,253,143,206,40,243,72,23,41,84,75,99,125,222,108,136,203,161,36,47,255,223,59,43,225,229,75,184,239,75,175,32,243,247,248,161,144,180,212,124,186,96,89,229,47,84,203,232,98,188,54,141,105,185,149,128,56,60,164,243,250,57,124,245,160,84,128,28,224,81,102,232,189,154,191,216,78,19,218,171,90,223,102,64,218,89,165,190,197,34,203,18,112,243,161,7,245,189,43,224,50,138,125,107,95,144,116,136,202,232,240,145,47,183,255,160,1,104,71,96,175,163,115,217,42,209,114,95,57,99,116,1,99,49,95,167,202,23,149,173,137,248,228,58,202,162,172,248,199,77,128,201,123,223,222,17,82,155,125,236,123,166,107,207,85,175,231,21,28,79,133,138,159,253,52,253,182,13,10,52,76,198,43,245,113,49,101,5,9,19,97,79,142,4,72,24,104,63,195,39,117,19,222,149,221,68,111,21,62,60,191,169,58,169,147,152,60,199,213,40,25,82,109,8,49,161,179,183,114,23,117,251,119,252,3,6,41,221,77,103,209,230,229,234,125,139,103,67,71,44,164,143,15,56,233,48,34,169,158,132,141,144,212,254,8,202,144,225,225,46,109,52,9,160,165,181,172,86,182,166,89,239,81,35,88,77,90,53,8,106,59,140,21,105,135,215,167,88,1,41,90,28,253,169,125,20,19,238,96,61,168,158,108,80,126,56,147,92,32,135,133,35,53,36,12,168,162,82,203,59,59,189,1,108,190,122,154,191,202,224,195,198,210,125,135,68,87,230,55,179,187,189,57,174,255,52,189,46,91,245,13,10,208,21,244,194,93,229,2,117,62,193,88,182,95,129,93,144,67,38,13,10,77,251,66,133,153,0,81,197,246,8,53,46,121,128,211,223,235,69,251,22,206,37,172,112,183,225,221,197,145,165,15,23,167,247,230,185,28,189,41,177,238,215,87,69,48,62,96,172,104,203,17,191,246,86,158,201,62,145,40,188,43,43,61,110,212,236,102,213,128,187,7,1,140,208,112,126,249,100,179,186,210,252,219,225,63,130,209,109,163,194,194,15,40,37,115,231,31,108,122,16,88,49,105,39,65,12,113,179,200,238,176,87,37,38,69,30,229,13,103,72,252,165,77,80,162,23,3,37,17,76,89,133,18,96,232,179,80,232,228,243,225,34,101,45,198,219,63,188,115,136,62,248,64,113,89,136,171,246,165,15,164,15,217,20,12,51,7,108,17,47,127,216,245,115,113,8,129,214,117,238,79,114,13,83,222,245,21,19,50,50,129,13,10,63,98,16,194,142,55,91,255,138,203,35,21,137,127,135,82,20,59,111,140,67,75,251,112,69,201,217,187,61,227,217,199,34,186,199,228,88,88,17,26,14,176,175,30,161,47,109,240,40,232,238,78,8,253,254,226,251,96,202,101,75,5,167,248,14,50,20,13,131,202,226,186,80,38,161,158,180,5,148,245,210,141,130,227,29,126,137,146,98,148,51,134,149,3,9,211,134,249,168,93,191,8,172,87,174,122,20,39,39,95,13,136,26,51,244,36,254,71,126,137,199,136,32,148,137,98,126,170,128,145,9,231,148,148,12,184,210,23,9,164,115,6,25,174,114,66,41,234,32,41,79,19,16,117,208,8,14,180,12,218,219,29,6,187,103,178,24,38,4,159,85,254,60,179,26,110,191,215,27,207,78,8,68,15,17,64,199,119,182,64,17,69,180,94,210,142,19,150,210,82,199,159,54,185,178,131,62,88,106,241,104,159,231,124,124,139,135,177,83,77,145,174,108,203,222,170,74,84,138,166,24,169,142,226,40,64,109,132,156,229,165,115,91,190,192,174,38,243,223,185,193,36,39,75,72,126,165,240,159,244,159,140,43,172,117,125,27,178,198,3,239,101,205,113,85,155,79,153,75,153,0,4,177,21,13,10,83,228,128,208,132,85,189,244,251,122,114,54,112,198,13,244,182,168,123,135,158,154,100,188,229,165,55,146,160,174,176,232,85,117,201,79,77,161,141,252,51,253,232,38,212,224,246,74,183,201,235,66,5,185,28,161,53,67,235,160,71,75,14,179,60,196,222,26,128,179,17,85,183,234,205,212,90,153,236,202,19,92,207,138,167,230,8,222,113,53,149,142,14,126,102,168,130,237,33,77,174,244,35,52,33,255,153,188,172,45,84,255,140,59,169,188,76,5,229,16,60,122,25,45,225,104,134,8,92,148,146,163,52,142,71,123,189,124,125,16,79,108,73,145,240,202,84,188,133,182,141,197,129,72,255,76,241,127,148,35,104,223,144,149,96,99,203,192,242,5,210,124,213,199,136,55,242,195,0,96,227,34,40,134,7,85,123,163,230,201,161,159,131,215,241,134,233,151,230,87,230,19,227,254,91,105,77,174,47,248,180,37,205,221,221,253,127,229,105,202,113,187,4,208,50,52,69,163,4,118,15,125,47,184,242,176,230,171,226,124,221,53,132,198,51,13,10,3,171,67,92,164,67,232,106,210,227,140,27,202,107,192,250,0,102,184,187,110,30,111,169,136,109,223,58,46,243,157,228,245,228,58,141,56,250,218,67,53,129,236,152,219,199,47,109,176,139,125,189,119,190,169,57,93,226,5,109,138,62,23,123,225,218,219,192,205,139,82,13,10,216,34,220,4,152,159,55,85,129,119,178,4,77,176,103,169,148,84,112,210,161,42,40,166,238,206,211,36,105,157,64,247,200,75,251,82,25,12,78,13,138,252,155,143,106,201,184,9,127,71,56,16,239,24,182,120,163,120,208,246,246,72,206,83,28,189,219,52,197,210,230,79,71,170,192,32,86,225,30,121,99,67,239,62,37,5,245,183,66,75,46,7,228,219,136,236,3,167,156,175,238,35,61,31,159,78,56,105,252,53,142,137,147,1,158,226,137,65,135,22,92,51,221,142,183,248,64,227,87,124,3,28,26,82,82,108,239,44,11,206,190,187,175,83,28,64,83,17,116,98,230,188,230,70,193,112,121,57,27,30,182,145,96,230,188,102,182,216,116,53,163,207,54,91,104,1,238,43,180,3,253,160,38,25,129,134,236,211,135,170,179,55,112,228,62,202,249,143,219,90,63,54,249,101,244,37,22,71,163,62,9,88,30,126,226,93,243,117,78,112,13,10,233,200,135,67,234,13,10,115,40,215,6,40,203,181,248,107,76,148,152,97,196,157,99,28,89,163,56,81,116,83,97,37,179,117,8,241,248,155,91,212,22,241,213,31,176,105,155,98,190,209,203,205,82,206,48,136,151,238,188,189,177,176,109,21,225,88,104,176,211,48,255,38,130,247,30,235,48,136,30,144,217,101,19,160,106,184,85,211,147,25,149,174,105,8,228,119,200,13,10,232,182,4,18,213,158,81,137,7,165,106,33,194,236,0,149,225,100,247,152,248,250,71,215,46,199,2,2,137,156,121,150,198,28,146,210,241,159,5,247,176,252,101,73,63,98,102,242,175,149,182,192,86,126,81,64,41,52,121,86,188,90,126,137,227,237,25,187,220,249,25,215,129,41,17,40,120,216,253,151,130,51,67,192,50,69,37,209,233,24,68,194,42,60,222,8,131,6,227,52,176,181,193,127,37,112,165,232,6,66,72,218,65,28,68,204,142,102,36,224,254,17,121,153,32,61,231,43,112,86,82,104,119,75,207,120,23,119,192,8,221,135,137,47,213,12,163,236,255,177,246,203,129,187,216,123,223,4,113,86,6,39,4,11,48,69,198,193,18,155,70,55,138,34,104,246,123,168,241,209,86,236,140,34,46,33,12,193,50,200,189,30,234,29,3,90,195,72,71,11,239,85,63,41,169,159,52,194,190,133,23,223,246,126,52,167,128,210,82,184,59,124,154,109,25,85,114,21,107,202,61,219,188,136,101,203,33,245,162,3,65,248,239,79,205,251,78,84,99,194,241,208,246,216,26,3,200,45,107,151,193,48,248,131,49,199,165,11,144,113,78,19,114,143,126,42,186,18,230,29,250,64,225,231,234,73,170,186,117,174,238,4,99,13,10,22,71,237,12,131,203,119,171,56,130,219,104,223,18,58,175,233,246,46,14,32,141,198,151,140,172,242,93,241,116,187,82,112,212,82,28,152,95,37,72,173,128,185,255,103,52,31,74,45,3,248,156,14,155,186,63,238,179,98,118,105,133,250,110,205,18,176,218,37,143,13,251,111,48,106,41,70,5,165,100,142,164,76,164,92,109,145,245,233,39,243,131,214,232,254,232,57,226,179,117,100,226,170,7,247,72,146,249,25,89,243,176,109,222,160,223,112,49,45,213,218,158,27,68,80,127,74,163,160,25,119,38,76,29,134,5,127,18,243,156,228,38,3,122,27,125,248,51,35,186,93,179,7,13,10,235,210,235,215,115,38,252,3,222,57,26,38,222,196,37,240,87,118,251,64,45,242,233,1,39,116,33,118,40,168,87,131,163,1,75,15,127,219,85,108,200,221,80,47,87,110,208,201,33,91,183,220,160,111,216,97,102,77,115,244,111,142,150,50,46,25,43,145,19,101,77,244,53,146,211,124,166,191,209,19,199,207,206,32,229,137,238,107,107,93,67,117,242,15,215,32,64,174,38,202,253,123,137,5,192,130,191,130,91,88,176,227,225,65,100,0,38,213,233,209,156,217,229,20,170,159,144,233,151,142,81,149,116,117,181,113,134,58,32,193,160,163,20,90,168,197,93,166,86,96,206,16,229,68,39,114,240,97,79,212,169,107,40,100,161,200,233,253,246,189,123,170,155,172,135,27,205,227,144,100,121,42,75,97,13,36,229,125,89,14,172,89,93,148,108,230,111,52,202,119,223,15,76,66,4,250,57,66,68,205,214,50,57,65,85,103,233,110,212,221,119,117,12,103,127,72,229,63,177,212,52,253,171,89,5,254,89,16,242,158,74,54,189,121,51,55,189,53,67,210,213,192,16,162,38,17,212,82,248,102,189,133,55,229,117,94,170,211,194,217,236,187,165,43,27,164,142,37,24,128,102,230,144,210,126,146,42,173,116,77,104,83,223,75,86,37,187,249,239,174,245,184,219,141,169,29,187,146,222,72,44,143,181,83,123,121,207,209,170,223,138,212,38,114,23,48,173,183,253,194,77,189,159,88,183,74,1,50,58,198,141,164,161,128,242,19,1,150,72,251,66,126,60,44,235,224,123,42,249,142,132,230,203,119,175,194,24,132,187,141,131,161,116,242,58,0,197,150,213,144,160,87,235,148,125,99,11,132,193,24,212,70,0,109,47,235,131,133,168,204,71,187,232,39,150,56,160,223,96,173,77,43,252,69,123,217,234,137,108,189,37,78,80,97,200,55,106,228,216,223,125,232,16,13,45,91,110,57,24,54,67,192,121,170,209,221,177,194,249,78,202,69,25,191,96,144,155,106,151,24,195,22,135,180,9,180,9,222,13,24,66,224,104,203,231,55,86,60,208,151,85,127,95,43,178,41,215,176,125,137,79,235,176,123,51,78,241,16,254,201,211,215,193,70,47,146,241,19,176,130,216,242,16,211,170,180,116,212,244,119,34,132,124,136,201,192,162,46,251,125,112,179,105,183,238,52,74,44,30,123,20,3,57,188,231,191,92,199,114,98,214,243,134,139,243,224,79,55,168,28,157,80,82,46,154,214,251,180,246,24,58,113,146,95,203,247,11,33,137,57,194,116,69,61,57,88,119,90,166,193,156,222,119,82,107,251,115,149,115,25,48,103,32,92,3,204,141,226,193,138,252,121,102,159,227,173,144,53,233,200,53,47,206,185,90,41,75,102,236,84,147,101,246,194,34,79,41,236,49,226,48,251,249,41,56,83,182,218,105,67,9,1,18,243,248,93,118,71,84,195,122,156,36,78,109,108,206,207,163,136,11,42,147,80,126,146,205,112,235,118,253,39,197,100,11,177,113,57,74,55,193,234,247,126,109,127,63,208,139,149,85,222,64,109,102,180,207,6,173,221,87,237,133,51,249,240,68,34,164,21,66,127,117,36,91,253,3,33,254,211,228,88,47,84,45,53,59,40,109,148,47,15,114,209,183,165,136,93,133,168,198,60,106,170,215,1,150,3,210,254,244,255,41,173,235,81,100,181,225,5,37,131,47,69,115,195,245,136,223,189,232,51,194,23,36,120,13,18,120,222,128,201,151,255,234,96,218,215,195,123,59,237,145,7,51,136,119,206,155,71,234,212,89,152,102,241,1,100,91,115,173,143,170,121,86,211,76,203,173,255,155,110,87,232,48,80,111,183,55,115,69,62,158,43,136,46,214,15,120,137,50,80,2,128,243,252,113,108,70,173,108,105,141,241,251,115,89,230,226,93,166,28,133,225,81,16,129,157,179,210,101,68,29,150,74,17,144,12,35,176,220,1,164,72,224,65,230,117,244,111,226,12,196,107,241,60,60,201,98,74,117,192,28,167,202,58,5,28,115,170,191,75,177,37,133,81,128,109,166,166,226,116,141,133,3,50,246,173,99,77,74,252,102,210,117,158,253,134,195,141,254,82,66,228,65,17,188,229,252,63,37,95,17,207,251,91,18,253,64,79,104,34,117,164,186,26,215,127,18,167,115,136,40,221,104,78,107,238,139,7,188,78,6,89,81,129,41,235,211,178,46,144,205,225,92,101,39,70,86,105,229,42,2,106,190,224,105,197,211,127,51,54,167,39,41,129,167,232,109,213,29,218,172,14,22,104,41,160,234,104,152,58,104,7,191,46,192,2,145,41,75,107,35,116,51,114,213,105,61,42,26,28,80,57,79,191,48,45,124,228,11,108,160,24,154,116,238,175,186,229,162,17,28,232,212,254,94,220,64,63,109,164,99,232,117,17,219,158,186,13,10,110,56,188,255,204,249,135,140,114,244,248,101,41,223,58,158,70,240,224,252,39,106,150,212,22,223,187,211,130,218,146,110,132,62,207,90,189,28,79,180,145,220,46,74,171,115,236,61,222,225,67,50,34,100,144,56,48,38,55,117,236,221,2,166,2,112,126,4,217,86,1,160,50,70,80,3,165,49,14,248,67,117,45,24,208,108,243,224,169,45,105,49,164,167,237,154,18,255,32,88,151,110,18,26,118,149,106,162,3,244,89,174,69,64,98,80,131,3,23,173,133,238,26,26,145,3,47,179,104,41,44,168,14,56,195,180,9,217,119,32,217,9,1,61,22,45,121,195,133,32,140,9,176,187,140,30,201,26,192,250,102,131,31,16,111,147,113,127,102,127,247,152,122,50,5,180,82,91,172,76,178,230,52,156,141,197,137,172,163,137,113,140,151,77,168,101,140,144,236,225,98,242,64,13,217,100,61,20,70,13,10,118,209,146,67,157,133,122,20,132,82,166,87,221,177,163,81,194,232,170,106,173,102,86,46,146,160,11,180,249,172,51,247,94,199,201,194,191,126,120,152,31,94,220,244,229,84,254,214,251,204,186,171,11,243,241,147,191,231,243,153,23,93,231,208,137,218,206,155,187,163,70,172,104,116,166,45,252,68,184,205,245,129,87,128,102,125,25,31,114,141,74,95,120,77,76,100,118,188,216,176,113,231,188,52,208,59,92,78,20,198,150,199,149,30,97,186,185,135,20,225,104,199,87,70,45,93,35,234,111,152,239,189,82,73,182,222,138,224,140,141,131,12,55,252,107,98,251,9,212,106,33,44,245,224,0,56,55,231,38,92,51,156,78,216,202,61,122,203,26,69,73,13,10,1,241,139,234,198,117,134,111,28,176,146,16,142,2,19,249,201,100,82,55,46,44,210,192,185,145,86,166,15,170,222,112,86,15,248,93,191,193,68,196,154,78,23,72,172,155,93,69,180,78,170,197,37,105,144,180,167,80,199,34,175,83,212,46,236,41,169,81,0,104,179,130,87,190,245,22,155,216,188,233,100,57,140,28,238,214,124,113,63,232,3,155,21,140,61,170,182,174,92,185,106,55,197,238,228,158,241,67,41,107,193,134,64,43,17,59,160,221,109,217,241,166,94,232,1,191,79,63,66,25,39,167,140,195,51,14,23,93,44,244,30,117,75,198,79,63,112,89,27,142,145,251,31,139,102,240,26,20,63,121,190,109,51,33,183,7,24,134,89,55,86,236,0,116,175,162,81,156,123,77,33,182,18,56,58,214,110,123,92,138,136,209,176,44,86,146,250,109,197,219,186,133,122,154,36,27,115,97,133,45,47,127,123,204,34,243,120,80,71,13,6,124,161,220,135,71,76,73,168,43,111,236,137,155,104,205,83,176,173,89,191,200,80,234,73,128,237,169,61,255,253,158,168,143,42,241,22,18,127,168,246,158,185,110,51,163,180,149,242,9,159,168,155,20,127,154,208,229,167,15,151,79,114,112,36,112,208,250,228,240,26,160,188,50,59,181,60,194,44,182,234,162,105,118,59,211,130,54,179,4,125,57,13,128,207,157,203,98,25,249,224,170,91,148,95,211,173,192,193,112,251,230,249,109,93,80,115,189,202,153,223,89,0,56,24,226,253,54,38,159,249,98,12,132,33,121,30,128,196,24,225,80,120,251,30,219,242,23,41,199,29,195,140,226,37,31,190,23,22,186,118,175,21,35,153,185,8,75,188,12,177,229,222,105,105,18,117,129,50,122,100,243,118,210,107,90,118,220,32,252,2,165,249,237,105,52,156,137,169,110,162,15,104,49,192,115,68,207,219,111,223,119,118,207,74,239,78,96,20,114,140,190,80,118,114,2,132,251,200,161,86,219,244,140,162,99,93,215,43,249,143,104,92,86,109,147,231,77,249,219,72,140,164,114,56,89,7,123,229,81,212,184,235,190,229,79,154,7,88,142,171,119,238,15,167,64,205,76,14,160,182,29,122,205,92,101,173,218,178,233,66,40,23,53,41,50,205,4,206,127,237,71,166,147,131,227,169,240,247,251,132,234,180,187,128,22,87,204,79,146,204,249,202,162,140,23,138,67,129,241,65,75,209,88,88,174,168,11,218,89,173,223,67,112,54,39,201,218,69,45,77,22,242,33,127,108,130,248,125,15,118,24,168,69,21,82,53,79,241,147,202,154,55,241,141,70,222,217,62,11,194,90,171,43,161,191,39,105,21,233,196,39,8,193,107,38,186,47,149,190,181,2,254,127,147,103,12,164,116,155,124,24,120,207,240,52,123,164,39,48,84,200,237,7,242,47,125,126,91,249,235,21,245,147,3,182,85,207,134,163,0,209,160,189,76,0,93,152,156,183,50,91,214,9,96,120,167,122,206,175,112,96,27,33,60,181,161,137,132,216,31,41,11,132,117,5,80,232,181,126,249,74,38,24,67,19,174,24,121,92,80,79,0,252,25,21,164,175,214,216,35,228,241,18,168,167,105,240,0,114,54,135,199,13,12,92,54,74,2,213,59,137,181,208,98,1,129,25,155,87,146,61,119,193,111,195,173,97,53,96,218,48,103,182,111,50,22,153,223,44,142,8,108,234,158,184,60,236,76,62,114,42,27,93,208,16,103,90,87,138,237,87,3,115,72,139,108,222,125,86,67,230,93,38,3,85,4,29,40,132,179,157,1,64,79,219,5,135,195,255,26,108,17,40,207,153,159,106,211,84,249,110,174,52,109,169,237,184,116,83,217,227,249,254,80,223,243,110,71,17,214,69,47,227,14,78,150,44,89,7,12,158,52,132,191,113,215,227,16,244,36,119,18,15,132,39,104,18,242,183,157,94,81,252,147,180,107,51,16,160,138,198,35,33,241,175,103,239,51,118,248,213,137,148,8,66,201,153,142,76,130,185,20,82,23,117,225,154,2,153,254,119,232,51,226,183,192,67,115,91,130,131,179,13,10,248,84,243,174,7,79,16,13,164,32,161,186,241,239,39,64,42,47,161,91,246,79,76,36,237,111,58,58,197,59,249,129,254,134,138,1,249,228,125,159,125,85,80,72,136,149,63,66,110,19,45,59,12,205,69,49,42,128,117,244,168,125,31,170,247,113,91,147,191,67,8,241,50,64,84,83,132,227,109,112,33,243,118,109,120,29,111,42,169,155,82,120,197,1,130,191,231,27,237,234,184,153,225,178,76,16,39,192,57,227,79,252,124,243,138,231,16,33,106,151,219,14,252,14,237,139,157,73,86,183,127,163,226,168,159,106,148,30,92,85,64,0,88,183,223,52,75,89,43,91,181,189,83,253,167,178,57,103,212,210,117,141,2,141,99,13,66,27,187,79,98,49,26,201,214,218,39,195,162,103,129,250,103,19,71,217,9,172,246,168,172,117,56,35,186,13,57,112,123,95,221,77,222,93,154,66,37,35,54,13,10,70,41,177,108,211,69,152,220,161,197,116,11,213,236,14,192,192,143,138,57,66,198,204,5,175,212,121,14,220,244,70,198,251,138,140,216,219,218,116,187,166,62,213,192,89,64,146,91,194,194,163,220,96,214,155,66,90,112,50,218,117,206,44,100,104,76,136,117,247,53,220,159,135,15,123,102,233,120,152,223,201,46,157,161,53,29,126,131,102,79,53,93,241,161,200,208,191,138,13,61,43,182,251,192,225,185,44,190,190,17,136,145,21,50,181,244,58,200,38,62,188,13,170,251,144,240,167,222,199,30,86,195,13,57,219,89,69,95,92,176,88,114,166,157,156,36,215,252,156,243,155,79,126,22,100,2,146,52,25,121,249,12,189,3,19,136,172,241,64,29,255,62,157,94,130,184,93,246,203,20,77,174,219,116,228,230,63,233,219,47,76,223,22,6,247,47,223,117,186,245,115,172,176,122,254,188,140,87,168,72,146,230,251,23,72,14,243,189,158,207,138,46,55,189,195,248,144,253,130,252,210,221,191,140,17,58,233,111,64,19,89,199,89,170,243,146,76,222,48,110,33,227,8,240,248,171,0,192,199,229,228,77,47,107,138,175,12,222,81,145,147,76,82,60,166,47,225,168,22,117,144,165,18,53,244,149,21,67,233,15,123,68,111,60,66,80,236,135,143,24,189,109,88,127,254,171,212,123,125,219,56,212,207,45,148,30,217,248,60,177,96,193,112,41,142,231,152,146,189,230,39,122,197,74,181,171,202,154,115,205,110,74,93,39,207,165,210,250,215,245,118,252,30,53,180,178,35,90,150,113,22,231,187,30,171,131,255,67,96,177,103,53,249,139,176,212,40,160,231,67,22,168,210,11,236,208,119,219,161,176,119,117,48,237,42,46,144,100,230,64,107,100,242,53,126,128,214,231,127,223,190,101,97,119,55,105,157,237,61,97,165,83,102,90,143,119,87,95,204,40,122,84,73,54,99,30,137,152,53,114,96,215,253,28,56,118,111,128,126,229,200,73,248,191,185,6,251,121,19,191,216,84,71,113,74,63,132,221,222,193,51,154,140,46,96,167,49,7,54,251,6,156,38,169,40,168,15,203,237,15,58,132,68,87,157,186,114,65,178,0,31,41,97,58,191,156,68,158,28,216,211,208,202,19,117,245,25,161,76,148,206,82,128,19,97,43,247,238,28,243,18,239,159,62,143,200,205,187,253,12,240,71,139,171,66,173,166,16,107,33,254,22,155,22,48,65,72,114,176,8,124,67,136,6,58,180,76,143,243,75,162,139,56,48,235,53,61,231,142,123,224,250,131,227,55,191,142,203,153,13,10,154,162,22,159,3,104,157,167,7,104,33,31,208,197,25,178,13,10,151,226,11,163,37,44,71,69,217,105,164,148,76,251,158,6,252,169,255,8,125,227,232,22,23,45,7,165,254,71,235,41,84,156,226,235,59,133,134,98,106,178,62,64,226,185,39,41,95,216,100,188,214,202,109,133,211,101,14,236,22,145,202,240,173,195,23,181,213,79,135,164,109,180,206,159,184,173,207,209,180,21,34,64,247,46,178,47,62,46,123,22,255,83,187,76,118,224,198,115,32,232,50,220,146,148,59,172,148,181,78,144,7,57,104,232,254,246,246,186,103,136,210,43,218,146,145,155,236,115,241,186,163,205,223,255,132,18,67,36,204,73,26,169,9,81,112,34,0,37,216,120,179,188,116,216,194,65,67,139,84,183,41,58,109,216,234,163,27,115,224,0,26,131,69,118,216,139,147,77,34,151,201,223,186,113,218,195,3,83,74,103,128,95,220,188,134,94,114,106,103,241,54,3,240,233,48,68,211,41,13,10,73,92,72,96,154,133,25,177,217,107,202,13,0,128,0,199,86,31,0,231,55,77,225,59,170,31,224,3,37,137,112,174,204,21,201,36,17,129,113,167,224,12,240,212,107,77,232,66,44,20,130,120,182,134,25,233,130,96,198,142,222,243,159,127,181,197,30,51,48,34,0,171,110,101,161,57,198,43,179,113,11,67,194,100,22,225,103,247,239,13,46,14,220,215,64,42,24,211,82,96,82,133,203,190,232,1,75,225,53,101,189,214,145,69,167,154,185,235,16,244,32,227,228,168,231,0,130,240,192,102,252,230,224,46,221,235,69,16,201,183,203,32,41,148,140,138,5,13,10,104,154,43,88,120,88,179,182,33,202,239,43,80,17,97,159,162,252,217,153,169,248,99,7,4,58,44,107,125,34,146,61,109,1,5,27,40,1,248,54,253,226,115,85,190,206,56,50,229,32,103,165,220,24,173,21,136,49,14,81,98,84,248,168,23,239,38,111,29,75,206,250,62,132,143,193,198,219,113,45,246,124,142,253,7,156,205,244,40,255,98,208,249,29,182,145,224,80,186,4,26,100,226,92,92,51,212,0,177,110,187,145,54,85,168,40,112,140,221,46,18,19,222,189,84,235,174,235,227,106,233,51,239,69,199,92,30,15,216,39,47,181,168,212,190,204,217,28,152,203,88,5,59,0,156,198,76,23,194,217,251,92,246,135,53,195,135,95,84,65,149,126,220,165,122,156,89,225,185,242,175,214,80,205,7,69,65,70,7,125,67,168,163,69,248,34,0,117,39,132,144,56,145,32,79,78,190,145,233,19,134,145,157,88,26,175,0,236,168,158,51,113,234,151,130,51,80,13,10,112,6,43,253,211,183,210,221,251,96,93,34,113,92,231,17,137,162,56,57,109,205,91,210,93,81,40,61,21,61,123,108,27,223,96,61,46,91,6,106,25,98,83,244,4,128,118,182,146,236,239,172,101,225,195,23,251,32,34,58,201,138,102,77,74,222,223,123,116,29,61,187,64,37,137,221,98,250,152,60,154,89,125,34,255,114,245,218,163,239,50,73,84,1,49,250,89,122,203,152,104,115,118,235,0,19,180,233,21,25,178,216,213,175,69,16,240,102,39,68,236,182,204,189,156,227,104,243,157,34,250,54,117,241,56,111,63,160,140,119,136,40,81,246,162,117,80,149,48,71,64,129,240,211,7,117,63,197,8,30,222,238,217,56,134,96,150,20,19,30,234,154,75,168,133,226,59,108,12,160,35,245,177,42,118,13,10,107,163,231,119,200,54,73,215,238,150,226,234,105,151,61,74,12,101,21,162,223,36,77,213,106,32,21,51,80,93,238,209,100,150,80,72,4,181,29,135,198,21,77,197,77,20,234,221,190,141,152,196,149,125,250,46,234,155,126,232,111,131,236,83,159,144,130,179,37,251,95,48,120,101,13,10,3,137,174,84,142,254,245,219,135,144,233,197,191,137,169,176,136,189,158,195,182,164,230,190,43,38,206,122,242,248,38,84,94,111,23,230,79,23,40,208,47,200,36,62,83,25,102,14,192,102,49,145,145,216,177,24,13,204,197,231,222,213,201,52,201,91,189,31,20,205,156,25,96,126,237,62,186,217,126,234,181,46,53,41,58,21,252,54,170,37,149,232,24,71,58,192,93,108,68,163,92,178,124,163,16,118,80,48,237,227,168,64,233,162,84,85,13,232,43,124,122,245,226,185,252,70,68,175,162,74,146,6,153,187,24,16,127,252,76,101,190,2,85,151,162,250,121,74,154,212,35,228,60,100,178,211,36,190,66,44,169,238,230,247,81,40,163,20,59,159,83,112,117,32,144,209,113,137,176,203,130,156,241,237,144,100,91,54,232,160,214,119,222,78,99,191,164,240,63,170,177,147,230,56,147,121,222,158,130,141,214,78,74,226,198,136,115,121,55,186,46,162,146,121,125,202,131,219,143,15,183,2,206,165,192,47,154,17,196,140,211,76,41,221,167,213,132,241,44,143,192,235,227,100,231,151,183,167,192,41,172,88,164,118,205,71,71,32,112,19,214,88,240,6,20,170,190,105,189,4,241,20,80,111,131,67,62,2,63,39,214,204,109,116,120,127,103,147,117,77,13,69,48,27,133,82,123,89,52,30,96,180,29,77,6,157,112,52,32,14,58,22,227,144,219,143,186,54,39,111,204,90,83,140,180,89,206,224,115,46,199,164,138,219,75,82,237,65,74,212,8,52,143,112,41,37,127,249,224,157,105,38,172,150,248,170,225,3,185,11,121,144,222,168,230,32,0,154,56,236,85,111,130,180,246,72,114,143,95,187,180,83,51,138,247,8,129,237,232,61,41,92,86,27,233,243,28,51,32,125,149,42,55,155,102,15,227,96,192,20,16,188,225,91,217,96,38,206,207,254,166,215,13,162,164,112,89,149,29,37,74,165,203,254,139,116,15,65,194,95,202,76,127,113,88,250,40,20,137,124,164,22,95,148,0,226,3,254,48,177,217,239,78,254,49,143,154,54,65,72,40,180,125,132,163,80,120,45,54,45,110,100,172,238,138,134,35,62,178,73,157,50,251,5,151,11,34,36,138,221,13,128,171,125,151,144,241,33,44,176,145,214,206,197,55,185,21,79,40,204,6,102,151,72,100,81,236,6,40,222,99,163,64,183,17,45,245,183,51,247,180,195,230,34,6,31,148,18,69,95,242,181,208,34,152,77,75,239,100,89,44,60,226,25,190,79,104,89,25,1,89,82,65,161,171,129,157,56,112,46,220,112,6,8,86,225,65,122,160,113,53,121,164,48,170,166,124,179,3,44,34,93,239,124,232,140,101,197,204,112,42,251,182,186,129,134,2,76,209,175,108,99,71,63,112,202,67,157,187,53,227,62,165,108,201,85,207,222,183,222,114,182,125,195,57,31,84,122,51,181,26,92,138,45,48,91,71,70,205,140,56,8,110,127,24,36,52,143,5,120,15,218,42,65,187,46,74,181,135,111,84,31,93,14,157,172,43,65,194,84,33,108,39,126,142,84,177,23,75,218,221,114,4,38,0,155,2,114,73,135,115,68,173,68,19,253,151,157,233,140,25,71,103,8,234,62,96,143,251,135,95,133,237,160,220,106,5,53,122,103,185,143,214,253,85,26,221,113,34,210,248,81,12,70,37,3,114,153,132,240,6,241,120,159,158,206,37,60,97,24,182,148,160,179,228,184,158,105,70,117,83,91,182,223,224,58,171,91,219,126,235,93,252,67,136,30,243,131,212,239,61,222,107,185,132,121,68,236,65,151,163,54,124,243,203,25,213,152,18,217,166,170,236,207,87,84,216,195,252,205,100,69,149,239,62,218,137,181,76,90,163,152,157,212,121,99,106,149,57,58,33,230,98,120,226,106,110,170,233,164,214,19,240,9,212,130,245,30,2,96,238,25,57,52,207,116,196,22,19,71,177,53,14,7,16,168,20,175,222,17,230,42,157,142,103,41,219,51,77,215,54,196,110,36,243,215,16,206,24,158,100,91,153,62,61,127,253,69,229,136,247,240,206,167,141,70,70,11,61,20,2,85,50,21,133,26,82,211,123,237,124,28,166,210,251,87,116,250,163,122,68,139,82,75,102,17,85,223,108,198,37,139,155,164,154,73,51,75,55,91,28,251,148,41,82,197,242,210,183,5,50,7,73,196,48,105,34,42,84,189,45,15,85,51,72,57,108,21,96,215,127,23,31,207,88,167,188,204,125,102,12,164,58,18,223,215,207,90,174,255,30,240,115,144,189,189,32,97,41,151,129,179,134,138,170,162,127,183,203,238,173,241,78,193,235,190,73,21,59,44,112,152,25,236,129,64,245,136,148,139,230,110,60,144,216,243,112,223,110,24,96,199,201,192,238,180,149,190,198,217,32,21,169,203,214,36,194,76,132,197,43,133,206,201,82,233,109,47,227,75,54,42,64,3,163,2,208,206,30,195,39,17,133,77,30,117,122,37,212,80,89,147,240,115,98,143,241,197,61,44,224,192,240,40,238,208,160,189,42,0,198,170,170,162,159,169,105,216,46,195,42,3,188,104,24,97,112,36,220,233,68,185,170,213,152,49,13,50,116,219,153,77,188,224,145,217,138,252,137,119,74,176,237,110,165,7,160,86,136,243,119,29,215,78,244,13,10,46,102,60,55,151,155,176,186,197,119,142,93,133,93,109,24,134,181,34,117,5,40,148,195,103,240,105,45,149,96,69,12,31,219,40,7,30,198,107,21,181,198,169,254,102,250,102,95,178,46,116,125,107,241,5,21,238,210,12,23,44,54,144,190,62,217,254,14,121,23,168,145,135,177,202,93,100,56,76,47,82,150,133,249,140,56,154,60,225,212,81,93,22,13,116,45,203,221,237,60,35,146,106,115,151,107,48,134,213,150,211,213,230,13,127,64,124,72,156,236,114,31,39,63,98,145,37,107,101,12,126,34,53,118,25,67,67,109,59,109,182,237,33,46,43,20,149,229,3,135,81,122,118,22,248,0,255,102,3,70,203,18,244,186,212,71,81,243,77,67,235,237,26,179,146,140,201,236,220,76,167,220,193,22,5,71,139,212,131,245,165,161,229,144,180,73,70,88,219,89,174,121,64,83,116,224,205,95,17,125,86,236,96,26,107,91,200,102,189,234,225,123,36,105,185,117,187,37,147,0,16,1,175,36,12,39,186,75,252,122,198,137,170,56,242,81,155,72,88,132,214,124,126,140,89,115,248,105,171,125,28,56,45,185,6,176,193,133,8,69,222,215,148,191,97,245,229,241,115,171,40,28,195,216,168,229,137,196,164,13,117,203,164,41,209,137,156,215,17,20,128,65,209,187,210,252,164,120,151,114,105,188,124,168,223,188,243,154,143,183,39,82,19,247,169,163,206,188,15,204,205,223,40,240,249,60,94,33,221,188,247,231,132,16,59,116,141,226,135,97,217,14,207,217,44,20,23,231,118,226,34,104,215,240,205,164,36,162,204,74,188,212,76,6,120,245,228,252,194,126,222,220,63,36,139,54,87,114,155,164,119,0,76,249,69,169,121,132,148,79,111,83,121,25,244,217,53,145,214,218,9,100,124,123,82,194,5,160,162,107,203,254,88,52,175,233,129,191,222,184,19,93,153,103,21,226,67,58,169,120,49,104,181,231,144,220,130,171,33,45,255,135,201,86,85,80,37,197,209,54,3,2,233,152,12,39,196,178,35,45,16,118,171,201,191,71,193,102,251,39,0,237,107,178,252,139,235,141,143,249,144,28,20,154,34,32,65,110,101,34,157,25,99,167,146,81,7,32,23,196,124,90,234,86,20,29,41,88,207,65,120,147,170,5,193,237,112,58,219,130,112,23,89,29,44,158,167,44,99,131,208,238,129,124,2,147,134,194,202,82,186,127,50,139,18,205,200,61,241,219,21,74,151,192,204,146,127,164,175,244,127,104,40,75,20,221,201,88,180,3,246,14,98,33,188,44,48,94,73,72,231,98,76,56,202,111,122,164,241,85,47,55,83,199,27,78,226,6,81,113,247,79,200,240,208,0,221,58,24,25,173,230,190,174,15,65,64,133,244,99,48,191,153,215,7,101,37,195,3,105,21,4,155,66,31,240,196,74,209,7,34,243,20,212,250,203,16,250,77,12,102,58,16,100,145,109,76,167,239,104,152,32,183,127,202,4,136,142,98,152,193,14,49,122,9,22,88,124,185,191,176,111,227,228,139,89,16,154,204,135,207,186,73,213,46,82,65,38,103,94,52,5,102,46,70,88,207,232,34,50,229,66,218,194,1,63,94,31,3,109,124,3,193,22,103,47,192,163,128,33,4,93,192,156,149,201,82,156,69,113,164,11,128,202,196,159,9,9,145,242,108,249,138,219,66,23,118,24,95,69,204,58,97,202,182,119,34,66,203,15,222,68,64,47,34,80,58,128,200,119,8,197,14,255,139,82,50,81,96,156,75,8,20,57,36,55,54,88,210,228,115,16,180,243,238,69,149,226,80,28,230,184,36,248,199,0,206,97,80,252,162,200,35,36,237,52,209,194,43,36,155,2,38,41,22,118,100,231,83,240,198,223,51,190,68,160,96,123,203,31,221,181,159,158,35,107,156,83,36,170,23,89,218,92,79,250,58,8,111,68,211,137,136,205,211,79,144,6,254,126,123,212,95,149,155,138,196,7,129,231,221,132,28,86,57,97,206,23,7,71,14,15,93,252,31,150,198,171,237,38,198,159,27,249,193,127,184,204,78,109,105,240,119,163,67,18,95,89,45,178,0,147,182,246,57,232,150,118,228,90,214,199,197,229,77,88,60,49,12,185,43,58,221,4,240,176,128,186,61,11,67,75,92,60,82,47,179,145,154,170,133,62,48,252,236,104,227,39,212,67,53,185,110,235,178,65,88,236,132,249,1,249,52,72,119,228,15,131,16,220,79,14,220,133,1,224,24,187,27,141,88,241,227,131,31,242,73,192,197,13,101,61,134,245,250,195,247,208,140,212,165,97,213,120,59,227,242,66,214,218,162,30,115,213,225,250,213,146,187,189,180,160,0,1,182,168,185,89,27,102,20,0,228,97,18,170,108,121,152,75,193,244,88,89,48,171,177,173,210,152,15,45,207,152,241,186,25,95,225,112,114,135,203,133,214,134,234,108,213,121,41,50,132,90,36,219,228,86,244,100,5,197,185,48,140,69,172,94,195,177,192,48,210,217,83,159,109,94,248,35,6,140,117,104,69,188,92,25,226,4,111,92,133,110,93,64,105,216,14,71,128,252,138,58,171,130,231,69,209,155,150,68,84,58,130,60,3,213,180,89,120,243,66,85,205,91,94,24,124,13,214,32,197,82,63,86,111,136,84,199,156,192,86,85,238,194,177,84,216,16,87,219,208,177,160,28,157,87,133,53,128,26,156,73,172,40,174,49,20,29,184,13,10,12,86,26,4,238,248,32,191,191,130,215,209,83,130,69,61,159,104,13,177,36,48,138,243,88,122,18,40,43,23,5,3,31,2,96,177,43,229,133,245,102,76,28,149,91,178,231,116,141,105,112,76,130,8,102,247,123,27,138,230,106,200,3,218,13,10,216,51,1,147,177,63,173,72,193,122,106,13,10,120,14,107,188,112,212,134,142,148,248,169,129,39,151,234,152,5,117,22,134,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen019023l=38472; +} +#endif //_PDF_READER_RESOURCE_FONT_n019023l_H diff --git a/PdfReader/Resources/Fontn019024l.h b/PdfReader/Resources/Fontn019024l.h new file mode 100644 index 0000000000..65ef0ed0e1 --- /dev/null +++ b/PdfReader/Resources/Fontn019024l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n019024l_H +#define _PDF_READER_RESOURCE_FONT_n019024l_H +namespace PdfReader +{ +static const unsigned char c_arrn019024l[]={128,1,104,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,83,97,110,76,45,66,111,108,100,73,116,97,108,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,32,66,111,108,100,32,73,116,97,108,105,99,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,83,97,110,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,50,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,49,49,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,54,57,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,83,97,110,76,45,66,111,108,100,73,116,97,108,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,55,55,32,45,51,48,57,32,49,49,48,55,32,57,53,51,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,49,48,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,213,143,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,111,47,225,132,131,95,169,184,186,119,91,233,66,91,123,39,131,197,116,154,128,203,71,134,50,152,204,149,17,195,62,19,225,182,89,172,120,149,241,242,214,79,169,184,191,101,189,59,105,167,210,29,140,247,206,16,230,175,138,84,69,175,123,106,184,118,109,208,7,47,17,64,201,135,11,97,57,157,58,251,114,168,184,17,117,75,169,217,180,182,92,102,70,28,74,107,175,138,147,218,16,251,68,64,192,37,246,81,123,240,180,170,163,32,234,182,203,173,138,58,5,170,180,17,74,52,105,78,248,97,147,166,250,237,36,142,28,173,83,177,110,122,51,145,61,145,68,178,252,169,62,156,117,172,203,112,220,85,218,187,91,30,132,240,186,121,59,228,84,23,41,83,18,234,208,232,183,123,174,64,226,72,101,129,81,178,229,44,84,230,105,159,86,243,35,25,107,141,98,0,194,154,178,86,198,194,240,63,223,247,228,129,197,30,140,173,37,240,89,215,150,247,138,103,22,110,113,106,34,15,99,223,227,148,216,89,249,115,61,132,139,29,243,105,88,110,99,131,234,13,225,224,170,19,162,115,159,104,148,138,63,242,230,246,58,72,182,79,49,144,82,150,251,62,225,130,147,149,105,224,51,140,171,61,191,244,54,118,180,86,55,189,217,169,84,189,112,13,251,203,97,68,144,197,85,136,110,53,146,218,192,128,248,144,130,151,37,35,157,50,6,142,31,129,58,51,5,48,201,2,235,143,60,232,162,147,138,194,53,146,128,220,199,82,90,170,127,40,32,0,22,246,138,84,22,148,219,156,44,20,132,83,254,53,3,97,173,220,198,183,60,54,224,228,250,72,142,45,51,226,204,249,200,105,13,210,7,142,152,13,28,104,24,65,61,138,117,102,54,218,250,72,32,216,152,120,159,98,204,76,45,54,197,110,72,169,130,174,196,111,13,86,89,118,184,105,23,137,122,62,166,82,221,27,3,107,24,27,142,163,71,205,75,250,52,64,70,78,151,74,75,188,71,115,105,48,138,198,123,92,12,84,176,37,101,104,183,180,229,212,5,32,14,161,55,254,153,167,202,214,4,232,168,3,116,145,153,32,16,166,155,224,195,244,242,81,162,99,66,105,2,217,156,252,81,44,238,81,106,211,78,90,169,155,49,58,172,82,100,240,5,141,229,131,100,110,66,137,244,65,250,13,186,0,55,240,74,133,127,46,253,13,10,248,231,254,69,82,86,213,115,111,26,177,217,181,98,233,37,18,4,169,118,82,226,248,22,123,125,206,56,243,225,202,8,29,8,223,167,137,118,78,72,80,22,214,233,214,137,99,107,96,249,12,238,241,103,109,16,200,173,212,32,206,43,157,236,79,231,39,51,191,6,252,101,175,74,120,48,204,252,214,100,116,189,69,223,232,17,114,189,228,55,159,5,140,118,251,64,195,36,156,168,0,5,97,210,241,25,155,82,33,232,166,64,79,144,250,143,237,192,132,143,1,15,213,27,225,207,62,246,254,222,210,92,16,167,55,64,63,180,128,59,214,53,192,92,168,213,207,155,204,156,245,50,50,69,75,145,189,41,57,135,110,213,75,24,29,33,42,54,149,49,196,243,138,86,245,156,180,132,162,249,42,105,202,211,127,238,185,114,13,10,73,86,110,223,55,238,56,138,153,194,88,220,222,89,152,229,216,81,225,193,35,215,4,179,127,34,224,106,118,26,99,65,99,194,172,65,91,203,131,2,61,35,89,148,90,192,179,29,33,204,78,208,96,160,52,255,47,59,96,80,129,212,104,146,142,183,47,181,94,12,26,190,9,33,170,4,210,21,64,169,39,42,83,84,135,99,107,138,211,152,161,156,186,154,43,103,91,123,213,251,86,252,252,4,107,174,176,172,198,230,131,14,64,46,41,179,6,119,245,204,108,214,0,8,120,58,251,43,219,35,68,89,144,67,154,225,243,55,220,65,138,189,180,70,36,59,118,212,40,0,231,127,197,244,128,200,243,3,125,138,87,89,118,181,107,159,206,201,242,222,116,36,221,127,133,5,144,207,34,218,107,213,98,234,195,192,191,77,31,252,189,248,31,29,95,159,81,227,110,77,79,1,164,182,113,237,121,56,208,75,18,199,132,228,172,188,58,74,2,55,76,130,56,92,8,61,7,175,19,59,65,191,73,117,73,253,36,22,154,135,21,34,110,106,218,202,57,130,11,51,80,130,99,235,219,172,113,120,141,175,158,248,65,176,209,146,48,216,175,121,152,61,81,118,18,29,155,130,215,186,199,207,189,131,17,6,57,169,153,154,170,53,21,122,29,33,234,230,54,138,141,53,21,254,142,176,61,162,179,32,158,23,242,46,79,37,11,26,34,214,207,55,167,134,64,96,137,70,147,147,125,212,13,131,195,22,93,118,194,247,127,181,188,45,200,4,105,215,243,121,201,191,49,91,203,193,180,192,115,140,51,181,77,240,140,120,63,234,115,138,241,234,129,59,46,187,63,62,164,46,248,219,195,35,152,63,227,121,98,200,209,188,191,244,222,141,220,149,106,142,75,194,120,87,165,81,96,120,135,238,87,159,104,228,40,248,15,31,183,16,177,216,8,92,0,213,254,112,87,110,164,35,146,174,172,120,149,251,89,43,112,217,110,205,71,23,238,91,49,39,156,210,125,218,82,228,123,148,49,67,33,192,74,232,110,249,170,23,206,35,180,172,176,97,155,152,246,94,231,74,129,107,217,99,75,117,153,54,47,220,155,7,14,226,98,48,19,45,43,66,123,133,131,185,110,122,123,98,173,230,165,82,132,173,118,142,123,110,74,173,247,121,149,150,109,249,12,134,106,92,39,23,42,32,2,196,141,167,179,129,65,223,63,89,106,191,235,81,254,153,186,211,171,61,6,156,35,173,160,168,203,161,44,183,17,39,64,104,158,182,1,102,177,113,130,168,121,159,187,216,36,2,27,191,204,20,6,80,254,7,100,185,219,39,71,100,197,193,5,240,24,192,169,186,139,60,229,83,145,29,226,105,114,57,207,181,217,112,71,151,13,10,143,126,3,39,183,22,121,218,122,33,93,145,130,124,177,97,136,147,183,138,236,135,67,223,252,197,180,0,4,13,10,91,139,19,142,123,212,13,10,243,119,159,158,196,197,178,100,16,92,102,152,191,8,111,60,61,248,77,186,113,99,152,148,151,63,134,221,238,153,191,142,51,79,176,220,143,35,5,173,40,82,241,207,116,43,191,42,152,105,244,91,109,75,118,210,229,26,21,28,20,158,29,111,167,31,138,79,4,240,235,208,111,118,95,14,246,128,161,171,241,116,129,86,68,81,0,13,10,14,4,168,93,27,178,252,49,88,107,69,76,207,222,28,53,159,254,214,174,198,49,225,240,107,142,113,252,26,236,215,208,120,179,148,162,92,58,165,136,132,151,244,13,10,165,127,100,54,106,117,77,111,169,57,126,49,123,68,217,170,65,148,94,6,153,75,162,221,67,125,228,94,68,141,37,157,18,179,55,218,218,130,169,42,251,212,190,15,35,252,229,208,47,196,137,235,224,193,83,193,7,176,188,117,6,131,156,38,215,143,25,199,23,251,45,167,74,83,210,55,94,47,55,105,47,198,119,32,189,32,50,38,233,43,122,228,108,250,145,223,42,154,108,6,72,213,33,14,71,189,83,179,217,109,9,14,168,248,161,154,165,80,161,250,159,141,209,111,128,237,80,8,21,150,12,168,44,102,244,158,160,23,83,136,232,101,128,26,90,92,235,13,10,37,11,31,94,120,52,19,138,22,233,248,94,53,205,238,13,10,138,83,11,251,206,201,221,21,225,149,163,169,108,163,173,5,90,226,230,32,62,1,118,102,65,149,30,229,87,79,93,166,159,170,213,37,124,222,237,209,136,159,197,25,6,187,246,76,166,191,64,240,234,55,35,160,234,219,250,173,120,207,239,245,221,171,144,210,235,254,164,117,135,220,125,64,48,227,32,69,57,118,42,42,26,143,35,46,189,93,153,4,131,201,27,39,57,0,110,120,225,228,134,47,248,124,37,173,103,217,41,206,139,231,237,100,133,9,164,161,66,126,247,234,208,141,184,3,208,195,214,135,9,167,9,83,72,127,84,100,159,164,126,113,25,47,21,144,188,137,243,73,77,182,34,154,135,83,206,172,196,97,6,179,21,101,180,153,191,219,110,104,132,208,131,0,77,243,55,59,142,63,242,239,247,219,55,49,213,142,218,182,32,154,219,93,62,50,75,216,32,76,22,130,62,192,108,61,66,130,234,210,116,12,198,216,8,5,24,148,61,254,35,145,28,179,18,57,233,108,158,211,212,156,170,44,235,36,70,17,126,126,97,179,77,228,254,117,184,186,39,106,178,212,27,129,42,17,221,80,114,156,16,252,25,155,226,124,215,28,223,55,169,181,116,102,205,17,181,163,203,189,152,173,190,156,97,0,20,21,15,63,130,191,238,35,126,233,157,166,146,5,74,64,137,144,12,139,185,97,245,7,112,104,135,6,46,132,248,208,67,169,62,127,40,218,69,58,80,20,152,146,45,245,115,25,187,82,16,61,184,98,74,56,214,249,173,233,158,61,137,174,34,95,149,79,131,6,235,95,229,199,62,219,9,85,90,19,230,219,254,32,27,28,159,79,90,173,198,26,237,133,245,237,224,103,89,142,27,141,196,136,110,72,144,255,67,202,188,206,4,226,254,251,66,15,196,69,24,69,155,18,218,57,79,243,95,66,13,83,19,90,133,107,160,85,34,51,50,142,209,126,173,122,222,54,61,162,20,134,220,61,124,11,155,180,141,189,241,93,8,167,29,66,139,194,79,143,64,116,185,108,23,52,240,186,241,169,45,243,145,49,105,90,17,204,107,246,250,220,172,57,115,80,149,163,27,191,60,237,4,150,244,224,218,64,161,243,116,120,217,248,70,19,15,73,105,53,209,227,210,141,251,131,26,117,148,140,104,59,207,228,116,18,27,165,51,181,90,100,238,182,13,10,70,127,125,219,60,245,86,250,214,140,99,73,103,17,51,69,34,22,149,102,90,224,33,245,81,203,191,235,29,61,201,18,153,156,248,97,240,48,152,17,44,65,100,136,222,255,100,81,97,82,17,145,224,143,229,100,229,46,136,45,80,169,13,10,161,232,83,2,172,142,229,86,31,106,121,50,45,240,97,9,1,147,249,29,157,137,140,42,93,140,213,167,51,102,158,29,159,69,158,161,1,14,115,225,74,115,195,241,251,252,15,216,198,170,130,54,104,247,49,133,237,71,97,114,248,173,32,240,188,2,160,163,246,80,125,23,15,213,184,172,218,44,58,191,43,62,146,85,146,38,250,6,123,186,232,56,58,224,138,125,132,142,94,180,170,15,95,67,71,31,46,133,42,170,172,65,168,66,36,101,199,223,242,147,152,202,185,201,177,185,177,65,1,168,251,153,192,15,97,225,121,84,34,11,153,232,158,245,87,23,191,190,141,13,10,228,222,103,178,213,44,245,77,126,252,96,18,199,200,156,11,112,247,101,77,185,146,35,84,1,130,112,253,139,120,91,58,122,29,204,69,189,12,116,206,16,2,114,45,175,58,228,214,175,173,253,27,194,209,48,142,142,46,143,248,186,243,75,205,125,52,173,184,44,252,63,123,252,68,251,30,17,233,163,139,138,247,103,99,159,93,21,158,71,123,32,141,239,238,18,177,51,8,74,67,248,175,72,63,155,19,19,188,66,146,94,212,54,68,8,255,237,125,171,199,74,164,84,8,249,210,120,115,74,88,86,99,152,9,143,142,230,242,206,128,56,9,35,147,148,236,24,55,160,197,62,88,123,200,7,25,112,252,51,254,124,86,89,97,194,160,16,113,220,251,67,86,171,95,47,56,215,15,87,3,231,100,74,48,176,230,31,209,85,153,49,175,178,216,106,246,25,100,7,8,192,185,223,16,134,132,81,147,235,228,174,14,67,45,184,199,151,97,85,195,160,219,234,65,118,73,249,249,216,249,160,62,147,114,105,26,174,89,178,121,73,106,19,240,31,194,205,73,219,202,216,190,143,222,151,182,95,214,9,218,135,236,36,218,143,159,146,187,50,4,97,246,104,77,7,153,119,47,123,224,153,37,3,168,117,206,74,17,103,154,37,31,224,46,166,197,255,63,13,10,222,30,180,94,210,95,244,153,149,21,225,61,252,4,156,78,36,160,231,97,174,77,173,151,235,89,234,94,238,190,106,129,19,76,107,115,96,132,19,184,54,147,229,101,35,14,105,1,23,126,52,227,241,143,27,251,140,236,15,21,184,31,46,213,27,122,70,214,145,84,120,85,111,70,104,112,17,40,237,107,112,114,49,37,68,70,155,54,62,103,1,164,204,253,35,84,175,62,220,55,149,70,215,39,30,45,93,40,183,199,124,134,242,189,149,110,176,163,93,246,184,62,72,183,216,207,29,11,155,241,5,14,11,214,121,253,189,173,192,225,206,91,21,109,106,157,13,146,254,44,237,94,210,166,42,157,169,65,79,226,230,7,90,22,57,21,144,193,162,85,106,160,84,14,251,107,235,218,165,31,3,213,182,85,239,230,11,252,224,94,100,89,136,71,6,134,179,159,165,57,15,217,6,45,116,110,201,192,89,47,153,92,99,225,112,253,18,63,115,180,231,52,30,16,247,55,115,105,29,250,186,35,215,151,106,194,87,186,86,111,207,57,246,117,161,248,187,246,90,23,83,162,226,58,222,109,11,146,5,115,95,129,74,229,93,171,253,179,139,213,69,254,47,252,213,28,202,27,63,24,235,193,114,88,78,225,105,207,152,125,78,160,55,244,164,69,63,112,173,50,244,151,195,125,192,32,136,188,193,249,222,0,243,55,215,77,219,231,157,97,30,123,114,130,184,57,49,116,153,207,81,189,81,176,153,4,92,143,210,143,237,217,157,129,16,37,125,208,184,77,234,218,249,90,45,31,199,247,109,245,149,63,212,84,239,174,94,184,136,234,252,123,77,173,167,112,136,55,145,180,35,100,56,33,22,165,147,164,69,191,116,167,49,194,11,163,248,28,91,49,70,163,16,149,207,97,20,96,197,84,184,11,90,124,129,108,27,211,104,66,159,220,220,22,162,46,246,17,173,87,220,66,182,121,4,242,51,44,131,90,192,173,90,89,97,223,47,166,240,94,119,124,242,16,56,78,252,101,184,102,199,124,204,173,95,162,205,158,53,152,127,158,186,187,116,16,62,19,147,63,4,249,162,221,4,66,147,136,13,178,22,233,202,90,55,77,167,105,196,158,217,17,211,246,73,167,47,249,123,26,233,121,39,155,193,230,13,4,103,36,130,143,163,82,33,125,143,125,226,224,198,187,121,150,205,223,251,184,170,114,50,150,224,0,70,63,126,226,111,46,138,196,234,154,212,89,73,175,152,250,192,225,193,240,175,16,100,126,104,173,180,203,127,55,45,208,204,14,34,222,22,157,105,125,5,89,234,0,14,200,109,114,248,133,182,77,162,55,119,223,118,45,207,111,69,148,240,153,184,250,54,103,11,16,246,190,208,3,79,88,16,183,114,254,55,82,105,189,95,31,7,144,129,179,89,38,4,234,173,217,194,229,168,196,118,65,108,7,169,243,164,36,213,225,65,199,12,243,67,24,64,222,18,251,240,124,249,49,105,212,59,222,118,17,68,224,13,10,28,168,232,171,60,87,130,191,63,221,126,237,69,50,150,33,40,84,249,116,161,66,128,15,26,66,54,252,76,24,23,165,212,184,221,211,46,123,129,87,193,125,164,192,134,47,41,31,39,12,139,146,60,26,102,182,172,126,233,224,53,4,175,18,104,70,13,131,209,249,76,219,20,134,138,118,102,243,15,83,139,111,110,167,118,177,99,84,48,172,203,13,31,240,132,158,110,117,51,101,23,20,193,164,253,47,46,66,40,132,103,140,223,61,183,215,218,82,141,166,7,199,104,93,51,145,233,88,239,96,160,69,174,87,117,239,166,44,57,207,39,8,215,111,103,176,15,107,157,31,191,160,140,30,36,223,108,49,91,1,73,214,202,69,168,242,199,172,97,169,216,47,180,150,18,89,246,42,62,31,74,43,172,113,127,91,151,174,11,197,123,178,70,4,14,23,48,66,203,52,177,2,85,9,78,64,132,98,146,168,68,65,17,90,15,88,80,150,43,86,112,36,180,43,201,114,184,26,229,39,232,51,105,52,131,121,46,77,39,194,32,97,26,96,79,126,153,68,211,27,132,82,88,255,12,145,22,187,13,0,70,210,183,62,76,238,37,162,73,75,35,244,115,126,29,76,136,251,154,35,184,187,74,70,65,61,23,76,216,65,132,55,110,176,32,38,6,53,239,75,247,161,116,38,54,51,19,113,67,62,249,161,20,249,199,167,21,207,77,101,219,34,220,251,95,237,94,155,210,39,94,221,94,66,211,210,137,118,215,245,4,136,50,41,22,14,179,223,11,48,76,43,96,86,228,201,161,146,16,174,166,49,211,3,241,245,1,92,228,179,254,175,90,109,137,136,209,218,201,9,207,13,10,22,111,160,47,111,12,47,205,32,248,181,59,28,36,31,4,185,176,60,244,179,177,198,88,91,239,114,33,50,246,44,190,24,59,32,229,221,20,191,117,231,27,91,110,112,34,198,109,231,215,25,96,201,48,33,47,114,101,7,137,208,29,31,240,66,220,183,131,66,68,68,110,26,81,179,21,116,178,250,138,113,197,211,126,179,198,206,55,73,146,238,55,60,126,217,66,6,25,98,86,136,202,111,108,88,13,10,129,16,1,31,184,97,6,236,124,116,138,64,65,140,167,167,128,183,156,73,223,173,134,145,67,90,36,207,245,47,226,126,39,65,105,28,220,172,96,32,43,28,158,124,18,179,209,192,246,253,246,253,153,91,85,131,27,50,235,24,198,252,109,62,249,170,61,41,24,229,132,213,124,39,2,206,114,107,240,40,2,112,167,98,83,186,160,95,25,231,191,107,253,44,203,239,67,158,126,206,188,248,108,18,221,14,133,133,18,137,104,21,251,235,22,96,22,201,177,40,75,242,110,64,71,158,190,78,221,178,82,42,212,68,103,38,226,13,126,91,114,127,156,209,82,96,113,18,131,32,171,59,8,79,192,238,70,135,197,124,106,102,108,38,254,65,129,131,51,3,157,30,244,113,19,69,35,252,228,150,172,197,211,4,107,186,73,246,101,70,11,39,146,238,34,123,198,119,180,2,207,84,205,188,193,149,154,9,181,68,188,29,208,211,89,101,148,244,129,38,74,58,129,187,234,244,135,178,161,5,85,142,59,217,255,100,190,203,102,217,212,231,37,52,188,98,172,63,141,197,165,147,180,14,115,45,57,134,190,238,155,175,50,26,42,242,37,110,160,149,245,169,30,150,253,162,77,135,101,246,174,78,31,178,208,74,1,26,227,63,162,16,13,248,210,132,142,2,154,177,152,152,6,1,171,37,160,124,71,97,202,109,30,20,15,93,50,184,134,8,135,159,217,245,64,39,193,88,41,99,114,216,185,246,32,250,231,87,31,149,66,252,6,203,193,41,46,195,135,186,63,75,55,19,75,254,65,49,79,165,47,5,60,113,215,143,58,161,190,143,122,177,219,178,143,22,145,49,141,15,71,190,57,244,80,249,71,48,7,127,50,220,18,114,247,92,32,9,228,117,7,164,0,14,157,43,148,26,75,137,84,2,55,223,91,155,28,205,118,144,144,42,200,252,213,91,189,190,236,35,85,6,175,238,54,33,116,127,236,31,226,37,128,43,22,2,186,36,225,111,24,122,104,8,114,254,150,28,98,153,88,38,249,119,65,108,141,233,124,46,8,204,1,246,193,43,230,180,61,138,136,8,117,158,149,168,103,44,198,111,44,81,101,194,172,23,99,134,137,224,82,35,31,118,69,148,35,141,97,139,108,231,203,169,253,203,221,214,187,147,76,37,0,108,65,28,21,100,116,180,130,53,131,247,173,87,120,252,131,95,51,189,235,172,29,181,45,110,145,108,15,169,56,176,166,97,86,148,35,69,17,5,173,138,92,91,102,210,98,134,148,97,42,119,154,219,135,223,137,77,78,91,200,36,0,73,64,16,41,58,112,154,4,35,55,181,86,44,97,48,113,8,121,35,40,52,139,58,29,59,113,0,83,117,136,180,233,195,216,34,169,148,52,58,87,71,75,196,173,85,35,125,154,26,29,189,65,219,137,196,86,62,243,12,214,103,168,191,251,121,68,69,51,35,172,190,174,122,83,13,94,8,154,31,245,28,28,48,29,245,36,6,44,31,138,155,238,205,73,104,146,148,100,171,18,176,31,221,163,71,54,215,56,61,35,84,106,36,198,252,154,118,140,236,245,28,227,166,141,22,99,1,138,80,225,43,158,136,85,227,101,63,41,167,126,39,92,7,175,152,86,89,18,48,181,108,158,204,103,239,43,12,163,78,60,83,29,35,219,48,208,16,158,161,201,53,132,255,194,5,239,224,120,104,223,194,219,171,59,217,113,199,40,3,117,141,163,255,230,227,38,156,38,45,220,236,83,181,53,116,212,169,149,54,178,55,24,43,42,84,131,29,251,27,14,208,205,155,128,103,25,160,133,142,243,231,32,134,184,106,117,189,177,15,157,13,111,231,251,219,35,196,25,204,71,27,85,253,137,65,112,126,152,83,191,199,204,28,189,174,45,114,183,140,16,227,149,178,42,67,169,23,192,84,153,162,72,133,136,170,126,4,96,112,238,117,2,158,153,23,83,235,111,134,120,135,252,152,173,212,70,64,52,143,172,67,249,54,222,75,210,72,61,180,235,29,35,34,247,58,121,49,92,93,57,33,56,231,132,126,230,9,184,36,120,34,93,26,99,228,64,167,25,61,19,204,105,123,21,97,126,103,61,138,190,36,214,247,126,200,165,126,186,174,116,232,241,128,47,30,124,101,139,78,238,174,117,239,248,160,210,127,239,52,182,125,105,202,161,233,64,73,202,30,101,250,225,208,9,138,31,206,176,173,232,39,117,98,244,1,73,234,203,235,110,204,136,72,209,122,245,224,74,2,129,27,191,88,143,247,239,9,228,212,204,66,14,0,122,79,126,182,167,227,170,146,87,132,130,91,41,81,6,50,116,43,148,107,28,193,221,143,133,173,71,48,85,85,243,212,27,53,142,203,167,120,244,58,0,49,102,40,2,243,250,22,123,174,75,122,185,51,115,151,14,157,107,131,229,118,93,55,82,187,239,185,165,162,244,56,31,253,68,42,254,9,197,112,226,197,49,84,155,3,226,17,14,72,60,171,126,239,92,228,122,91,83,102,185,219,173,182,170,63,42,160,40,115,18,193,231,103,87,101,73,213,163,9,58,134,194,232,28,224,58,145,123,98,146,149,218,46,140,70,155,250,172,148,78,11,57,73,186,177,115,59,38,1,229,74,141,159,117,44,151,86,132,56,188,104,108,241,166,197,178,47,208,115,112,31,64,216,46,24,143,118,164,77,221,176,245,224,94,148,221,149,35,191,146,21,91,48,218,211,168,133,146,125,231,167,136,138,9,51,116,122,21,160,148,99,114,68,251,40,62,133,131,170,97,179,195,159,75,122,212,167,129,79,170,34,212,165,18,246,77,223,209,159,28,124,84,92,93,110,89,212,125,229,73,157,245,122,228,163,194,208,136,117,149,160,5,108,46,171,128,82,247,13,52,67,9,23,28,191,75,90,104,245,223,113,252,96,159,226,68,158,38,88,183,65,67,153,38,240,43,29,81,173,254,117,225,198,176,234,86,80,124,61,157,201,221,151,210,141,197,147,17,73,157,178,166,35,31,247,127,87,161,47,88,97,243,87,227,2,8,226,108,167,222,190,54,168,74,129,131,182,173,247,220,49,146,198,80,252,215,209,248,18,116,179,162,14,32,231,46,186,49,135,172,177,80,160,180,51,241,199,105,137,222,142,84,53,96,154,35,85,1,235,124,197,117,171,118,59,102,195,112,182,239,35,147,45,185,218,135,203,170,207,133,209,200,65,38,108,31,43,191,132,213,7,17,179,111,176,162,136,196,240,79,17,52,254,212,27,8,46,205,123,197,152,231,129,53,85,98,3,193,220,151,214,30,56,239,106,220,97,50,230,185,17,47,206,23,172,79,32,32,175,102,164,86,162,209,56,2,15,89,54,49,226,77,244,128,128,222,176,27,72,132,79,176,226,24,233,20,55,66,191,245,31,92,232,212,130,76,141,70,192,63,225,44,73,52,3,92,202,201,162,202,162,131,68,63,110,151,218,121,150,56,5,99,191,122,201,187,195,165,130,215,162,98,89,188,255,3,151,106,42,220,247,131,8,169,191,201,8,162,186,196,179,246,118,93,145,197,100,176,160,248,87,171,250,202,227,36,112,91,224,117,27,29,126,15,146,27,216,45,223,167,157,49,240,180,80,104,47,247,38,216,34,224,209,159,0,13,249,30,174,217,87,233,104,234,108,196,253,95,192,37,173,51,31,75,249,109,34,80,94,199,193,222,184,124,16,149,220,35,153,255,131,157,29,93,99,36,3,53,69,176,118,103,223,54,54,196,245,194,33,163,102,48,71,207,4,147,179,171,171,185,17,24,150,91,135,247,23,62,139,196,144,130,28,195,229,69,216,1,209,70,14,17,137,215,186,207,140,106,94,3,141,193,241,3,246,253,243,217,13,35,43,86,13,10,209,38,192,210,240,87,100,230,13,161,40,47,71,171,201,137,213,43,150,207,217,245,42,190,13,10,55,90,196,115,192,69,43,114,251,218,100,14,121,169,247,176,63,62,229,40,41,95,61,65,191,217,54,207,9,196,49,18,150,17,210,152,236,228,172,152,75,55,25,32,193,34,44,64,24,51,70,168,188,24,253,70,206,202,249,178,130,211,72,92,167,88,34,184,105,54,211,221,186,3,30,69,190,218,138,146,54,24,171,105,59,139,176,50,195,145,160,24,5,199,118,222,220,192,193,73,118,13,10,128,26,47,207,148,46,123,185,142,189,41,129,85,78,157,211,191,199,97,73,81,199,188,246,68,225,102,93,140,68,50,175,252,191,183,162,40,165,132,142,3,133,136,126,13,10,0,121,92,55,17,243,203,32,33,175,241,168,171,242,200,225,200,131,29,246,49,15,131,235,139,224,182,237,154,112,172,138,136,16,121,29,134,19,168,75,17,223,27,88,198,65,214,5,30,71,235,231,224,151,34,60,25,178,53,17,249,198,55,230,128,245,61,191,145,64,126,67,143,40,189,77,39,15,87,89,21,176,118,126,50,56,190,244,84,33,51,225,101,98,24,32,113,219,171,233,46,247,113,187,248,225,141,223,85,196,45,36,77,157,188,170,224,217,17,143,30,160,214,79,59,240,44,98,219,70,253,173,54,105,32,91,103,253,159,133,152,173,79,117,17,230,159,151,231,217,119,93,221,88,125,220,140,242,87,35,214,104,1,189,216,62,36,207,133,92,142,138,171,76,170,44,237,179,74,127,230,39,251,67,228,56,7,44,155,14,90,219,144,90,82,110,254,239,212,78,175,40,112,142,246,144,41,234,106,21,108,178,16,61,180,148,141,83,206,55,32,45,150,134,253,113,54,83,216,57,94,146,161,220,59,88,164,216,240,28,185,127,164,172,206,29,184,136,212,82,114,81,65,255,122,230,125,7,191,212,94,153,49,107,2,88,194,12,233,201,212,160,23,155,221,230,82,77,157,145,128,24,214,183,16,60,67,46,218,236,24,58,49,192,103,24,31,224,204,159,83,198,70,74,109,172,246,82,30,51,56,39,158,111,93,66,62,229,6,65,56,53,247,50,174,80,56,55,24,194,224,33,249,120,189,100,146,247,186,97,32,248,106,66,82,20,204,20,100,97,82,102,248,130,96,152,233,80,224,9,217,24,44,2,138,235,66,109,82,34,69,171,9,232,60,209,102,242,68,94,2,11,168,177,0,148,127,217,192,170,9,14,149,80,199,1,200,172,247,68,17,145,107,144,145,60,88,62,55,69,128,96,81,129,174,46,217,3,231,181,71,105,179,195,222,173,220,168,108,17,63,35,155,63,221,180,109,99,67,251,234,244,65,53,247,239,94,162,23,144,45,59,230,228,59,170,43,143,253,142,160,101,114,155,164,98,253,25,101,248,229,188,89,157,97,70,16,195,67,204,74,61,49,92,160,2,4,30,248,9,163,120,156,53,247,14,214,190,247,30,234,237,200,250,146,237,233,6,195,223,31,79,158,147,103,57,216,243,190,205,68,26,94,127,73,11,189,122,6,59,100,193,234,130,189,68,69,167,210,41,194,219,97,189,111,80,214,195,227,240,40,92,21,213,164,128,161,201,178,49,118,46,115,254,229,116,168,179,197,187,236,54,178,189,56,200,58,41,92,69,26,177,35,190,87,134,50,128,130,4,226,201,140,157,135,220,108,111,145,41,99,201,178,88,76,225,73,210,135,39,26,145,244,11,228,187,3,40,27,25,88,46,146,123,12,184,26,4,119,236,164,131,138,163,16,94,238,146,87,172,7,99,206,28,235,48,253,174,28,73,107,93,14,124,157,6,179,7,22,19,86,194,67,248,178,74,192,22,184,230,5,43,116,164,24,102,134,100,101,173,157,253,45,214,49,176,11,119,192,125,204,99,184,168,207,118,148,117,80,46,162,171,196,11,100,164,48,192,170,117,193,139,81,25,133,44,142,162,116,41,15,206,231,14,90,72,183,78,55,59,32,248,145,54,56,168,109,72,234,229,98,207,89,113,225,170,29,115,121,95,173,234,9,132,113,250,54,98,99,50,8,157,133,243,243,138,87,253,232,6,0,65,60,180,178,192,57,129,54,94,126,255,62,149,81,236,62,96,149,93,31,213,97,24,51,212,125,92,12,245,202,83,108,179,41,39,163,111,245,187,146,169,107,20,106,223,190,168,245,106,43,202,72,164,192,139,34,153,158,213,179,115,225,103,152,114,132,255,247,149,101,97,42,81,245,80,182,86,157,6,211,154,97,182,121,237,39,128,116,14,148,125,93,25,193,239,39,86,176,68,101,155,175,77,121,30,199,249,62,133,141,116,159,154,45,146,1,70,54,128,193,206,142,97,121,0,35,139,78,220,102,155,227,152,132,149,126,90,227,52,57,198,132,24,13,234,203,245,34,228,133,74,39,76,116,123,107,182,62,194,161,127,199,122,36,213,252,129,233,185,71,41,109,161,91,96,100,224,128,87,235,188,132,24,181,255,220,147,205,225,121,230,56,22,143,217,90,185,222,59,168,73,185,171,43,221,46,21,130,187,106,39,18,42,139,164,216,26,227,211,249,109,116,176,252,209,245,65,2,19,118,183,243,38,86,26,181,195,245,227,100,133,181,0,223,62,220,145,15,207,54,84,101,194,115,30,66,189,205,189,189,226,188,174,107,230,65,178,30,14,73,169,126,161,13,10,6,126,29,225,169,105,97,49,234,245,105,187,171,241,54,114,132,127,45,12,126,217,88,225,200,44,114,50,236,8,154,130,233,95,244,227,54,251,189,45,83,3,166,211,53,91,189,133,214,109,97,96,195,178,68,130,190,248,251,235,242,123,97,127,152,135,45,21,136,9,47,54,145,217,249,168,34,63,123,170,191,201,89,2,11,178,95,235,206,28,65,167,135,141,138,56,13,63,204,229,144,211,41,172,86,43,136,153,135,194,138,242,24,208,150,252,46,228,1,31,238,235,166,48,53,57,91,119,49,74,251,192,146,29,157,167,144,218,179,62,122,29,175,125,212,148,106,44,48,214,52,240,157,40,5,114,44,4,241,154,59,57,4,84,233,196,86,248,52,156,36,148,100,211,226,46,24,207,207,144,47,169,13,10,216,180,183,178,146,184,186,32,189,21,161,181,230,101,45,106,225,94,77,74,162,76,0,190,140,158,222,207,42,80,94,63,80,136,50,151,216,77,17,28,136,219,194,82,115,147,228,215,245,175,82,28,107,43,244,105,20,79,45,209,246,224,93,180,4,0,226,93,112,161,101,196,28,149,108,144,215,61,26,131,192,83,141,242,248,90,156,165,167,134,168,18,22,2,205,158,28,84,4,11,184,123,187,126,202,107,153,47,131,13,131,218,219,194,217,28,224,182,70,36,198,199,117,36,202,58,230,19,59,118,87,197,18,140,84,27,240,187,151,177,3,27,218,0,1,121,2,120,131,118,78,197,198,146,240,68,126,94,222,24,248,85,58,125,127,200,221,149,184,250,117,156,252,53,144,32,154,172,70,223,77,233,130,121,237,141,125,236,158,67,240,192,24,152,191,228,127,166,14,243,184,140,217,75,22,189,5,253,13,155,66,66,6,115,243,113,198,245,133,182,33,252,57,246,15,171,66,177,27,247,77,89,106,244,52,138,109,67,198,118,15,174,213,15,200,201,179,179,245,232,164,242,27,134,168,182,106,229,124,212,74,0,162,241,183,122,187,66,92,84,45,252,139,212,235,72,179,53,53,224,62,78,92,165,240,37,65,98,95,75,207,128,207,171,219,123,135,154,5,89,200,216,170,156,226,234,0,213,25,242,85,74,197,169,135,226,129,43,140,164,2,130,178,230,190,120,45,197,238,249,70,137,118,130,179,201,236,157,128,77,54,212,107,22,110,31,38,13,100,168,148,170,105,87,165,215,28,133,117,192,141,172,224,56,43,40,18,186,148,28,20,170,32,153,136,62,82,222,139,118,231,237,170,22,138,83,99,29,137,8,130,131,101,20,245,151,20,33,187,102,137,197,43,1,142,70,235,230,196,124,218,227,64,157,36,2,116,70,176,72,30,243,72,161,9,232,59,65,16,100,161,80,102,27,247,115,100,141,59,151,13,44,184,8,70,252,147,30,150,85,148,224,54,79,29,67,23,255,101,165,92,162,206,53,113,27,140,21,235,185,163,181,182,202,110,100,144,68,207,212,150,51,214,104,215,246,142,193,86,83,112,56,72,83,194,153,43,234,54,104,88,187,169,239,7,156,246,228,102,69,47,47,130,122,56,234,49,37,6,232,78,204,37,132,255,244,103,174,21,135,75,124,66,78,76,251,138,219,209,227,249,174,74,16,29,28,226,35,85,137,25,45,185,62,188,229,216,232,235,16,140,82,117,12,207,146,148,248,234,144,145,161,110,154,7,80,175,56,54,13,10,203,218,75,143,211,14,191,216,25,14,95,62,232,203,107,21,178,245,48,215,131,6,187,13,10,16,47,32,55,251,69,13,10,186,169,15,59,240,2,46,102,85,121,202,153,208,26,20,26,132,33,60,48,252,226,217,176,248,254,197,85,109,119,114,88,167,188,33,67,158,13,10,220,41,111,89,252,104,156,186,115,105,106,208,236,117,31,218,39,243,122,65,190,3,104,144,143,13,10,64,207,57,219,145,221,194,241,141,103,191,237,46,69,98,236,225,38,15,102,153,217,69,166,226,82,67,88,149,142,248,227,129,164,69,133,120,219,29,87,53,152,0,194,24,76,121,79,13,221,164,141,154,244,75,244,192,225,192,210,108,17,64,18,150,155,86,225,109,68,11,50,97,67,149,59,127,229,118,130,22,213,164,221,89,118,68,206,86,116,104,55,92,241,84,101,114,119,11,186,204,14,37,183,66,114,136,13,10,145,172,199,201,180,185,133,193,116,62,165,216,246,143,227,0,54,62,40,200,171,22,220,199,47,87,248,193,100,109,163,72,12,133,123,126,47,226,106,2,62,203,5,1,223,188,93,128,232,47,183,176,78,95,251,204,173,167,159,110,129,59,242,233,176,168,97,57,172,26,119,165,162,45,55,70,189,220,57,241,174,4,82,77,121,198,249,144,99,216,67,2,197,184,69,16,138,199,94,214,36,41,114,73,237,217,94,32,223,14,241,131,197,241,196,168,63,186,2,44,202,49,129,242,138,174,218,168,87,120,95,116,6,164,101,157,229,175,45,93,24,82,116,81,89,7,125,3,82,24,227,239,89,1,220,94,239,51,161,98,189,189,77,144,241,188,37,158,246,15,190,17,113,221,156,169,145,130,229,9,204,113,155,246,82,152,168,235,65,129,241,100,97,72,81,30,9,248,226,30,249,7,137,11,196,191,175,154,125,101,97,129,234,252,219,233,0,21,9,193,255,105,121,238,144,16,112,160,36,214,152,213,25,105,18,238,194,118,227,165,17,115,80,232,8,6,114,45,152,125,25,247,197,199,241,204,19,237,197,119,237,3,214,48,40,194,9,28,134,219,202,139,83,243,224,182,113,9,132,147,61,103,166,224,215,112,161,184,218,73,77,204,191,223,193,201,142,230,134,180,172,62,60,191,241,106,86,156,194,53,77,123,114,92,81,31,107,79,245,238,112,92,184,232,229,141,95,191,140,185,74,12,128,127,75,169,142,55,17,243,142,107,142,3,21,245,35,107,228,244,69,178,47,60,239,155,86,150,241,9,203,119,14,119,237,250,48,206,180,22,251,48,41,173,207,229,194,197,203,45,75,218,78,252,117,203,105,184,151,73,60,53,32,135,28,16,167,52,163,88,238,113,83,51,150,172,222,231,104,47,172,182,27,27,67,9,190,52,132,143,234,0,21,204,219,195,7,202,14,178,44,145,171,206,42,119,136,244,79,226,23,5,96,83,80,7,205,149,9,160,11,216,12,13,10,129,206,208,198,226,136,233,198,109,120,3,122,177,214,16,18,207,152,217,118,128,51,196,223,100,191,25,22,1,153,238,133,46,56,96,92,31,145,49,39,126,131,61,25,48,62,216,189,217,66,213,35,36,229,124,65,113,193,203,207,86,125,227,187,228,207,20,175,86,100,188,181,167,22,99,184,48,162,176,162,35,76,71,134,68,216,196,138,143,90,189,134,203,15,140,222,237,17,128,120,142,35,21,89,219,209,251,113,62,230,51,167,52,231,11,133,141,53,127,24,86,68,76,35,240,123,4,138,61,211,251,25,21,94,44,151,25,46,142,31,13,10,232,172,110,111,42,220,241,216,103,50,69,211,183,147,135,242,101,43,42,142,31,243,52,195,34,16,47,152,221,43,34,207,251,215,222,120,92,225,117,185,33,105,127,157,224,97,39,25,0,243,40,95,92,163,91,71,110,197,87,121,117,224,69,159,202,252,72,8,253,54,211,206,129,83,78,228,55,232,204,112,20,6,56,172,250,70,43,11,91,65,199,164,34,11,4,208,2,173,102,4,174,251,162,9,102,137,108,144,187,60,228,225,220,62,34,41,167,224,48,146,38,9,224,57,122,176,195,185,1,132,144,171,186,75,105,1,23,45,206,109,74,254,60,142,231,235,99,193,13,170,128,12,250,104,29,49,121,129,90,203,96,96,56,112,88,55,35,211,150,38,241,5,222,99,86,105,242,60,49,36,5,176,88,172,16,108,196,208,190,233,124,225,93,247,240,217,127,113,167,25,242,174,122,83,255,247,229,11,186,230,227,255,21,160,207,39,138,141,79,115,104,69,227,33,145,97,83,164,201,177,128,148,102,191,34,64,226,167,28,197,62,150,224,175,232,53,122,126,231,231,91,59,228,56,156,49,242,189,5,77,55,28,159,155,125,113,17,186,124,160,234,28,52,231,229,209,35,191,101,63,38,107,98,92,114,97,2,98,185,13,138,144,67,161,25,235,161,101,44,42,12,239,232,195,232,230,100,44,159,32,155,214,151,156,244,124,6,137,83,205,5,84,224,66,165,247,187,168,171,74,81,12,86,127,101,53,189,55,63,187,107,216,220,37,44,54,241,14,204,43,204,53,65,34,125,248,246,244,142,77,55,27,212,30,192,231,97,6,140,45,164,180,145,83,108,239,157,97,158,23,57,203,116,95,181,199,231,181,140,159,144,201,36,206,3,128,87,236,37,124,190,51,102,32,102,132,211,220,36,123,206,26,180,49,26,154,95,156,219,114,93,237,46,230,98,30,13,10,248,82,46,124,134,159,15,236,20,175,174,76,94,62,205,149,94,71,251,45,88,213,109,87,232,109,115,46,140,166,205,139,63,183,124,178,156,189,40,103,22,42,31,85,100,17,118,22,249,39,171,58,76,165,35,226,192,156,227,79,86,28,15,22,241,180,14,94,187,26,63,203,31,200,253,67,90,213,177,76,128,56,40,245,168,186,200,39,198,16,135,34,238,133,229,75,218,215,166,223,148,14,35,253,248,140,82,236,132,200,140,78,203,71,141,209,40,19,93,247,70,153,67,65,163,126,197,251,48,198,141,250,163,212,203,94,23,50,116,244,193,119,100,172,61,85,229,205,67,69,28,0,224,166,128,157,123,7,20,80,61,193,175,31,255,48,7,46,206,67,234,135,108,197,15,160,195,113,126,97,159,104,251,3,230,184,132,198,138,254,48,166,5,25,19,195,242,88,201,148,196,185,109,64,67,230,78,76,8,101,58,188,79,38,238,137,228,243,28,60,182,98,57,51,105,158,156,108,192,130,121,41,244,229,190,34,64,169,19,60,168,59,90,186,225,108,167,184,238,81,251,146,132,126,39,179,17,201,240,203,154,38,169,58,70,92,16,35,61,7,124,35,113,142,58,137,67,145,131,199,17,150,236,191,230,7,114,117,110,63,152,207,233,161,119,30,48,152,132,121,2,203,198,71,14,215,186,145,127,221,30,1,96,96,124,195,89,134,190,184,156,81,21,202,93,92,36,211,178,94,60,131,79,116,98,139,246,174,90,193,115,90,35,8,191,119,163,251,173,212,131,203,130,130,37,214,33,102,89,168,170,61,156,205,105,44,18,175,241,83,199,13,10,170,57,74,0,210,226,252,125,126,16,186,143,84,37,171,199,161,70,145,146,252,45,255,108,15,16,7,65,16,191,25,162,95,182,213,122,116,148,126,30,37,201,142,146,151,147,65,88,159,106,78,100,233,165,177,207,231,129,207,254,73,179,96,189,197,253,135,66,5,32,207,238,69,58,142,115,93,51,139,58,195,63,98,222,142,18,145,136,105,7,45,225,53,238,194,81,104,41,190,213,12,71,104,30,57,152,112,119,199,26,56,92,58,119,222,224,230,88,28,196,43,97,218,100,78,218,142,182,181,136,62,50,133,14,46,17,2,154,12,55,252,70,52,198,156,9,246,178,165,253,168,25,179,16,22,250,13,156,128,45,74,123,124,146,225,176,94,125,171,68,65,97,16,52,231,43,14,221,227,251,79,156,214,13,224,180,100,236,197,124,84,14,74,164,235,170,201,118,96,92,77,84,152,173,184,131,226,115,176,120,5,51,250,112,104,54,87,227,42,94,182,31,12,35,43,3,60,6,205,28,156,185,234,237,154,134,143,65,135,128,174,77,7,75,36,53,114,181,165,121,236,136,232,184,179,80,89,251,124,81,23,169,70,28,146,222,113,212,79,88,8,15,103,40,42,178,245,17,204,246,213,142,85,169,26,19,116,54,54,139,5,48,218,60,64,26,87,225,114,1,219,124,179,143,46,212,86,247,58,114,4,143,211,83,183,174,201,82,155,152,58,214,205,227,170,120,247,144,199,75,94,212,99,183,200,109,104,156,44,180,234,167,53,149,229,239,20,140,113,189,89,24,55,244,13,10,73,72,207,56,164,94,162,67,70,208,205,218,82,196,109,208,13,10,108,82,45,58,51,80,117,96,254,195,233,49,35,108,95,59,47,162,113,190,168,0,137,6,237,162,135,31,145,158,235,43,58,141,158,211,147,207,48,126,64,34,191,251,170,2,71,197,238,35,60,152,124,43,183,144,113,99,190,18,67,153,211,139,151,198,29,173,151,185,250,184,75,147,32,171,185,150,155,250,101,157,138,217,79,27,247,14,46,15,223,51,184,111,196,208,116,111,249,225,18,120,29,83,48,154,123,63,149,108,35,29,90,215,43,212,137,125,144,55,188,156,2,180,19,209,124,107,111,136,202,119,104,66,194,3,127,101,217,63,160,146,107,62,12,132,223,232,169,62,129,222,99,185,13,208,39,23,68,54,131,32,121,1,140,167,77,94,238,190,158,110,228,226,124,23,79,60,94,79,93,210,206,32,13,10,29,67,128,96,35,149,17,9,207,20,237,19,146,64,43,55,136,151,165,111,103,20,120,16,244,203,230,29,50,5,210,113,252,6,13,154,85,138,70,150,5,229,112,97,92,229,166,98,154,56,246,54,204,99,234,89,76,219,181,154,78,56,16,82,102,145,64,225,25,5,246,118,149,175,43,60,224,123,132,21,87,2,167,132,116,124,91,147,120,246,225,1,35,20,63,5,217,148,143,229,40,240,184,253,88,178,63,143,174,18,80,213,238,244,64,207,69,117,153,153,132,65,47,253,236,241,46,162,184,228,81,60,242,44,128,135,234,100,169,139,202,185,173,103,187,101,62,19,113,187,87,134,21,8,99,213,225,76,92,139,17,39,75,146,120,38,171,79,89,236,38,227,104,146,33,186,159,55,73,220,100,15,204,128,217,148,141,73,31,155,78,91,189,120,216,211,25,131,182,169,219,0,223,210,230,221,176,138,68,251,177,127,167,89,210,77,69,8,4,57,179,175,115,117,185,244,71,71,185,29,227,90,147,121,218,12,239,52,28,252,61,197,124,75,248,205,189,160,224,14,144,143,134,239,5,25,139,34,61,163,208,61,37,216,152,217,13,10,85,190,14,6,228,92,158,166,87,64,215,206,221,1,254,249,225,67,74,212,126,182,144,124,107,114,86,147,52,51,222,85,121,34,108,235,45,26,123,15,248,133,163,67,163,122,226,124,221,166,84,180,206,119,232,197,157,19,187,79,148,129,70,19,50,247,86,53,83,205,207,21,123,137,179,39,38,231,33,224,219,88,174,128,52,118,221,127,182,114,129,192,214,234,172,62,201,136,154,21,52,173,127,97,176,95,75,102,54,141,248,213,26,102,245,222,2,60,181,60,106,185,165,219,230,23,184,31,44,248,76,17,228,179,206,249,234,174,155,187,81,76,93,39,242,119,234,254,43,219,168,102,28,150,142,32,150,31,231,75,191,122,86,102,123,198,209,157,168,125,140,137,251,20,250,135,167,82,163,218,86,48,190,46,204,61,139,95,209,30,109,42,229,157,246,31,123,48,171,190,186,231,151,64,120,142,71,226,4,203,72,71,228,194,28,62,39,112,42,24,171,155,123,200,247,3,127,67,199,253,254,102,251,191,76,201,229,79,104,236,61,51,235,16,55,3,133,68,21,168,56,150,255,40,20,137,58,232,188,19,132,102,139,11,92,49,213,34,211,79,202,136,13,10,108,243,29,192,171,18,53,102,117,226,45,224,236,226,201,135,201,45,91,221,219,211,247,250,129,115,11,162,41,164,126,84,147,174,20,187,249,54,230,6,120,249,194,117,155,108,37,117,219,34,227,99,205,36,21,57,151,149,32,169,3,233,172,140,242,195,199,94,34,32,152,83,142,63,88,104,246,74,106,137,223,124,131,50,130,220,131,201,37,230,219,193,48,136,199,166,146,157,217,169,156,145,86,197,245,46,240,72,83,248,120,197,83,215,224,78,206,135,193,165,112,164,54,101,73,65,59,246,209,104,235,94,25,179,209,152,195,237,71,56,230,205,222,3,219,184,179,25,172,76,218,172,77,123,0,147,101,207,111,162,122,168,17,124,241,25,183,74,160,77,251,171,123,161,91,14,209,139,38,82,59,197,138,255,120,239,144,111,54,34,160,250,90,24,50,16,86,163,154,177,231,204,103,31,19,22,34,192,16,54,26,81,240,42,97,213,78,128,158,163,242,37,67,62,46,204,116,107,49,251,2,201,245,8,222,100,8,58,167,30,139,164,109,154,232,12,75,48,243,235,73,90,221,149,131,230,31,181,184,108,123,144,43,143,81,108,104,65,217,195,177,221,182,30,177,239,96,164,208,66,187,116,250,79,12,208,20,143,2,9,135,25,200,102,47,234,196,122,77,137,31,252,38,157,46,115,24,183,40,158,38,18,238,175,254,90,136,128,48,230,121,102,27,3,215,92,210,81,112,27,36,47,83,197,50,126,13,79,66,228,118,73,175,24,168,45,126,164,188,81,249,209,123,74,178,208,15,44,61,31,127,36,77,198,106,161,164,223,81,191,14,251,87,71,253,31,122,114,25,105,127,44,224,99,185,93,4,14,184,171,57,177,36,111,84,17,156,30,14,150,134,247,35,199,79,108,154,196,185,112,69,66,60,93,176,227,213,35,12,111,176,230,132,179,182,195,116,176,97,142,77,116,40,16,127,123,60,145,1,241,87,41,63,234,191,254,202,171,34,93,85,46,77,75,171,55,49,101,132,141,159,98,93,128,227,222,13,35,50,255,192,14,187,244,246,216,125,13,10,67,7,43,118,35,1,108,6,230,245,54,78,229,199,123,44,29,201,47,48,186,204,231,131,196,12,125,184,126,73,76,224,181,100,190,190,47,243,94,29,72,108,0,94,106,172,90,225,147,30,63,247,53,143,21,45,72,54,236,122,220,126,39,197,54,231,34,204,154,29,43,93,104,95,221,38,207,203,97,112,76,241,230,234,9,120,91,248,231,240,198,148,48,31,231,81,130,141,224,113,42,142,131,3,235,107,55,248,93,57,137,220,5,115,245,218,66,89,129,110,137,68,5,242,138,30,52,142,127,108,89,108,232,197,242,174,123,246,189,254,29,53,146,171,167,4,5,209,136,128,191,69,230,49,9,71,146,83,138,138,235,50,161,91,213,122,7,198,1,140,183,172,195,101,227,8,162,176,207,190,204,246,198,99,188,28,240,4,13,10,25,176,187,57,168,81,103,114,204,202,155,251,7,58,99,211,48,82,18,15,109,144,102,53,71,119,213,17,221,172,45,33,121,252,177,87,21,221,99,161,79,231,11,66,179,14,44,163,56,145,228,91,164,33,134,102,172,28,159,16,214,204,130,63,185,230,36,7,239,155,255,160,121,192,98,219,143,130,128,172,36,21,38,139,59,254,249,49,88,107,69,76,207,222,28,113,53,131,214,122,3,49,117,144,109,182,149,133,103,253,31,208,36,34,119,132,27,90,152,230,139,196,14,154,153,76,235,192,97,157,135,196,162,144,246,2,118,128,249,206,17,86,235,75,52,20,75,217,9,6,184,95,248,42,4,72,2,199,248,125,255,102,66,206,148,254,30,220,67,250,152,109,253,226,150,102,245,6,121,147,252,194,15,117,42,117,26,116,207,216,231,213,253,127,78,176,102,22,17,20,133,241,168,226,92,53,18,98,159,190,165,130,24,116,115,12,62,118,31,60,11,179,81,252,66,73,194,46,40,8,113,74,233,41,137,195,130,232,250,194,149,14,228,51,80,220,49,154,168,63,164,3,156,24,150,246,91,240,211,249,156,178,192,30,53,130,37,64,148,13,164,135,134,73,70,18,199,186,195,73,5,40,8,126,197,239,78,155,152,184,181,250,209,25,67,107,190,8,186,8,88,212,54,131,73,189,131,127,9,192,141,151,112,234,69,184,118,110,188,92,5,31,224,246,56,104,102,74,181,238,252,123,130,5,117,3,235,151,224,225,56,108,148,144,105,8,89,149,29,140,95,189,74,180,55,43,36,141,74,157,30,178,165,238,58,44,129,40,54,117,244,186,192,19,123,254,159,234,252,77,209,246,57,142,211,3,77,176,103,161,217,101,121,201,120,178,203,48,164,102,244,241,193,204,168,217,234,112,23,69,159,169,59,47,189,255,242,38,245,130,15,13,38,11,125,235,167,235,87,163,90,13,142,125,28,112,67,238,181,28,233,27,218,196,18,213,218,62,43,101,173,206,237,206,24,212,14,151,48,29,73,59,207,173,98,9,112,59,194,26,34,196,105,208,132,67,233,204,209,90,209,1,253,33,198,142,57,130,197,88,246,251,17,228,246,130,101,192,221,255,166,130,24,223,88,123,213,52,240,237,93,249,136,191,202,64,199,191,115,133,201,147,101,234,46,64,65,154,202,111,24,151,216,255,17,213,188,161,238,128,215,111,238,176,143,203,56,18,115,182,152,14,243,72,125,73,35,27,79,122,199,172,151,208,43,170,241,65,45,82,90,230,238,236,222,137,75,188,168,177,122,112,1,236,149,187,201,98,96,195,38,147,177,18,101,58,224,242,110,71,31,146,15,71,89,203,194,153,93,176,222,181,57,12,136,210,131,62,110,19,83,83,7,239,126,145,65,241,248,208,4,127,212,82,9,106,214,135,172,48,176,107,214,149,18,231,205,0,154,162,199,244,55,84,104,122,44,220,5,133,53,239,172,107,237,78,9,153,68,107,85,49,181,59,119,182,7,2,145,208,137,2,203,251,238,28,6,49,158,171,23,50,161,238,213,86,115,126,75,4,176,61,68,96,245,184,20,254,119,48,26,155,88,157,18,16,150,226,121,246,175,238,38,49,121,14,113,72,252,201,78,31,168,109,220,228,134,159,150,123,36,109,148,177,38,23,171,174,45,149,173,209,2,137,141,52,51,174,125,228,221,26,11,32,120,182,166,141,110,14,225,131,46,93,54,184,48,141,147,64,142,111,203,138,233,244,198,181,37,88,49,20,121,91,187,234,57,223,3,63,143,169,13,186,195,164,238,85,44,126,215,1,225,245,167,220,65,26,169,181,39,162,73,86,50,106,134,195,111,218,178,218,107,61,101,94,254,171,182,12,137,253,43,80,239,214,136,183,97,18,146,95,217,79,102,40,159,220,173,11,173,234,69,195,40,155,127,20,125,69,203,121,171,8,253,72,144,251,245,203,184,234,191,45,112,59,227,130,111,95,213,131,201,42,137,76,30,201,221,133,52,160,61,99,225,134,154,113,147,227,96,70,58,220,13,125,228,185,48,206,6,49,242,183,57,116,19,128,159,30,49,67,230,219,255,18,113,236,234,250,113,219,247,23,85,159,101,246,79,97,173,125,153,49,49,226,181,196,227,38,236,1,51,137,181,219,129,225,116,40,239,151,22,232,70,121,77,189,131,13,10,116,0,151,237,89,139,90,240,79,207,79,134,92,137,114,117,248,216,161,254,215,127,91,22,204,241,210,33,233,25,37,105,53,251,171,58,176,2,105,62,247,247,216,203,225,157,148,66,226,244,130,137,113,145,246,119,4,65,171,98,146,80,57,115,91,224,74,9,49,148,116,70,24,126,106,165,117,235,77,241,184,179,19,183,222,87,78,129,87,126,102,72,99,229,66,192,34,164,69,163,40,41,62,78,120,139,173,102,80,191,185,182,200,167,117,63,136,96,199,179,129,58,163,102,72,189,239,163,147,36,116,68,99,243,135,49,111,113,15,92,8,219,49,146,157,220,95,237,46,245,90,17,238,29,179,191,50,231,167,55,186,185,51,48,58,125,7,98,143,41,62,57,246,51,224,36,201,223,130,117,155,235,67,126,78,222,197,102,128,57,235,167,35,21,142,244,247,153,139,104,106,134,165,1,221,2,217,135,46,77,187,132,103,68,140,172,62,66,223,132,236,185,42,96,48,161,61,50,134,103,239,151,223,7,118,94,243,185,163,242,166,71,237,13,238,245,154,238,123,200,131,0,158,50,195,238,83,218,66,19,87,72,110,58,205,195,162,250,116,167,206,23,131,235,229,79,253,56,122,147,249,179,210,88,101,236,193,194,162,80,162,202,174,135,229,74,70,91,101,27,180,96,136,74,167,203,133,124,206,181,144,49,201,55,237,41,26,147,58,3,2,175,193,125,167,120,32,18,13,58,250,7,213,2,17,55,82,203,97,149,6,255,234,103,68,150,129,6,200,156,132,233,41,242,239,59,162,23,17,103,221,241,89,13,10,244,29,125,208,160,105,185,107,252,102,185,20,252,27,219,12,239,153,49,77,120,153,19,0,179,192,80,93,209,117,168,54,192,181,153,157,38,102,102,76,238,197,32,180,233,133,119,201,130,151,76,172,224,135,47,193,1,88,206,236,226,50,39,1,136,142,100,133,116,245,20,118,87,4,120,189,107,168,195,33,142,150,59,90,217,250,103,161,136,35,175,92,125,231,155,161,11,2,161,230,136,229,194,156,58,74,154,108,94,173,107,183,191,90,27,0,178,21,21,190,167,82,8,108,81,133,83,114,9,6,80,157,143,75,235,190,41,63,140,122,162,196,84,152,90,18,166,98,254,255,127,111,170,238,254,190,124,109,125,69,136,225,70,59,171,232,59,217,3,21,16,18,205,52,249,92,156,151,118,51,202,182,179,100,153,178,95,64,141,126,98,177,248,169,2,125,81,29,137,6,163,168,42,186,44,162,139,18,140,151,76,242,194,222,209,104,206,138,29,58,151,200,85,193,44,81,248,114,200,174,51,234,151,188,149,204,19,21,159,233,60,151,154,50,176,94,50,110,39,32,68,27,238,197,101,195,8,242,232,136,0,22,185,137,195,37,85,165,98,186,8,243,197,176,66,137,155,31,175,147,84,241,240,218,196,176,156,50,30,203,44,102,38,121,214,182,146,92,29,97,91,16,246,52,234,92,234,73,86,162,192,223,32,56,240,168,93,234,183,182,193,86,25,145,248,113,152,215,188,237,69,205,21,34,246,159,200,94,103,86,27,60,115,69,196,182,148,150,95,129,177,86,210,168,87,24,71,188,221,48,46,23,34,136,220,203,99,119,38,238,45,5,96,21,6,242,228,209,245,234,185,210,104,15,213,141,219,0,254,187,254,240,81,128,151,8,99,25,230,88,163,214,190,233,41,203,141,0,24,34,195,9,43,146,240,1,197,24,237,7,240,112,51,234,215,191,134,18,84,105,180,207,150,234,209,179,39,213,0,52,237,106,26,53,243,177,20,41,141,117,181,62,105,74,64,219,76,155,242,157,220,57,35,68,43,155,22,156,61,13,10,83,80,216,16,223,25,230,70,242,48,94,78,235,165,97,191,133,234,234,229,30,77,123,129,211,173,37,110,149,235,106,31,169,42,164,41,215,226,89,90,108,135,169,148,82,89,80,3,38,195,219,31,89,211,235,140,193,28,127,235,138,107,241,130,70,134,49,102,160,158,122,140,143,47,84,59,189,181,165,133,146,40,88,216,126,135,150,35,19,231,47,242,130,63,176,38,40,101,171,43,94,186,138,143,28,130,64,163,211,134,78,161,167,170,116,58,152,224,158,106,129,109,215,225,7,209,80,71,18,100,168,5,13,2,62,4,250,72,21,120,65,15,153,106,252,33,79,166,70,141,24,74,89,16,49,213,114,99,255,171,243,50,221,112,42,196,255,176,162,130,117,173,57,164,104,128,90,64,4,41,250,59,242,238,63,252,24,19,103,171,238,110,87,198,122,77,149,213,1,106,129,143,29,139,38,224,56,225,27,45,19,229,75,164,194,249,43,255,124,80,44,90,206,255,88,74,61,164,2,246,199,212,61,4,224,242,246,196,22,174,176,151,255,66,58,242,75,158,29,36,225,48,217,129,193,55,183,118,234,89,81,174,1,3,149,202,48,128,221,83,119,30,14,206,11,253,174,248,49,41,39,181,199,55,124,73,128,147,60,33,88,212,118,208,254,7,135,3,53,176,173,97,251,14,126,145,209,181,154,47,38,153,209,62,82,233,17,53,121,185,67,45,183,154,248,138,14,249,45,59,174,175,140,3,82,18,42,212,13,10,56,180,140,32,18,224,234,68,231,84,124,180,73,245,81,59,173,71,75,35,56,189,145,149,206,228,42,143,158,85,92,56,250,31,123,149,252,2,60,26,48,45,82,204,79,178,65,214,2,196,39,49,95,219,46,4,71,220,123,253,168,147,154,168,218,205,51,214,196,228,245,244,201,238,119,162,250,187,46,1,110,209,50,74,119,248,194,12,31,182,33,62,92,165,236,95,236,63,96,151,169,156,104,58,238,39,107,243,25,126,190,84,127,16,244,241,253,176,78,35,221,157,145,204,27,181,45,99,108,166,69,156,253,97,0,77,202,90,48,101,89,198,228,167,3,145,84,143,186,125,40,8,251,165,4,24,115,35,85,79,189,84,238,193,183,32,88,222,182,105,155,59,247,115,40,22,189,251,101,20,188,77,45,237,232,136,246,3,1,6,80,157,105,26,117,231,216,143,143,49,67,157,124,80,86,54,141,137,123,212,214,29,105,26,131,181,69,55,120,81,22,225,100,154,168,219,79,48,193,218,31,69,63,126,215,133,233,204,87,8,217,176,202,13,10,218,48,201,83,225,150,222,215,164,102,36,150,144,160,53,53,178,249,236,157,241,203,94,96,72,227,197,214,250,255,70,199,236,31,199,187,213,48,249,254,47,59,147,22,252,216,233,109,227,14,47,78,251,36,52,233,72,35,75,46,231,62,246,135,198,242,246,43,5,59,4,41,155,41,129,126,243,210,136,15,229,127,115,233,220,145,33,171,153,93,63,253,202,141,115,103,192,242,1,221,225,6,159,101,162,39,171,72,38,217,156,238,33,160,80,201,113,130,43,122,85,173,110,61,234,230,188,129,183,124,103,94,26,189,116,254,231,230,207,16,55,148,194,154,239,36,229,245,37,207,205,133,217,133,214,123,76,237,83,250,232,97,179,71,38,249,19,217,204,131,87,240,205,240,79,29,105,237,230,250,68,108,33,110,80,69,7,240,82,92,195,98,89,24,46,143,3,214,125,163,83,14,217,143,40,75,151,95,211,193,0,213,244,216,126,165,164,192,230,200,200,25,153,238,112,77,247,133,113,225,183,144,246,118,201,150,196,233,111,226,170,166,154,159,207,221,2,178,42,242,163,22,147,122,243,233,138,79,231,210,53,100,105,164,39,2,18,68,178,70,213,147,111,160,109,232,210,221,12,213,158,189,77,142,55,4,170,27,219,118,167,151,243,76,4,78,120,35,159,53,196,177,136,205,25,96,49,68,62,199,6,222,42,2,227,36,221,247,52,223,192,69,137,167,252,39,2,37,121,201,58,81,111,43,34,59,144,83,108,172,194,167,140,70,229,160,74,15,59,23,36,74,197,0,38,253,15,165,154,13,67,0,120,52,222,235,240,135,101,111,243,111,174,176,120,106,8,61,44,253,151,64,51,200,219,102,195,240,82,180,158,117,221,105,17,46,155,208,36,83,158,224,21,54,169,151,25,131,151,155,16,11,132,21,44,246,29,165,195,221,67,129,210,5,248,14,241,35,118,137,73,63,124,189,182,159,133,9,8,36,73,236,185,70,38,140,44,243,80,179,253,75,102,78,225,11,99,54,67,39,177,28,106,217,41,94,252,124,146,165,125,126,146,191,120,107,124,52,112,250,110,24,206,100,133,156,36,34,88,184,93,97,70,240,74,91,225,248,118,201,222,243,111,200,105,219,122,52,71,94,81,31,83,74,59,237,214,159,28,42,120,192,115,175,205,126,254,88,128,255,77,140,5,144,142,69,205,94,45,248,16,161,234,39,184,114,122,7,108,2,69,110,3,107,159,133,207,156,185,110,131,248,124,140,191,191,101,164,222,110,120,133,97,174,44,5,165,80,18,1,153,145,187,244,239,203,147,161,213,247,109,44,55,58,228,199,226,126,55,205,74,139,16,63,180,17,139,198,40,238,213,73,15,223,155,5,32,40,238,79,172,131,222,71,109,176,189,120,232,178,212,223,197,189,96,218,115,176,49,203,142,15,237,151,217,151,108,247,179,146,139,189,219,255,241,180,113,169,231,223,91,50,101,162,226,81,56,154,252,230,34,102,216,178,255,205,123,187,244,61,128,63,122,40,117,89,128,153,82,188,167,93,160,180,53,102,27,58,214,210,90,76,3,197,87,113,237,66,50,240,107,55,196,25,4,87,67,113,210,127,104,3,153,171,20,205,124,117,238,218,16,78,213,25,88,72,57,206,3,57,191,107,197,204,66,165,196,219,204,89,180,56,100,199,172,133,157,251,243,98,29,25,40,70,55,196,57,159,254,183,207,220,141,2,1,27,88,188,38,155,172,140,92,236,186,72,154,123,223,202,66,8,6,37,197,102,254,22,241,120,9,75,206,122,56,45,207,133,144,144,153,28,133,202,186,210,183,74,241,232,5,114,68,70,172,171,19,215,94,79,148,36,243,175,100,166,240,31,13,185,182,122,160,39,36,255,245,28,12,28,110,184,62,179,249,211,84,126,65,8,152,29,115,70,43,211,56,61,168,53,58,239,62,179,31,219,52,144,193,76,207,187,83,26,131,191,166,191,150,159,15,101,140,100,33,98,251,147,134,102,155,209,155,200,238,234,119,127,246,48,24,88,113,154,90,45,248,130,13,10,185,232,190,34,80,1,240,125,225,208,85,142,162,54,96,89,62,1,45,79,225,59,240,26,221,101,206,60,126,121,66,236,82,220,129,75,66,79,214,87,38,223,118,106,105,19,65,146,212,214,129,63,165,55,0,193,140,103,255,118,159,127,26,240,109,72,6,26,199,58,62,57,32,170,109,26,43,67,215,213,130,211,140,96,57,177,95,202,174,246,45,67,249,74,102,87,69,226,236,32,78,160,136,59,66,196,11,186,26,149,137,28,35,235,185,26,225,7,17,241,119,201,101,242,140,73,91,188,162,213,87,57,54,60,12,236,97,166,238,72,167,117,150,186,12,214,52,105,39,106,72,196,137,241,242,101,116,122,47,36,24,120,167,6,68,35,67,58,167,122,118,138,61,171,5,206,45,241,238,228,58,223,113,160,24,238,68,144,248,233,62,0,22,80,94,15,182,149,163,204,159,107,146,136,157,77,146,115,81,94,48,202,97,138,100,161,19,39,166,149,66,90,133,13,10,189,219,192,225,178,194,104,201,152,82,156,65,14,55,26,81,37,31,210,127,235,100,116,77,100,216,6,235,157,118,134,116,119,156,29,219,21,116,0,200,230,89,81,24,183,69,24,18,177,230,92,89,39,71,82,150,208,173,158,84,232,96,254,234,7,255,238,101,190,41,206,5,137,165,211,149,183,169,61,9,77,143,252,189,37,141,146,168,39,109,2,157,41,97,222,216,233,57,16,178,84,94,170,194,120,32,212,152,183,146,170,111,38,182,48,219,73,140,220,161,248,18,47,218,153,254,22,181,245,179,186,110,64,251,72,194,206,226,161,35,187,167,112,31,198,227,15,180,42,24,19,105,254,177,178,186,41,123,221,90,105,2,246,227,163,125,95,182,221,0,13,10,181,169,23,124,34,12,2,117,168,154,52,76,166,255,43,177,135,173,25,70,42,99,251,147,237,49,83,161,35,135,185,35,204,189,115,23,172,34,45,101,197,146,13,181,93,126,190,185,24,179,238,197,131,83,98,69,160,3,110,91,4,38,58,233,135,172,213,4,4,75,50,7,183,161,173,1,118,40,215,90,153,40,193,175,52,41,245,99,84,162,201,191,1,226,177,120,175,24,88,142,82,15,181,89,8,69,200,69,97,211,218,14,80,76,215,69,78,153,206,121,11,127,58,174,244,153,59,175,117,18,117,154,152,240,231,67,130,118,244,248,236,98,72,227,72,76,132,39,117,173,174,171,6,84,17,137,240,152,176,75,29,72,116,241,242,50,249,49,173,222,12,225,66,101,168,178,152,97,68,73,177,167,84,136,131,192,78,253,137,224,200,232,131,44,20,67,200,185,20,136,156,170,189,135,190,154,96,11,126,151,206,173,48,166,248,5,231,165,214,1,23,171,58,23,12,30,56,109,206,137,22,255,191,215,49,59,218,1,169,179,75,67,50,189,235,133,161,178,9,165,1,51,227,150,216,241,139,79,51,36,125,148,228,153,25,66,108,164,9,166,30,72,183,240,48,61,123,102,87,213,174,253,24,128,143,157,203,33,26,37,56,151,165,152,223,18,15,18,238,191,95,19,122,234,32,234,180,86,246,208,228,5,143,179,72,71,182,206,196,220,34,234,85,249,68,169,115,130,141,207,82,65,237,138,104,18,224,19,24,214,213,216,156,34,177,250,220,172,57,115,80,149,163,27,191,60,221,146,54,223,237,22,41,95,53,184,0,77,55,119,90,81,11,63,154,168,121,178,178,142,74,59,23,253,149,93,238,139,139,146,173,22,24,233,163,71,243,214,116,185,190,233,246,247,190,60,121,211,118,30,111,30,41,162,160,229,196,232,166,7,77,103,115,119,19,151,8,78,234,162,111,131,114,70,169,235,163,71,31,152,93,1,225,85,12,82,100,120,93,68,201,52,253,236,224,122,233,17,151,179,218,184,42,158,163,22,189,62,17,43,204,136,187,181,33,64,76,20,228,16,99,252,155,222,234,160,162,124,234,11,38,65,128,146,74,255,218,229,210,32,94,158,189,69,238,164,104,54,231,135,41,149,31,16,29,137,233,162,134,215,33,79,84,201,130,218,50,72,160,83,236,191,189,78,232,202,24,241,130,239,134,91,228,244,136,246,177,132,75,163,70,61,211,191,185,26,131,2,183,19,35,197,158,4,36,253,59,6,138,214,152,190,163,185,226,181,168,83,51,239,147,60,6,37,20,44,51,93,234,0,37,157,115,60,208,113,230,215,236,112,132,127,64,86,72,233,213,152,22,198,155,123,235,64,24,250,212,82,111,29,190,200,193,202,244,232,13,10,75,82,72,249,70,11,149,125,75,25,82,25,75,174,1,154,211,131,250,133,61,128,40,232,225,191,13,152,44,209,1,130,253,158,159,107,246,185,67,60,20,159,202,117,156,83,141,222,98,73,226,180,225,55,243,166,41,122,75,24,126,60,118,187,166,132,23,59,202,206,96,223,162,86,119,80,247,149,52,96,137,199,243,109,249,43,166,236,126,141,127,114,39,13,167,219,78,91,49,59,169,121,91,218,110,12,239,118,184,123,84,242,168,139,13,10,51,223,43,171,97,131,178,166,145,70,85,176,254,107,118,241,173,176,238,93,188,32,170,120,227,227,244,208,36,0,83,64,214,18,148,34,204,114,45,0,197,106,32,221,177,23,238,154,147,138,114,131,108,21,206,4,94,104,104,147,125,193,65,31,120,82,3,13,10,25,145,224,0,74,158,224,224,50,7,252,123,169,203,110,169,211,70,69,21,161,220,15,153,179,194,90,38,100,147,148,56,74,135,197,13,10,30,239,17,191,155,15,43,225,32,176,192,88,226,111,27,237,15,228,239,207,5,59,20,49,254,151,97,35,95,227,65,2,89,56,232,42,142,255,182,155,219,130,132,66,113,143,168,191,47,179,126,34,180,52,158,195,143,89,109,184,11,74,139,202,246,8,49,77,71,116,203,41,0,241,177,146,147,107,72,176,112,150,170,32,196,207,17,186,139,12,57,176,128,96,130,122,27,187,250,113,225,235,165,42,49,109,72,13,146,80,161,238,222,197,143,39,185,120,127,68,201,192,241,199,195,142,32,47,59,161,111,47,223,229,62,111,36,77,151,46,73,111,2,23,180,42,110,48,148,111,12,20,107,157,80,126,34,20,86,105,159,77,202,176,53,187,204,209,144,184,191,203,0,4,109,150,79,195,94,31,233,162,238,76,78,209,243,112,183,41,214,187,173,59,7,130,58,207,210,250,212,237,250,170,218,254,231,142,29,141,238,12,214,140,50,105,225,58,232,156,209,199,2,176,143,193,136,221,111,179,134,30,213,55,207,228,179,33,175,38,204,146,60,75,201,53,92,213,152,112,184,0,114,123,1,32,44,83,161,196,160,103,9,176,12,209,37,253,1,99,196,138,199,51,65,227,113,8,103,252,142,142,248,59,65,54,139,107,221,17,168,203,39,87,141,172,173,27,133,240,61,82,51,122,111,72,151,211,142,78,155,117,36,27,44,85,78,150,250,249,153,28,95,220,102,140,114,7,87,27,22,2,228,57,190,60,84,119,48,91,136,172,19,45,84,165,169,201,11,203,160,120,117,103,25,143,187,254,225,75,246,211,58,113,227,53,25,114,154,197,168,146,79,200,39,225,104,52,17,191,129,175,23,155,2,70,53,150,189,38,120,252,238,121,108,37,153,14,219,146,245,146,74,150,125,111,221,207,156,80,201,159,94,0,55,61,13,180,213,111,1,76,181,237,207,172,135,131,231,87,238,208,206,49,160,244,117,14,134,135,59,174,53,159,215,140,199,83,183,102,155,183,76,240,94,133,145,5,20,231,1,173,29,226,19,194,27,140,36,102,84,78,215,176,185,30,78,83,118,251,121,76,61,7,63,255,75,188,43,196,231,131,151,215,59,56,23,91,129,145,88,13,65,209,225,146,74,91,206,19,82,73,250,20,175,136,217,24,160,5,134,36,95,226,73,120,41,106,109,193,249,93,68,175,13,181,111,13,146,70,7,17,143,142,61,164,94,71,137,15,81,253,208,180,83,240,193,197,248,230,3,188,124,30,157,34,239,230,147,187,188,162,242,238,105,60,237,91,167,78,199,156,99,130,66,69,202,185,14,196,54,34,48,69,212,231,9,133,141,63,95,160,90,157,95,255,167,4,69,122,226,213,161,96,78,76,74,15,230,123,221,86,165,63,25,48,112,45,98,39,22,199,144,116,165,28,49,47,15,9,206,185,46,48,191,186,92,200,17,6,79,11,89,173,226,85,231,159,15,149,176,14,176,135,117,198,107,192,0,125,128,33,255,173,234,103,140,222,25,111,56,71,208,249,128,169,61,251,183,221,86,81,58,111,130,51,162,138,109,33,188,149,89,158,47,121,38,115,237,114,4,234,229,63,244,231,150,178,32,231,87,146,176,182,182,35,247,193,132,70,150,117,177,128,118,206,229,95,33,227,130,26,231,251,177,170,202,76,243,119,200,71,222,253,85,45,98,50,212,12,255,75,207,176,151,37,48,173,19,102,46,42,235,40,233,216,15,171,7,241,43,27,21,244,41,83,172,69,234,50,92,202,111,243,50,173,20,244,239,0,223,191,22,233,51,100,56,103,32,88,222,55,26,40,250,255,8,25,79,15,202,162,158,106,231,245,148,119,3,186,0,229,31,27,45,221,234,61,104,134,28,140,194,67,225,1,84,221,222,127,39,136,63,13,10,233,133,202,226,3,230,243,82,234,89,196,176,1,93,3,244,172,80,208,197,239,41,15,129,42,125,248,112,76,205,238,3,22,21,67,27,188,79,58,67,243,212,18,122,26,55,244,231,31,119,141,79,13,10,78,136,160,195,36,96,221,200,24,216,49,121,188,45,130,146,95,189,68,143,249,149,249,139,105,1,207,128,32,146,198,195,151,8,246,235,6,132,75,180,157,74,15,206,231,177,26,49,115,220,247,209,26,104,117,55,233,177,128,187,205,83,182,165,6,123,106,64,101,145,149,142,86,74,31,91,12,23,2,73,48,223,31,34,227,49,56,188,132,177,129,241,64,216,226,73,172,35,191,75,106,86,140,172,130,187,75,48,13,65,38,20,147,1,242,189,97,195,170,105,24,90,16,160,253,176,148,187,171,254,23,40,155,11,21,195,60,103,44,68,77,234,165,2,6,69,140,16,84,118,118,14,47,240,30,69,89,96,74,246,190,174,81,174,18,148,43,141,159,184,186,115,55,112,71,204,203,162,55,111,46,220,183,24,157,120,192,36,161,182,170,232,100,88,247,102,202,23,200,102,219,105,85,166,178,254,239,22,130,84,250,89,163,144,29,200,182,109,178,15,68,136,241,183,76,42,130,184,141,71,79,169,197,234,86,244,212,63,155,110,90,222,183,164,243,148,39,211,40,19,165,92,244,127,37,63,112,55,221,240,107,87,68,1,204,230,17,153,27,205,64,246,12,220,247,102,155,171,181,223,101,4,157,151,183,161,198,122,36,98,199,126,192,237,246,143,157,30,247,201,25,145,43,154,172,96,133,127,66,14,94,89,64,150,182,47,151,96,159,221,109,239,150,149,207,0,75,71,102,153,145,155,132,179,27,123,12,83,212,103,208,254,70,86,227,60,246,71,164,159,166,133,208,188,238,199,237,136,230,211,76,123,3,212,204,209,176,60,243,136,122,254,109,29,71,166,96,242,121,169,24,215,32,81,219,108,251,76,195,91,34,255,166,221,224,133,164,168,182,97,118,64,214,1,161,115,185,53,221,33,205,131,49,248,12,171,186,197,28,253,105,175,160,198,225,173,233,42,110,61,122,144,179,64,2,228,84,190,67,36,106,17,92,64,179,56,132,115,37,227,243,244,162,157,1,147,108,223,51,232,133,167,5,33,130,35,255,95,89,127,140,97,175,18,58,45,239,13,10,173,167,67,111,177,137,200,47,24,33,164,4,203,9,51,165,67,3,42,124,114,105,164,76,139,169,94,61,57,172,120,50,191,231,214,12,80,37,92,89,70,25,83,201,246,195,248,62,249,64,44,47,56,84,7,97,153,74,125,71,204,173,219,66,103,157,83,229,36,52,29,134,70,142,231,180,18,156,85,192,163,230,8,225,144,252,233,66,19,135,144,199,143,199,112,35,139,252,247,175,60,218,220,226,254,109,224,179,214,81,250,254,9,230,124,14,136,127,41,67,170,88,249,104,193,121,43,30,138,116,129,197,84,232,114,124,232,254,29,19,105,189,82,181,89,91,51,58,6,99,30,11,17,87,162,175,168,40,60,21,20,56,48,135,245,110,89,32,142,168,3,143,165,22,167,122,75,85,14,30,87,34,54,200,201,199,155,227,186,55,2,21,13,10,243,193,175,236,139,12,248,165,167,225,153,77,198,29,224,217,162,87,33,202,108,255,220,136,137,22,223,216,203,81,209,252,24,208,121,95,192,87,72,103,231,208,87,178,70,187,36,140,183,89,229,248,187,152,229,162,147,66,212,200,8,118,93,61,217,103,183,17,8,115,189,48,174,154,93,62,232,82,87,26,99,5,92,114,133,4,84,227,25,79,228,11,208,88,215,183,166,36,162,78,154,102,65,19,39,220,85,172,186,40,49,112,130,20,229,175,150,44,253,60,180,240,215,174,206,38,72,70,102,25,200,156,249,14,159,239,34,138,80,159,174,39,134,115,205,22,211,173,174,149,180,55,41,1,118,179,224,181,70,105,73,212,49,28,223,41,138,21,118,193,200,1,236,13,67,91,133,20,168,171,188,87,78,29,61,63,63,151,218,83,218,64,93,152,50,226,82,110,54,22,165,61,212,34,209,126,230,244,102,241,1,139,52,63,253,138,169,97,176,53,248,214,178,153,39,85,120,152,171,64,31,0,185,198,75,58,26,137,203,234,164,79,194,17,89,239,252,194,145,176,84,18,194,13,189,207,87,96,72,11,95,96,171,163,16,26,25,188,116,69,195,158,134,4,127,228,212,146,13,10,173,31,202,142,139,253,116,67,28,208,23,181,2,218,117,210,9,87,19,128,231,87,43,164,193,248,40,73,60,80,240,68,142,26,60,4,226,178,151,202,68,62,152,49,200,136,32,172,125,225,203,75,156,225,19,246,34,238,87,106,95,77,254,167,129,224,209,176,93,198,173,57,137,179,184,48,138,56,233,204,147,185,174,17,99,130,16,92,48,9,217,248,54,127,205,227,216,79,11,93,166,112,225,51,29,62,104,191,226,24,14,4,161,108,51,162,88,240,114,68,173,156,245,106,79,157,70,240,38,68,253,42,251,145,34,68,59,6,13,184,153,68,249,0,215,127,55,253,175,127,47,109,234,85,126,182,190,11,16,37,225,231,66,208,245,16,220,168,101,165,113,166,49,50,159,209,200,71,80,69,137,124,133,85,165,161,72,155,132,90,28,104,89,38,8,132,241,147,150,197,182,190,252,18,22,87,116,103,139,79,199,76,86,149,247,231,60,132,38,233,136,188,168,185,142,81,67,61,215,110,11,148,190,213,5,215,200,16,139,85,223,26,129,220,163,140,255,136,90,160,69,218,14,157,146,30,176,19,230,170,250,181,172,21,40,191,241,16,157,167,29,133,62,184,53,205,144,233,194,89,157,115,200,18,232,41,89,215,65,102,108,182,19,49,133,200,57,90,198,151,50,164,158,115,135,75,61,123,113,83,1,79,221,219,144,113,18,187,45,165,228,97,98,161,214,127,82,136,160,247,64,171,180,228,187,51,183,218,8,216,243,221,21,220,171,231,48,39,244,24,184,182,108,121,116,90,65,85,47,149,247,132,221,244,98,51,165,166,231,59,155,111,178,224,159,14,144,9,82,95,212,73,174,201,59,201,226,20,137,144,22,88,110,144,128,41,163,152,218,89,15,71,243,181,19,236,8,23,61,113,88,138,12,25,106,88,58,106,2,236,52,24,3,49,82,188,53,231,17,240,51,117,109,128,61,223,166,122,16,62,65,189,84,248,204,162,82,131,8,126,106,238,181,62,250,64,206,111,17,192,83,92,240,115,99,79,224,11,126,23,215,113,124,158,183,140,75,66,179,218,195,152,85,147,30,137,54,209,86,172,13,121,219,52,201,90,132,205,250,204,93,126,16,74,184,191,86,214,60,141,124,187,102,168,162,78,147,176,45,89,123,22,230,135,189,48,241,195,66,92,65,92,23,115,50,118,55,255,235,76,2,203,13,93,245,216,245,176,253,133,127,171,71,150,68,32,183,167,210,102,115,118,145,44,4,212,140,195,59,23,120,22,232,59,255,188,122,218,125,207,252,76,23,238,241,37,201,142,83,38,196,148,144,222,247,177,136,79,103,41,50,186,59,172,85,1,106,224,101,149,251,214,26,238,66,129,23,29,113,109,215,186,47,60,222,197,146,98,132,114,254,192,75,208,18,67,77,108,232,209,30,242,87,86,78,167,17,250,78,113,240,100,170,239,233,206,65,71,169,205,28,79,18,20,94,71,32,203,54,150,177,193,251,0,252,135,84,150,32,201,136,141,227,189,180,238,82,217,184,118,150,1,80,51,105,55,63,154,155,51,186,180,201,116,123,86,160,179,86,233,59,32,129,180,50,190,92,110,71,54,50,205,220,210,194,199,196,79,135,235,74,23,70,190,32,156,83,112,95,4,135,104,157,161,53,235,210,156,83,156,59,156,45,203,181,51,40,179,17,74,15,201,114,41,239,148,126,170,112,17,233,92,72,233,100,125,123,16,101,19,254,87,251,0,5,45,19,243,89,228,7,9,212,43,157,7,79,23,187,51,183,218,20,11,237,126,248,222,183,225,206,255,215,85,137,145,226,134,62,244,67,105,31,105,241,238,250,172,100,118,98,172,218,14,188,138,167,207,238,107,33,179,206,113,34,200,198,17,152,253,249,12,27,185,67,40,252,200,150,196,187,230,224,167,29,164,65,88,66,192,160,221,111,172,187,75,13,156,106,181,72,145,139,61,151,144,95,88,117,189,53,49,178,181,240,238,246,33,184,16,100,210,250,81,23,182,254,116,140,186,114,97,31,100,97,192,138,157,213,110,105,134,158,150,91,64,228,47,81,5,98,155,27,137,32,153,212,135,217,248,225,22,88,122,34,235,78,67,115,33,216,229,201,155,168,147,141,79,193,29,137,134,16,143,160,154,209,173,107,222,26,197,179,214,128,94,147,220,162,131,111,152,175,232,161,19,55,132,149,202,182,120,162,221,61,104,137,242,169,102,213,128,185,30,21,36,87,186,14,162,237,49,149,71,211,54,132,60,240,79,122,184,231,26,231,202,26,159,157,176,215,240,135,171,0,170,197,133,25,237,178,78,75,155,53,192,98,194,37,38,44,44,124,45,112,226,177,29,180,197,22,39,109,181,28,155,102,100,198,124,163,9,198,218,119,124,12,8,136,28,12,15,173,108,133,71,41,47,4,66,85,169,210,221,84,6,85,228,170,67,118,202,11,51,79,40,218,250,71,174,80,110,125,252,155,223,145,71,15,31,80,70,234,151,47,101,109,199,245,113,198,14,216,18,158,206,14,90,245,120,5,161,249,101,218,216,124,142,30,186,79,236,173,31,111,50,89,22,88,244,102,106,254,48,188,223,126,100,86,124,157,128,209,130,157,255,59,163,151,59,179,235,24,125,96,173,191,176,63,71,53,91,226,181,76,228,149,227,190,67,132,84,17,161,166,191,193,7,191,139,43,75,154,246,251,51,99,12,93,21,233,27,161,75,161,233,41,21,45,49,156,86,39,122,118,11,133,93,101,166,122,132,184,165,253,49,108,231,121,141,116,126,185,75,0,252,116,158,234,29,61,238,8,192,34,142,132,46,203,153,6,0,8,244,231,72,90,102,107,54,206,194,47,207,155,233,222,82,155,180,88,88,101,124,170,2,82,86,182,7,158,255,84,7,218,194,25,196,80,62,34,206,91,0,234,116,39,73,144,151,216,6,180,40,109,33,20,148,243,255,19,120,71,125,14,142,176,128,51,140,113,171,137,213,251,156,146,112,218,3,106,254,130,123,237,141,41,160,41,136,231,134,148,244,208,203,62,173,130,67,93,50,199,116,53,201,223,83,222,5,225,95,94,68,27,207,178,38,32,128,230,206,83,0,50,231,167,132,90,242,219,41,138,168,248,23,209,26,25,55,57,71,13,36,136,202,178,131,129,113,75,74,176,179,243,207,56,78,3,60,222,86,233,120,175,79,62,247,71,11,106,168,243,230,120,4,222,131,105,241,170,192,107,19,215,125,206,228,163,37,182,236,186,34,241,63,105,90,204,26,188,52,245,126,237,21,166,149,181,203,94,95,50,167,209,1,205,181,225,19,255,247,143,202,54,73,110,227,14,183,67,152,209,67,164,50,155,74,103,255,148,86,125,211,249,179,212,244,45,134,100,245,102,50,0,76,211,248,138,143,142,197,135,87,39,195,227,99,135,98,230,88,252,153,81,81,42,195,232,35,172,238,196,66,172,104,71,242,179,41,29,230,200,87,104,242,31,44,204,21,30,74,254,158,124,77,62,86,91,8,240,163,160,146,148,126,211,206,158,148,5,175,238,149,17,225,219,215,183,168,48,44,100,143,152,236,173,140,135,156,183,69,164,59,255,87,254,234,38,25,144,65,122,236,64,207,138,233,25,30,228,165,79,186,80,101,19,187,73,24,38,108,148,247,162,29,77,166,136,220,76,75,105,178,240,18,240,226,83,186,174,97,145,84,176,159,169,59,7,67,89,217,82,126,252,211,139,122,99,250,252,52,198,229,0,184,163,144,62,90,250,96,121,67,169,188,45,69,40,197,110,237,60,108,216,182,29,116,51,223,161,115,84,207,70,249,13,10,166,7,180,125,150,148,238,37,123,21,103,238,211,221,117,101,196,188,200,166,5,198,144,16,209,164,65,148,134,6,1,82,204,220,81,169,81,18,12,159,149,213,132,193,28,246,178,251,233,67,173,54,233,45,173,30,222,199,0,156,199,236,94,225,235,85,237,19,177,107,147,37,37,233,159,88,52,196,252,185,244,68,130,241,152,82,168,28,223,20,174,213,99,45,3,69,225,141,130,114,150,147,129,57,217,113,122,148,106,136,68,181,3,1,27,112,0,0,242,0,147,27,136,25,208,116,183,128,189,243,48,225,95,87,201,165,183,19,228,26,3,6,33,28,147,255,218,133,174,96,230,100,12,225,210,11,160,134,85,83,245,207,169,40,252,2,63,145,56,216,59,132,142,129,145,117,196,20,36,212,0,5,49,118,157,4,161,36,254,215,70,177,14,186,85,187,52,57,136,75,39,230,22,100,200,59,238,100,100,246,202,106,195,209,118,162,104,5,2,160,98,170,46,216,178,205,153,131,233,229,44,32,184,194,48,159,187,116,72,150,171,167,230,171,98,251,255,123,197,156,229,198,69,75,193,131,220,84,238,190,160,190,57,233,123,221,204,121,119,8,225,223,206,130,216,235,53,82,208,47,108,219,53,117,182,23,41,173,87,86,228,20,57,66,75,229,145,154,39,205,193,56,80,112,246,75,118,40,124,31,16,71,244,120,131,53,158,130,142,87,23,49,164,75,12,40,20,240,36,123,123,14,232,64,61,252,26,121,253,86,28,194,251,87,84,81,163,208,170,55,93,19,117,45,127,21,145,129,129,245,101,96,35,97,194,197,242,218,26,138,220,232,170,52,216,215,244,23,86,228,48,97,240,84,171,86,198,41,8,63,158,174,84,74,75,81,164,13,97,5,63,190,171,63,9,106,100,7,13,142,5,47,141,203,83,103,217,252,81,167,126,249,83,16,4,72,80,94,115,113,120,103,172,76,112,190,222,226,126,225,69,181,218,75,106,79,191,175,114,69,216,32,203,11,101,151,91,107,44,20,105,44,141,231,39,117,121,234,179,55,150,218,131,194,61,249,95,108,234,70,66,52,185,61,219,160,33,185,109,249,131,58,175,23,94,226,224,13,10,68,146,8,88,35,204,214,237,23,70,240,39,109,143,244,112,200,41,53,74,237,248,104,60,205,69,76,46,235,213,206,197,6,253,142,169,9,210,62,37,60,140,121,149,115,106,31,72,149,207,211,2,235,85,34,206,249,163,209,105,121,213,205,56,70,122,169,201,183,148,130,110,126,245,11,206,197,162,134,104,59,79,94,90,251,224,151,91,69,196,143,80,61,224,75,21,248,6,244,7,220,238,139,41,92,165,246,15,108,144,124,0,177,121,87,226,35,62,111,227,193,97,49,255,42,15,58,219,124,6,120,124,115,180,94,218,60,247,232,216,83,205,167,206,164,213,231,90,98,15,103,106,191,81,126,48,252,82,249,125,174,77,245,173,246,147,214,212,195,233,190,9,15,120,77,124,172,114,198,222,23,95,228,93,235,219,7,1,129,137,0,242,81,144,93,225,210,249,145,214,254,135,36,141,240,247,255,70,251,88,77,111,225,141,190,93,64,35,29,73,254,198,133,31,53,109,104,240,63,46,1,229,14,230,21,94,155,90,31,128,208,37,183,167,101,105,181,24,180,163,196,103,50,217,174,60,56,218,63,54,67,221,198,53,37,84,240,118,229,193,126,101,169,45,35,79,168,165,159,192,13,10,126,71,86,117,81,236,171,215,56,2,128,150,22,190,218,90,235,191,53,218,159,210,206,156,72,59,102,1,41,252,118,23,189,199,137,6,13,10,182,37,239,56,9,244,52,172,193,197,245,183,6,254,106,216,173,59,171,56,199,77,238,115,36,67,57,58,61,98,150,214,140,248,1,0,9,9,160,12,218,237,40,202,56,67,86,35,95,133,109,104,161,25,221,241,203,65,111,169,8,194,125,245,218,224,147,171,5,107,40,198,192,65,178,158,229,33,135,158,79,48,56,91,159,141,106,231,63,240,106,9,174,212,243,141,169,132,253,27,16,60,191,137,223,252,186,173,254,26,248,53,183,187,99,127,106,44,225,30,20,229,152,19,251,12,223,201,163,64,234,198,130,208,126,155,128,119,70,193,232,107,181,166,57,32,200,164,76,110,105,200,29,195,181,134,58,84,59,41,124,253,20,87,77,52,32,242,93,239,230,227,134,96,212,21,168,47,29,27,162,221,133,157,0,220,25,193,248,59,6,253,160,68,201,163,196,35,212,55,111,68,13,13,10,194,54,79,78,175,97,36,242,77,42,214,53,2,135,238,190,49,192,41,137,74,101,190,200,156,54,38,55,126,19,22,37,31,211,25,63,204,36,170,113,248,193,148,36,99,19,213,101,67,0,142,46,227,225,236,90,61,135,187,167,112,250,231,127,113,180,89,255,75,111,242,59,215,170,229,226,114,31,221,196,52,167,20,33,110,251,235,230,239,107,178,222,232,133,61,23,15,255,196,100,185,23,20,121,105,239,131,25,62,67,31,84,89,27,78,235,26,176,174,66,149,170,159,44,62,148,107,59,213,121,136,87,8,31,14,242,241,181,168,126,31,38,46,2,22,4,24,215,24,237,33,90,103,123,65,239,163,137,45,128,137,187,57,148,173,99,214,60,67,39,112,148,21,151,1,82,131,89,39,122,49,239,230,22,141,27,125,245,72,66,255,156,231,248,149,189,165,138,149,237,89,195,41,247,59,4,91,174,250,27,188,173,185,57,195,225,196,146,217,152,164,61,71,188,37,96,22,125,26,150,161,221,1,115,184,175,240,27,162,85,131,132,57,43,154,126,215,55,237,205,243,49,225,201,194,221,155,35,155,233,230,233,48,95,133,53,123,48,8,72,173,225,242,15,82,244,70,31,252,42,184,180,66,226,29,149,179,8,152,235,56,149,22,247,49,76,156,251,63,156,45,202,161,33,51,181,182,1,209,242,31,160,107,103,46,235,142,187,71,206,119,194,230,77,93,111,140,212,240,126,147,197,74,223,118,207,152,185,234,111,189,27,148,106,129,50,74,48,95,230,108,206,28,167,94,156,12,211,251,48,229,173,140,143,192,12,35,16,194,217,13,10,216,36,200,95,231,181,200,138,197,66,104,225,153,98,182,46,217,32,39,192,49,234,194,169,122,242,112,194,39,208,243,132,175,114,87,179,36,69,80,172,240,11,206,147,15,100,9,177,179,254,167,96,218,245,20,176,117,103,80,156,243,17,30,5,4,196,146,79,164,30,178,190,159,67,129,187,81,27,126,111,229,217,0,62,40,107,105,223,73,194,213,197,67,200,51,191,200,247,191,183,180,219,193,56,9,78,196,84,174,63,62,172,176,118,54,153,216,252,176,28,224,0,111,253,3,235,129,78,187,194,156,176,92,248,156,92,108,188,157,161,19,185,72,99,132,92,54,99,121,71,154,187,230,151,152,62,79,20,70,62,228,43,32,106,231,183,174,176,247,156,252,145,189,118,2,55,109,138,112,226,163,155,204,87,100,220,235,163,208,72,183,234,6,32,128,243,23,6,238,242,242,24,223,151,15,18,60,142,19,177,254,39,98,232,52,188,150,21,86,191,153,13,10,68,237,152,73,79,128,44,78,75,139,64,15,209,53,127,113,173,171,233,47,9,17,6,158,252,188,19,6,155,229,23,24,176,189,72,136,86,62,62,61,125,201,243,65,95,247,22,65,11,192,110,37,235,143,107,88,93,242,16,154,226,216,217,169,156,105,201,113,221,13,10,192,170,49,242,127,208,18,141,236,66,217,199,100,154,233,74,73,113,196,204,0,102,6,166,147,193,203,200,202,97,92,49,43,112,213,223,220,120,138,145,185,174,150,95,97,15,234,206,153,130,177,170,43,247,44,66,63,6,30,251,97,255,71,235,88,72,0,105,161,188,1,66,138,41,247,43,63,47,213,139,186,13,10,226,87,103,95,20,99,171,255,55,174,205,105,24,32,2,212,54,52,97,86,122,71,111,50,157,16,56,180,17,45,49,75,117,77,149,103,21,96,255,91,170,102,254,68,4,171,187,181,253,151,6,177,35,106,68,71,208,226,32,14,69,104,76,99,147,117,161,14,204,55,0,141,94,2,119,61,139,63,5,207,134,236,138,119,157,38,74,52,25,238,166,3,19,13,10,69,133,57,37,94,69,196,39,112,94,36,46,1,192,68,91,86,117,90,40,89,143,140,213,21,207,218,37,222,72,244,118,120,237,50,239,162,227,190,35,232,135,121,221,5,51,115,226,13,28,255,86,46,120,8,5,168,122,18,195,27,177,217,113,75,146,225,128,174,32,75,153,169,121,143,9,12,129,217,145,213,101,3,153,161,67,178,11,196,56,108,123,154,239,226,51,236,123,212,139,13,220,61,38,201,5,103,104,38,251,53,42,136,233,129,88,32,126,112,45,50,114,106,32,70,42,16,116,208,155,55,130,156,14,220,161,228,153,85,221,19,171,48,69,77,234,178,246,92,126,60,180,181,110,105,96,190,83,214,147,127,126,99,160,128,223,222,254,222,206,160,216,142,214,202,138,184,4,102,227,244,101,85,189,98,143,252,104,197,94,97,233,214,215,137,102,48,180,234,64,138,170,99,241,202,8,65,73,121,220,50,161,153,179,67,174,153,103,178,179,151,220,196,125,227,190,252,12,184,133,193,248,74,172,250,94,103,249,36,237,114,238,23,170,98,164,131,127,109,43,4,121,131,12,31,164,110,172,254,253,73,5,32,161,200,137,54,252,124,185,242,56,103,3,247,18,228,87,89,191,6,180,3,33,226,208,35,174,64,225,46,14,73,6,195,135,216,238,149,79,227,198,53,113,221,158,116,17,12,6,179,165,78,25,56,181,112,53,215,198,86,138,63,189,197,201,103,98,236,92,163,120,57,75,233,135,187,107,80,41,108,74,82,137,127,135,45,254,138,180,211,132,96,104,172,199,87,182,17,159,223,184,214,141,170,35,145,114,85,251,204,196,109,106,214,15,197,206,104,106,161,79,163,141,13,107,156,198,17,227,227,247,232,113,242,196,98,70,49,230,80,110,204,139,121,4,239,190,178,220,241,129,28,135,245,18,251,104,83,141,94,192,223,234,74,244,123,40,203,196,62,43,196,188,204,133,14,233,192,203,27,128,196,153,105,242,119,155,76,246,100,239,199,248,97,191,115,194,115,13,10,194,235,32,100,172,36,15,47,59,134,109,20,227,109,108,189,203,151,3,211,51,157,224,64,68,181,79,216,85,68,165,138,13,41,142,15,187,125,15,163,5,57,212,94,70,108,57,78,40,164,179,241,173,110,22,94,22,254,145,242,74,182,124,159,237,43,112,49,164,240,208,47,168,216,180,227,45,160,195,119,60,146,59,71,232,209,111,78,197,118,39,143,238,20,244,0,118,88,106,164,171,145,129,141,36,69,253,90,93,241,132,252,48,64,37,99,131,45,124,167,73,104,224,245,125,115,152,131,28,193,157,145,144,200,232,101,99,110,92,250,117,122,19,172,99,63,216,183,221,111,26,127,102,62,113,18,144,49,54,247,133,173,215,18,33,194,84,25,132,185,141,60,112,197,69,129,50,242,220,152,136,23,115,191,110,56,251,143,132,231,44,14,3,117,195,183,186,130,48,206,147,121,184,106,86,92,198,3,198,234,1,104,82,74,122,165,81,72,195,243,99,247,126,75,41,133,134,104,254,92,237,150,245,166,78,96,89,83,79,69,72,86,107,233,204,218,67,184,74,116,80,194,110,245,104,219,56,115,105,168,141,58,0,75,233,6,141,116,170,106,140,177,240,215,151,187,1,212,161,13,10,117,59,5,139,6,243,170,187,18,28,114,13,10,172,67,101,57,73,49,85,43,166,43,37,100,191,3,74,161,158,225,72,179,189,225,221,48,206,178,168,184,153,74,90,46,28,219,247,45,214,59,75,166,110,255,56,125,18,234,83,7,113,100,87,16,199,52,161,146,116,180,47,116,210,59,100,58,113,134,61,235,29,91,96,39,120,210,16,201,186,31,174,97,121,126,134,84,46,21,217,74,87,73,241,54,127,119,121,246,220,188,38,211,170,61,170,173,108,161,178,254,140,136,120,184,83,44,205,61,178,61,222,16,44,209,216,96,180,246,162,31,223,140,98,27,200,220,149,234,180,251,188,161,175,42,194,96,28,140,44,188,13,10,205,94,124,119,67,248,71,214,25,52,84,1,36,156,225,173,216,168,53,217,93,113,139,120,154,216,125,120,224,38,223,137,211,83,92,140,103,82,186,181,64,18,182,38,112,162,206,12,141,141,35,1,227,53,112,125,235,183,186,87,34,66,30,147,45,70,237,119,245,63,16,74,155,188,42,230,113,244,245,41,24,236,55,21,171,54,206,130,175,118,14,242,42,250,9,203,255,27,121,175,252,207,181,168,63,49,139,215,194,248,233,30,214,135,9,41,169,195,190,2,130,108,181,61,79,106,130,16,234,71,41,1,110,167,165,222,166,73,13,10,46,227,152,51,121,229,43,105,28,4,195,212,199,153,51,18,151,125,102,0,186,97,212,140,20,111,206,201,196,133,252,101,161,91,254,102,199,193,68,220,89,24,253,121,73,236,50,50,33,170,25,13,47,108,99,12,235,189,254,152,190,187,249,246,76,238,119,104,167,97,252,224,255,188,177,115,207,184,170,204,187,201,124,158,100,237,23,238,11,83,35,165,117,225,7,131,247,244,149,129,122,203,106,91,180,145,88,31,241,122,255,85,214,4,244,235,213,50,160,243,46,8,210,31,80,233,205,41,141,82,227,177,1,161,1,119,199,68,169,46,131,177,157,64,19,30,16,117,109,105,211,240,173,13,243,31,1,78,107,152,134,228,250,195,205,156,230,54,160,147,0,114,69,175,64,80,143,74,172,181,248,210,59,85,208,91,186,231,246,132,222,88,93,185,35,83,94,131,200,33,47,63,24,80,9,95,189,65,66,151,148,115,53,203,152,0,168,144,129,58,47,243,7,165,76,74,135,41,109,139,123,12,55,138,20,122,226,164,110,247,181,88,145,157,134,210,41,207,132,79,156,214,13,224,132,5,35,195,227,5,236,202,138,120,93,172,209,213,8,37,148,124,225,176,180,131,201,28,108,102,182,108,114,35,63,52,122,38,203,237,236,195,25,250,118,37,109,147,56,123,237,144,55,103,37,126,82,212,113,14,107,209,50,102,37,215,40,119,80,175,26,243,132,79,90,31,171,77,254,34,179,72,126,96,112,218,110,242,219,178,184,27,118,38,102,130,76,163,211,93,236,203,13,10,15,252,108,7,34,51,35,235,235,105,145,114,77,179,245,49,6,38,204,180,172,224,63,73,237,159,36,85,22,132,193,27,200,224,219,88,69,187,172,245,188,47,7,204,3,53,64,188,202,55,250,106,143,55,65,196,226,155,160,139,241,4,183,181,108,20,166,128,65,36,170,57,129,104,85,113,153,75,231,93,13,75,102,235,240,185,128,37,185,159,242,57,226,164,246,63,110,102,231,188,178,105,40,76,248,250,74,0,206,166,218,161,249,13,10,138,152,136,87,229,101,9,94,181,97,34,44,244,152,114,133,102,233,225,215,191,17,5,19,167,246,133,29,241,27,213,58,233,133,25,176,238,153,99,84,224,154,39,100,175,255,114,130,160,106,173,107,225,141,156,20,54,204,97,199,124,29,154,247,191,17,213,140,61,84,214,114,229,164,34,231,31,67,194,69,211,3,13,28,182,71,111,252,189,114,12,242,25,192,141,196,188,76,191,165,84,11,34,240,98,178,51,241,83,43,51,182,194,62,34,21,156,162,69,124,32,224,160,115,235,231,249,185,121,106,245,32,232,239,186,230,152,187,139,125,178,233,198,85,53,71,78,235,162,87,42,245,173,85,242,74,153,101,26,250,13,119,93,90,34,151,235,147,131,94,192,108,169,247,168,66,244,21,156,0,63,223,237,55,109,118,144,242,5,140,9,112,109,13,10,99,168,117,164,150,148,112,103,236,4,202,41,206,184,181,98,223,79,40,159,103,182,26,161,22,70,178,129,20,17,25,207,2,88,152,90,159,203,45,35,112,79,11,113,33,185,24,199,230,146,131,4,221,143,96,59,166,111,172,130,210,83,216,37,82,103,200,240,1,104,234,93,201,13,10,228,201,116,249,192,73,143,106,233,117,204,51,214,125,140,140,35,229,166,32,244,253,135,253,37,60,124,38,64,19,155,173,173,214,212,222,231,251,244,192,143,160,150,97,166,46,70,79,230,83,82,245,110,120,46,206,240,0,246,107,238,194,212,68,53,9,198,146,131,189,40,114,62,99,69,89,55,216,134,157,68,151,207,217,9,83,244,216,150,199,125,65,58,231,11,110,46,8,31,225,142,90,155,225,251,114,109,72,197,28,47,76,73,118,85,73,25,120,75,213,89,214,241,59,169,255,243,66,80,218,165,203,53,254,118,92,136,0,91,173,39,72,84,116,63,199,156,16,35,60,241,77,235,11,228,225,46,139,14,246,28,205,24,199,235,73,117,33,108,109,243,158,130,166,83,221,19,71,53,180,98,46,30,227,29,238,109,128,68,194,60,24,128,75,160,148,204,108,55,234,28,206,185,37,101,44,9,19,133,41,152,16,138,74,28,107,54,21,119,226,92,12,234,165,115,95,194,97,72,111,176,235,165,45,149,12,119,13,10,4,162,13,49,227,112,201,181,8,1,114,251,150,251,178,3,96,198,43,248,20,40,124,39,214,43,21,76,207,217,174,207,201,251,11,74,219,106,202,208,82,12,212,182,47,16,102,89,199,47,62,172,67,183,17,252,165,119,94,89,234,3,208,47,36,33,249,27,144,170,43,202,204,238,18,169,229,254,50,112,176,30,44,133,142,124,45,15,16,236,57,221,194,245,41,49,144,182,215,11,227,125,173,174,111,75,171,108,36,56,35,34,13,10,204,253,46,40,204,182,89,47,50,86,145,242,210,244,132,156,22,214,115,6,218,141,32,24,180,167,59,234,77,55,59,202,18,150,213,37,165,209,65,37,20,233,5,32,61,184,88,188,61,198,116,183,240,87,241,42,242,153,13,10,254,77,53,208,206,191,130,125,59,99,20,107,65,37,127,95,72,198,51,88,90,105,18,92,229,175,178,54,211,84,148,243,255,239,176,194,81,43,72,6,55,223,3,206,31,85,236,101,57,143,251,22,48,109,22,34,85,136,152,31,65,6,254,251,77,53,105,248,91,146,220,144,136,120,200,205,12,135,75,61,51,156,178,167,123,68,72,65,24,156,124,148,96,90,119,25,199,193,104,157,23,168,138,101,221,126,180,76,35,251,178,116,254,217,90,110,68,103,209,126,143,116,75,146,150,27,45,189,123,199,138,7,60,77,167,21,4,241,232,198,149,107,71,83,239,35,131,196,14,166,14,4,247,248,103,89,185,220,194,156,185,94,21,232,217,17,152,141,84,184,64,139,170,178,217,247,28,48,89,43,221,1,71,46,63,55,15,157,79,51,64,54,157,206,120,235,231,13,10,240,42,106,212,83,137,22,35,156,120,89,160,109,18,249,60,127,77,57,126,145,74,42,239,169,141,198,68,196,27,223,49,29,160,141,29,39,27,226,41,25,231,196,252,212,177,105,116,67,169,159,35,145,164,138,66,90,216,123,254,66,131,137,82,151,129,9,91,101,34,214,228,201,122,92,91,144,161,247,231,24,234,112,192,170,98,39,103,152,240,135,120,176,50,187,72,32,91,145,154,25,132,9,250,144,149,29,59,52,77,9,23,175,23,206,236,80,77,8,38,24,32,38,168,219,187,21,177,5,87,236,125,181,19,99,102,151,155,181,50,77,148,23,104,89,59,117,0,44,96,243,95,178,169,26,54,156,225,189,181,209,138,85,211,42,189,85,165,4,178,224,161,223,97,215,174,142,118,77,13,10,212,34,48,43,175,243,59,118,240,162,106,212,249,134,23,158,136,151,0,80,192,188,114,231,104,112,225,199,22,216,120,0,174,23,203,78,43,96,35,184,220,109,164,42,144,115,104,115,25,106,20,55,163,165,157,216,250,53,142,163,135,120,93,32,57,37,170,195,137,209,150,67,28,11,113,136,198,219,63,62,84,181,222,61,13,10,155,82,19,172,144,161,11,249,28,86,22,148,221,251,128,205,153,183,255,191,37,217,158,222,33,130,93,223,58,45,141,32,200,161,230,188,201,147,20,97,62,27,253,162,124,194,252,166,150,0,9,248,33,210,224,169,134,155,202,44,115,147,177,145,70,9,218,110,90,222,215,26,139,240,135,216,157,184,214,224,8,123,8,84,37,246,87,185,133,173,205,116,147,93,255,45,161,95,95,249,223,166,170,8,86,28,229,219,119,137,168,135,154,190,94,125,4,233,59,122,63,43,206,228,214,81,120,155,32,193,222,13,10,184,169,216,178,95,213,56,241,75,73,228,93,184,103,9,197,251,93,148,63,226,179,230,77,154,110,254,66,85,231,245,61,244,215,130,58,124,166,246,181,206,172,181,146,224,93,231,24,141,138,196,210,38,49,221,157,75,85,211,48,140,87,115,75,57,224,211,187,13,230,57,41,92,135,59,77,71,240,204,242,236,75,105,2,47,137,164,135,107,112,5,141,11,11,249,254,124,207,193,17,246,254,155,93,156,175,232,236,53,139,119,203,200,39,198,246,11,96,21,150,44,128,185,201,191,40,32,250,107,219,214,90,245,222,59,59,171,250,108,94,200,30,205,132,111,174,6,115,176,14,110,84,42,244,4,150,129,215,177,133,172,59,124,201,85,63,252,252,168,55,229,177,126,243,226,38,143,226,211,195,140,64,140,153,116,103,145,30,197,120,82,1,86,22,29,184,163,90,43,101,167,37,25,221,148,183,171,184,231,94,76,132,221,99,199,156,192,86,31,154,43,230,122,239,57,82,16,82,215,74,148,244,71,169,113,117,225,70,212,61,107,109,52,225,164,237,148,69,169,153,105,155,58,31,221,57,191,153,130,55,101,247,131,240,46,113,32,49,36,74,158,216,242,35,28,104,145,148,113,224,203,8,33,53,231,88,189,60,193,87,191,242,192,90,127,102,157,250,234,75,235,203,0,160,158,39,174,149,120,190,40,145,37,228,249,1,97,255,113,64,255,188,94,171,57,13,10,156,68,209,174,37,237,72,116,203,198,216,125,247,50,32,111,21,174,77,199,194,77,24,93,231,142,28,170,171,253,243,106,26,169,166,198,9,56,57,123,239,211,161,14,32,35,114,86,137,129,2,219,70,225,202,120,187,123,106,160,41,56,138,208,116,230,175,14,242,86,232,149,197,26,28,177,71,250,141,142,46,194,190,21,219,111,186,239,203,239,159,125,240,30,172,168,150,46,45,78,90,250,192,54,43,91,139,43,162,153,111,205,111,68,30,37,166,237,183,185,88,101,39,136,245,171,15,50,124,145,226,101,205,28,157,81,193,28,220,207,122,181,130,139,78,152,118,110,22,170,235,65,232,45,50,106,237,226,66,123,222,203,254,252,117,164,13,24,53,67,147,241,228,176,231,91,245,215,124,101,9,37,175,147,255,115,125,157,195,12,247,79,87,0,195,55,102,186,115,28,139,196,143,40,61,233,173,34,126,184,142,39,153,195,72,144,20,248,81,119,198,153,139,167,214,144,135,215,167,25,229,225,184,7,39,48,1,116,16,148,179,52,209,11,28,229,217,26,177,199,57,92,192,208,167,231,89,114,11,26,142,85,58,155,126,186,78,58,44,158,79,211,53,102,113,11,86,159,223,251,115,243,188,86,46,233,131,209,61,160,179,234,219,225,53,22,219,221,206,24,89,209,121,176,94,99,159,221,219,8,0,11,93,195,91,182,140,60,7,155,22,93,109,242,162,161,183,131,243,6,59,165,154,147,250,81,112,238,250,250,41,23,68,89,179,64,52,53,30,3,109,244,175,39,148,50,151,51,47,219,148,160,217,110,8,91,205,26,143,5,136,16,228,228,243,195,83,40,20,18,3,231,136,215,30,104,37,192,128,155,36,109,169,72,37,210,200,254,241,169,149,55,19,161,98,216,33,83,154,125,90,116,177,71,33,140,152,125,102,78,212,182,225,88,104,123,196,15,26,187,228,136,204,173,108,60,147,94,86,192,113,47,239,99,12,254,70,233,178,57,232,241,123,169,226,232,128,207,57,182,17,129,195,182,201,61,102,48,207,229,120,118,199,237,159,48,205,76,177,110,251,142,144,197,95,224,248,81,91,247,68,42,173,117,84,129,92,75,224,246,123,86,123,28,42,46,237,210,211,40,174,20,82,142,33,226,83,193,153,123,169,23,234,155,98,147,241,187,223,60,33,17,178,124,18,244,158,124,30,111,127,252,250,78,9,35,53,99,161,3,37,72,174,177,9,102,68,169,46,166,118,104,228,106,27,56,132,122,182,27,188,71,151,247,76,105,228,200,159,205,36,180,139,189,7,171,44,153,183,54,58,79,249,229,253,31,99,213,151,117,203,105,128,236,79,31,130,162,30,0,135,96,144,167,195,177,234,153,76,242,245,107,120,22,132,185,199,211,176,215,2,28,43,14,153,31,58,156,98,224,38,68,29,102,5,60,202,14,3,124,125,36,82,206,167,42,191,103,188,147,188,242,66,11,78,99,221,56,13,10,174,96,28,249,126,147,236,123,93,171,25,228,200,220,115,125,3,27,122,16,95,49,193,209,9,217,160,174,113,13,172,137,134,85,238,201,28,140,39,104,155,159,108,94,145,98,90,102,5,196,218,249,39,79,114,170,251,27,210,148,152,92,39,131,237,234,29,80,105,160,242,144,43,127,159,4,142,183,202,109,166,24,50,252,221,239,201,119,191,131,9,1,0,85,30,193,65,112,13,106,72,185,174,170,149,16,125,226,91,57,122,18,68,115,13,224,12,121,113,55,9,63,72,187,214,105,121,253,167,205,200,0,211,163,219,65,137,145,239,166,220,196,200,143,161,165,87,211,120,26,62,254,153,65,91,196,35,173,104,238,44,220,58,218,216,30,45,42,9,24,247,135,235,125,70,9,159,134,104,192,36,238,133,49,49,211,114,66,206,129,125,45,73,215,177,101,182,250,29,36,64,67,152,184,132,7,100,39,170,66,50,93,148,178,99,213,78,147,194,242,12,240,225,81,200,98,176,193,173,21,139,183,127,222,96,80,125,14,109,34,20,216,62,145,106,179,132,164,160,169,231,153,195,57,1,80,114,157,57,80,130,2,69,206,9,69,99,206,165,142,120,108,220,120,32,234,177,65,112,82,219,227,187,104,134,239,234,132,57,159,231,73,171,3,159,162,145,160,208,240,110,126,125,29,172,111,85,150,43,62,115,218,237,7,99,172,48,227,219,128,214,52,165,123,213,179,164,68,185,4,155,246,57,51,49,65,40,118,92,202,102,148,16,104,128,206,166,31,76,176,178,192,237,29,98,128,30,63,101,102,92,17,83,93,198,83,31,34,108,35,69,5,139,154,218,39,71,76,32,128,125,194,103,75,176,132,124,11,233,33,34,48,215,173,46,229,226,111,233,247,154,34,82,242,27,44,55,149,23,243,196,183,231,129,53,172,35,116,7,251,212,22,65,86,12,58,215,96,68,48,13,218,97,132,49,39,175,35,49,76,236,128,227,193,175,170,64,162,208,114,33,247,159,35,206,254,131,94,93,17,62,47,87,13,93,189,246,38,16,0,148,185,124,237,125,29,45,162,205,239,186,22,131,9,201,27,0,1,4,170,119,253,27,77,237,92,96,130,63,80,132,250,199,57,2,30,161,43,72,214,51,192,45,234,186,66,129,126,154,64,13,28,196,95,22,91,128,11,195,99,252,72,77,135,197,244,83,87,208,86,236,70,16,7,25,88,45,31,176,149,115,38,226,87,45,142,157,140,5,177,23,120,89,105,119,131,128,174,182,105,167,251,241,129,234,201,57,209,22,119,68,163,138,28,40,215,130,134,231,231,148,149,171,186,141,83,163,47,86,18,187,123,122,49,13,10,157,207,2,19,9,205,200,146,14,103,198,137,248,73,141,28,12,179,120,236,35,113,233,241,239,201,229,118,127,199,86,194,189,149,163,42,216,85,123,63,108,182,133,112,237,56,206,114,46,120,61,48,193,184,115,51,218,201,131,18,35,115,74,186,83,32,7,176,202,235,38,202,165,248,181,29,181,57,82,16,110,190,177,45,120,34,221,52,4,228,195,103,95,206,217,98,139,1,236,111,71,200,195,238,12,161,185,119,65,60,180,196,36,161,119,7,113,244,158,48,68,62,219,217,45,50,242,127,229,140,209,231,37,43,168,158,46,159,47,160,29,228,251,84,160,97,60,24,135,108,141,9,213,219,157,134,146,129,159,178,249,204,90,85,188,243,50,183,91,221,6,247,112,27,176,32,168,249,56,164,100,103,49,118,0,144,240,254,249,53,139,235,247,165,8,174,140,33,67,46,153,183,249,155,88,249,95,198,227,207,183,53,112,23,153,158,194,200,239,129,246,220,255,191,48,171,190,66,225,157,124,180,62,182,64,54,187,215,82,200,39,77,206,61,182,59,239,240,17,20,84,189,38,43,197,144,26,178,51,69,103,150,242,171,141,45,235,41,47,7,182,7,180,73,243,33,68,167,134,229,207,144,15,212,3,105,98,186,46,94,11,57,94,41,43,138,9,109,94,212,183,164,29,103,122,147,187,119,224,139,57,186,119,164,109,70,83,104,222,78,190,248,158,151,92,129,252,190,255,216,13,10,193,231,1,164,22,229,102,86,42,220,137,207,105,140,97,184,173,186,122,141,58,176,124,146,229,120,158,75,39,205,199,210,232,165,240,190,247,152,105,15,15,154,69,49,38,29,95,220,37,231,146,165,91,162,183,46,192,9,150,180,0,111,59,118,108,107,137,150,15,196,195,217,231,247,243,167,125,219,234,54,229,19,223,141,87,111,236,139,71,3,28,47,144,20,191,187,74,189,145,212,102,170,137,252,82,30,78,97,205,174,112,58,25,160,2,31,51,204,49,155,183,54,52,36,59,28,164,141,56,3,208,163,176,90,130,11,85,250,121,128,23,191,15,221,19,69,11,252,178,214,139,153,155,146,83,74,175,12,20,40,14,26,84,244,107,93,208,121,221,174,201,119,129,242,134,171,120,153,161,2,74,70,3,3,85,5,115,215,164,180,125,252,130,40,187,30,18,168,134,227,49,219,198,52,7,193,75,171,154,255,129,203,37,204,200,39,77,56,215,57,33,243,168,213,167,243,175,56,147,101,122,103,165,58,42,60,48,24,95,137,186,153,42,58,63,168,19,90,176,117,235,200,184,207,52,37,206,72,245,66,103,254,91,157,26,129,84,21,119,154,146,140,138,127,127,198,115,61,180,90,241,59,164,87,98,177,12,232,209,179,54,143,175,212,187,48,31,149,41,105,82,76,102,111,17,176,0,144,209,184,253,165,170,188,39,140,56,217,244,28,97,98,38,172,70,116,144,121,239,86,103,250,191,31,96,68,153,106,9,88,244,20,234,189,220,139,169,80,119,11,220,156,182,37,9,217,11,13,33,110,20,62,81,248,191,7,197,202,25,176,11,142,92,70,49,86,115,240,209,17,192,103,5,156,135,97,173,219,133,54,221,47,47,101,129,174,95,195,218,242,62,211,104,96,113,67,178,158,88,201,184,102,86,18,53,61,89,187,21,82,239,29,223,17,165,80,139,194,27,109,236,27,203,213,174,248,103,166,69,249,128,181,154,152,250,188,201,96,72,142,91,36,3,249,132,43,9,33,28,225,105,25,124,14,129,196,62,219,83,145,129,87,161,247,112,181,243,229,63,59,143,185,138,223,99,123,148,27,238,180,197,150,0,77,241,186,50,165,17,183,154,253,168,32,140,83,192,72,5,29,123,129,56,145,252,106,118,144,72,2,203,142,96,232,135,113,45,169,224,185,15,86,234,34,210,245,153,52,73,76,224,84,52,67,136,84,5,24,13,134,151,226,47,212,80,134,245,21,253,109,47,254,135,54,46,247,167,229,12,193,122,196,56,201,131,74,133,201,244,130,226,23,95,192,22,72,234,105,211,113,118,160,104,2,156,207,82,161,179,148,126,74,150,219,67,214,170,240,114,139,235,194,3,179,185,104,101,39,89,5,114,194,228,94,11,234,51,34,81,71,87,248,115,161,177,138,245,177,15,203,156,175,23,167,69,16,221,98,222,40,86,33,20,12,204,155,160,226,217,37,204,53,38,25,239,165,95,28,200,126,71,152,104,38,144,214,238,96,134,1,49,213,38,153,174,72,85,91,168,86,184,78,83,112,61,0,156,210,16,71,58,254,205,63,26,143,119,101,218,248,138,61,18,214,184,162,127,219,184,209,198,219,117,216,107,88,139,27,103,194,76,137,107,42,35,157,101,97,57,191,194,154,79,255,138,29,8,35,116,119,119,85,167,123,71,177,28,154,177,77,173,37,51,71,127,212,230,154,251,35,198,252,103,126,62,60,163,169,244,160,125,81,137,94,58,76,202,87,103,155,71,140,231,22,142,8,110,162,248,36,217,43,139,152,126,76,87,248,196,34,97,123,226,156,29,205,208,237,141,194,29,156,198,243,79,214,212,204,250,222,62,59,191,180,12,231,45,174,176,180,75,4,162,238,31,117,161,74,160,70,37,180,241,219,232,97,189,69,125,23,79,203,0,115,250,50,39,70,161,156,191,27,72,16,204,114,66,6,126,68,213,209,80,67,111,145,58,100,175,237,71,5,54,35,153,140,110,176,85,194,88,171,22,73,149,250,165,23,128,138,19,241,116,213,158,191,146,59,125,178,0,122,58,76,237,157,109,207,78,88,133,147,8,109,15,107,38,21,97,230,223,250,207,97,114,145,60,142,19,150,146,11,98,241,224,128,192,85,3,135,35,132,193,243,100,86,51,141,99,248,77,37,237,188,77,185,136,159,191,60,181,89,239,226,196,219,205,107,52,229,209,13,10,181,145,170,152,191,85,155,243,135,184,170,57,171,216,58,13,208,173,172,23,229,14,88,167,74,187,247,252,104,177,113,68,193,165,103,30,150,249,198,59,36,200,119,168,124,161,148,59,217,249,112,45,135,234,60,250,100,24,206,81,240,93,157,12,198,95,185,13,10,28,187,76,22,131,134,172,232,99,174,201,70,81,169,167,197,86,243,98,11,117,13,10,108,146,70,83,174,185,117,123,148,50,185,155,78,159,94,120,151,241,133,114,105,118,213,206,52,255,181,250,182,19,193,126,44,211,48,108,29,218,212,83,49,168,121,243,82,20,23,87,19,171,206,169,248,117,78,224,36,48,117,49,5,3,106,27,207,234,236,112,182,24,156,213,70,211,60,12,141,110,148,89,150,122,14,87,71,14,70,193,34,116,232,21,158,173,48,131,244,63,98,136,62,233,177,151,221,89,197,12,168,131,40,27,180,15,120,131,159,72,190,53,50,102,13,244,169,215,242,93,39,2,228,123,228,224,222,27,154,254,116,95,221,151,213,34,217,66,122,224,42,42,114,241,127,120,37,62,62,57,180,202,57,107,37,82,189,193,136,154,228,178,250,106,83,184,51,43,153,82,111,141,12,170,136,174,211,40,138,189,57,243,81,180,34,253,40,105,230,102,236,83,111,35,57,165,213,32,223,130,133,203,185,119,144,91,111,101,239,89,106,124,87,217,106,236,59,119,80,251,91,230,87,136,27,44,208,199,177,20,197,157,96,254,114,74,190,155,242,129,242,110,171,241,3,80,16,163,187,1,140,241,233,198,51,4,130,151,251,86,183,1,106,211,238,81,15,208,57,237,72,69,226,197,22,186,180,116,111,249,226,197,252,220,250,179,55,103,27,238,114,191,123,209,149,105,26,101,121,5,91,25,103,18,95,200,196,206,86,95,220,17,111,128,71,255,131,42,17,45,220,66,80,245,200,195,70,4,102,201,249,230,21,25,34,51,193,155,33,37,167,48,119,116,69,201,158,112,88,116,34,70,122,177,244,186,234,162,61,223,244,13,10,148,16,148,92,111,203,103,168,98,223,149,230,102,3,249,69,107,87,157,79,194,140,171,253,223,206,109,75,121,22,46,7,11,123,230,82,110,53,80,254,76,210,32,70,92,21,52,90,89,155,147,182,74,61,239,246,139,110,255,156,172,232,124,208,140,45,11,139,61,149,140,99,178,19,20,62,52,154,239,97,196,157,231,78,171,73,175,160,226,212,218,90,232,169,228,54,191,155,31,140,234,90,163,113,99,143,76,185,221,215,50,253,142,167,245,141,69,216,248,248,43,246,202,55,76,233,234,163,147,193,142,28,244,173,93,56,114,49,24,240,137,254,212,19,195,71,71,123,226,4,49,47,68,141,130,26,91,5,161,182,239,182,74,154,78,178,52,240,179,180,119,133,123,96,48,223,0,138,155,234,195,76,113,161,5,137,70,23,26,233,170,223,2,175,74,179,87,134,140,73,206,131,120,200,88,29,231,183,126,81,171,44,72,240,49,181,113,124,141,69,156,15,195,164,219,198,227,95,126,145,96,120,190,76,72,218,190,44,176,0,16,124,59,132,99,181,107,60,230,102,239,137,75,6,21,32,209,136,61,228,118,171,21,50,65,73,4,194,118,32,81,70,224,59,15,71,123,157,109,114,35,138,22,166,27,67,67,206,215,83,127,234,251,237,46,101,83,120,9,116,219,168,42,16,69,166,204,247,13,238,219,148,173,198,68,117,227,226,213,231,227,151,2,62,44,145,118,26,42,146,255,1,158,173,131,244,99,213,236,141,201,219,213,230,6,225,249,147,31,118,65,24,194,35,99,75,212,224,79,156,28,58,124,26,101,67,123,15,185,239,30,126,235,243,64,202,181,19,227,78,187,170,13,144,26,227,239,127,164,239,204,163,12,53,13,10,91,71,93,33,119,117,128,252,169,36,180,72,178,104,200,122,47,108,46,202,1,158,195,254,248,5,219,47,5,176,187,198,107,174,125,159,70,140,25,50,158,187,80,5,63,116,246,116,4,21,175,228,131,119,200,52,85,144,32,151,29,13,10,220,108,223,84,244,52,188,163,17,95,2,14,145,124,21,96,149,243,144,241,144,86,186,55,160,1,153,88,187,183,187,135,116,129,38,148,229,69,87,240,180,170,69,154,251,187,169,247,66,123,181,123,253,80,235,133,221,84,74,240,46,87,77,54,41,5,103,88,163,45,203,198,208,110,223,90,188,6,239,133,135,201,239,144,68,56,250,203,190,24,150,227,38,239,187,118,83,175,2,121,83,188,103,68,228,220,21,173,62,64,204,133,31,80,18,96,30,119,41,114,127,0,232,84,60,74,215,134,203,80,55,58,183,212,123,80,154,26,244,76,46,83,85,46,235,102,154,36,197,171,114,166,90,38,164,4,212,16,130,210,49,166,2,145,65,177,77,109,105,195,209,85,3,163,18,125,203,196,49,69,224,206,36,0,202,145,176,162,214,233,255,249,207,173,173,100,189,183,180,89,196,124,171,141,61,118,236,210,136,43,145,252,247,26,177,96,199,167,171,221,195,64,142,108,83,127,68,249,200,194,133,203,128,163,111,174,215,209,208,159,83,108,123,136,65,204,13,10,16,231,11,131,126,33,195,43,112,57,225,28,135,145,195,18,180,179,27,123,154,29,181,70,37,216,170,59,125,113,248,102,219,206,159,77,131,208,235,111,92,128,208,58,64,36,0,33,64,26,184,81,139,90,231,14,106,70,201,176,254,39,224,175,114,18,53,47,137,106,235,247,13,13,10,207,8,196,187,58,205,232,218,184,58,77,140,51,46,34,140,123,102,231,190,216,0,79,212,140,94,254,127,27,47,214,186,67,233,113,13,10,133,176,178,9,192,136,238,81,114,206,124,141,107,17,27,239,184,126,19,106,132,94,99,164,136,7,246,79,65,96,108,30,213,154,163,37,191,168,46,91,11,45,54,183,11,70,125,220,160,208,128,196,31,13,29,189,97,63,225,62,251,194,5,229,221,209,245,101,2,94,135,200,97,235,237,121,134,199,220,173,48,98,29,7,117,13,10,142,118,150,138,211,200,212,13,10,172,4,130,172,158,178,230,21,246,184,138,19,213,8,127,227,131,185,148,175,60,171,152,239,137,152,240,51,161,224,143,5,34,244,131,124,37,212,163,195,250,14,45,46,7,56,157,105,127,233,101,172,60,103,232,195,58,222,33,140,112,214,36,144,209,160,223,83,221,113,185,169,170,181,157,86,121,223,108,255,95,121,15,221,133,114,199,13,10,237,57,92,116,96,95,197,251,118,248,248,140,7,249,98,183,177,218,55,97,25,209,228,189,101,142,158,73,54,211,242,224,223,49,152,222,241,190,177,38,109,93,205,57,37,200,145,90,249,14,142,198,200,194,236,83,198,38,41,76,95,107,129,237,19,89,91,222,175,85,126,56,77,167,215,59,101,0,177,22,39,120,105,45,68,110,113,58,137,154,9,102,79,111,93,108,222,196,244,93,134,105,127,5,84,135,123,36,132,103,29,12,50,212,112,235,184,173,224,14,95,134,82,205,172,28,7,7,53,239,58,214,191,94,225,74,27,120,105,117,22,198,205,201,52,5,72,39,224,182,134,187,217,185,174,164,157,85,226,88,174,19,170,89,146,202,172,83,125,175,5,144,161,161,177,195,56,13,10,140,211,17,112,189,89,201,60,84,51,204,18,215,44,224,23,3,113,22,65,120,180,114,247,126,13,136,198,60,98,169,18,128,94,15,112,83,162,137,72,94,164,153,20,214,85,122,35,37,139,74,0,116,15,71,102,170,162,135,4,184,179,187,224,45,130,90,109,170,202,168,73,144,252,78,8,146,59,116,100,28,29,188,85,36,149,144,37,143,50,210,200,181,16,231,128,243,16,46,167,71,181,157,100,148,17,127,92,181,38,197,154,226,22,124,206,237,204,153,219,124,197,56,69,149,208,50,85,247,106,116,68,23,48,228,216,22,248,201,8,44,155,154,108,122,247,136,222,21,39,67,71,227,12,193,156,215,177,208,197,107,74,131,69,188,67,188,150,180,66,62,197,145,15,128,178,135,72,91,42,140,145,225,249,106,74,142,128,65,99,5,70,135,128,130,195,146,218,161,30,6,99,131,236,50,117,125,203,199,155,226,130,80,172,205,26,56,31,63,206,169,5,200,98,159,60,109,210,26,78,138,223,75,162,173,83,24,78,193,106,217,25,158,126,66,150,240,68,186,245,45,76,56,90,22,37,149,63,59,191,67,66,254,92,233,50,8,219,201,105,110,240,195,169,236,41,106,152,181,137,32,166,211,38,31,21,46,186,72,158,53,245,9,11,133,186,238,144,135,174,184,110,176,108,40,222,124,5,111,82,231,214,110,13,85,25,119,129,16,120,210,58,24,177,226,186,253,19,55,138,184,237,51,182,227,115,159,148,238,85,199,96,106,53,226,223,230,132,36,144,180,2,236,47,51,231,142,193,98,47,91,48,27,192,13,211,150,245,207,33,60,162,95,199,60,129,238,50,52,157,231,25,253,80,143,87,115,122,175,3,28,235,136,127,113,216,125,27,29,132,245,24,90,30,49,131,182,35,176,81,81,42,58,219,11,56,77,27,13,10,90,133,82,74,242,30,23,52,191,136,33,15,22,160,250,251,39,93,233,31,112,131,76,216,115,151,202,152,18,90,221,17,93,109,170,23,140,40,94,17,20,5,217,50,227,169,17,230,127,145,156,147,81,38,194,230,245,139,252,149,174,64,19,106,233,196,248,243,137,106,70,46,192,206,207,112,231,250,204,73,213,4,93,148,84,0,119,159,182,233,224,20,216,224,80,84,53,238,252,165,211,196,56,53,221,25,70,213,38,127,152,173,140,217,231,132,241,245,214,126,124,34,12,73,92,18,149,41,58,117,85,140,13,193,177,22,138,20,212,78,207,70,72,54,128,88,141,217,123,77,149,122,175,94,221,48,149,67,198,221,49,32,28,181,4,196,58,135,8,14,55,209,46,173,138,117,217,113,83,122,181,131,115,72,50,100,250,104,225,74,113,46,168,17,219,173,21,142,218,111,8,216,112,164,217,129,92,68,0,134,183,21,113,203,213,8,216,70,29,223,160,146,57,142,179,4,142,34,29,163,62,30,129,57,114,43,140,115,58,148,164,3,214,161,219,62,28,133,233,199,43,69,118,183,60,200,133,54,104,143,142,44,117,215,70,12,225,201,135,62,99,231,50,135,194,156,209,228,189,118,170,121,115,156,77,188,220,163,169,206,122,75,239,109,158,198,14,97,112,204,33,219,196,217,227,193,50,173,44,251,83,125,246,96,225,106,0,121,190,84,22,196,44,34,48,4,41,131,190,165,57,229,224,213,35,83,3,13,112,70,140,85,157,215,14,102,157,138,54,135,53,86,245,70,147,2,17,60,75,132,234,190,22,107,101,184,188,220,167,115,65,12,39,86,235,39,128,23,51,65,81,137,30,17,94,62,86,115,155,211,225,79,201,217,39,195,128,184,93,18,194,120,91,28,66,41,116,244,141,145,87,30,13,224,0,201,34,147,255,236,88,43,207,147,62,126,83,49,77,223,33,25,121,101,37,136,209,162,179,57,2,247,227,128,13,10,229,61,204,111,241,13,120,6,163,149,117,248,236,123,123,245,48,39,83,0,149,190,92,221,6,154,204,140,240,22,177,254,171,193,7,133,127,242,85,85,143,186,101,30,179,0,82,132,71,32,164,9,63,225,247,196,182,3,11,122,169,212,229,177,246,95,70,27,58,36,11,207,66,11,33,132,248,148,155,44,233,184,125,70,85,186,139,46,23,226,201,149,19,212,85,70,232,195,118,124,93,110,119,123,88,62,72,196,146,209,90,134,202,3,54,84,92,83,8,148,80,228,137,146,32,77,133,142,143,150,137,128,249,199,155,221,55,61,55,249,212,255,6,171,13,10,208,243,47,230,73,74,79,192,162,150,23,212,96,141,194,26,131,230,139,126,227,201,167,3,75,208,93,131,207,194,255,237,31,86,28,149,44,77,50,141,124,212,201,34,116,143,108,234,21,92,195,28,110,70,218,119,16,191,221,135,16,52,66,229,145,74,254,74,145,178,104,45,244,108,138,32,143,195,51,109,125,21,93,61,112,1,77,239,6,170,186,78,218,172,31,232,235,53,141,251,33,211,232,204,82,146,243,212,75,25,176,218,21,184,110,53,128,69,136,245,243,160,31,237,142,109,55,34,222,239,145,26,178,213,78,232,182,197,44,97,249,249,139,52,33,22,249,128,212,107,198,138,163,36,138,68,96,97,144,186,148,165,87,132,173,144,132,112,81,138,233,152,86,35,100,131,120,45,112,197,127,138,79,130,8,87,27,165,219,90,171,23,61,7,107,231,202,19,196,9,204,69,100,99,212,4,243,94,60,230,169,154,187,7,34,166,118,58,191,52,175,91,168,234,98,134,180,160,150,242,21,21,236,29,159,198,228,171,31,107,58,210,154,156,251,51,3,42,115,176,159,81,178,69,95,30,139,155,2,155,103,26,25,147,66,99,209,17,101,131,171,211,39,82,202,157,39,54,132,203,108,70,244,178,16,122,207,154,140,118,100,184,211,219,140,120,11,0,32,75,102,210,31,95,198,205,71,250,132,47,77,129,249,4,174,36,80,49,150,162,14,206,91,250,167,23,25,147,109,13,10,116,72,27,11,59,88,133,150,143,50,151,147,115,196,48,242,183,249,153,60,235,114,170,254,6,81,2,87,145,37,26,40,130,244,177,67,60,224,166,209,116,122,163,20,200,179,91,121,46,228,40,208,98,90,57,199,60,104,74,162,219,116,77,254,65,8,195,13,187,193,14,16,134,101,52,65,15,73,23,11,144,125,113,206,142,170,194,151,214,15,188,72,24,255,66,34,148,173,199,220,109,123,108,59,241,223,120,89,87,74,22,55,50,49,60,223,129,247,23,230,141,221,227,161,55,244,79,145,3,52,13,112,140,129,139,33,164,5,157,232,244,36,215,127,141,48,41,118,42,165,220,52,107,205,221,2,226,139,52,200,182,213,204,39,245,95,237,132,230,204,58,175,239,8,127,76,33,180,223,247,173,98,139,23,43,5,101,91,64,82,106,109,155,203,31,19,29,144,111,66,90,171,77,37,95,193,149,216,209,172,32,38,209,29,116,42,124,82,133,62,11,230,111,121,214,185,118,224,31,197,211,134,120,138,58,202,127,217,169,52,74,165,102,231,150,203,100,65,78,86,177,133,228,185,111,215,151,69,139,177,213,90,244,39,114,169,216,247,154,200,55,179,56,106,191,16,72,182,11,89,84,202,122,173,80,185,41,159,56,88,88,74,243,145,85,187,176,27,240,140,16,187,86,103,228,225,69,127,20,86,52,103,172,11,104,241,8,142,141,248,102,221,18,163,212,151,253,209,51,61,56,85,126,123,163,147,147,11,243,94,201,39,212,76,142,95,18,36,79,177,82,13,187,84,212,60,106,163,179,205,37,113,171,13,10,39,94,241,129,253,190,44,222,227,247,6,181,74,50,114,113,65,131,31,136,9,177,109,234,91,27,6,133,191,139,173,168,3,104,121,96,225,213,133,216,143,160,9,109,19,88,173,166,187,73,164,88,20,239,70,7,54,239,231,239,46,66,160,169,255,61,176,181,176,54,223,19,126,193,207,209,4,40,88,239,41,99,40,209,148,23,243,69,119,49,94,157,182,193,132,75,6,237,192,159,237,79,223,59,175,77,185,153,231,156,233,224,82,182,18,38,37,226,173,90,29,175,57,76,164,59,27,23,107,243,192,46,210,101,47,198,252,76,84,141,88,70,64,189,94,28,78,240,68,123,238,110,210,114,220,134,14,85,254,26,43,115,5,102,134,239,198,100,3,86,29,208,93,156,73,73,227,31,158,58,121,193,12,9,90,215,181,24,225,238,188,1,54,250,177,100,173,101,5,36,106,206,17,33,238,8,115,248,195,140,168,70,142,97,103,141,252,149,28,141,38,180,200,36,147,54,60,47,136,231,42,242,32,149,107,52,172,109,170,226,140,154,222,194,16,32,241,149,149,83,156,235,57,231,219,119,52,107,160,243,56,212,146,133,200,246,214,142,77,51,219,140,96,253,19,25,62,77,114,126,148,151,2,235,229,57,240,125,133,208,61,24,133,208,31,159,104,244,120,187,191,101,37,118,28,145,53,85,97,53,129,46,4,248,81,136,78,97,60,44,198,92,65,99,122,160,253,237,238,110,156,44,20,21,186,212,43,122,198,196,40,248,164,129,246,154,209,130,8,201,182,71,177,97,238,57,114,214,95,188,91,108,18,182,116,119,123,56,53,177,70,195,79,186,63,18,93,191,36,145,1,199,59,29,244,161,239,134,236,159,157,225,194,158,121,48,178,27,23,155,105,29,252,189,129,13,10,151,241,222,24,192,166,216,159,127,173,140,18,250,155,240,227,199,55,57,35,98,71,89,239,82,151,9,85,200,60,177,89,13,124,88,165,65,237,97,127,191,65,150,231,253,50,6,57,253,156,123,109,66,208,197,113,118,109,24,44,216,35,66,55,127,12,108,82,238,118,0,200,177,139,146,83,150,194,33,26,67,39,182,34,56,250,181,41,224,206,210,2,143,188,65,164,178,112,44,92,41,105,19,60,41,44,241,218,249,89,76,241,145,54,18,182,251,239,127,155,41,82,93,156,62,202,83,130,123,191,218,182,81,243,235,78,29,28,94,207,162,217,217,7,97,223,249,89,80,251,74,246,253,46,246,225,146,3,69,74,7,177,55,56,236,138,97,109,37,228,66,119,17,12,44,128,127,104,72,21,139,58,177,72,197,51,216,118,164,111,66,52,188,252,5,69,215,100,142,112,205,173,53,131,0,124,252,223,106,12,15,88,201,139,38,73,37,134,150,94,127,70,191,217,48,66,113,1,21,210,146,241,90,87,222,145,9,12,156,110,22,184,70,88,105,232,150,4,81,170,104,181,8,51,43,162,33,119,84,140,93,21,188,162,103,223,9,233,24,124,131,138,163,150,172,111,121,238,203,176,240,71,58,107,64,12,152,132,218,174,106,113,168,178,245,87,122,191,88,138,157,49,56,156,182,119,4,214,15,255,41,79,112,234,40,120,145,48,188,171,195,137,230,205,183,82,0,252,193,156,129,203,140,45,224,59,153,77,139,27,85,48,131,202,69,237,183,182,212,99,102,30,79,184,157,40,181,18,31,129,72,232,51,180,173,59,228,135,18,190,253,238,93,186,112,247,164,246,67,48,97,140,191,137,80,229,126,208,103,233,64,22,74,32,16,81,245,33,49,4,61,104,11,228,127,126,92,19,18,166,38,89,4,188,81,238,161,157,219,150,64,232,32,74,240,210,185,143,21,2,29,117,80,29,233,229,144,240,100,249,44,21,93,194,160,246,170,243,174,233,30,32,188,5,185,65,52,68,54,208,31,170,245,196,126,163,164,132,191,182,120,83,226,192,95,43,101,38,47,163,6,168,177,18,139,30,185,89,81,179,118,94,138,159,211,6,28,74,50,12,110,54,233,181,61,48,249,110,164,107,186,117,171,134,120,212,12,59,88,216,0,191,236,32,124,208,41,251,12,48,202,156,145,114,243,48,247,99,27,148,197,211,65,9,127,117,89,35,156,9,165,150,45,57,69,80,101,70,12,96,44,117,35,205,174,105,124,251,26,126,96,108,152,117,116,93,131,7,123,62,29,215,204,3,9,121,117,110,193,59,86,17,166,44,22,211,238,50,115,252,47,59,27,71,39,252,115,45,118,111,130,243,164,138,126,249,22,12,168,34,147,185,181,16,143,237,136,226,62,254,114,48,216,247,190,169,6,221,43,31,222,119,160,187,173,149,144,13,180,161,79,118,56,221,23,127,145,231,133,107,144,106,87,223,136,34,25,174,18,199,161,153,80,237,219,167,207,206,17,212,161,213,12,137,87,100,240,0,26,110,197,84,32,187,191,253,151,212,251,134,67,165,84,255,181,116,97,65,228,54,153,28,229,7,43,107,166,32,39,242,209,137,17,11,238,247,131,87,36,41,227,253,166,134,68,188,163,39,239,233,203,187,232,249,94,251,54,136,148,244,25,151,65,218,9,179,175,141,255,115,81,73,178,162,165,255,32,203,80,150,150,77,229,134,247,70,120,138,57,224,86,116,48,23,251,244,164,78,66,17,85,240,0,181,61,154,227,116,13,164,5,149,59,39,11,21,80,101,41,176,147,84,213,255,41,147,178,113,202,130,235,223,61,203,161,152,215,47,81,156,5,226,226,32,174,99,194,34,107,28,40,224,162,55,86,47,207,92,54,85,107,217,57,71,51,150,114,164,24,82,141,253,249,96,25,251,40,34,174,77,133,67,11,98,87,171,96,223,69,209,13,98,43,214,55,160,188,138,147,13,10,154,81,47,46,20,183,28,110,186,238,230,155,77,164,63,142,234,50,116,176,9,96,32,159,38,121,159,122,237,86,119,131,191,108,180,7,206,128,245,87,218,19,18,110,26,61,254,228,225,234,9,120,91,248,231,240,198,150,66,167,144,12,217,205,35,80,176,255,36,23,253,140,35,172,144,105,75,190,235,135,171,191,225,65,37,103,75,8,252,34,177,90,123,101,80,233,206,145,251,5,71,222,49,38,68,50,79,132,191,4,96,141,251,30,155,252,219,101,69,185,71,138,132,37,145,115,50,67,205,164,105,86,112,75,134,230,78,54,189,47,165,92,57,197,189,73,146,104,164,115,167,87,123,161,143,252,210,149,178,25,117,137,129,172,145,166,56,163,246,228,246,191,41,41,63,45,6,26,212,180,71,202,245,18,91,17,29,19,140,172,199,120,176,145,100,96,66,63,56,179,48,211,161,187,90,95,119,120,105,28,79,28,221,67,218,60,17,77,119,209,126,170,53,189,125,19,219,16,12,181,99,119,125,212,74,158,5,190,9,233,50,52,139,217,91,112,12,26,5,150,124,142,242,90,34,205,139,96,86,116,127,201,39,83,89,88,27,72,34,128,237,163,20,29,45,152,67,186,195,204,97,112,102,110,151,173,106,18,66,31,170,11,78,39,226,97,212,86,38,187,41,54,109,55,25,84,45,221,37,67,231,3,44,153,228,246,232,226,140,86,231,223,25,96,204,33,187,225,172,238,126,63,2,199,80,173,38,236,117,89,1,130,231,235,104,128,97,239,161,189,65,123,151,62,155,217,157,144,109,66,211,34,181,86,234,186,38,138,70,33,190,139,228,27,23,139,49,124,210,122,254,100,170,167,152,54,36,122,185,3,97,173,227,173,128,55,163,46,100,148,200,57,118,77,120,7,1,113,176,148,79,202,63,26,140,238,167,160,131,122,13,209,234,209,11,204,90,136,239,41,246,218,178,143,155,122,114,16,162,79,53,21,200,157,164,65,100,123,244,25,199,144,135,233,182,22,83,168,131,137,211,189,208,66,211,70,66,218,123,155,36,245,75,221,245,81,213,245,184,192,182,99,195,159,14,241,219,202,145,93,53,104,137,244,56,252,14,87,221,126,154,75,133,217,113,139,50,232,124,32,106,114,21,33,21,134,249,18,98,193,224,49,8,174,159,154,115,25,2,207,164,123,198,51,212,119,14,217,255,222,138,255,39,182,57,7,132,86,251,132,199,194,220,178,114,192,92,244,224,93,131,135,96,55,242,177,66,123,12,87,29,158,240,74,13,182,166,151,137,119,173,0,96,217,210,138,69,234,104,61,241,83,54,208,122,120,58,181,122,244,95,191,147,254,237,163,156,41,77,18,127,49,216,77,19,38,233,3,66,252,180,45,162,232,245,201,89,207,62,148,201,171,162,253,158,127,131,143,146,125,21,180,111,115,0,38,124,234,64,173,139,205,36,28,96,136,64,115,85,75,208,139,193,69,16,103,151,155,202,169,46,38,208,13,34,237,117,13,18,166,226,9,82,133,253,5,157,172,82,193,128,60,163,250,43,223,201,154,158,202,230,133,159,74,143,98,179,93,109,98,60,60,117,168,167,146,206,84,133,151,155,240,111,70,156,120,88,159,219,74,55,141,5,50,238,109,133,158,221,117,96,32,231,245,29,170,9,133,57,71,42,228,55,187,94,165,124,252,113,109,174,115,64,43,37,237,200,181,127,32,200,212,177,14,146,196,236,69,27,125,158,3,74,186,175,103,113,83,237,60,201,240,68,176,244,115,172,206,7,189,34,122,98,237,208,49,175,154,50,132,255,153,198,204,170,254,175,226,228,78,35,240,226,58,40,85,28,101,153,80,35,101,243,222,46,34,127,118,47,232,18,235,143,58,200,4,217,91,254,149,206,127,41,31,8,25,86,19,41,110,107,88,186,108,144,177,188,171,163,32,70,94,150,158,145,27,201,163,33,151,231,76,238,44,41,253,118,41,15,185,200,202,29,144,52,168,83,154,181,200,132,55,198,114,4,131,74,55,42,25,185,222,241,66,144,3,83,239,195,167,118,54,73,74,183,76,37,216,251,100,67,151,145,179,110,67,123,137,104,46,97,124,15,163,54,158,235,219,147,60,188,115,70,109,165,44,87,39,125,142,147,50,118,186,47,241,228,126,238,253,111,82,196,163,192,71,104,133,69,121,68,184,106,163,150,244,201,19,9,39,144,115,80,131,44,3,152,117,17,60,236,114,161,12,247,9,182,143,58,240,48,245,144,178,74,155,187,109,65,75,114,59,226,139,0,58,67,88,70,91,190,46,164,11,250,124,14,76,179,86,51,48,159,194,191,194,177,215,215,115,70,42,207,90,232,13,186,197,149,65,14,132,85,134,201,173,186,5,103,239,202,142,179,170,13,10,190,5,120,45,229,110,251,36,152,130,238,41,171,9,126,87,30,178,254,158,82,222,224,37,63,194,111,37,50,109,252,42,69,81,87,177,95,47,11,200,149,238,181,145,175,34,52,111,81,215,31,24,204,190,88,35,184,196,244,197,150,194,131,254,225,119,12,137,41,83,206,225,64,121,119,23,64,229,215,230,214,45,100,154,60,148,220,82,113,151,137,112,2,138,41,2,187,76,190,147,111,14,66,127,22,140,111,234,89,116,101,122,93,8,40,187,122,160,53,203,186,202,3,6,1,37,33,18,38,245,198,39,174,87,149,9,34,122,235,233,125,120,112,196,180,51,155,25,159,37,19,214,27,68,195,148,13,10,143,166,184,116,149,146,93,102,130,13,10,118,119,96,209,123,8,74,254,20,226,93,72,21,7,148,239,204,85,63,220,86,255,39,49,47,143,104,47,95,227,129,93,109,45,126,82,227,108,107,254,25,147,5,138,9,172,76,12,98,23,165,222,209,138,6,69,79,150,85,65,249,29,87,238,52,214,172,79,46,225,89,234,198,108,186,148,30,51,139,220,255,144,54,134,27,40,103,208,151,223,224,211,43,216,133,73,191,147,46,5,194,238,216,194,173,32,2,225,59,3,83,139,243,178,13,10,229,131,179,81,169,221,134,145,99,169,36,197,243,170,46,4,133,169,231,193,254,47,90,199,99,0,202,240,186,79,23,39,117,153,217,122,74,172,154,233,33,131,66,53,214,128,167,235,243,69,31,143,244,130,165,124,219,136,213,249,204,73,194,217,95,187,134,40,245,185,231,4,5,185,60,190,218,23,9,61,241,252,243,216,8,2,92,226,187,191,159,54,239,7,145,2,192,104,60,165,150,63,121,78,197,161,118,244,80,86,110,88,218,203,187,183,242,86,242,107,106,12,39,77,70,205,115,163,60,95,99,18,17,168,170,15,113,234,35,169,245,100,128,219,170,206,232,176,218,180,230,94,65,233,76,116,96,240,90,117,246,102,188,232,96,204,26,237,88,16,71,194,172,61,84,67,237,129,197,203,0,31,93,113,243,162,63,139,65,213,79,138,217,185,138,198,141,49,166,79,171,124,248,28,51,229,191,12,62,128,27,113,105,80,249,49,78,82,190,4,85,213,42,233,109,42,17,174,59,11,26,125,12,248,63,168,82,24,88,165,211,195,56,73,142,110,157,216,234,23,167,33,243,54,208,122,73,217,155,161,252,232,97,184,175,226,89,159,238,147,114,47,181,101,231,171,45,225,200,135,217,88,57,96,96,57,66,223,55,119,53,196,34,215,32,27,109,186,227,213,48,210,35,82,248,89,113,172,72,162,13,178,207,55,81,104,190,92,94,152,164,79,41,151,165,146,197,187,129,191,243,9,63,161,21,189,82,159,111,208,143,42,193,89,141,2,252,176,13,10,237,62,84,208,52,108,139,16,140,85,75,232,168,172,181,253,132,47,201,155,124,142,56,163,59,122,73,2,84,197,80,42,185,121,123,112,156,106,110,12,113,153,198,19,168,105,45,38,168,94,210,61,144,69,180,151,33,190,186,17,245,235,188,143,215,224,38,236,28,144,238,21,177,62,242,87,187,197,64,32,165,233,127,60,251,18,254,217,96,144,141,166,207,237,245,112,65,67,206,7,131,151,57,188,32,84,214,130,92,49,199,80,59,80,177,252,22,188,131,217,153,108,208,149,136,6,181,254,164,85,190,100,6,102,198,245,32,80,112,112,60,108,25,87,72,181,229,230,111,1,134,2,82,110,54,243,136,0,211,163,138,34,194,131,25,247,146,22,58,144,143,113,114,189,161,223,240,194,239,29,49,150,157,63,20,177,244,144,80,225,9,113,226,134,84,49,149,54,96,28,45,110,22,27,161,78,59,175,217,122,62,69,210,64,231,246,99,216,3,74,240,229,240,51,195,1,14,222,130,39,177,3,144,245,90,13,10,199,22,224,65,175,61,250,224,87,147,156,2,246,140,119,192,230,178,159,81,133,121,253,2,31,126,100,98,111,37,126,174,231,13,10,110,46,51,59,218,216,248,60,100,107,246,93,98,146,151,202,166,222,77,163,123,45,7,224,111,100,85,107,145,3,77,182,183,22,82,27,119,37,17,195,175,213,47,8,202,122,134,159,57,205,245,81,89,154,234,53,234,161,113,234,119,176,83,85,132,134,217,178,230,80,255,151,208,13,10,151,225,253,107,178,48,40,94,57,100,31,46,96,132,84,90,202,163,222,131,195,115,82,230,91,219,35,227,204,246,80,146,67,32,13,133,122,210,77,71,192,33,37,223,12,143,232,97,195,185,24,46,98,72,246,243,79,115,1,95,64,151,253,50,134,83,169,22,215,24,94,71,184,63,251,126,79,71,134,196,179,193,99,99,170,59,249,71,98,64,167,141,19,130,248,238,53,17,156,67,205,127,28,143,225,116,44,30,31,164,71,213,221,33,245,174,179,230,122,142,158,135,178,110,223,244,33,234,98,111,231,143,114,91,183,133,113,207,243,53,172,42,73,20,80,137,13,10,184,222,253,244,180,136,228,62,23,185,74,57,81,31,15,17,0,85,91,43,120,59,196,28,193,86,240,49,194,23,240,236,101,223,169,202,31,179,92,102,37,53,166,7,203,227,116,166,129,38,176,119,166,17,56,19,59,156,120,174,85,137,143,75,165,55,129,89,170,93,214,9,87,113,116,142,14,203,199,144,58,30,116,213,48,213,26,83,254,56,102,109,31,9,153,192,162,132,81,219,167,122,28,45,60,52,113,166,39,4,203,13,154,197,26,253,163,12,103,9,171,65,121,39,150,89,115,204,128,108,67,147,27,46,109,195,125,119,13,174,148,32,59,248,138,250,142,234,203,19,32,116,205,17,91,85,154,243,11,194,143,114,193,205,76,188,208,4,0,120,96,255,213,135,229,221,13,10,60,55,150,135,206,26,237,50,195,44,184,224,15,172,205,159,147,226,141,202,149,116,94,231,177,4,2,20,200,65,77,242,232,77,45,196,216,34,213,220,69,145,133,240,92,155,96,154,167,113,77,228,8,238,110,234,247,61,59,73,182,157,184,61,142,96,216,201,144,68,132,6,223,234,40,197,112,39,125,228,139,29,179,21,46,59,86,19,77,60,67,101,161,193,19,29,27,82,16,9,122,225,241,35,27,253,21,191,114,138,226,121,223,180,114,149,76,191,133,228,32,128,47,44,174,85,12,208,157,146,178,125,94,92,231,218,112,40,235,154,211,11,163,183,175,194,210,41,158,64,134,188,52,135,31,105,105,11,160,226,228,209,255,236,125,61,137,180,188,178,66,13,10,57,127,208,19,80,249,81,178,97,5,92,172,107,154,29,140,127,216,145,150,3,60,12,103,53,60,189,146,35,150,186,37,184,9,246,242,125,19,162,42,196,177,211,58,109,66,64,128,12,29,34,22,84,70,55,121,181,32,126,82,225,193,210,238,89,32,44,47,123,227,255,206,20,38,150,150,49,42,127,247,199,174,4,88,155,139,18,208,114,188,236,142,220,173,206,67,155,32,119,100,5,13,10,15,90,120,82,211,73,31,111,194,254,29,255,128,186,146,13,24,191,104,235,212,43,30,50,64,51,66,93,39,138,203,81,101,83,122,237,98,160,247,32,104,132,144,195,208,99,74,69,153,101,25,119,229,234,9,99,232,219,191,227,97,86,119,12,53,116,222,223,195,146,137,73,241,98,64,219,202,198,43,47,106,161,56,72,203,173,230,69,100,181,212,31,243,138,142,205,200,78,197,6,100,76,30,223,53,210,79,16,14,186,106,81,228,45,94,95,46,174,132,28,91,96,240,235,18,154,107,137,37,32,27,46,196,23,127,64,220,109,116,133,126,12,236,59,155,192,11,5,60,21,247,186,31,128,20,99,222,212,32,35,77,73,143,185,115,247,234,142,228,61,141,221,50,162,64,253,73,174,21,169,190,50,50,175,169,176,72,166,124,29,132,114,103,188,225,129,126,62,18,102,169,211,251,149,204,109,55,127,9,161,127,78,182,140,66,147,130,12,30,182,47,139,86,39,145,59,116,246,16,151,146,132,0,96,201,212,214,242,84,147,251,234,95,177,210,103,191,240,67,187,211,145,251,37,86,72,36,90,33,218,56,180,170,188,34,112,216,11,216,126,229,31,200,45,139,37,239,45,12,222,96,116,82,202,171,149,111,163,17,242,227,72,75,149,54,157,63,247,248,123,139,86,38,21,85,220,213,221,75,145,51,205,116,34,194,190,169,12,232,142,59,113,204,91,163,128,227,113,83,57,29,159,120,52,22,254,251,111,3,75,204,122,226,162,198,43,36,35,80,43,112,89,208,208,241,76,48,5,12,7,0,231,126,175,20,186,214,90,184,124,33,172,203,201,202,227,240,193,58,163,36,227,131,54,124,90,69,227,125,80,133,59,151,182,108,137,229,43,103,19,124,102,45,51,47,8,225,84,98,21,74,138,7,208,31,237,28,65,134,102,149,142,204,82,214,63,41,253,180,209,126,99,48,152,103,84,71,250,150,247,53,46,244,155,106,28,136,208,178,19,202,43,178,14,26,106,135,201,218,67,202,102,154,44,124,154,3,238,232,195,251,102,141,237,25,204,146,220,246,120,147,136,47,1,13,10,193,21,159,67,246,251,23,193,154,23,238,160,37,70,179,118,147,202,223,163,173,245,174,236,210,224,247,74,167,113,190,186,131,212,24,193,140,36,225,166,8,200,49,119,5,233,164,56,207,200,44,192,240,143,93,6,80,249,196,150,51,110,21,232,238,60,0,64,252,42,122,128,73,219,73,91,155,225,209,182,252,29,196,119,100,114,108,133,26,108,140,46,240,197,78,233,111,90,243,71,64,20,220,253,183,31,161,155,12,246,24,247,64,14,135,41,28,90,1,142,6,59,206,238,93,188,107,90,13,10,60,156,152,166,108,96,254,91,134,90,28,82,187,194,220,76,187,51,40,134,81,94,16,123,77,158,49,16,124,211,110,225,201,61,232,1,249,150,66,11,83,14,255,225,225,47,166,144,85,228,206,139,57,217,195,126,151,120,57,38,122,23,178,235,24,208,178,179,60,72,158,215,32,189,136,219,131,192,255,88,0,36,33,239,172,23,46,220,132,124,23,36,46,59,133,92,212,232,206,82,108,50,109,73,43,67,218,237,25,80,153,118,251,67,118,254,97,2,144,222,12,129,176,31,1,224,185,173,133,86,114,94,48,213,57,231,87,251,173,167,130,133,163,254,130,225,81,99,224,249,151,210,57,112,198,239,67,241,15,133,92,112,101,155,26,65,248,83,219,13,10,245,35,108,236,207,103,113,144,195,197,240,77,5,87,217,0,133,216,175,192,37,114,106,122,34,27,162,74,20,104,68,73,134,244,152,209,23,149,236,246,193,137,65,238,44,147,41,13,10,129,252,94,12,182,59,171,193,173,46,235,251,216,252,250,76,252,26,250,124,21,202,223,249,243,25,48,2,69,232,108,43,185,61,24,182,38,89,214,37,168,66,106,235,154,244,238,204,191,190,240,7,224,154,103,27,102,134,60,30,220,92,180,115,229,43,120,117,83,22,96,57,236,172,118,125,158,248,245,113,165,140,80,168,120,49,163,222,137,160,160,61,71,124,75,31,29,35,203,199,163,216,241,87,39,139,201,146,86,0,189,188,51,93,21,74,82,162,122,224,129,101,107,65,4,221,13,136,210,82,94,238,236,136,120,1,179,12,167,28,154,253,240,2,138,205,153,194,26,244,161,8,14,23,120,198,193,31,23,186,52,12,71,190,183,244,125,103,108,50,74,97,150,75,7,25,90,235,27,124,163,47,56,19,212,1,242,85,119,105,249,116,77,168,80,167,5,89,206,18,11,109,193,220,126,217,241,245,186,219,106,121,63,116,6,169,110,156,75,86,89,90,203,26,188,244,198,107,20,142,3,106,251,127,12,96,139,138,102,82,244,98,183,1,234,20,167,30,249,84,191,249,82,74,19,199,68,22,81,96,91,96,128,208,1,142,2,0,209,23,245,175,57,56,240,94,240,122,94,118,162,252,229,208,210,210,33,20,153,173,197,69,99,169,102,220,79,183,122,2,91,215,168,82,163,200,69,115,190,245,21,164,89,119,109,4,114,104,35,180,164,20,97,28,128,250,87,82,56,145,36,67,135,159,184,175,66,18,32,67,83,186,44,48,222,63,37,102,192,126,95,208,106,140,196,81,5,125,252,155,217,173,172,42,224,206,152,101,240,206,106,235,145,122,191,96,70,125,189,83,244,78,54,99,157,155,161,20,3,54,188,140,247,239,197,82,18,43,42,249,232,188,233,30,176,253,143,166,50,28,101,26,100,69,244,29,66,4,155,219,143,234,105,173,106,159,87,207,246,84,73,12,249,101,231,95,1,45,237,243,208,18,40,174,69,26,121,21,221,185,149,154,152,85,185,151,72,103,244,245,188,183,147,161,2,64,96,51,155,7,35,164,147,110,140,216,222,244,74,215,6,133,85,7,7,84,172,250,17,98,180,230,64,182,164,209,179,168,200,75,81,35,4,97,253,176,167,132,137,113,254,199,212,169,49,15,112,97,245,235,95,193,100,209,214,107,13,10,205,211,96,238,104,229,97,122,58,165,200,193,30,26,97,38,226,238,21,206,236,107,97,207,2,158,18,22,58,211,59,32,13,10,226,29,4,4,220,9,174,233,223,190,221,204,13,48,56,169,129,198,70,207,185,2,213,227,87,83,20,240,177,115,122,62,148,36,233,247,94,130,109,24,170,191,144,252,222,37,24,106,104,79,193,145,224,191,252,231,216,60,219,205,158,208,5,174,133,14,160,1,90,49,195,143,221,197,89,56,78,232,142,182,216,53,105,61,169,165,70,6,246,180,97,4,74,50,142,167,27,4,152,198,72,60,144,245,118,139,118,175,8,3,231,113,5,62,82,242,140,72,143,17,64,54,77,156,142,138,126,4,42,25,87,106,44,119,73,248,36,17,19,78,175,1,90,147,77,3,70,183,6,60,151,138,214,126,171,69,252,213,29,65,112,209,5,16,74,111,184,211,241,100,48,58,33,235,35,78,232,158,252,165,238,65,80,168,208,129,67,112,221,130,100,141,105,190,39,152,11,61,225,67,37,71,15,132,45,251,67,26,38,108,23,107,126,11,220,95,62,185,14,144,148,79,237,63,8,142,251,227,199,82,177,28,154,35,237,155,216,58,184,78,223,154,132,51,0,69,81,112,62,12,78,103,36,111,222,56,170,122,19,72,121,159,211,117,251,248,228,83,1,69,216,11,167,129,3,88,251,163,18,55,33,57,152,139,218,217,108,118,245,13,50,166,86,191,185,54,194,0,192,206,51,255,222,141,151,120,241,118,80,137,202,20,121,225,169,244,218,119,115,20,170,201,189,216,254,56,108,128,32,69,124,108,1,19,38,157,163,221,64,228,239,149,92,72,248,95,45,186,0,213,140,252,50,55,157,32,215,99,73,116,141,201,175,220,207,131,156,38,199,158,133,58,12,21,18,208,164,13,10,161,93,6,70,187,153,165,189,205,201,57,198,98,240,237,7,136,95,47,196,215,21,251,221,146,193,243,169,109,15,192,65,7,197,80,160,23,24,215,16,77,20,254,88,132,48,243,131,187,154,245,162,177,128,53,93,83,245,251,96,33,95,138,162,63,159,112,48,254,215,2,24,52,68,251,56,48,4,201,250,205,112,126,193,23,54,251,218,194,149,228,141,216,124,247,214,84,75,210,42,129,151,13,10,95,65,246,27,52,77,224,240,30,92,26,116,45,5,98,18,16,239,77,80,76,179,73,119,95,77,12,89,186,203,36,27,219,41,172,75,67,13,224,205,97,115,254,23,27,74,105,123,6,36,225,104,208,41,41,40,170,220,120,151,196,212,13,10,105,132,59,15,48,27,41,98,241,126,18,128,32,13,109,8,102,210,74,91,7,147,65,247,98,175,164,2,125,63,199,238,46,28,57,5,190,147,81,171,196,138,124,1,20,163,65,164,237,93,151,203,203,190,98,9,160,228,178,140,221,69,161,24,141,7,15,106,93,131,109,113,30,5,205,114,72,153,6,249,195,184,214,207,182,179,49,24,232,22,23,239,94,59,88,135,11,83,78,88,214,53,30,49,211,150,40,177,232,156,242,110,243,122,95,201,101,91,33,97,62,146,210,29,209,203,51,250,178,187,58,152,137,192,211,19,187,116,194,2,27,164,94,89,85,20,205,110,226,61,75,64,245,204,85,91,27,4,180,136,247,181,1,111,8,99,110,99,61,130,225,145,152,211,168,220,249,224,208,103,12,162,241,96,39,5,184,52,233,176,57,226,146,117,240,97,53,181,117,179,95,220,99,204,112,217,72,248,198,62,82,5,89,7,143,91,246,139,44,67,13,10,225,82,17,66,234,153,138,66,211,99,222,100,58,31,161,47,235,179,129,171,187,90,252,29,203,226,135,99,36,101,203,207,50,108,162,15,58,105,116,22,65,167,196,254,137,80,117,162,155,125,115,114,216,208,251,124,132,153,40,39,206,3,216,167,137,4,235,45,89,134,181,189,72,111,11,189,49,89,160,219,195,179,72,134,20,34,26,133,3,92,205,13,10,254,227,9,86,194,100,24,227,228,154,113,111,170,70,214,142,50,57,143,206,26,235,2,3,12,12,182,142,238,107,27,40,174,220,84,95,94,149,8,41,134,211,63,236,108,141,168,116,196,104,78,151,195,215,210,43,71,100,146,174,20,189,170,242,87,146,13,236,252,159,168,17,84,179,128,149,194,95,163,196,150,205,127,161,19,46,235,12,116,165,108,99,209,131,169,64,214,107,53,103,169,116,119,123,106,102,201,16,4,13,10,82,229,54,80,164,17,50,225,231,236,5,168,43,102,216,171,186,184,78,45,212,78,162,227,192,215,179,125,134,225,115,214,94,73,244,161,246,159,241,117,160,109,99,3,142,176,179,132,122,14,236,99,118,121,5,195,139,240,76,16,33,143,81,9,153,47,52,123,36,23,155,110,177,73,1,75,182,232,230,187,219,16,58,42,37,255,149,181,242,180,79,139,182,85,241,76,128,51,27,205,177,87,15,119,208,244,248,110,14,79,47,11,250,239,108,54,236,25,59,24,108,248,159,102,86,84,105,125,155,203,212,230,166,194,122,204,62,231,185,178,117,186,156,189,165,232,229,144,23,64,150,37,184,199,186,104,175,46,171,99,204,41,196,206,18,16,170,147,9,163,100,95,73,27,69,92,37,193,44,218,107,98,175,71,46,143,196,159,69,15,207,224,205,243,38,29,199,147,97,183,131,192,48,115,122,63,211,100,68,64,81,211,137,87,85,234,9,146,31,5,86,141,155,112,72,248,197,184,13,237,121,101,50,227,102,48,198,27,152,223,170,96,114,215,160,246,131,24,182,64,103,20,113,211,75,8,255,221,172,237,213,95,189,49,13,10,13,175,12,27,46,218,160,14,36,201,41,134,175,11,20,186,39,104,41,181,36,209,65,246,252,207,255,124,172,170,45,252,207,44,26,187,148,102,43,207,87,33,250,255,202,163,175,120,110,194,60,225,54,229,201,243,82,253,29,29,48,147,193,138,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen019024l=39176; +} +#endif //_PDF_READER_RESOURCE_FONT_n019024l_H diff --git a/PdfReader/Resources/Fontn021003l.h b/PdfReader/Resources/Fontn021003l.h new file mode 100644 index 0000000000..bd9b2ce577 --- /dev/null +++ b/PdfReader/Resources/Fontn021003l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n021003l_H +#define _PDF_READER_RESOURCE_FONT_n021003l_H +namespace PdfReader +{ +static const unsigned char c_arrn021003l[]={128,1,109,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,82,111,109,78,111,57,76,45,82,101,103,117,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,32,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,82,111,109,78,111,57,76,45,82,101,103,117,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,54,56,32,45,50,56,49,32,49,48,48,48,32,57,50,52,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,51,49,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,53,171,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,109,179,220,152,52,60,156,210,208,155,164,49,34,37,246,125,198,155,158,191,103,136,246,235,41,110,151,43,102,16,93,15,155,114,167,105,90,177,79,32,202,117,68,246,223,110,72,49,73,173,147,13,81,158,68,198,50,51,246,110,139,19,213,24,20,97,206,86,192,104,192,21,223,22,215,82,245,174,204,61,68,27,5,147,187,213,82,244,196,16,71,26,174,130,49,191,226,254,223,97,158,93,76,198,21,189,36,54,172,165,7,250,167,236,189,151,170,194,84,124,68,127,8,164,255,178,142,18,197,182,227,213,241,16,39,123,57,182,197,63,3,26,59,32,52,52,89,59,85,70,157,26,159,15,130,55,56,202,132,145,195,240,53,203,116,81,113,119,44,70,0,190,206,134,69,197,121,124,34,152,199,142,120,55,214,249,177,139,168,109,3,112,40,168,25,112,154,3,161,173,228,111,212,201,18,216,106,207,196,49,181,156,39,7,246,99,237,204,25,75,144,75,240,172,223,145,182,247,104,250,249,243,103,179,136,66,175,159,205,53,108,197,182,247,221,183,64,93,6,47,39,69,59,152,158,233,186,22,104,5,236,231,7,50,13,10,165,4,41,20,76,29,151,119,154,180,98,113,32,85,167,67,42,61,73,190,97,175,155,109,232,169,200,32,192,231,13,67,229,29,9,184,55,32,201,210,6,222,225,55,132,205,12,178,21,18,247,224,65,138,144,113,151,94,91,105,165,90,151,85,86,118,232,35,233,64,245,165,230,230,123,64,5,65,153,165,248,174,151,65,210,213,82,113,83,249,205,192,142,185,217,92,77,221,251,9,72,5,25,83,243,156,109,45,129,29,63,253,194,95,120,110,7,43,42,138,31,72,48,249,229,86,215,138,46,92,12,113,56,224,124,213,169,194,200,167,166,30,33,217,40,31,166,230,213,212,209,157,235,129,58,228,77,74,73,112,158,15,197,99,38,36,97,5,51,39,90,81,233,59,80,119,126,18,217,53,157,187,62,12,60,143,62,51,212,225,77,3,173,136,82,65,200,148,211,100,7,249,36,255,193,1,18,184,225,15,74,95,28,71,135,214,107,68,65,237,131,98,24,192,68,109,32,74,137,188,21,124,74,108,56,69,24,229,48,171,218,174,140,41,211,151,56,222,75,174,90,198,141,98,52,3,22,35,165,115,122,215,86,127,81,108,243,97,188,66,219,20,16,194,129,42,15,127,17,237,129,121,127,245,159,37,208,172,27,183,19,137,132,144,97,18,247,71,149,107,184,101,238,181,93,212,244,139,174,117,255,119,136,81,223,191,247,30,155,59,229,145,126,219,116,231,174,108,51,66,82,232,221,94,31,2,135,190,211,251,220,32,249,91,120,145,30,37,40,13,240,184,200,103,179,87,155,156,219,25,14,72,2,215,20,60,33,100,176,192,43,183,169,177,40,35,24,247,246,26,98,136,163,59,131,222,165,58,157,27,196,202,130,147,228,217,147,161,210,117,252,134,207,38,23,233,33,56,41,181,247,163,1,53,209,202,170,199,17,152,75,192,12,61,32,155,5,232,251,34,153,59,57,35,210,60,21,191,72,104,150,254,59,57,138,229,96,214,203,17,181,82,190,26,90,192,248,97,228,41,169,217,191,132,220,93,224,186,167,93,73,173,180,65,171,202,81,227,248,123,182,22,57,87,71,139,73,18,234,128,117,63,8,35,182,14,159,190,211,85,45,180,137,103,242,244,123,22,6,29,221,238,199,140,24,110,25,78,98,236,89,209,141,184,200,79,86,240,3,81,75,42,14,247,176,234,155,19,69,222,53,176,155,66,172,158,87,173,242,238,205,15,104,177,0,185,100,122,164,21,70,1,145,202,50,85,98,13,10,53,189,54,4,238,91,123,156,93,114,200,29,166,166,163,124,27,3,174,76,166,5,94,24,8,20,171,227,133,37,17,40,160,166,236,213,121,220,177,190,163,17,35,217,142,27,60,101,123,17,8,13,10,28,19,150,45,167,228,116,15,139,188,145,55,27,49,231,13,10,112,220,145,46,215,226,230,19,140,14,61,117,126,141,189,224,168,140,26,184,23,65,250,112,188,142,220,121,92,140,168,72,13,75,239,123,27,91,217,109,167,32,139,78,111,241,82,132,134,180,174,239,15,199,210,26,175,164,130,180,172,211,20,52,115,33,139,110,81,248,46,190,153,9,245,206,109,80,175,239,110,5,105,214,7,210,249,98,114,155,69,195,224,199,38,12,162,11,176,76,193,170,196,241,8,208,38,213,249,176,38,41,151,218,38,250,227,124,128,65,116,81,18,30,64,180,17,21,17,167,252,83,76,128,127,65,184,3,78,15,150,241,22,210,211,250,105,248,100,166,48,118,228,252,163,215,9,199,209,108,218,118,223,216,64,162,4,199,251,185,111,159,32,33,163,31,255,187,230,22,103,80,173,196,155,31,95,96,13,33,141,124,208,86,119,114,167,187,236,12,108,73,162,149,178,204,166,76,14,62,131,24,124,105,211,97,38,184,188,142,48,236,105,6,43,203,98,234,193,130,177,255,197,113,120,221,59,22,137,223,213,126,246,69,94,76,189,76,238,208,98,153,158,63,239,227,148,108,168,55,176,135,184,64,195,230,82,69,234,196,122,135,13,18,12,68,176,232,78,23,232,133,208,253,167,72,61,162,251,208,205,185,25,44,187,164,105,49,90,111,50,94,109,203,19,101,156,223,156,248,217,163,230,242,46,61,58,59,207,182,93,177,161,6,70,208,138,162,28,96,143,171,206,103,86,202,30,216,236,235,97,59,61,94,118,7,13,57,72,54,187,169,7,9,83,177,7,64,187,179,24,36,249,62,100,169,144,253,138,250,152,158,184,186,12,67,82,22,86,51,231,155,201,155,7,117,121,248,127,125,84,126,172,196,244,182,156,138,252,36,12,35,179,1,130,37,12,219,228,97,254,196,194,230,125,57,127,178,141,141,78,192,120,185,124,67,231,29,169,3,234,14,128,200,123,101,227,80,78,239,132,149,20,138,0,40,47,162,70,247,214,32,33,224,93,38,36,176,11,159,127,98,113,43,138,89,14,204,211,248,31,153,218,94,110,49,140,163,219,235,35,60,240,63,219,13,10,248,28,131,185,9,124,14,142,209,167,162,173,120,215,225,186,243,253,242,17,213,254,131,241,14,66,110,19,226,236,243,253,220,20,156,85,97,207,121,61,13,10,212,88,143,235,52,209,84,5,3,125,146,18,67,163,174,179,49,204,216,197,169,73,251,181,41,241,87,83,54,239,102,252,242,64,41,30,227,189,210,150,66,176,97,37,92,147,236,217,74,158,79,111,160,154,230,156,20,150,168,190,165,244,140,96,227,112,117,70,102,178,248,101,119,22,141,134,185,141,229,103,251,55,232,247,11,238,244,62,204,37,187,12,78,231,12,171,124,44,40,88,160,214,57,22,29,13,10,203,249,124,108,197,225,201,103,144,225,225,128,202,250,93,9,177,198,82,7,3,243,253,179,209,168,199,184,41,231,183,38,60,224,116,107,150,239,26,230,253,70,204,32,70,73,155,99,87,148,159,85,13,10,71,149,232,180,233,164,24,70,56,29,201,209,224,147,89,154,176,53,163,217,227,85,222,56,110,42,114,251,0,149,40,243,110,121,211,178,183,104,118,131,33,244,245,151,29,99,112,230,82,51,183,104,214,120,67,46,169,97,49,232,214,213,232,242,129,223,105,48,59,41,208,39,94,16,249,85,57,9,13,10,178,234,191,39,110,204,224,121,128,147,3,22,83,117,20,249,99,176,242,216,32,71,72,231,21,40,70,186,19,36,200,151,36,159,198,149,118,205,43,20,56,145,235,105,238,222,37,160,197,140,159,2,237,43,222,173,196,13,10,8,85,59,40,21,89,56,205,101,47,219,31,89,244,126,163,175,143,191,12,14,216,243,145,141,29,203,146,0,221,97,26,13,74,162,161,178,206,163,100,31,18,252,42,69,81,87,177,201,208,53,220,249,17,185,65,165,0,207,186,159,101,231,109,104,40,236,132,210,117,192,254,103,94,198,227,112,185,79,25,165,197,181,213,57,75,199,217,94,249,38,228,99,15,96,221,197,176,98,118,104,76,45,101,73,80,6,122,189,225,195,122,164,236,145,115,169,203,81,135,238,16,215,225,58,84,132,47,20,122,230,238,74,251,80,184,79,252,131,109,90,91,137,62,170,24,185,138,233,250,116,81,37,245,27,90,203,126,234,170,131,142,17,174,105,232,85,26,182,234,170,13,4,157,152,220,83,221,115,179,160,48,126,30,139,250,51,130,41,201,243,187,86,208,60,218,116,107,165,174,165,242,84,98,180,114,210,195,198,126,113,216,190,43,114,126,14,118,184,181,126,76,40,164,161,119,220,215,211,117,205,116,158,202,232,41,249,159,135,7,105,85,198,162,197,106,26,213,143,219,211,49,201,244,89,37,239,142,181,191,82,112,106,210,96,83,38,33,241,193,177,154,199,203,129,115,2,100,116,105,127,29,182,229,95,46,187,163,245,19,235,111,244,30,65,102,128,172,127,171,181,11,208,188,8,150,246,12,179,4,49,106,148,83,112,207,162,59,23,57,180,133,161,118,19,66,163,159,95,100,52,201,199,157,13,10,16,164,234,163,102,34,210,49,104,147,9,17,97,40,82,132,254,188,121,103,75,79,204,20,182,98,146,111,52,255,97,108,158,72,181,64,128,132,4,119,68,193,78,218,60,240,154,66,164,64,143,192,3,60,238,246,68,237,199,168,15,151,226,129,42,42,50,148,255,48,84,14,154,116,203,121,109,163,149,24,13,10,187,6,110,203,122,252,213,170,227,79,137,132,110,90,223,119,70,90,95,155,210,228,251,45,72,40,240,101,106,75,2,229,98,241,94,99,13,203,0,251,139,84,255,16,218,17,202,192,251,180,180,139,2,220,235,41,209,132,170,154,95,11,0,203,225,33,32,133,105,196,175,156,247,21,19,216,85,205,195,186,167,155,7,101,219,68,36,167,53,61,154,54,106,250,118,204,23,14,166,61,220,249,140,134,238,93,33,219,211,77,129,195,11,186,168,191,202,99,67,151,114,60,96,77,249,162,157,200,43,152,26,194,149,16,126,120,60,105,171,97,47,18,173,186,181,28,206,17,106,76,155,205,11,178,94,20,76,57,215,74,51,85,148,35,236,172,232,203,184,72,104,51,15,125,157,28,171,163,46,105,21,109,40,43,183,189,252,85,52,187,65,166,255,117,83,140,116,94,224,65,241,107,19,16,207,15,217,189,88,48,22,105,154,63,220,51,95,60,127,152,76,118,33,2,23,203,11,98,110,106,112,136,117,153,195,32,252,127,249,194,135,201,204,247,183,67,50,221,222,82,124,202,211,44,177,118,98,96,158,167,251,103,121,243,143,232,114,69,206,44,75,38,6,5,226,98,72,140,174,51,87,193,230,61,157,121,94,132,51,24,19,157,14,65,186,62,120,148,219,65,254,30,55,129,137,155,1,144,205,156,105,68,203,13,52,33,144,164,249,165,169,89,161,79,94,201,227,37,217,52,152,8,175,176,149,223,172,189,241,210,249,125,188,221,29,75,19,132,21,85,64,51,130,246,24,71,163,205,76,220,205,117,116,170,141,227,176,51,225,107,157,206,0,204,156,185,246,118,80,206,122,113,125,127,177,95,124,112,254,134,220,21,230,176,82,88,218,238,183,73,14,116,123,63,64,130,40,31,87,173,79,176,58,146,196,176,184,246,23,3,49,71,160,25,67,145,181,13,85,244,127,154,109,104,109,237,81,163,199,60,219,91,188,168,200,72,150,48,32,165,177,41,69,22,115,77,185,185,29,114,112,26,4,205,232,136,248,137,103,207,130,197,71,206,31,26,234,255,43,53,164,88,26,179,66,107,136,143,211,75,94,217,157,240,1,210,228,132,173,246,72,68,248,13,10,226,87,125,33,28,128,107,246,21,102,0,240,154,22,218,199,62,28,254,215,65,120,230,170,148,170,59,252,123,19,238,115,210,46,175,212,211,39,199,143,87,219,236,128,215,186,45,155,232,96,3,89,195,195,113,208,41,17,241,213,227,252,50,66,7,45,115,214,123,101,132,6,118,182,147,119,83,148,213,158,239,128,107,213,63,66,187,234,172,180,111,170,111,118,141,20,56,106,12,183,55,129,20,189,55,38,243,115,75,211,91,155,77,150,50,185,123,172,113,178,154,174,79,252,131,169,51,223,165,171,170,18,62,158,86,13,79,238,71,114,59,93,56,127,160,238,6,81,248,241,4,182,215,11,144,255,13,10,230,24,187,223,201,180,254,189,11,38,218,59,144,156,105,62,141,50,202,84,67,217,134,84,247,12,138,219,4,253,209,15,165,18,155,244,167,225,213,186,216,153,245,76,54,178,53,41,248,8,236,165,157,251,28,152,199,87,135,167,217,57,50,229,209,21,221,245,140,154,153,149,216,168,236,226,183,55,72,39,174,150,3,107,213,135,47,237,218,120,69,36,224,187,94,192,38,128,216,52,177,128,235,85,151,41,186,251,80,248,231,185,242,97,179,148,173,22,109,120,229,217,23,162,192,181,203,22,127,69,112,1,184,207,99,57,146,221,187,69,234,19,201,156,101,156,15,202,219,54,108,208,40,58,107,187,155,253,241,108,228,152,24,76,226,92,43,182,106,40,125,43,169,42,108,230,189,68,0,134,50,126,19,123,141,230,162,59,65,143,241,105,238,75,135,164,112,11,213,212,14,164,99,206,245,139,5,223,104,243,45,103,158,239,112,232,133,113,172,125,141,233,250,198,212,101,82,56,96,73,213,154,227,169,35,230,44,219,59,152,14,76,61,200,157,120,146,83,86,240,246,239,1,63,105,111,6,187,166,230,237,137,189,80,192,158,28,124,13,181,125,182,205,62,31,29,174,66,148,239,139,66,139,196,173,203,176,48,21,106,250,192,6,75,205,44,143,237,244,96,120,103,89,137,116,148,204,160,51,40,96,77,230,135,15,111,44,43,7,216,146,110,131,14,41,187,94,213,66,11,56,156,151,229,187,92,207,196,68,83,123,227,34,236,179,199,213,137,177,207,118,248,160,189,207,88,62,251,225,255,56,86,44,127,43,173,83,122,91,86,61,54,241,252,169,83,82,52,106,150,210,226,230,207,16,55,148,194,154,239,63,127,134,49,64,187,166,202,149,146,157,242,210,63,235,151,77,111,35,194,20,185,54,195,151,232,250,3,7,114,192,220,247,78,103,197,19,156,83,99,196,135,123,102,152,240,33,2,220,11,39,205,153,172,125,116,140,240,134,149,163,170,63,58,19,136,223,86,248,223,169,244,118,159,156,104,108,85,100,63,228,186,158,161,53,79,62,162,171,61,154,55,129,116,77,238,120,135,84,224,13,240,117,156,74,233,90,48,226,170,4,154,152,11,209,103,34,16,118,207,220,236,145,73,66,177,229,179,139,211,2,134,224,168,179,228,164,160,194,202,188,238,25,226,122,6,109,107,143,146,58,227,75,130,188,252,215,115,141,59,77,60,98,210,203,216,54,118,56,112,40,14,202,9,197,90,128,171,237,12,214,55,32,250,153,24,158,61,48,134,74,74,196,213,218,87,175,162,107,37,134,132,131,59,201,17,152,69,125,52,34,34,123,218,59,240,182,2,53,0,11,218,210,29,18,154,137,61,117,42,242,172,220,19,36,53,48,163,120,234,57,109,151,246,23,105,219,193,192,23,13,10,127,30,175,209,224,184,67,70,11,233,81,140,139,191,192,119,1,241,166,190,19,238,58,116,209,175,26,175,203,32,39,80,237,245,71,241,249,93,241,75,150,193,245,208,63,197,23,157,121,160,233,97,140,57,100,89,54,184,23,152,254,127,128,254,129,167,165,181,62,104,7,96,193,116,33,110,167,62,240,54,38,204,28,250,54,155,86,64,194,61,118,166,157,206,232,56,28,101,147,44,171,243,38,44,139,112,18,107,154,27,183,229,133,150,202,116,201,183,233,28,163,13,160,15,38,159,179,133,134,176,70,232,148,95,95,227,244,150,167,11,20,18,49,213,86,107,28,104,141,245,42,82,169,15,230,41,122,180,115,162,131,164,75,199,201,141,225,106,77,197,241,176,60,218,62,225,77,189,139,114,176,24,133,121,33,9,178,95,216,236,253,107,19,210,115,29,231,6,125,252,238,82,226,192,171,11,93,220,167,150,19,34,249,25,38,54,23,99,184,147,1,95,72,238,103,71,240,1,31,105,81,24,101,115,36,171,160,78,134,244,29,155,203,65,96,172,234,154,166,54,90,28,43,122,24,46,7,242,197,212,129,144,116,125,114,119,118,57,186,36,108,170,40,4,170,60,40,167,24,107,27,249,141,153,230,168,59,254,74,198,248,72,235,42,88,112,29,19,137,174,110,212,116,102,112,172,98,234,44,9,158,33,59,164,123,109,129,40,234,217,138,241,103,105,47,173,91,63,142,68,36,146,231,168,157,45,240,160,13,10,58,17,122,240,134,245,1,94,67,181,165,106,80,47,41,50,158,202,228,114,219,143,150,61,188,137,162,56,49,33,72,43,119,39,31,139,242,74,81,235,44,143,174,245,186,65,209,116,184,90,60,137,220,184,13,10,93,91,203,133,113,151,175,134,55,65,48,224,231,169,186,66,94,8,27,177,207,109,191,135,48,242,164,171,32,174,249,100,46,237,188,8,87,220,79,129,133,4,216,105,49,37,115,65,238,128,67,33,142,119,219,148,38,180,131,217,63,241,194,1,200,177,167,173,226,31,146,241,158,253,91,182,116,65,54,203,173,16,35,117,110,16,193,7,24,233,116,89,189,27,5,197,107,116,28,153,39,128,112,186,203,116,183,7,171,146,167,168,103,153,199,229,179,46,112,60,119,51,19,159,254,247,235,133,198,234,253,31,135,232,40,39,5,160,111,37,8,198,251,207,94,66,122,51,126,66,123,16,196,6,66,30,188,241,92,42,137,149,222,190,88,13,117,245,135,58,111,55,240,120,57,70,199,27,205,129,52,145,161,3,95,53,122,118,253,220,61,12,251,89,218,103,133,143,147,147,175,154,165,230,233,71,252,244,145,116,184,13,181,233,97,103,95,192,173,9,166,65,217,62,227,141,32,234,56,246,8,103,169,193,122,179,227,220,172,127,190,5,66,158,191,33,105,168,9,46,123,12,201,184,36,0,122,122,17,62,225,162,61,141,13,10,98,110,110,97,132,125,2,217,103,159,148,86,205,126,203,28,113,88,158,170,42,236,82,227,164,248,24,199,141,212,114,13,10,62,161,54,248,37,107,125,204,160,170,46,36,53,240,51,46,230,226,183,25,83,130,198,64,253,154,31,21,162,100,134,2,124,4,51,237,182,234,19,70,206,37,134,41,173,60,66,173,65,132,126,60,147,220,191,197,84,102,214,25,3,208,254,109,37,169,26,102,201,212,184,102,108,30,247,59,164,199,252,169,74,57,95,78,164,225,96,205,162,13,10,199,151,140,191,210,125,246,148,61,31,74,9,103,142,46,0,217,33,7,255,55,230,114,177,8,243,207,15,11,191,117,188,163,35,41,190,252,211,46,33,56,150,68,206,91,123,204,19,8,234,85,104,208,115,237,70,198,130,152,201,251,78,88,139,12,12,105,255,0,136,172,85,235,73,42,195,13,157,208,175,20,156,45,122,83,34,6,203,218,66,13,10,58,193,137,202,52,141,164,147,58,19,160,163,141,202,143,153,162,229,141,106,125,46,17,142,184,249,243,194,51,95,85,121,194,70,43,47,135,210,20,151,201,147,198,224,155,221,47,222,76,41,81,81,190,105,165,50,138,47,220,144,88,116,234,84,233,9,45,221,198,82,42,48,110,180,132,64,209,106,128,173,222,222,99,199,228,77,85,170,184,250,134,53,48,165,168,124,68,111,253,163,110,94,221,100,83,197,80,243,250,171,11,182,85,68,226,226,124,134,39,84,40,218,24,248,182,87,243,35,64,252,130,227,162,237,186,129,11,139,81,194,205,0,239,243,129,235,71,127,140,157,141,131,52,57,134,238,153,94,216,104,157,240,90,89,27,16,47,58,174,1,112,22,254,89,203,249,162,65,211,13,12,70,214,159,119,245,237,66,37,85,147,211,73,57,86,14,119,249,171,102,230,12,129,21,210,138,118,170,55,86,103,124,103,158,94,239,248,93,165,217,94,178,220,94,16,160,89,237,174,216,193,69,251,145,237,184,146,205,108,1,162,216,252,121,137,238,120,255,178,179,13,27,199,92,176,218,227,238,111,214,110,19,245,1,153,187,190,34,175,175,82,120,200,44,218,154,37,235,24,59,63,72,214,136,80,22,170,80,133,50,154,58,189,138,38,13,10,200,64,79,152,53,142,8,121,5,24,31,166,214,145,96,188,88,221,149,183,47,111,237,207,133,70,98,94,237,156,229,192,225,154,61,152,250,124,121,65,58,38,47,90,20,121,128,232,202,221,110,1,158,1,109,218,105,149,68,199,183,92,56,25,104,194,102,8,26,88,62,175,147,22,1,36,181,38,16,171,183,87,140,41,192,243,255,131,179,229,37,116,242,188,148,150,4,214,53,192,90,210,173,164,208,23,168,75,12,131,50,192,171,145,195,32,67,220,66,17,250,255,9,9,231,36,123,231,206,126,114,6,193,107,118,180,99,38,187,227,217,122,188,80,153,22,231,58,186,129,132,115,144,224,58,202,122,43,174,33,35,102,138,100,120,210,181,79,18,7,85,157,62,220,36,241,60,155,146,168,139,246,119,227,96,37,184,65,67,94,193,253,34,227,1,221,47,7,8,146,243,214,122,52,247,167,156,43,125,83,8,44,198,59,198,100,22,155,50,239,127,16,48,115,141,119,171,194,219,48,177,178,65,222,80,48,94,106,156,25,185,210,79,221,133,159,184,72,189,122,81,50,41,121,133,118,251,157,157,115,234,150,254,242,130,197,92,173,182,157,250,201,158,97,20,5,162,13,10,246,68,135,21,155,102,55,56,233,24,177,126,20,248,112,46,148,114,90,81,30,191,31,217,153,142,118,66,232,198,252,246,24,32,202,135,17,45,27,95,73,250,160,203,254,133,52,29,249,166,210,154,182,49,56,227,58,160,188,132,6,235,166,233,132,93,1,212,65,84,93,209,236,154,166,41,120,175,211,76,77,141,8,211,153,202,81,118,43,81,250,182,152,66,246,139,236,182,154,173,212,189,60,32,1,122,148,17,191,146,77,224,22,248,180,199,7,95,235,125,206,228,116,160,121,171,41,0,53,11,47,234,118,91,104,229,158,3,191,234,147,120,71,162,16,136,238,37,25,176,155,73,179,168,143,16,187,38,135,26,9,214,236,174,214,243,177,56,39,50,250,174,208,66,117,180,158,225,124,103,77,253,237,78,28,130,152,179,253,33,209,254,71,215,208,1,86,195,40,115,100,85,188,209,50,73,112,73,59,219,95,80,79,105,26,124,172,198,240,247,193,42,56,134,230,37,253,88,130,62,185,28,73,243,8,109,63,147,85,123,221,251,123,176,141,39,245,202,216,229,115,149,7,31,187,138,37,124,149,219,185,148,225,136,142,253,2,224,199,161,44,5,192,48,68,197,72,70,70,50,122,252,166,211,214,136,43,245,232,114,243,244,148,57,139,136,31,80,248,249,158,164,117,232,205,32,38,238,2,129,152,223,215,72,141,150,31,142,128,22,165,107,40,206,95,125,239,54,141,9,36,133,229,151,203,6,169,194,53,0,3,149,221,225,195,203,149,26,249,108,164,71,163,73,207,230,170,211,153,64,87,243,57,169,255,73,204,209,109,145,60,43,1,22,101,21,63,70,235,106,212,58,237,142,72,71,100,106,136,66,123,198,175,97,8,234,128,55,137,17,120,155,174,35,28,137,139,118,72,157,36,158,114,101,124,27,136,80,6,110,151,230,99,253,134,234,112,101,12,132,151,152,117,124,171,67,253,108,151,51,194,173,125,9,222,54,185,198,8,164,119,1,112,69,85,94,66,4,153,126,133,223,166,238,141,27,38,207,12,128,36,226,149,151,73,230,16,208,44,173,33,141,105,48,42,139,74,211,246,136,13,10,85,72,228,17,46,181,80,94,186,2,27,176,11,236,162,35,20,61,116,48,214,82,28,167,60,247,137,120,126,221,28,170,106,100,175,4,81,49,25,76,229,204,212,250,229,4,29,26,122,111,89,220,138,242,89,89,71,82,250,46,57,165,142,166,52,118,64,163,3,79,237,9,189,133,188,82,19,252,118,37,158,37,134,13,10,62,140,69,239,21,29,170,132,195,249,251,149,30,198,54,225,66,247,132,88,87,19,88,144,108,227,80,188,76,132,201,15,176,231,195,102,202,111,81,202,186,175,111,15,150,116,117,58,106,151,49,212,164,147,250,181,191,84,74,198,240,233,253,30,61,99,206,18,205,55,89,145,74,25,207,156,89,11,61,65,250,162,71,202,197,195,183,92,100,11,120,99,46,41,147,99,120,250,214,159,83,197,71,123,190,122,62,192,1,148,207,1,182,180,209,139,231,19,47,2,70,39,197,147,39,62,169,172,19,71,68,7,250,240,243,35,34,114,215,169,193,49,35,106,34,155,30,194,168,47,193,167,194,85,168,1,39,11,17,57,92,153,66,93,90,62,89,166,151,62,136,191,122,215,67,58,83,169,59,80,140,153,15,213,221,20,216,171,251,96,7,245,116,215,24,218,58,175,134,48,25,145,134,234,181,186,195,151,88,122,109,169,237,46,166,99,74,175,202,52,118,103,81,190,131,216,97,57,203,42,45,189,188,229,126,255,197,36,19,56,158,136,246,183,158,186,179,209,212,244,75,43,157,168,100,117,35,47,14,248,47,68,133,89,129,87,98,36,5,210,68,44,213,218,104,249,146,180,116,164,132,69,196,60,77,90,69,248,90,120,126,142,223,132,85,138,234,64,153,92,70,66,14,95,174,218,120,77,32,240,107,164,84,41,110,193,122,143,232,252,18,44,4,148,99,174,129,247,83,16,216,64,121,51,86,140,145,162,126,120,70,43,151,199,121,219,111,9,86,143,209,146,230,25,165,14,37,244,14,200,247,236,142,120,132,159,154,26,27,135,223,192,105,89,207,183,116,177,81,92,124,144,253,4,95,31,132,37,24,84,226,192,106,162,165,159,100,85,193,104,4,53,185,151,133,146,152,44,110,186,138,179,123,92,53,208,117,196,20,224,220,39,96,60,135,82,99,65,128,244,134,198,21,13,10,47,153,8,39,57,122,15,127,176,121,124,187,185,226,55,125,192,91,83,110,20,4,107,144,199,156,78,123,119,247,14,207,99,254,21,227,147,195,243,51,72,84,197,37,190,47,15,113,62,110,84,125,255,175,165,249,140,221,181,126,113,241,234,155,150,49,34,161,171,57,40,191,112,107,45,133,213,184,44,255,110,188,212,54,75,118,25,135,25,194,114,141,24,83,208,25,93,94,116,212,136,206,97,159,193,11,191,189,207,19,78,29,237,163,18,63,86,249,150,126,67,149,132,191,178,116,196,210,41,154,116,242,65,5,13,10,13,119,87,164,188,124,103,75,132,202,69,234,4,78,223,100,75,248,137,203,194,207,92,141,30,130,178,91,121,14,122,8,0,222,224,6,159,244,4,24,26,135,74,156,140,44,110,11,190,61,229,19,78,196,158,168,219,110,12,199,105,57,233,147,128,110,177,142,27,77,165,24,245,173,175,188,132,190,72,73,173,57,121,210,244,170,23,198,215,57,202,14,126,20,46,52,39,169,47,156,224,203,157,237,123,213,193,254,255,56,47,167,74,8,95,221,43,231,30,168,226,244,13,153,6,208,123,216,230,200,73,248,191,185,6,251,121,158,1,171,131,57,246,133,69,68,112,252,177,57,20,201,21,216,19,99,175,130,141,70,131,139,104,176,105,0,6,9,73,202,246,107,241,67,63,70,68,158,228,179,157,37,158,39,137,237,116,203,241,99,100,97,59,73,59,116,95,151,51,22,147,107,75,86,142,97,86,179,107,28,79,239,9,38,81,139,224,245,172,134,5,237,30,44,182,224,118,215,87,36,169,100,159,208,160,192,159,25,233,51,101,179,72,192,31,102,228,146,199,241,160,34,95,94,150,147,142,104,252,142,163,61,175,168,159,16,235,22,8,179,124,41,3,246,255,54,249,197,41,239,50,148,59,241,195,204,6,210,24,46,157,36,72,130,137,230,184,107,174,253,119,170,97,202,226,197,5,116,135,191,12,250,98,252,224,158,184,90,248,176,48,95,190,178,253,136,198,154,197,225,191,203,157,231,47,205,90,58,4,248,42,200,113,185,75,172,142,79,49,184,248,159,223,23,114,85,177,214,147,84,247,77,182,152,68,42,78,161,216,14,86,245,190,104,33,147,230,11,43,95,29,43,213,195,63,209,132,156,253,25,7,199,200,174,16,28,252,210,202,67,114,140,35,128,215,28,221,99,185,51,134,85,82,182,185,249,152,117,213,167,55,214,130,199,227,47,82,167,149,177,142,253,13,10,79,40,151,7,146,97,239,53,161,234,181,126,61,148,150,26,3,37,97,245,134,132,144,169,227,185,201,230,3,174,151,90,195,106,185,132,188,42,40,140,182,39,31,200,206,7,208,65,252,149,142,122,110,235,76,41,24,46,131,159,207,151,145,99,27,203,0,143,109,181,9,176,110,216,54,90,87,181,48,193,113,240,112,44,205,138,148,124,167,144,103,140,9,31,228,159,174,7,252,69,174,225,17,231,81,110,138,142,150,53,61,248,191,67,6,175,18,186,183,50,173,33,27,232,172,164,111,146,112,27,140,233,11,43,167,76,125,203,141,114,134,45,135,174,229,57,31,5,193,245,80,5,41,185,197,247,11,153,92,97,209,99,131,166,231,199,75,63,6,124,193,223,159,49,202,128,209,78,216,23,48,18,182,244,122,7,117,7,39,105,63,11,6,204,13,10,237,17,132,36,226,216,203,253,1,151,253,199,149,238,107,124,58,84,75,65,59,167,74,45,218,128,141,54,90,116,104,67,114,55,103,121,178,237,70,129,93,77,75,55,230,229,34,30,54,117,112,204,183,158,77,58,187,167,13,10,50,241,6,139,41,184,26,152,12,159,88,181,145,179,209,255,217,236,26,189,156,59,96,149,24,235,52,21,209,17,89,213,219,11,97,132,38,103,237,94,193,46,56,206,63,98,92,87,188,47,200,229,21,33,50,87,139,106,199,38,111,239,130,57,18,204,221,77,70,170,167,174,150,29,4,20,167,157,104,208,243,217,176,101,17,206,201,5,164,102,84,15,56,225,7,162,237,112,147,13,196,61,0,43,152,105,203,193,119,78,163,173,202,125,201,182,34,74,217,156,107,82,152,13,10,155,107,14,202,89,253,174,26,1,95,20,2,226,95,151,199,133,247,128,214,163,152,32,249,233,45,239,166,97,222,255,114,104,17,18,88,209,55,232,237,33,13,76,26,4,52,6,209,142,147,255,101,227,163,191,55,55,117,124,26,176,245,45,145,69,241,161,147,198,229,33,106,2,53,98,84,182,92,114,94,60,251,56,16,207,178,0,12,147,193,129,165,59,196,177,105,1,35,61,81,189,33,75,23,143,211,177,163,47,230,229,208,116,0,6,26,74,115,164,216,60,211,229,154,152,209,218,30,78,200,152,107,13,10,211,249,149,82,82,82,212,68,26,249,208,212,125,130,230,82,89,202,88,127,29,60,118,105,30,95,4,89,238,63,102,19,183,69,159,236,43,141,103,104,208,89,74,18,34,214,202,71,205,162,238,89,18,121,182,1,62,113,139,211,129,88,153,247,166,228,213,114,201,150,248,246,38,223,42,156,155,184,251,27,43,150,133,87,59,218,50,157,157,77,107,183,2,34,65,79,1,2,97,209,49,180,210,165,230,160,5,152,12,194,143,255,240,64,80,204,241,102,25,175,7,133,233,12,41,64,183,253,230,140,24,80,88,86,29,27,51,248,158,119,63,80,186,206,234,58,101,28,103,176,201,13,0,189,203,101,227,188,20,244,95,114,69,139,0,81,15,166,116,196,211,114,62,237,153,227,103,187,243,33,45,131,144,237,181,142,164,92,236,42,251,178,221,181,156,120,47,189,182,203,216,69,74,252,170,29,5,217,27,212,179,149,197,219,8,102,167,4,43,83,72,52,30,152,171,214,80,115,253,130,44,178,14,54,77,197,82,44,124,170,16,208,219,56,89,155,126,171,143,120,250,135,142,221,135,73,50,220,191,114,181,143,60,86,251,134,146,79,237,2,189,28,118,15,66,133,65,112,57,183,124,210,114,60,31,102,72,138,90,190,57,190,31,134,143,129,107,212,240,18,56,11,225,103,179,210,98,89,244,236,53,198,21,127,27,13,151,43,89,33,171,87,9,133,128,68,183,103,131,232,1,11,84,56,182,206,200,29,120,30,149,104,63,151,107,213,253,80,250,211,251,189,46,100,97,204,122,214,202,45,222,152,134,29,243,206,94,81,105,228,76,12,180,231,93,165,135,82,28,217,201,6,214,129,212,54,57,201,128,114,180,63,159,94,158,85,23,13,10,241,40,5,146,149,8,222,211,69,55,206,45,149,158,58,87,252,221,85,195,236,193,184,183,35,12,102,181,23,227,76,223,61,67,26,105,139,184,49,202,36,11,47,241,15,135,7,23,122,247,103,184,63,33,195,115,34,88,6,75,62,23,60,20,41,58,249,209,92,178,49,122,16,60,160,235,208,188,164,247,175,46,249,237,90,195,13,10,7,187,133,147,39,109,82,168,186,243,152,131,174,38,19,97,41,144,238,99,26,238,41,169,253,135,141,108,152,170,120,31,155,95,103,66,230,13,95,176,36,202,164,191,238,210,190,14,198,209,152,147,23,29,41,150,31,37,79,7,117,90,67,190,30,179,105,3,216,2,12,210,99,208,196,51,99,166,141,64,252,214,217,179,33,133,219,154,191,225,84,243,87,186,60,25,67,184,116,207,183,222,113,7,75,232,241,70,153,147,126,197,230,15,97,153,246,171,12,184,18,199,74,39,163,115,75,8,178,171,90,46,192,147,70,4,223,135,145,72,6,69,4,96,90,4,129,99,244,44,27,134,125,45,16,201,210,230,163,226,147,143,154,26,176,80,125,36,32,37,119,66,119,127,98,31,173,155,72,236,156,1,44,239,116,59,225,29,215,3,36,178,174,38,98,74,248,25,235,48,207,57,149,50,237,119,139,169,234,28,55,65,237,91,25,107,94,19,55,134,21,31,208,107,68,233,212,71,55,133,202,117,170,21,223,121,205,21,199,71,155,214,171,198,209,160,49,134,60,59,53,4,111,43,212,89,191,119,162,46,151,129,208,231,179,40,220,45,30,251,38,9,57,20,90,35,1,150,232,43,213,164,163,56,158,15,30,60,28,162,162,240,83,61,215,147,71,138,155,22,119,144,208,64,71,38,98,6,213,45,116,132,207,66,73,237,202,180,185,35,210,217,82,133,132,111,169,142,251,155,191,134,182,32,41,135,84,146,4,172,160,65,19,237,185,236,81,29,34,89,1,85,8,173,42,49,41,1,66,193,146,248,45,217,72,76,218,13,10,178,111,200,150,106,41,94,105,164,173,247,110,208,108,133,197,184,4,221,173,216,17,219,84,65,144,90,200,179,106,80,162,255,117,213,225,100,180,81,122,147,233,119,115,247,164,86,7,13,10,44,90,211,75,127,122,54,22,60,109,176,134,142,36,32,194,90,7,82,215,40,150,170,199,185,227,56,170,180,78,29,130,128,165,114,86,47,12,155,27,14,12,173,121,78,204,38,4,144,172,96,192,172,113,53,192,238,32,94,176,222,180,73,61,43,238,218,230,32,164,83,43,187,15,222,150,70,251,67,236,247,84,84,123,25,50,131,207,151,146,205,126,67,13,123,133,2,55,46,55,160,61,63,224,38,99,53,94,33,153,70,186,118,218,77,15,61,120,193,96,211,144,88,202,204,13,10,17,134,234,75,165,149,186,83,213,69,101,114,206,96,242,141,90,222,28,75,131,121,87,44,68,190,187,236,64,181,192,4,19,16,85,104,131,78,27,79,84,148,252,143,1,186,209,13,157,229,113,181,231,31,87,222,41,164,0,218,214,169,121,67,51,238,35,36,194,172,26,61,57,45,221,239,123,70,11,60,207,230,3,20,200,19,55,122,48,224,120,44,213,52,116,185,221,129,233,97,102,29,149,38,59,206,110,12,95,152,88,2,250,174,125,220,155,71,240,87,5,108,68,247,83,52,178,52,95,132,124,88,209,36,86,55,113,78,219,18,67,6,65,7,205,33,131,55,214,62,67,75,36,181,152,45,101,55,101,49,3,68,77,173,167,116,198,70,52,119,7,58,34,64,252,207,166,67,75,229,238,161,127,36,252,47,128,38,139,131,93,60,151,110,100,194,78,139,43,177,198,245,22,241,11,93,133,117,153,125,107,138,225,4,98,34,30,26,135,45,222,226,250,158,69,203,135,35,212,214,112,108,204,5,64,29,53,178,243,25,215,51,211,114,150,206,225,17,3,163,107,209,44,24,26,142,235,198,119,214,195,252,223,0,53,238,165,224,29,83,246,137,63,60,84,164,165,168,35,168,141,95,19,72,148,124,33,164,183,113,23,93,214,195,194,228,86,248,24,189,114,155,125,156,158,241,53,22,70,117,33,108,109,243,158,130,166,35,192,138,111,234,125,1,132,116,154,165,118,53,102,211,215,69,254,12,80,203,185,84,14,64,64,15,216,230,38,41,159,53,35,109,244,14,239,94,13,10,166,1,227,103,58,40,9,191,207,156,1,192,46,171,177,249,205,215,138,159,188,49,249,74,23,176,170,148,214,173,105,20,102,126,12,155,110,33,241,254,241,51,82,161,242,41,23,109,110,91,14,91,139,213,171,133,22,29,101,179,11,148,130,156,188,84,71,201,101,43,66,141,239,199,209,68,38,242,94,37,108,149,104,11,16,202,24,150,32,148,21,158,14,239,173,119,145,151,125,1,177,116,123,213,36,113,127,77,92,246,153,163,106,169,178,218,131,6,255,77,143,216,22,80,175,112,170,184,49,245,195,157,142,158,181,157,110,38,138,112,30,229,64,76,121,213,248,232,192,44,90,53,59,215,236,42,204,23,242,26,184,82,141,220,123,183,121,12,116,120,51,69,20,127,69,101,23,237,177,105,103,157,136,178,13,187,209,150,158,243,157,51,52,41,120,217,148,100,212,111,249,54,160,120,214,174,36,193,81,17,174,232,58,244,239,164,139,189,88,146,124,153,122,24,49,30,241,70,40,27,175,216,54,165,146,61,62,109,164,74,247,228,63,67,175,189,195,198,218,114,46,207,125,177,76,212,77,220,42,250,55,187,84,196,175,176,134,43,225,189,156,190,169,96,92,185,181,118,244,160,124,150,55,211,164,154,22,94,54,184,79,4,183,204,24,251,121,99,224,76,187,117,225,34,71,78,116,95,22,112,236,159,212,66,189,96,44,248,43,79,87,41,83,159,74,97,150,176,156,183,254,74,209,20,7,110,121,253,155,163,116,133,176,156,166,158,167,223,175,79,2,69,253,44,49,6,15,19,201,41,207,173,235,25,55,9,55,13,115,65,100,145,6,130,3,203,8,57,216,248,132,201,120,24,228,44,189,207,49,150,185,136,51,223,194,28,82,84,81,188,13,222,165,110,80,229,235,135,73,26,252,128,182,28,99,209,99,116,2,117,89,168,179,132,63,69,114,233,215,177,84,210,133,17,61,26,18,46,85,247,6,4,116,133,6,84,125,87,185,238,179,171,203,56,192,112,68,200,58,50,167,18,52,58,165,119,219,92,68,1,104,34,78,196,53,151,200,39,209,206,100,28,131,0,197,148,253,126,6,63,170,104,139,178,88,207,70,119,90,35,247,57,192,239,147,104,123,82,74,57,104,41,241,253,1,91,92,162,154,126,115,42,236,180,45,6,144,249,153,23,161,144,47,83,228,161,136,155,84,220,201,171,29,42,74,36,39,106,44,154,43,193,105,249,42,137,6,120,117,179,89,76,236,207,113,184,164,76,203,6,183,4,254,71,212,162,33,117,241,160,163,143,52,95,126,110,181,125,5,9,140,58,4,44,204,162,100,63,208,125,143,110,55,39,220,19,71,32,224,188,98,217,162,176,212,243,245,148,227,99,44,119,189,199,146,88,71,51,72,24,188,13,142,22,255,157,168,68,61,150,21,131,33,168,194,160,219,123,211,124,170,174,219,85,43,92,14,252,169,68,162,45,66,71,81,225,81,91,103,80,76,217,93,213,198,143,77,33,191,67,106,134,64,232,237,36,14,142,207,203,67,118,157,178,1,12,125,231,149,114,119,175,198,55,91,20,193,83,174,169,236,209,15,48,120,208,42,169,141,30,175,142,235,99,94,187,7,24,146,233,195,76,70,190,111,43,30,152,119,215,21,72,11,220,9,186,114,127,150,188,132,179,233,15,234,96,93,198,174,193,58,243,135,208,242,16,185,215,177,183,224,4,30,246,122,85,237,77,31,34,54,102,251,187,171,233,65,196,242,196,109,23,136,99,250,47,2,109,103,120,92,177,210,223,248,194,50,209,83,149,200,93,198,140,250,39,253,84,37,137,57,208,195,74,157,204,70,22,21,39,67,244,12,120,188,240,95,2,186,241,71,191,155,135,33,107,207,214,68,86,140,80,24,33,175,128,87,120,105,76,210,239,0,250,76,205,125,47,177,95,163,121,194,195,66,101,98,207,17,166,172,113,60,116,98,236,103,144,147,142,145,66,243,146,151,250,164,238,171,48,56,130,119,74,18,102,104,81,73,188,90,208,8,58,97,184,42,164,110,204,9,181,204,201,62,176,219,127,153,143,229,64,129,198,55,167,232,47,251,174,48,232,192,173,76,176,95,197,185,33,0,229,95,174,156,37,37,35,167,178,167,154,190,154,40,142,204,111,240,175,61,79,234,234,122,9,147,15,184,129,16,60,131,204,173,189,114,163,140,116,112,133,68,149,89,88,196,240,31,249,41,146,162,147,207,172,252,60,135,101,195,68,46,184,202,176,248,114,221,239,114,2,98,127,51,40,209,86,30,239,57,111,54,175,21,0,0,46,116,99,72,217,219,34,68,34,13,10,9,63,39,173,39,108,126,190,155,206,230,126,104,103,227,156,14,26,86,182,204,129,136,192,143,125,174,170,57,162,92,96,30,175,129,239,101,129,198,168,86,117,124,95,142,74,232,162,242,59,208,110,203,1,56,3,175,121,169,222,59,95,176,3,206,253,177,42,185,89,233,201,70,81,226,207,20,172,43,232,134,217,217,2,39,80,227,133,71,96,73,118,180,42,68,38,244,30,179,142,243,161,221,35,170,148,212,108,154,237,151,121,35,252,163,233,132,25,152,45,114,144,7,1,184,251,249,156,2,83,73,168,104,196,255,196,88,69,214,70,107,244,36,35,47,242,152,60,63,250,14,144,185,158,196,131,80,181,109,104,1,229,201,149,109,151,114,205,38,13,10,252,33,65,156,233,211,19,92,175,67,56,242,104,145,40,91,210,128,225,80,145,65,88,46,167,15,22,76,14,72,32,16,123,126,234,27,17,147,254,25,38,141,114,196,121,206,95,241,152,186,176,41,238,242,84,4,50,171,131,61,211,29,169,211,179,117,112,150,65,104,98,88,73,238,210,5,74,120,105,245,111,106,35,92,116,64,134,80,63,223,56,162,9,102,186,110,161,5,105,110,52,30,75,83,60,141,183,164,143,101,46,241,195,175,203,234,111,206,63,146,224,48,114,194,20,160,188,80,179,23,243,80,118,12,1,163,240,183,250,137,142,213,115,95,239,245,216,2,103,163,186,240,50,149,31,105,231,21,92,135,95,31,126,140,141,148,233,158,222,152,222,115,44,169,158,210,132,50,240,122,141,219,118,146,139,235,43,110,96,5,52,232,30,157,223,31,143,153,181,74,213,115,192,56,253,188,187,19,70,188,98,152,108,190,250,223,3,84,63,88,18,8,27,27,113,210,51,216,84,141,231,44,245,156,57,157,173,14,59,232,131,75,251,43,134,50,197,162,107,111,79,227,38,152,210,205,134,57,136,20,165,176,223,178,21,62,202,80,31,255,83,202,2,254,44,145,36,108,34,54,180,242,15,180,191,188,97,136,118,36,220,35,120,216,77,31,197,211,121,115,226,252,132,76,135,197,139,229,89,208,96,182,240,77,205,60,215,17,149,241,105,59,181,205,201,95,63,26,184,107,140,24,101,97,146,89,47,208,69,187,253,32,183,170,214,145,57,225,173,160,55,165,117,3,46,90,208,25,82,122,149,92,88,64,231,207,32,72,198,80,144,1,249,231,160,20,144,33,52,175,247,86,255,38,69,117,148,198,111,46,185,228,30,176,24,44,103,238,5,182,202,1,117,182,169,55,220,134,67,111,161,36,78,99,214,166,40,188,217,213,194,131,62,45,246,221,234,7,166,240,109,94,38,44,80,239,211,76,78,240,91,65,177,72,70,148,146,21,18,247,222,147,51,127,193,183,118,35,6,30,22,208,71,47,55,128,220,154,243,248,57,72,130,30,64,209,96,143,185,253,213,56,246,88,131,213,113,126,230,39,143,71,54,160,192,198,98,96,69,130,119,242,178,133,83,95,141,140,103,229,223,82,43,201,124,180,137,248,59,60,173,0,89,150,44,72,36,36,6,80,225,9,235,241,196,80,54,219,135,134,112,77,47,116,147,128,237,111,216,210,255,233,217,119,93,221,88,125,220,140,242,28,183,161,25,9,122,194,102,43,155,248,179,255,114,28,138,43,252,55,154,72,162,202,177,224,164,199,144,133,77,216,6,255,140,248,39,254,44,207,4,253,179,155,158,179,87,160,108,214,126,37,243,1,78,174,157,7,206,237,136,133,82,101,25,115,186,226,7,45,149,30,209,26,28,197,220,61,16,23,80,28,73,49,225,189,114,254,63,60,79,72,150,142,2,238,84,196,219,134,51,74,83,92,90,109,173,190,149,14,0,6,45,37,109,157,26,67,92,121,186,146,200,142,2,90,178,121,37,226,21,99,135,237,133,156,96,225,67,254,247,88,200,24,176,38,219,151,146,94,25,116,224,241,252,82,171,147,46,133,5,147,76,145,32,32,243,152,77,22,67,25,5,93,244,184,18,114,0,252,85,228,40,193,55,159,67,120,166,41,3,44,160,100,212,213,166,231,164,63,153,89,32,145,87,101,200,181,132,23,126,108,35,200,91,231,211,193,146,235,8,20,60,34,74,78,231,221,184,176,117,47,75,205,55,107,147,221,194,182,153,134,126,177,0,120,165,81,98,228,185,149,127,98,166,83,1,142,152,32,75,95,251,172,185,154,150,14,172,46,29,27,247,131,143,42,154,80,75,42,13,10,146,212,235,21,123,174,173,167,139,39,237,32,194,215,163,188,244,142,143,6,4,218,196,130,188,217,49,185,98,35,178,156,11,141,77,52,21,34,41,57,84,207,201,204,249,196,92,64,62,249,61,181,247,169,72,6,215,99,151,138,41,48,166,227,205,42,206,95,234,4,86,41,88,3,57,149,45,247,33,89,216,107,238,132,155,227,213,150,67,42,14,49,237,126,138,182,54,68,132,39,72,157,1,228,70,119,26,51,116,253,78,81,144,98,194,207,178,124,219,178,67,9,15,183,15,148,2,92,170,219,4,142,98,163,108,135,159,224,181,45,15,27,59,97,126,6,17,13,229,16,97,204,206,159,251,227,123,100,149,114,59,201,60,56,128,141,12,29,166,203,81,111,130,207,35,194,169,26,171,151,203,169,116,24,16,61,132,126,67,197,4,90,83,124,54,117,4,206,26,198,19,143,234,225,154,97,89,137,227,174,43,116,37,93,157,236,238,111,158,159,205,101,19,155,130,254,195,195,98,135,68,14,243,148,75,187,78,13,36,84,155,206,220,229,176,136,67,15,174,223,151,6,53,119,30,255,114,109,76,253,42,155,100,229,107,177,115,11,158,59,3,152,175,217,13,217,193,234,40,91,195,238,249,24,96,45,214,102,243,63,63,209,88,22,224,233,219,230,113,49,22,200,185,120,76,251,179,159,43,59,189,142,158,58,63,132,206,238,195,151,246,34,116,84,11,94,32,140,104,145,239,42,126,61,235,83,86,97,235,223,154,122,152,243,93,107,153,242,61,40,170,56,121,202,91,154,78,13,10,80,165,151,77,45,14,20,47,240,14,227,89,234,100,22,217,28,236,138,178,202,82,3,30,179,41,130,206,22,88,46,124,106,107,76,183,180,41,173,87,175,157,207,148,227,59,111,26,39,203,13,7,224,99,77,105,158,108,167,244,234,116,104,155,46,19,195,223,65,145,98,119,100,140,78,136,220,240,143,40,56,172,8,36,66,52,228,198,176,234,86,80,124,61,157,67,9,122,237,191,205,106,3,213,224,185,80,162,13,229,77,24,248,225,179,80,225,60,175,227,50,58,15,134,167,47,88,123,169,161,26,77,76,87,101,196,173,16,188,180,195,139,151,27,251,243,43,6,30,120,197,76,113,139,43,55,247,64,42,104,119,134,134,231,202,12,205,128,91,173,37,66,208,237,148,219,238,26,166,78,249,122,119,67,105,111,130,53,12,18,98,34,242,23,193,250,90,224,83,169,43,149,180,128,60,28,64,21,190,117,43,89,29,95,84,58,185,195,136,181,33,163,1,81,14,199,250,214,70,236,23,208,206,131,217,46,174,234,200,60,248,143,69,105,241,134,11,43,144,125,13,10,6,49,227,133,242,147,151,170,136,13,10,20,108,197,22,172,216,9,229,143,95,230,254,137,242,75,34,70,149,222,129,253,95,227,162,204,100,11,242,178,250,174,80,233,8,164,54,32,125,169,22,146,24,215,14,248,127,210,185,83,9,130,50,78,55,7,158,107,68,165,6,65,213,179,223,5,8,196,211,93,135,157,116,137,16,97,74,254,75,129,15,190,248,23,220,225,186,65,229,16,241,177,193,20,81,204,238,238,141,104,125,126,35,235,210,66,127,151,245,132,162,16,157,193,37,31,168,237,252,241,55,51,157,227,81,143,218,228,157,113,103,108,119,107,38,166,216,60,153,247,44,70,150,222,58,87,73,76,171,160,99,35,52,187,84,55,247,86,113,145,41,220,213,141,23,96,199,17,164,15,231,254,80,124,154,223,42,90,101,156,145,142,19,170,92,29,116,84,247,124,152,215,244,138,237,23,219,235,172,69,71,206,214,45,11,24,4,34,123,31,23,233,110,19,205,89,40,143,178,243,23,34,0,223,63,20,237,123,168,90,160,48,34,168,97,27,180,172,11,199,155,52,180,137,48,104,224,119,22,209,99,90,120,163,245,229,131,198,232,89,178,166,70,89,184,57,120,105,155,136,31,250,147,245,63,245,89,13,112,11,232,93,103,96,81,96,119,131,48,239,20,207,21,137,147,60,105,235,234,29,147,134,57,24,24,79,235,100,171,9,80,113,90,51,77,18,56,246,207,235,85,52,29,63,205,145,123,28,138,155,166,161,75,253,214,52,141,104,26,52,176,134,216,1,229,78,197,236,235,186,46,129,55,115,109,186,189,200,110,226,136,163,23,19,8,223,186,170,8,227,175,124,113,2,121,104,85,226,17,230,117,20,53,2,211,103,54,254,74,178,198,89,106,186,111,206,233,162,80,159,28,166,137,142,192,150,242,74,186,68,12,158,169,106,34,126,181,14,98,102,111,100,144,252,132,181,125,120,211,12,182,39,99,245,65,101,201,140,250,36,229,47,96,66,165,120,245,142,168,213,37,237,18,243,52,168,189,63,18,28,141,40,29,191,51,66,109,175,111,96,141,16,94,18,146,222,194,234,119,26,56,82,129,44,214,181,108,208,140,239,111,38,6,84,30,231,195,120,225,115,69,173,120,141,37,220,172,3,105,215,221,37,120,144,166,182,217,205,188,201,20,86,140,161,83,182,180,119,194,74,98,46,189,138,186,107,181,194,245,181,166,235,109,58,47,218,46,71,170,220,179,40,107,63,242,209,110,21,18,29,207,91,7,22,97,149,198,91,33,130,160,35,213,216,214,182,128,62,144,50,173,205,183,195,147,16,150,212,22,224,183,8,133,183,128,109,250,209,48,126,33,139,39,221,252,13,10,140,50,16,90,170,91,98,239,129,92,108,164,222,78,251,147,108,126,207,42,231,113,15,95,16,190,242,7,56,97,92,89,123,8,222,199,38,104,252,242,109,187,154,205,86,89,24,249,237,34,35,26,128,56,115,141,123,85,86,13,177,210,97,35,106,100,205,14,59,96,207,180,21,120,219,161,170,36,28,231,74,84,222,207,56,181,246,135,69,72,232,34,212,14,79,52,234,108,140,105,45,24,228,209,146,46,72,173,52,171,160,72,121,252,72,235,59,13,10,128,140,136,79,14,7,56,102,171,171,191,194,91,51,76,250,244,239,67,247,199,220,206,196,217,135,78,70,48,25,90,166,95,78,207,202,241,195,33,91,54,55,69,86,53,148,27,121,68,38,0,54,221,58,99,106,28,191,160,2,217,143,21,184,133,18,70,206,0,42,235,120,177,38,47,127,246,74,167,188,11,62,235,194,212,99,164,97,158,61,114,145,37,222,191,12,41,116,32,83,207,148,254,112,124,55,114,68,174,12,104,112,206,113,253,149,192,236,167,59,209,57,25,186,113,156,20,216,138,94,138,43,202,206,140,150,23,22,174,118,22,58,39,101,195,94,105,119,51,44,204,105,107,28,48,37,150,55,23,111,251,203,225,198,203,46,239,147,49,153,90,247,2,128,204,224,24,87,176,217,32,120,64,214,221,15,131,60,96,215,208,221,182,157,1,35,96,17,15,76,150,230,221,92,190,119,206,214,56,131,81,52,22,221,223,185,121,172,37,243,122,78,77,29,144,17,223,238,170,39,173,145,196,76,40,241,213,246,152,96,99,100,253,248,25,59,13,10,4,179,103,216,162,12,159,232,90,131,93,70,166,157,28,77,16,37,2,164,93,168,187,150,218,157,181,56,105,212,61,173,70,71,230,49,38,242,200,56,199,5,112,151,89,174,190,163,63,191,238,68,247,161,152,45,166,200,31,199,193,229,51,30,94,169,119,26,97,228,226,208,19,66,163,143,230,128,50,183,44,52,237,59,86,106,155,107,83,139,79,92,182,218,159,163,118,24,76,251,93,165,66,237,35,5,220,237,47,203,33,176,52,90,31,51,241,47,232,4,144,17,173,76,95,34,152,110,82,168,179,172,68,101,0,119,182,104,251,206,206,134,216,142,140,206,119,28,29,199,35,84,21,53,33,245,44,156,103,141,216,61,159,164,246,154,29,87,236,27,12,145,242,15,48,166,161,116,190,180,64,104,189,215,14,186,41,25,233,174,6,25,177,222,123,60,201,34,128,245,167,75,214,67,165,97,220,126,172,178,9,29,18,42,187,30,56,149,113,107,24,209,70,151,89,147,230,141,163,225,236,97,35,110,203,187,109,154,27,91,15,227,126,234,188,97,41,136,188,103,233,242,211,188,141,37,33,17,232,89,175,85,46,178,4,7,188,251,91,220,227,223,236,25,100,197,169,231,109,246,51,165,140,0,137,205,188,249,127,105,23,55,22,73,62,28,85,187,164,142,90,35,203,163,197,58,220,192,170,9,14,149,80,199,1,53,81,202,208,162,113,6,69,158,39,179,18,85,161,85,15,138,204,75,224,76,223,192,200,47,23,88,209,120,106,211,154,225,227,219,237,185,122,206,71,196,30,234,124,208,30,255,200,223,156,45,82,19,201,122,22,220,6,169,193,172,66,183,91,252,118,126,98,118,117,124,4,75,199,49,211,42,247,203,106,243,93,42,169,17,110,43,85,130,215,179,37,60,77,8,56,43,214,217,219,64,190,169,189,87,250,211,196,190,224,45,135,214,190,224,46,24,189,29,140,194,44,113,77,140,190,119,110,150,18,80,154,228,111,81,22,4,44,142,100,214,113,158,134,74,116,135,122,181,35,128,239,23,125,237,127,18,255,137,26,172,112,205,137,222,66,69,131,22,126,117,179,89,128,202,13,255,175,98,217,223,51,83,246,79,9,62,235,134,237,72,54,118,123,164,141,143,191,95,27,250,248,67,19,168,158,196,164,98,44,26,26,241,198,66,158,123,155,181,178,100,57,157,144,31,29,243,40,136,34,238,163,231,25,45,170,13,111,158,30,159,14,159,157,123,154,46,77,99,16,212,56,215,75,97,123,72,21,89,119,192,149,146,50,25,141,31,73,37,44,165,77,213,191,232,176,28,107,61,190,101,183,166,160,220,182,236,78,249,125,120,128,217,3,62,138,123,94,231,172,173,150,143,180,253,110,66,216,44,70,15,85,33,201,113,152,37,25,163,166,40,211,2,105,123,65,213,72,76,232,54,34,248,11,191,110,68,38,203,112,170,224,193,100,181,195,9,168,252,166,238,202,13,10,128,159,142,240,157,172,204,198,116,130,28,144,166,23,89,86,197,78,98,54,43,133,105,133,118,73,192,216,28,195,134,82,234,105,216,138,52,12,131,101,175,78,76,137,5,93,193,84,118,159,222,185,99,61,51,246,244,193,151,105,117,173,122,201,4,231,126,13,64,183,222,210,236,176,149,89,33,246,221,231,153,171,133,22,117,39,49,81,11,172,230,198,192,67,196,124,235,97,14,23,201,105,32,88,61,197,147,57,87,250,27,53,202,95,15,208,232,80,177,80,131,85,188,253,252,64,85,11,213,106,153,71,220,148,6,222,134,217,4,210,146,33,255,9,36,219,141,36,162,177,152,101,75,12,184,181,234,221,98,147,171,178,186,38,50,165,38,202,56,186,242,200,233,210,151,123,31,115,178,33,63,71,177,90,180,95,255,153,68,127,84,72,9,45,236,203,158,199,227,80,48,241,225,233,128,156,233,190,246,67,76,92,181,130,57,209,228,228,4,204,170,145,254,164,239,190,139,113,46,164,70,196,173,18,195,20,103,69,141,246,182,246,157,161,49,140,190,18,77,0,180,175,135,113,175,65,92,202,1,112,224,20,254,143,49,165,14,239,202,118,23,184,206,185,170,77,9,154,13,10,169,231,254,194,27,78,158,254,35,253,101,52,90,63,230,27,91,161,54,157,50,4,214,110,176,254,154,60,32,27,47,27,252,84,99,13,10,69,210,190,226,147,240,196,122,221,17,55,73,42,186,203,144,168,115,118,229,187,73,113,157,74,2,126,64,103,191,48,92,13,68,3,225,59,130,230,176,147,213,140,23,132,109,225,214,112,91,116,4,142,93,162,106,199,208,171,210,247,153,158,139,230,242,148,179,242,111,158,125,81,2,238,150,225,97,183,198,205,164,184,213,118,9,133,27,98,46,174,94,196,129,216,233,239,135,178,84,91,193,222,141,174,162,25,2,190,215,20,180,127,59,81,117,12,76,197,19,128,54,144,176,9,111,221,28,29,254,189,217,59,236,136,209,17,142,48,206,160,245,181,8,123,25,98,88,226,189,43,42,33,186,73,138,72,190,89,61,57,222,118,177,105,251,7,255,106,125,218,132,103,82,254,49,93,58,248,221,52,47,107,209,244,218,98,147,165,129,240,197,144,215,251,158,81,224,239,209,75,137,1,213,113,58,89,146,155,46,218,255,246,243,3,19,193,176,113,14,72,225,239,59,62,191,218,101,56,238,162,91,183,192,213,2,245,46,112,62,182,243,242,119,35,13,52,55,111,53,183,117,210,23,151,148,49,13,97,116,87,99,252,239,181,147,226,222,173,199,74,123,32,65,74,242,45,61,192,67,35,249,186,226,120,64,76,94,222,79,213,204,71,205,13,86,161,84,242,245,215,188,98,36,65,49,204,148,104,174,78,41,231,92,91,250,235,25,11,214,225,235,139,190,236,57,220,109,79,76,163,85,236,32,250,213,248,26,145,34,22,173,230,138,152,64,166,172,9,33,181,40,252,73,171,97,159,102,240,238,53,253,124,255,74,231,191,187,52,234,186,79,113,173,177,216,162,83,189,172,45,167,42,94,116,226,87,18,228,54,242,92,75,199,50,31,207,33,35,196,99,127,70,39,213,234,119,56,0,252,80,228,6,253,163,147,5,51,255,191,167,211,135,174,169,229,192,36,219,142,50,159,64,118,32,44,238,60,122,183,114,151,214,235,114,148,96,51,205,48,193,36,223,254,12,3,250,202,228,32,187,227,217,122,188,80,153,22,134,252,30,190,102,152,3,97,92,162,225,218,204,249,18,56,207,50,53,48,234,95,93,174,11,223,180,87,0,124,23,180,212,209,238,41,205,73,79,202,102,186,136,194,213,112,239,201,188,250,202,199,116,197,53,26,131,14,215,51,222,125,228,234,101,143,171,208,200,252,34,196,166,168,190,238,106,141,13,211,138,216,170,202,180,70,185,109,82,0,96,240,222,98,114,30,45,33,36,82,103,242,225,215,145,95,99,103,224,35,108,169,6,245,190,213,82,29,48,52,116,11,145,211,44,239,32,143,147,56,165,143,138,131,192,73,155,109,1,201,9,205,115,75,199,6,44,18,189,193,125,23,157,223,234,113,222,106,156,150,198,84,12,112,246,242,47,70,33,95,172,174,135,164,48,47,0,143,120,218,206,90,84,192,112,143,180,215,38,76,139,253,216,168,106,250,118,8,89,74,21,45,4,89,107,194,121,29,172,38,36,183,157,190,83,241,123,114,92,8,103,228,245,173,109,80,19,221,149,205,233,107,201,219,26,174,42,108,208,97,251,138,198,193,178,89,243,154,74,216,206,158,228,143,166,188,181,1,207,206,150,229,235,176,204,26,91,173,101,230,53,136,226,225,232,197,2,125,241,140,244,192,240,167,32,241,31,33,140,151,251,34,144,141,193,189,91,60,30,232,52,93,225,25,76,169,131,0,44,41,187,25,194,17,253,206,89,159,74,193,98,72,37,217,208,229,254,179,26,216,49,39,80,149,221,137,180,86,197,236,198,48,135,174,0,152,23,193,247,77,103,243,92,119,90,99,191,235,85,181,212,158,35,236,3,104,227,92,36,106,137,137,13,31,8,34,240,199,105,160,154,215,190,144,217,95,80,225,50,227,73,179,206,180,249,112,167,212,92,79,97,107,36,192,87,166,69,169,74,165,222,68,131,170,36,255,219,249,89,178,186,182,13,10,135,210,155,204,85,88,136,63,139,44,23,227,145,98,6,1,174,29,140,19,187,62,17,208,28,55,43,63,213,15,37,32,139,57,248,25,35,142,128,165,104,245,146,230,189,119,98,168,107,58,156,80,53,172,1,109,172,120,15,51,174,93,107,74,4,40,215,243,166,118,183,64,9,209,228,214,34,62,47,195,42,151,47,146,183,97,30,19,14,82,161,56,54,196,115,139,106,82,255,14,83,110,72,253,249,222,158,85,235,132,7,199,15,46,32,105,157,249,197,138,214,28,54,81,226,174,224,203,97,128,213,212,226,194,170,235,159,160,241,118,205,4,35,8,150,132,126,237,209,13,10,115,76,82,254,192,88,157,114,124,162,189,110,218,18,15,30,171,3,33,210,68,130,65,93,148,140,255,96,36,17,26,31,230,16,92,35,144,181,178,250,102,204,241,255,2,73,153,31,95,87,147,157,93,5,229,64,18,77,25,47,228,15,148,176,171,134,176,13,10,167,18,207,165,132,127,68,129,147,163,7,40,13,10,29,241,176,147,119,195,40,198,82,231,50,108,64,13,206,151,211,56,74,106,239,50,42,138,148,135,151,83,17,33,221,69,157,140,219,197,165,204,151,189,218,235,245,219,195,70,11,154,74,103,247,138,143,88,194,227,86,86,204,159,141,188,102,190,87,148,90,93,241,63,82,50,157,117,180,246,223,39,22,209,101,118,164,140,166,107,81,12,230,53,55,100,135,8,11,24,149,111,231,200,32,214,207,67,190,166,68,135,27,17,190,68,70,173,69,110,69,91,3,44,196,32,207,64,251,157,80,235,24,58,158,79,21,115,43,32,243,179,198,110,110,128,204,174,171,149,139,6,217,119,77,148,75,143,7,231,4,184,81,95,160,198,117,70,6,172,72,113,196,28,217,231,239,255,77,11,145,23,208,106,239,126,205,64,173,107,62,220,67,57,37,203,13,169,9,36,93,229,252,147,136,178,66,207,155,91,147,204,242,29,150,162,240,213,178,50,57,106,69,201,108,133,207,221,13,10,29,76,254,146,203,210,72,228,28,207,79,169,115,19,67,114,151,13,10,169,147,88,44,127,38,225,204,153,196,48,239,241,73,174,62,102,174,109,228,132,132,218,171,168,54,244,97,131,166,113,33,81,147,254,35,248,104,197,9,43,224,137,116,93,148,7,8,71,247,108,43,141,163,76,27,16,182,30,179,185,0,145,218,67,129,158,159,140,200,240,220,253,68,156,154,28,253,70,63,110,187,156,125,235,134,2,55,60,56,21,166,106,12,105,239,245,24,152,78,79,43,254,224,233,2,116,129,111,31,120,221,147,77,108,30,246,92,161,176,57,163,132,236,149,132,112,99,251,153,43,151,174,224,81,23,137,209,136,92,105,3,250,239,173,120,106,46,124,79,45,119,107,192,107,93,182,4,199,189,29,60,252,47,125,83,150,255,80,103,115,40,176,134,245,250,34,65,208,154,65,126,84,214,17,109,81,17,45,204,52,53,154,91,208,8,29,34,72,104,127,189,86,168,137,202,255,82,54,23,199,24,237,130,142,249,222,181,97,76,109,113,142,76,135,73,50,240,240,189,192,41,236,250,197,225,202,55,207,214,200,130,32,37,85,149,158,91,170,230,243,23,32,182,172,82,130,147,151,138,26,20,119,5,15,218,140,207,139,194,243,178,64,104,20,53,117,163,252,158,128,16,79,206,224,93,63,203,188,193,93,223,233,30,167,15,175,179,18,152,97,67,114,155,218,219,66,210,170,18,57,68,16,28,103,0,32,122,112,78,82,6,25,168,203,49,49,64,213,126,32,130,225,4,55,51,214,158,252,64,183,113,86,57,2,13,10,226,142,204,0,87,170,53,62,145,18,191,252,123,18,33,100,90,236,32,211,179,207,99,7,125,158,157,169,99,46,11,28,43,128,28,15,64,107,37,51,61,48,98,205,240,63,198,164,194,254,140,135,214,173,248,12,117,91,184,240,0,57,254,28,248,251,206,17,156,89,232,87,241,61,1,137,30,58,250,195,35,57,59,112,13,179,54,90,89,39,93,17,140,207,155,194,170,253,112,91,117,9,43,48,72,128,105,31,245,136,243,242,194,219,198,60,137,147,209,174,134,84,18,206,184,253,0,200,45,58,166,210,11,18,230,246,77,22,66,6,179,92,16,248,129,174,72,194,51,33,5,62,185,36,91,28,56,219,154,167,75,199,25,134,144,244,50,222,133,217,0,122,101,15,140,66,67,224,78,9,116,197,12,244,84,46,78,52,175,83,194,56,192,176,61,14,194,201,28,175,161,138,245,110,122,247,151,216,97,24,95,223,75,144,154,170,75,133,246,192,143,34,176,28,7,66,133,85,204,126,89,247,177,212,144,159,21,4,14,193,125,178,99,49,235,102,205,232,176,168,57,24,13,19,132,213,253,42,225,184,237,63,132,232,110,167,225,60,125,86,183,112,43,4,207,117,235,99,198,47,87,37,134,6,115,37,172,239,223,135,48,196,0,161,38,39,36,245,155,148,181,109,233,158,154,81,117,161,28,249,50,47,134,162,243,17,135,144,249,136,108,29,148,203,97,44,98,158,123,184,30,184,253,94,43,217,70,233,156,15,40,65,139,44,41,141,171,104,16,153,185,60,183,195,207,152,52,150,145,207,224,30,108,64,177,125,64,221,150,6,122,231,21,177,16,13,15,109,12,166,126,223,166,67,52,227,237,162,35,180,251,123,130,176,254,6,238,194,48,206,76,130,43,65,241,136,224,207,115,130,131,206,44,98,106,74,110,89,242,171,77,85,89,173,135,207,77,143,53,79,159,111,64,140,174,30,221,157,60,248,144,2,39,115,237,36,126,7,159,190,159,32,69,31,103,206,156,218,162,179,236,156,216,12,70,91,211,79,143,221,48,107,102,185,53,94,197,97,232,159,244,83,73,240,48,158,168,165,240,167,174,131,203,124,137,72,248,35,195,36,99,83,121,99,13,254,139,217,34,23,194,217,171,223,205,20,206,184,229,43,39,59,123,0,208,104,11,64,239,2,18,163,235,251,232,130,172,162,95,182,246,103,36,28,31,71,55,53,38,59,13,27,251,234,89,217,81,65,91,194,57,156,65,223,76,249,151,185,210,252,16,81,229,146,212,35,183,75,20,119,231,109,56,96,23,206,223,220,156,203,211,243,169,39,54,130,11,91,188,166,232,99,254,77,251,197,133,103,216,179,98,79,78,235,197,124,70,220,19,124,106,187,181,249,12,95,179,23,250,52,175,48,234,106,195,5,217,130,127,241,193,16,215,97,235,82,16,60,59,51,100,54,95,45,126,196,39,230,197,111,235,33,238,213,196,201,20,153,70,209,193,66,59,12,179,229,233,166,193,59,59,105,213,31,209,164,220,213,133,50,86,48,140,108,198,52,158,109,9,25,155,161,142,36,185,221,135,127,39,159,243,201,51,39,50,14,183,76,232,190,222,151,161,193,132,225,4,16,246,97,77,144,231,43,164,53,26,233,87,3,84,202,121,156,194,241,69,151,25,178,211,91,117,121,168,149,169,5,208,122,2,187,222,183,101,157,113,13,10,214,184,226,142,139,5,220,199,19,38,203,77,59,182,148,163,218,100,164,164,186,179,95,163,237,87,190,20,203,243,4,177,176,45,122,107,65,30,117,33,39,6,28,195,0,245,142,2,243,51,202,103,23,32,102,74,110,182,98,126,211,173,6,122,140,229,189,123,111,73,18,79,143,106,205,105,85,118,12,189,150,147,225,0,176,224,145,77,87,222,132,50,60,43,6,177,137,203,124,184,215,110,227,163,60,148,163,185,219,109,215,232,35,83,78,182,184,106,113,42,81,152,216,173,69,162,161,228,228,98,190,77,66,147,205,142,12,60,56,207,91,206,25,32,9,14,68,190,72,15,37,124,81,28,128,251,57,169,158,236,76,126,65,210,192,48,222,173,40,239,213,24,41,104,193,56,200,89,87,116,137,92,143,196,9,68,232,216,13,91,217,6,61,248,142,96,236,227,167,43,3,18,22,106,232,144,197,209,117,108,156,27,100,230,175,172,175,155,233,154,116,4,122,188,117,176,71,87,38,172,13,185,46,202,162,206,129,24,90,248,6,127,12,108,83,246,137,169,89,23,158,3,235,160,234,103,73,237,77,85,175,32,183,226,28,40,106,176,247,142,102,14,132,133,175,93,212,132,178,247,170,50,41,252,111,49,141,58,206,164,63,107,107,162,34,193,150,95,87,244,9,84,104,213,51,87,92,203,184,226,66,66,197,159,50,40,143,35,107,127,189,203,164,109,62,14,65,253,202,202,98,130,225,128,79,219,4,219,107,125,36,102,231,252,56,217,74,200,3,76,29,217,200,223,103,154,229,186,165,105,38,45,85,55,253,150,89,196,61,2,0,88,38,115,202,14,154,104,111,122,88,215,39,187,236,202,50,40,13,181,39,15,217,23,199,233,47,231,146,132,242,90,126,92,218,33,231,215,133,133,194,86,78,4,165,20,213,216,219,190,234,29,3,130,99,156,115,106,18,241,124,233,56,240,13,10,170,53,225,226,34,250,164,210,40,127,35,22,7,199,220,217,169,13,10,188,233,106,157,156,233,205,11,0,81,66,57,157,93,52,19,79,12,88,188,106,54,144,235,134,136,0,127,215,232,78,67,145,251,185,32,163,176,130,57,93,229,235,22,239,120,212,95,66,15,55,184,130,41,167,86,25,29,248,192,189,87,244,247,113,51,109,152,92,158,207,61,233,182,244,63,166,30,144,162,183,222,121,40,222,107,122,120,52,7,89,71,79,133,50,211,107,50,154,57,77,146,88,254,94,78,237,27,135,248,164,63,229,63,16,13,227,41,242,11,145,64,140,154,94,110,41,97,133,214,113,5,40,184,51,228,17,255,181,76,49,156,20,247,8,3,152,225,136,185,253,120,65,183,74,202,134,26,170,189,225,138,90,248,19,251,237,235,74,126,226,170,23,67,178,219,207,220,38,34,92,114,3,34,127,199,115,177,71,32,41,73,86,107,167,200,31,90,211,45,254,60,231,131,209,112,140,123,155,140,155,67,115,4,44,124,143,208,222,2,249,207,66,242,56,228,181,26,145,126,75,99,216,195,26,198,225,143,220,14,161,36,159,49,117,230,89,100,154,160,242,211,7,223,134,253,164,45,128,163,189,70,151,218,91,27,5,211,70,179,250,238,210,200,210,31,199,170,71,186,62,42,237,222,0,85,156,148,134,72,233,209,183,187,22,230,27,168,123,78,8,202,229,158,131,145,121,0,239,65,128,228,215,51,208,224,28,84,234,175,223,181,81,79,51,132,138,235,208,151,32,246,247,71,108,67,15,14,218,246,198,45,131,20,155,3,181,19,46,36,28,114,115,162,243,34,51,194,18,198,250,232,151,62,201,143,135,183,227,41,169,235,103,54,173,5,230,227,5,247,211,132,19,85,191,246,159,189,242,205,252,65,201,66,188,41,122,189,63,55,186,203,83,16,157,99,137,71,210,141,185,119,115,182,253,13,27,211,177,18,70,163,138,33,219,4,64,110,15,149,135,116,91,154,43,233,235,204,241,5,74,80,92,171,39,5,136,32,144,213,56,47,111,153,100,143,59,1,158,98,71,20,181,251,177,249,224,200,209,93,71,229,133,76,171,9,53,205,26,242,19,178,8,182,172,37,17,122,33,76,106,145,246,64,26,38,237,179,215,60,147,117,17,238,120,95,68,75,143,254,206,235,139,138,3,87,179,9,223,192,233,188,24,99,20,206,124,251,155,239,38,57,162,211,194,18,215,214,102,104,6,215,175,139,165,2,35,227,224,178,81,188,150,202,221,72,120,162,157,85,209,65,183,101,120,237,55,90,165,23,90,186,230,117,217,111,3,196,222,97,204,177,152,206,227,122,196,209,249,222,112,213,59,13,73,49,61,206,239,100,169,181,45,110,124,116,231,90,111,40,248,47,162,89,2,174,180,159,129,184,78,77,48,57,82,195,171,125,189,88,55,238,202,33,31,27,130,52,121,231,107,227,116,19,140,230,206,228,75,169,148,28,202,57,221,166,214,201,180,1,154,91,61,175,229,69,70,73,30,18,217,212,57,212,85,173,33,253,213,4,163,229,63,117,59,179,95,62,205,13,10,43,60,234,79,166,12,79,140,116,251,94,85,177,7,183,25,219,126,34,204,0,127,7,198,134,59,87,220,219,202,162,113,106,114,120,218,14,147,63,121,120,14,80,134,152,46,176,39,86,219,71,37,11,137,127,67,111,210,7,233,136,136,38,40,236,127,41,230,114,23,60,231,190,7,47,107,13,10,229,157,224,221,27,8,208,132,172,173,26,183,119,184,123,243,0,131,1,149,91,167,25,24,214,220,103,214,232,13,209,56,160,118,231,197,50,74,29,27,2,167,115,33,187,179,32,231,212,124,120,81,131,197,225,238,177,156,108,156,146,70,248,223,250,26,9,80,13,155,88,175,141,27,168,145,217,221,3,117,120,143,57,73,117,201,40,6,248,180,244,178,194,176,177,93,248,203,178,20,204,13,127,177,125,140,63,46,245,55,237,224,200,237,94,132,32,41,82,70,24,197,6,170,33,193,187,151,234,176,25,232,250,222,70,136,129,83,160,115,45,200,195,92,176,134,113,67,32,148,27,165,171,28,130,198,95,140,167,192,228,240,65,85,45,255,179,207,97,219,251,166,188,7,220,109,255,4,33,187,176,2,164,50,193,102,123,101,14,92,150,247,124,109,106,136,203,17,178,0,200,153,55,8,33,53,40,170,7,141,200,170,176,1,70,243,85,213,37,237,196,56,113,183,110,119,181,190,59,235,167,100,103,109,191,253,198,1,214,250,33,91,229,51,214,254,145,138,6,208,198,191,47,219,210,143,138,180,229,197,62,63,131,141,103,99,148,97,102,179,13,10,110,172,185,124,243,235,108,159,76,42,29,9,94,35,170,40,224,123,68,77,7,144,120,162,39,59,141,246,179,164,122,19,91,138,188,129,55,218,186,145,58,94,87,128,144,228,194,99,38,103,85,176,124,30,150,196,88,135,241,171,136,52,130,168,146,172,92,94,126,182,18,175,141,113,221,182,162,86,35,4,137,121,197,248,209,213,250,151,225,75,195,143,133,51,74,167,124,145,52,93,73,29,249,103,100,187,20,242,103,26,92,33,25,34,47,131,136,166,219,162,103,82,244,33,174,235,251,214,196,115,20,155,111,33,89,157,22,162,71,237,65,174,105,5,115,17,95,56,84,248,171,222,186,85,34,60,86,144,141,0,25,12,71,24,219,146,6,182,196,21,104,139,6,75,24,54,146,248,14,45,42,54,165,69,230,31,44,138,176,159,146,130,116,212,190,252,174,69,12,221,235,6,7,154,188,42,57,254,151,14,210,82,156,94,8,208,75,1,57,47,71,118,151,82,96,12,93,177,227,79,251,48,69,241,157,125,110,179,196,194,194,85,89,83,31,174,56,89,133,140,49,46,181,142,81,51,142,33,52,148,168,80,24,162,44,63,108,150,7,183,229,25,187,20,192,203,244,18,115,119,105,110,75,103,55,150,243,150,29,127,7,29,218,240,222,94,89,228,31,54,198,31,189,205,26,185,55,157,177,147,135,121,72,202,76,249,47,27,43,93,144,135,152,31,107,233,67,124,154,40,145,58,203,138,33,41,84,54,80,126,112,211,235,136,177,176,182,206,197,0,255,159,118,198,134,63,13,230,38,49,3,90,43,28,216,144,86,242,31,225,132,58,175,166,248,84,37,141,221,185,215,182,94,133,82,225,247,224,230,73,78,183,104,52,7,73,137,221,226,19,99,150,120,234,144,251,253,24,118,23,110,109,250,55,212,98,140,11,22,246,80,119,27,177,142,2,144,68,95,102,172,179,255,132,221,115,209,110,37,102,196,90,181,113,28,168,132,177,199,175,122,178,158,236,83,168,21,160,38,239,58,74,94,188,111,91,41,127,52,235,17,58,115,115,100,181,206,248,247,85,27,54,110,50,60,199,52,88,238,96,237,21,181,154,205,64,64,220,236,43,24,252,132,154,157,172,68,144,174,182,179,210,108,59,232,19,238,193,103,176,46,162,117,113,207,166,76,51,176,201,49,41,253,97,37,52,55,165,228,201,22,215,227,136,171,107,184,145,58,117,42,59,149,220,69,210,194,247,255,47,194,69,54,13,10,254,13,10,113,99,65,165,234,137,198,96,31,80,64,132,173,150,255,137,160,91,97,84,255,71,198,154,98,142,123,46,68,246,140,82,211,189,135,200,58,170,243,8,237,219,27,93,234,84,169,157,56,111,81,171,182,36,254,120,247,198,200,187,106,157,124,87,193,222,33,153,47,99,2,157,204,0,234,228,201,106,193,4,99,247,34,33,52,178,203,6,88,58,81,248,250,207,233,208,59,152,81,252,52,65,197,32,222,1,63,151,135,114,247,12,193,164,82,18,196,208,180,63,211,107,82,128,11,212,251,167,69,208,227,42,172,42,54,115,33,181,177,46,134,217,72,45,171,97,85,145,200,232,36,207,143,140,72,183,138,128,56,225,122,21,21,104,229,212,235,69,188,63,15,68,111,166,28,169,51,106,82,198,145,31,152,28,169,69,9,61,71,126,177,245,55,13,209,210,213,116,63,21,23,104,97,205,99,234,86,27,25,230,148,231,225,98,250,192,148,81,125,50,135,234,133,164,136,76,69,85,154,77,41,147,126,24,138,218,100,88,23,24,173,245,251,108,144,27,105,209,239,130,221,126,253,130,152,197,191,105,63,54,18,241,171,168,157,148,127,17,114,51,47,19,240,14,255,119,226,192,28,35,141,72,167,216,243,80,4,231,187,245,209,73,130,98,79,191,160,175,24,235,43,124,156,185,77,40,79,225,162,66,83,41,227,59,201,146,158,101,202,134,74,251,127,218,13,100,81,190,128,201,80,0,164,207,44,13,10,61,23,73,29,25,80,227,40,45,249,170,214,29,156,196,114,2,57,145,210,134,105,86,202,240,103,49,106,152,0,129,92,57,117,71,196,222,208,189,44,74,42,226,253,235,129,196,241,65,245,70,91,182,124,253,212,7,125,163,157,22,84,68,233,168,159,41,27,63,79,156,214,244,165,70,115,151,181,23,214,73,95,107,214,170,116,8,24,76,18,105,228,93,110,89,145,101,134,180,223,155,26,122,52,249,92,20,167,220,132,168,190,104,184,197,167,59,106,136,203,243,85,187,105,234,243,221,67,93,165,15,43,42,234,168,224,113,46,249,234,157,173,78,245,184,97,34,205,6,14,213,248,147,101,171,104,240,54,109,203,2,175,232,165,103,60,95,227,200,0,240,186,163,148,6,18,175,15,239,194,153,207,163,173,185,223,26,138,49,34,143,61,206,58,165,131,87,0,39,148,87,252,111,138,180,50,122,147,80,214,11,188,225,115,196,28,38,53,234,47,194,68,37,191,121,106,138,62,55,48,227,109,156,212,18,202,64,158,42,125,187,120,191,216,92,87,36,12,48,13,134,16,144,19,33,186,254,43,0,80,141,37,226,18,57,73,121,253,4,204,26,241,100,7,43,146,143,162,67,129,99,14,76,147,66,107,22,45,237,253,106,200,94,155,9,160,119,123,239,171,36,253,149,25,84,240,26,200,13,10,68,133,164,125,77,230,61,85,147,169,168,55,88,9,197,184,217,35,177,64,19,245,85,79,203,189,78,46,56,172,199,161,179,215,157,84,125,118,254,222,239,177,0,116,211,48,244,253,46,159,236,35,209,174,194,221,204,194,77,236,212,149,73,79,193,248,12,207,141,189,223,116,245,0,39,153,105,26,145,172,178,111,107,37,104,73,19,196,46,31,238,162,157,184,51,28,97,60,191,158,157,74,19,1,95,70,123,68,219,40,169,65,248,218,240,200,209,44,67,232,198,249,102,93,126,105,254,217,114,9,213,166,118,222,3,70,33,96,238,66,163,190,26,33,65,103,176,177,154,143,163,106,154,140,180,59,13,233,222,111,109,131,112,107,97,122,138,90,40,206,141,254,174,207,40,47,244,35,64,174,22,34,190,108,153,251,43,130,24,128,90,253,127,15,55,131,120,231,121,200,74,117,191,233,83,112,87,104,200,40,58,201,199,98,248,67,146,238,182,213,123,153,88,130,110,16,163,227,125,113,16,66,2,251,63,103,125,196,92,249,199,9,30,76,78,54,104,74,199,133,4,152,73,237,89,170,64,19,114,9,7,232,214,76,153,233,202,78,184,205,209,218,13,109,240,64,114,63,30,231,117,73,126,224,85,156,1,18,62,151,83,250,64,87,238,88,124,198,186,191,248,129,207,59,13,212,187,255,64,163,184,13,10,12,70,161,86,8,185,19,246,225,235,163,233,222,230,251,101,98,65,184,71,255,80,95,233,30,20,51,165,106,75,179,28,179,104,152,246,164,255,67,0,28,211,138,202,87,129,174,37,76,239,50,164,113,235,21,33,48,83,89,26,40,18,132,192,150,218,75,143,161,95,236,241,85,175,159,47,191,75,107,115,96,132,19,184,54,147,202,13,10,188,21,116,215,169,189,89,143,54,243,123,25,148,67,200,98,70,111,134,50,254,153,134,190,235,131,246,70,173,116,133,138,144,210,200,88,78,247,167,232,125,16,237,9,79,0,197,130,231,208,145,138,116,240,158,172,9,49,73,248,44,199,162,222,224,188,124,251,98,199,75,80,149,20,93,178,103,211,170,31,94,113,140,197,161,240,173,182,140,124,105,178,224,48,208,232,209,5,161,105,172,9,151,0,75,26,116,146,246,44,28,205,86,181,203,217,104,144,121,37,228,43,7,207,171,101,22,191,241,39,30,248,239,87,99,49,14,91,28,219,21,232,208,192,247,216,65,103,48,175,228,44,147,229,31,214,153,137,97,12,37,20,72,37,250,54,188,55,52,98,209,133,134,236,77,135,47,130,143,89,40,237,13,10,41,25,40,238,245,154,112,64,203,145,170,126,236,86,110,156,65,114,208,225,223,125,52,46,129,164,22,186,239,34,161,151,84,116,161,17,127,178,151,102,34,209,184,204,177,190,23,168,223,46,29,129,43,64,183,91,194,108,232,187,203,109,41,34,146,34,109,88,16,47,106,118,76,4,208,218,207,169,169,252,152,137,146,185,142,219,20,164,218,26,105,241,86,92,127,80,83,141,57,239,98,168,160,240,193,163,20,125,228,222,60,108,152,32,180,139,112,123,242,242,189,182,250,50,196,163,12,127,56,161,195,60,84,63,153,151,247,134,156,223,180,4,83,30,177,236,66,13,10,113,26,162,199,144,145,79,32,155,158,137,146,48,172,85,111,180,152,153,37,61,172,213,129,158,69,245,176,123,166,119,34,121,190,239,89,41,201,25,252,1,207,225,186,38,147,77,234,42,175,184,61,67,115,105,23,114,161,32,190,122,218,67,9,191,133,103,160,132,136,124,176,190,242,58,165,171,108,133,146,84,93,124,45,97,31,131,34,168,239,36,84,246,179,91,231,27,195,88,230,189,215,36,189,173,255,5,15,141,13,10,211,116,121,211,210,19,156,123,12,189,236,89,2,23,43,162,223,190,5,248,177,229,109,88,120,175,102,121,53,127,49,58,94,205,191,21,116,187,217,165,182,222,9,53,95,254,99,213,194,64,141,230,174,9,158,92,33,191,123,19,11,125,9,218,179,150,94,171,101,43,0,12,235,76,139,243,130,169,127,176,113,239,197,170,231,240,225,12,165,6,39,154,170,48,118,204,52,255,108,112,80,139,158,210,37,217,214,155,101,17,232,34,158,19,128,200,168,101,164,211,250,24,57,85,179,126,254,217,131,41,52,17,120,66,173,47,43,31,204,150,214,242,209,92,126,177,251,22,40,132,98,151,72,120,114,88,92,23,52,76,76,221,108,231,13,10,199,208,183,237,187,17,173,204,51,240,99,83,52,91,158,92,54,217,95,189,209,15,223,86,187,108,152,108,60,40,150,249,234,33,150,35,133,104,114,74,148,186,80,169,234,178,159,77,182,13,208,186,169,33,36,100,220,189,30,129,51,73,213,180,7,87,49,21,7,138,116,92,102,224,178,232,133,51,154,128,62,182,68,161,95,2,91,222,195,131,77,105,253,197,183,32,79,87,243,201,174,168,247,35,194,69,191,24,222,188,125,225,51,84,184,106,253,42,235,62,124,127,141,66,192,116,232,134,0,53,182,192,204,215,188,200,171,147,61,40,247,60,68,242,249,11,73,141,206,109,16,213,254,188,248,170,212,175,120,95,151,170,139,12,70,131,25,186,41,115,158,162,57,28,163,84,84,46,87,158,212,75,50,94,127,61,204,198,114,172,254,202,72,6,96,181,20,226,144,62,187,186,247,15,122,119,215,40,246,16,140,16,69,68,93,171,128,106,129,27,155,185,56,179,113,42,182,91,62,166,177,113,70,151,211,185,109,203,103,194,44,137,121,86,56,185,211,238,181,175,171,230,159,244,185,178,117,83,85,102,138,227,2,41,48,66,251,193,146,183,212,159,92,229,42,114,169,98,137,74,186,43,187,185,181,103,234,212,91,172,46,36,198,150,11,247,238,180,133,17,122,138,238,193,144,159,220,51,136,245,175,133,70,91,103,216,52,160,47,150,225,83,239,91,237,232,90,236,19,125,175,118,105,171,15,53,20,180,172,234,124,203,179,249,218,219,141,16,185,168,7,229,166,206,215,149,93,174,41,100,154,58,140,119,15,204,212,202,178,1,233,40,151,87,64,107,178,69,21,156,243,163,53,55,131,91,123,124,55,31,56,109,56,28,57,214,139,59,11,160,196,87,149,51,125,138,69,106,245,2,132,231,157,16,134,60,87,54,174,167,175,146,204,105,89,162,76,130,167,14,155,135,210,225,228,195,86,202,5,194,247,64,198,45,79,127,81,94,128,212,149,117,216,213,32,142,15,4,190,81,191,250,206,86,147,114,86,124,211,127,145,244,112,126,100,54,204,131,194,213,50,210,98,80,84,99,178,176,3,238,72,155,132,90,24,181,138,40,164,255,14,249,53,1,187,41,146,237,97,113,176,226,95,199,73,110,152,148,64,144,28,12,217,105,152,210,188,151,95,190,117,170,0,149,60,220,60,85,89,140,157,170,246,78,63,184,145,83,137,142,116,151,226,38,240,42,42,19,28,207,167,34,38,106,19,222,137,93,111,106,198,116,203,146,214,157,123,28,1,54,77,220,235,62,97,228,100,64,82,246,102,182,82,183,60,142,3,223,6,195,158,202,105,249,135,253,40,55,65,231,16,35,129,112,111,12,84,227,166,112,185,194,176,206,141,144,22,168,192,158,100,51,132,117,232,225,108,129,184,89,199,144,162,199,28,111,61,39,69,151,251,54,101,77,184,4,37,117,21,213,122,248,39,95,25,8,176,69,59,7,23,105,84,239,45,14,75,127,154,69,183,48,139,148,24,95,235,103,168,142,169,158,102,190,217,66,12,76,115,235,227,163,154,232,4,73,226,18,223,47,15,144,247,225,63,248,146,140,74,162,15,194,38,58,122,142,145,87,33,159,122,208,16,208,90,137,109,29,126,130,147,13,31,222,25,127,128,255,45,42,126,228,247,174,8,216,162,92,216,5,98,246,20,131,123,139,103,22,95,139,62,120,39,102,106,141,229,85,156,129,159,0,73,70,96,237,33,74,196,140,184,147,88,145,228,25,236,23,9,157,109,0,138,125,113,214,107,13,10,25,60,200,146,254,42,86,128,227,129,128,77,173,144,69,185,192,218,39,37,23,89,142,234,85,178,84,71,146,113,185,241,61,208,168,6,158,249,101,168,255,166,204,75,119,234,217,252,250,194,166,91,14,117,167,116,171,169,133,92,214,251,159,175,70,96,162,200,26,231,157,248,202,81,233,219,226,150,73,143,83,137,176,217,228,92,237,182,1,94,227,76,158,192,159,245,220,37,142,33,68,116,199,236,231,51,79,3,115,3,19,209,24,103,187,79,164,248,170,194,53,188,134,54,136,180,62,252,42,222,127,142,152,240,8,149,252,75,51,132,36,109,99,114,57,70,140,81,139,75,117,42,211,40,24,172,23,225,155,150,193,186,0,185,22,247,220,153,129,97,197,42,20,214,154,106,210,228,231,70,25,150,64,254,177,179,51,115,143,160,102,13,10,162,68,228,196,115,140,17,253,56,100,154,113,119,5,166,197,102,202,237,219,53,230,185,65,20,238,122,183,54,16,19,241,171,46,42,72,96,183,96,254,234,94,250,230,57,195,206,167,216,131,247,33,197,45,106,99,28,40,82,130,11,128,124,32,234,183,230,214,203,153,113,237,199,185,133,51,81,179,86,118,72,72,156,173,253,221,236,126,204,99,91,156,64,192,210,35,255,16,254,14,34,92,136,25,166,217,236,123,250,27,17,2,191,178,183,95,155,81,23,189,109,126,8,108,167,126,54,107,43,214,121,70,202,203,233,80,136,176,25,200,33,135,147,12,201,255,43,67,239,101,226,144,68,47,250,48,90,236,149,15,114,31,176,52,232,18,32,237,215,241,7,29,84,109,175,145,167,24,78,16,245,250,8,169,52,162,61,160,191,6,100,106,172,78,178,248,169,245,252,163,155,237,212,49,24,68,134,204,140,82,166,62,224,228,92,234,106,40,206,236,213,81,213,105,84,31,2,237,180,123,236,24,51,217,45,215,116,225,29,186,249,0,60,108,211,204,166,109,118,20,135,212,186,26,209,126,117,161,62,238,23,42,100,1,12,85,225,72,67,234,102,2,144,16,203,157,100,67,8,52,134,128,195,8,119,9,255,246,76,165,92,132,110,179,234,21,214,160,212,227,252,12,248,129,20,223,42,94,166,238,187,160,54,31,89,65,88,153,170,239,126,83,175,213,206,48,194,190,147,242,220,242,53,86,166,157,234,242,159,176,210,151,79,32,78,53,39,127,37,91,242,0,237,177,221,225,86,239,42,111,79,126,61,249,34,185,70,107,237,202,154,53,121,42,33,26,177,33,247,183,245,12,156,31,5,109,42,255,22,90,17,40,61,156,96,216,179,143,154,97,139,244,77,200,64,236,184,23,73,191,204,185,167,131,118,71,165,183,182,236,74,216,48,128,88,35,183,167,131,120,98,194,216,134,80,163,211,139,249,193,46,55,55,111,62,4,64,96,242,208,149,225,242,27,148,146,239,128,114,14,226,88,220,209,105,98,65,218,53,95,44,145,168,82,80,121,185,125,0,118,13,75,178,52,249,94,81,117,32,81,130,84,108,18,165,246,107,101,179,253,149,223,48,117,136,208,165,0,8,97,44,97,164,173,94,41,74,111,61,152,235,189,139,42,4,47,171,255,72,167,5,158,151,252,126,122,171,32,241,250,159,156,127,114,74,119,223,127,197,62,82,81,60,241,217,220,149,202,123,194,88,241,80,167,240,148,231,219,145,233,145,8,69,2,241,113,94,181,183,133,210,171,104,99,170,137,151,2,43,248,22,82,79,0,129,6,22,128,194,61,131,7,154,117,188,198,173,155,172,87,143,38,234,154,75,212,78,159,205,208,255,130,13,10,66,68,11,242,242,41,105,128,77,90,136,211,140,12,35,209,69,56,93,137,99,131,180,149,6,250,87,181,234,165,128,100,174,35,229,103,252,107,60,253,118,151,62,192,39,223,18,72,118,133,115,235,190,209,8,116,0,205,95,76,89,16,35,51,198,127,26,222,11,103,224,48,187,210,16,54,55,9,150,174,163,0,186,185,14,36,209,150,101,138,118,58,142,196,40,206,224,185,71,210,229,6,154,212,252,162,192,117,57,57,205,230,14,42,150,41,48,211,208,195,170,188,117,172,28,98,192,93,192,89,34,77,158,85,151,123,220,136,18,246,118,127,50,63,204,192,24,254,205,118,29,33,13,44,126,80,132,197,216,127,170,108,211,194,127,81,196,3,57,187,215,23,186,56,213,58,160,50,23,20,41,155,190,30,59,159,20,248,102,103,7,125,23,95,237,115,239,250,253,38,23,102,231,133,225,110,135,132,240,153,221,81,112,3,237,239,98,170,67,145,30,235,225,81,60,134,74,98,42,82,198,68,8,244,220,51,5,28,213,94,80,80,143,162,207,86,141,61,102,49,167,114,208,17,225,1,84,199,61,121,112,17,181,232,39,33,13,27,49,180,87,199,29,167,100,219,98,61,30,13,10,244,55,184,64,89,118,246,68,214,60,35,221,218,131,250,77,20,214,225,131,146,89,127,229,161,69,220,216,18,253,173,53,189,111,113,207,17,146,26,0,31,104,176,67,119,233,218,216,233,190,195,223,27,146,194,241,231,239,209,172,234,37,194,172,185,33,153,217,177,32,145,81,131,99,104,209,162,33,90,114,235,12,217,139,108,170,192,40,112,99,105,88,252,138,174,124,172,3,169,18,90,59,144,206,19,29,168,162,36,61,157,203,103,211,187,67,223,22,146,29,200,178,0,83,214,69,33,26,232,46,253,120,32,81,198,41,168,133,34,25,84,36,168,186,92,180,78,40,96,229,246,64,203,243,29,199,46,64,120,83,209,17,103,212,93,246,63,100,66,161,208,164,246,137,221,110,167,209,222,151,141,8,248,92,87,222,118,92,214,178,243,64,48,47,26,93,162,90,26,229,67,29,29,141,195,31,156,130,109,209,180,213,161,217,255,2,59,177,82,30,57,216,210,219,200,109,36,86,111,42,11,166,235,166,60,153,31,253,62,130,166,108,249,224,232,196,51,198,15,47,191,248,105,176,132,11,226,16,19,51,192,227,67,187,22,68,153,97,131,59,162,146,61,14,2,170,226,88,16,228,107,34,207,128,121,117,105,170,244,35,195,227,169,254,24,82,238,106,194,68,203,104,246,148,85,150,111,139,88,175,126,74,196,115,214,83,88,242,224,60,14,3,222,21,184,192,54,246,82,166,171,11,194,152,48,4,24,253,46,40,226,243,110,232,200,246,236,49,28,16,1,112,128,224,127,96,196,201,79,91,60,90,162,189,31,219,197,78,58,85,92,8,193,32,251,163,64,15,210,181,117,123,87,167,245,73,30,93,121,54,64,58,178,62,27,84,205,23,226,78,52,77,223,247,47,187,136,142,157,237,92,93,73,42,132,56,239,192,160,1,1,55,212,6,122,38,194,51,163,93,12,5,48,96,120,146,18,237,146,92,85,228,176,223,14,206,202,96,145,192,47,220,0,105,106,133,169,48,72,193,13,172,215,242,84,133,192,119,155,25,62,97,253,143,121,77,162,153,69,95,44,196,228,135,66,193,110,93,230,255,219,216,215,9,9,89,48,21,13,13,10,180,104,43,181,164,95,152,168,255,112,159,65,61,241,48,205,77,83,180,127,145,53,8,255,167,163,252,126,249,28,195,87,78,181,201,164,131,100,244,129,207,180,155,251,204,249,66,191,113,165,141,90,217,44,174,101,191,254,87,60,214,102,158,38,105,210,16,54,141,170,255,245,102,106,208,182,247,16,5,48,154,252,192,50,245,150,45,73,112,19,177,132,155,29,79,53,11,194,55,97,254,131,204,133,201,5,82,37,141,5,147,237,124,158,42,180,176,131,224,164,4,160,225,254,53,190,192,151,77,34,221,121,174,219,83,123,19,106,196,211,127,141,152,46,192,29,94,170,104,204,136,157,203,114,89,94,25,53,151,225,30,123,9,252,80,25,129,12,74,16,253,149,184,225,126,131,105,249,49,1,132,16,45,22,77,94,174,175,168,34,173,0,68,48,64,50,118,86,176,210,220,106,77,36,133,152,151,28,196,117,17,111,81,135,156,177,147,122,91,35,6,5,58,183,108,11,100,201,7,175,179,220,93,145,58,221,177,188,52,144,152,6,128,57,145,225,121,29,240,155,74,23,174,255,219,9,65,102,2,187,195,168,119,81,121,164,167,7,11,154,124,203,241,223,175,149,36,75,12,125,190,225,31,42,144,62,188,56,32,246,142,137,68,108,253,63,168,239,115,165,53,199,185,130,81,228,183,190,250,16,95,106,133,247,78,12,25,71,204,137,71,236,65,75,159,40,23,112,16,178,245,205,247,51,7,186,21,213,32,1,197,101,242,84,244,136,47,48,179,87,62,97,61,93,228,207,143,72,59,207,121,149,117,11,128,221,207,129,151,230,144,130,184,113,203,238,11,159,47,151,53,108,243,252,232,57,58,9,24,3,153,128,230,1,230,89,213,243,163,67,202,224,95,234,195,81,128,183,167,51,34,139,4,254,42,250,181,233,240,61,207,13,10,97,62,220,16,129,247,59,155,250,78,228,248,166,3,244,22,182,158,175,159,70,24,122,130,242,197,210,24,90,0,45,49,100,97,80,170,155,248,134,99,24,185,126,253,14,74,221,29,151,68,0,168,194,209,249,215,95,101,9,5,88,205,212,181,55,53,58,152,111,227,190,90,119,229,122,121,100,134,50,192,43,72,46,54,80,217,32,111,181,76,17,237,91,5,216,34,210,39,0,186,95,252,89,247,105,208,103,49,193,1,29,31,190,103,147,176,123,126,30,120,159,231,195,91,88,133,138,240,156,182,60,101,175,224,6,136,105,116,245,46,119,253,222,56,210,180,247,219,111,85,201,35,33,23,108,129,106,21,108,72,15,58,85,113,120,24,219,91,95,218,80,40,214,234,175,131,97,75,168,47,229,236,156,179,209,35,55,12,111,182,2,3,53,59,252,236,148,173,126,78,124,184,5,209,75,183,202,122,251,164,11,26,211,124,232,127,230,102,211,0,248,235,223,201,224,232,7,205,7,218,247,49,122,195,23,16,130,235,151,141,160,33,113,65,212,114,34,4,244,61,30,172,210,28,127,23,220,208,225,56,36,57,201,30,172,3,185,144,170,27,219,59,136,139,66,101,231,114,13,10,38,9,121,94,233,166,23,159,195,46,82,72,225,65,28,144,144,4,135,101,153,178,112,251,93,37,171,131,91,78,5,16,173,239,142,66,138,99,232,158,101,63,119,180,120,22,28,3,244,176,56,34,154,146,222,220,246,9,176,107,115,94,163,175,33,90,204,141,43,8,74,230,13,87,172,6,136,29,237,99,99,23,169,177,99,43,197,83,175,34,69,195,132,219,0,162,182,8,154,89,127,222,68,210,8,209,171,11,195,136,59,215,159,108,61,244,157,48,124,174,105,220,100,98,195,152,208,230,138,224,24,71,62,197,132,59,135,73,21,88,55,79,46,58,126,135,42,232,30,22,138,7,118,60,154,185,206,102,250,191,81,84,69,114,153,65,109,116,237,214,42,127,119,25,127,211,12,112,234,128,158,179,183,151,178,92,248,243,227,122,21,199,71,153,7,242,218,232,217,37,152,94,183,205,183,167,142,211,238,238,170,242,29,154,174,117,144,124,57,112,18,214,19,247,93,71,190,238,60,99,207,47,215,42,139,230,170,233,92,101,215,182,59,122,248,20,79,41,151,78,55,146,47,229,53,248,234,16,200,153,227,169,124,117,119,197,225,194,25,143,241,126,117,81,137,167,90,116,13,10,199,164,73,56,76,246,169,87,194,255,109,69,54,93,133,106,140,52,188,107,29,251,11,151,83,214,169,217,234,249,230,248,94,43,175,171,251,183,133,76,6,49,69,236,145,233,8,121,98,67,141,82,39,50,26,211,2,95,127,146,112,147,61,139,22,125,37,228,243,199,0,145,195,87,195,180,135,59,234,197,77,79,155,101,26,182,196,161,35,165,210,130,22,56,79,97,219,155,151,136,35,113,93,122,171,45,77,187,50,23,169,202,183,23,189,228,90,124,173,86,179,227,5,95,240,12,112,95,252,119,242,20,133,171,193,155,176,64,39,184,66,72,131,215,42,151,156,115,250,119,177,177,40,155,153,230,34,201,113,136,204,254,211,183,93,186,119,254,110,101,206,121,62,80,93,77,160,135,32,121,106,62,9,245,210,7,8,211,145,112,206,126,83,60,250,167,248,72,110,4,243,146,22,126,160,160,147,254,153,184,41,124,43,19,152,198,33,93,75,80,146,83,56,186,89,87,140,153,1,101,94,146,46,24,180,239,196,180,38,219,40,197,7,51,60,228,246,9,195,184,137,15,103,118,205,134,134,185,84,240,60,8,225,255,153,104,0,239,14,143,58,109,150,155,40,51,255,21,111,72,29,190,65,95,179,69,182,63,252,236,216,108,134,188,179,164,223,3,5,211,23,100,79,73,255,31,85,103,11,94,251,222,98,192,211,15,195,169,142,18,31,157,89,77,186,19,122,180,214,254,175,122,200,238,13,10,223,178,183,32,110,242,134,212,215,9,116,97,114,101,67,255,32,211,173,202,70,34,23,153,217,202,206,104,143,74,90,14,194,96,3,26,52,17,78,173,168,127,153,207,65,76,168,132,6,231,88,180,118,0,131,154,235,228,65,45,223,239,159,240,27,176,161,184,194,77,41,60,110,40,63,170,161,62,41,27,139,34,203,40,199,12,75,188,56,74,133,54,190,62,226,8,245,22,23,101,123,133,77,7,8,150,162,166,134,108,12,90,246,238,34,108,156,11,205,93,133,187,110,195,161,163,0,11,50,224,234,224,181,111,163,86,40,182,212,182,132,144,182,199,24,107,52,250,173,164,130,114,83,61,228,5,167,51,173,172,212,144,197,234,173,199,50,144,162,87,66,140,92,122,225,110,25,248,21,91,85,16,159,176,160,233,112,232,241,105,145,32,46,94,24,66,252,174,221,113,29,202,54,30,191,61,20,73,192,220,29,240,194,168,192,202,91,2,105,174,49,79,176,180,2,194,145,162,24,178,41,73,59,53,246,25,58,226,93,187,102,89,39,249,123,25,40,82,77,102,110,195,62,127,3,75,168,191,172,218,112,80,210,61,148,84,218,216,90,215,17,177,106,12,193,76,47,53,27,237,174,142,148,115,63,231,235,36,30,34,66,79,62,107,216,131,139,149,104,112,92,97,222,197,222,55,72,217,24,232,130,31,240,51,69,202,134,170,196,82,200,87,6,87,37,170,37,16,223,138,6,0,202,166,192,201,140,218,109,213,245,35,178,111,23,219,141,168,42,0,228,157,55,106,80,77,134,247,8,143,242,144,18,153,203,99,144,232,237,98,201,164,157,2,31,37,216,219,142,192,200,148,64,4,100,33,149,238,29,17,0,238,205,255,115,120,230,233,137,111,57,26,106,91,175,184,136,9,134,16,144,19,33,186,254,43,49,182,13,10,96,135,96,9,74,145,129,149,165,48,233,124,236,161,20,166,90,126,61,165,53,149,7,46,248,26,149,37,146,19,103,0,7,138,206,24,105,3,253,103,42,103,203,122,136,51,95,181,87,210,41,255,208,56,198,151,161,174,230,246,0,98,102,230,191,211,228,154,51,191,11,229,8,21,2,232,39,91,116,251,90,156,110,179,146,61,216,39,52,212,71,165,223,115,252,224,54,151,21,157,142,142,209,67,226,92,98,252,206,15,195,240,29,64,5,183,193,223,154,219,200,26,63,37,93,133,39,110,94,71,247,132,23,120,237,148,57,100,115,194,84,54,4,171,178,140,125,214,79,18,82,209,7,17,187,76,118,51,238,254,125,227,219,154,131,39,232,252,116,25,201,109,108,9,110,229,66,221,108,137,235,163,148,30,138,134,164,42,138,202,236,155,17,232,36,209,21,34,121,130,195,225,39,8,77,25,203,86,14,113,62,222,77,237,124,144,153,225,13,10,242,119,48,202,99,172,29,141,117,88,135,16,183,230,162,37,57,171,112,104,128,207,56,243,106,44,82,152,57,245,165,218,196,134,181,231,252,168,116,142,133,205,79,231,43,146,6,120,43,218,247,183,225,217,31,81,153,110,166,163,73,67,205,159,144,74,254,199,19,13,229,42,73,145,147,76,81,31,166,137,54,77,45,255,6,110,91,238,55,91,126,1,1,168,11,2,197,170,54,142,14,164,252,164,52,209,129,238,163,67,158,166,57,138,114,96,32,39,244,21,202,193,207,184,71,49,161,9,95,161,19,92,183,92,79,174,231,20,132,63,97,23,171,30,62,104,132,119,216,207,157,35,24,68,163,176,0,94,98,15,159,186,61,188,147,140,110,181,225,240,107,237,174,236,151,141,232,1,252,148,176,37,124,106,197,205,83,224,100,193,145,60,20,221,28,223,144,235,120,194,22,176,227,192,36,207,53,32,110,155,95,123,113,225,116,16,40,239,106,89,47,131,62,13,243,175,224,78,71,74,2,54,118,6,172,173,222,48,218,228,230,71,13,5,235,51,88,254,160,35,176,171,248,100,202,199,94,75,220,56,219,247,100,88,164,89,191,56,174,251,195,196,199,194,200,184,36,73,187,21,118,175,202,206,129,25,64,137,185,166,131,190,196,98,98,49,38,7,27,28,68,195,54,68,245,176,93,245,155,176,89,220,49,190,111,213,33,117,132,237,155,23,101,127,163,41,192,143,52,13,249,182,12,91,228,234,95,37,82,168,236,2,156,251,152,99,73,143,78,9,135,167,37,157,245,13,135,39,165,93,197,56,75,225,104,69,71,74,95,196,224,152,213,6,167,168,4,117,218,133,131,111,228,214,58,246,134,142,254,218,29,223,136,173,44,195,131,187,89,153,99,24,129,48,124,113,16,134,6,200,205,201,248,182,38,150,21,112,194,50,213,118,8,66,101,95,237,70,212,149,42,79,28,214,138,32,2,195,47,230,57,197,102,52,200,61,157,231,228,100,3,235,164,1,88,157,116,20,85,223,108,198,27,244,181,153,147,14,204,99,71,91,187,140,70,212,118,221,8,93,189,20,2,211,217,99,56,53,177,225,4,77,181,45,196,163,19,121,253,169,247,191,168,96,85,4,219,1,106,13,72,81,166,213,90,134,19,66,245,230,57,87,121,129,231,50,45,231,145,60,105,96,83,206,135,125,196,252,239,90,193,22,154,130,245,246,252,182,176,161,145,248,159,115,197,113,110,251,213,31,189,175,225,133,14,176,7,202,181,50,98,147,204,203,188,53,49,226,46,194,77,159,54,210,245,240,37,122,83,36,150,23,243,244,73,7,183,0,66,189,114,231,187,54,253,146,6,160,201,231,250,53,208,31,77,22,83,193,98,152,251,46,160,4,114,87,135,55,169,236,83,82,173,21,116,170,129,7,166,112,84,252,8,241,80,49,39,223,84,237,247,78,39,167,37,186,23,245,249,201,250,139,21,216,62,151,103,201,37,156,83,83,126,151,161,67,223,132,87,170,160,132,167,241,239,179,114,217,206,226,29,207,222,89,128,103,101,47,64,17,69,87,219,137,80,249,153,182,220,131,20,18,203,223,255,160,143,250,96,134,161,13,10,245,75,235,225,13,205,72,31,201,65,78,64,66,223,181,160,147,239,84,58,225,78,42,180,253,253,64,195,14,209,180,13,10,52,104,236,200,225,148,242,40,78,29,244,154,115,81,212,216,167,252,176,118,77,199,211,231,128,229,5,68,176,210,193,54,37,194,185,56,3,246,58,162,141,168,28,126,169,34,18,250,150,202,194,246,71,99,228,102,102,236,0,111,139,15,219,204,111,25,193,35,203,124,145,59,117,64,98,253,132,18,42,34,19,56,137,25,8,228,87,161,247,13,10,215,146,3,146,182,11,194,139,60,101,21,93,211,86,177,7,0,144,196,147,64,191,110,254,174,3,201,46,31,181,103,72,102,174,179,41,126,192,34,12,145,248,187,4,191,131,112,119,244,144,251,62,146,151,248,182,11,91,228,172,15,66,120,116,99,181,83,242,235,3,89,219,190,229,227,23,115,94,59,191,165,91,115,198,197,225,101,134,111,220,19,132,43,210,85,53,209,134,29,244,247,19,14,87,29,250,53,134,1,230,166,248,112,179,35,244,223,159,171,25,91,169,223,126,15,140,237,235,188,52,80,235,151,45,223,41,61,203,184,223,222,51,7,129,14,240,156,48,83,166,1,20,208,250,116,120,83,250,109,66,46,13,194,117,143,52,73,46,57,184,241,69,11,105,142,97,51,204,227,210,99,187,194,168,123,88,228,47,64,135,213,136,186,250,53,255,245,109,180,173,71,239,32,125,148,98,112,25,111,100,154,110,155,101,122,202,193,233,2,154,181,29,150,237,186,21,109,22,248,71,132,94,255,77,235,102,143,156,219,122,183,36,105,140,81,169,239,244,189,195,196,35,72,233,109,86,137,220,93,234,246,56,192,178,64,24,77,102,106,130,15,9,236,46,176,213,168,165,108,48,81,78,22,121,86,104,50,159,43,20,56,27,63,183,228,46,132,155,163,218,25,104,142,71,91,14,230,206,250,67,169,188,210,255,181,243,227,170,221,108,71,122,195,158,254,241,210,17,219,195,57,73,247,251,201,242,139,190,238,183,100,133,82,244,56,199,204,99,228,1,61,84,169,12,129,57,235,91,21,120,101,187,114,192,185,233,26,207,226,225,194,204,150,116,165,195,57,248,140,26,236,238,170,120,220,131,194,130,2,42,145,112,21,131,44,154,206,127,32,124,0,29,128,55,155,249,146,5,3,222,88,136,144,182,160,23,229,218,138,243,233,231,154,127,176,172,67,120,244,253,164,109,14,125,51,155,124,101,33,179,188,78,190,65,239,95,147,103,63,135,20,238,67,188,91,93,233,27,110,61,96,154,211,52,114,122,128,5,191,7,81,73,6,26,24,84,209,241,147,241,187,149,35,227,166,29,20,122,244,248,134,156,173,2,139,147,88,241,155,254,54,230,231,31,244,76,26,189,99,203,70,96,113,191,121,157,97,52,155,36,167,60,210,73,41,169,117,163,1,50,140,235,37,74,213,25,99,168,31,48,153,7,67,224,5,128,18,108,92,145,4,62,94,205,183,106,75,142,166,40,65,132,220,141,123,62,82,8,205,123,105,87,135,45,21,42,166,124,85,5,77,99,202,128,137,73,140,131,79,12,96,85,161,131,56,124,252,172,83,77,170,223,208,88,110,147,18,176,179,147,126,209,201,166,28,150,207,87,106,164,27,44,31,50,137,101,31,184,206,60,163,245,208,23,118,106,12,211,217,222,175,141,246,117,166,158,199,113,101,214,32,135,85,111,96,251,23,145,41,39,55,124,76,127,105,173,13,19,183,194,210,42,62,49,135,191,25,72,251,125,6,186,84,17,38,150,109,234,132,1,41,40,97,210,228,92,112,60,61,56,210,160,111,136,144,230,76,187,225,118,2,74,166,141,159,196,49,22,89,17,236,210,222,16,140,236,228,152,24,236,248,159,253,50,199,111,231,17,234,63,216,52,53,13,86,143,76,203,110,163,150,251,215,11,97,122,136,47,37,193,181,244,19,120,73,163,116,137,85,224,232,37,174,218,96,17,21,95,59,139,64,54,9,108,38,148,219,186,248,130,248,222,176,64,148,79,3,52,237,214,239,15,222,152,149,56,167,215,160,98,9,210,9,247,156,235,9,190,81,66,76,208,179,139,158,234,255,44,73,98,221,106,243,251,232,144,199,244,111,151,125,122,122,8,1,210,18,124,208,61,4,118,229,106,35,29,157,64,114,113,33,221,95,172,111,173,43,113,173,52,240,238,68,192,136,245,225,215,236,63,98,15,47,82,81,122,139,34,62,8,63,151,166,200,11,111,247,66,68,115,187,254,165,84,142,23,6,47,38,66,94,223,219,94,179,39,161,110,96,72,252,164,63,166,163,181,127,98,129,178,161,46,254,223,190,78,148,244,200,216,177,123,240,195,122,107,251,225,50,80,38,13,200,171,250,128,176,116,154,9,242,238,127,102,7,23,224,93,122,207,105,105,0,125,140,159,83,176,116,97,26,148,16,146,73,239,201,134,213,86,197,227,30,72,231,1,30,163,74,82,135,45,252,102,213,133,174,49,60,99,13,10,42,132,185,50,147,246,159,243,255,6,152,7,67,233,163,46,106,59,63,17,18,126,41,150,236,107,185,14,93,111,0,70,64,131,190,133,229,57,59,87,108,22,171,186,212,151,139,95,233,203,12,215,150,232,134,52,91,37,1,42,4,21,152,58,176,222,127,176,38,94,221,143,218,182,107,159,160,114,180,90,225,153,44,209,44,29,181,227,214,166,142,84,130,39,207,197,5,106,164,162,111,240,159,99,39,123,251,55,164,191,250,130,109,24,182,160,255,194,29,181,87,134,118,103,55,186,153,226,11,145,109,55,232,16,178,196,165,46,40,15,219,156,226,115,72,185,70,9,38,245,157,143,91,217,196,240,36,231,38,81,9,112,218,221,237,139,75,140,74,139,177,143,52,236,143,77,116,51,230,198,174,202,221,212,194,49,38,223,13,131,65,165,77,234,233,243,50,42,88,45,246,160,66,95,60,244,22,171,16,79,141,63,118,73,35,199,139,124,236,11,253,222,219,200,110,211,171,2,32,52,180,232,121,158,118,147,103,221,107,68,184,19,130,176,31,118,91,114,84,117,169,126,229,142,59,198,240,13,84,109,99,253,57,4,6,118,74,127,170,130,2,64,26,190,116,216,90,230,53,152,42,208,4,119,212,144,197,155,38,72,118,49,32,3,161,198,24,87,187,185,205,106,177,73,235,175,113,139,64,54,14,71,164,160,236,214,202,86,72,53,168,245,114,250,195,124,175,168,112,211,148,214,53,203,14,90,38,78,106,77,59,56,85,140,98,27,37,75,223,51,171,116,130,19,178,31,236,192,153,229,131,38,12,203,251,174,212,183,240,14,42,136,52,49,253,168,207,7,129,192,54,249,152,38,61,211,217,119,14,81,125,117,198,30,187,30,212,252,177,144,67,105,243,20,35,187,78,93,205,1,13,213,161,200,205,67,84,104,111,146,28,232,69,185,143,144,62,128,53,169,94,106,32,11,38,46,202,148,204,97,165,38,79,165,189,169,81,168,170,90,183,68,142,54,60,55,160,254,26,20,129,220,152,63,51,146,184,54,80,187,245,11,216,233,111,126,31,198,227,155,145,228,227,92,23,194,58,15,250,165,249,184,210,43,92,119,153,77,146,2,249,74,132,169,43,106,161,214,58,191,64,251,98,220,107,194,37,66,83,134,0,117,22,185,93,140,242,182,201,156,184,0,134,56,13,73,27,73,57,59,240,110,128,155,107,138,87,236,139,34,109,76,7,238,11,243,76,186,163,92,227,148,6,14,131,61,189,62,123,137,50,220,203,40,218,72,106,89,235,155,121,21,230,86,29,66,86,224,176,136,123,3,117,151,20,34,167,180,128,142,47,184,89,190,110,219,124,187,211,92,173,93,152,255,229,23,208,95,106,37,185,38,97,129,111,207,108,220,152,142,81,72,3,164,54,52,211,178,177,131,95,18,70,95,24,190,46,56,178,108,40,211,216,197,248,40,73,60,80,240,68,142,41,204,130,194,229,137,137,82,109,122,229,210,222,26,18,174,46,100,105,61,20,135,224,19,93,235,147,228,28,226,109,92,184,155,66,65,227,77,107,43,211,183,44,233,163,105,30,155,188,254,217,59,134,37,254,251,50,21,47,2,247,114,124,156,147,56,204,231,74,131,13,187,131,113,19,178,31,166,239,28,97,228,209,141,150,155,71,112,220,1,165,0,9,33,114,112,200,136,255,60,202,169,75,210,154,144,135,98,108,64,209,115,153,190,86,142,237,67,17,218,16,40,43,135,91,83,52,190,156,186,149,49,96,234,230,137,150,114,105,88,59,105,5,90,51,32,23,45,198,39,88,112,52,103,87,33,167,191,84,100,39,187,140,12,120,123,189,232,146,180,241,121,209,81,79,73,213,74,69,174,109,55,171,5,231,243,95,204,74,200,77,145,0,249,57,111,242,130,96,173,104,216,150,95,189,81,152,183,133,69,161,170,78,51,239,171,62,234,25,109,227,182,26,228,141,26,50,50,177,99,176,70,86,17,48,122,126,221,179,85,164,110,63,194,210,92,152,49,4,70,148,74,106,126,228,211,88,243,227,134,70,254,139,58,100,13,183,55,208,36,140,86,76,199,92,14,77,126,193,199,35,179,48,100,62,233,203,41,114,154,8,169,179,54,148,149,73,65,201,254,175,75,239,151,248,130,6,188,107,125,216,8,197,56,150,15,230,185,138,233,207,90,179,44,155,218,26,18,218,190,112,94,193,212,81,95,160,72,4,124,11,38,68,121,16,154,186,81,89,147,199,62,211,14,0,21,74,77,21,3,235,114,55,247,140,205,62,62,87,5,36,68,57,78,217,174,152,244,177,227,145,223,54,148,30,86,61,93,73,36,149,248,199,36,154,36,194,66,159,125,177,196,164,49,180,162,177,232,220,190,40,69,124,231,180,20,36,94,58,23,122,23,12,135,174,18,173,207,150,244,117,125,17,91,22,203,15,215,136,199,122,31,159,179,104,107,219,201,39,5,28,70,120,248,62,141,195,185,100,104,197,168,202,131,164,108,123,230,38,99,187,173,23,157,189,197,91,160,190,109,193,222,87,53,160,208,38,16,48,148,186,87,193,85,1,158,59,134,162,96,252,123,63,194,160,173,173,165,185,251,86,2,154,40,35,87,245,207,212,206,224,43,49,172,96,27,87,60,69,127,71,104,193,130,231,104,138,102,168,160,186,5,237,172,45,189,244,252,200,143,214,31,149,172,163,51,104,61,203,157,247,147,184,13,90,226,128,130,12,66,198,48,155,35,155,228,216,119,51,81,64,19,11,198,199,45,176,195,230,222,60,148,244,98,209,207,125,157,47,29,242,139,147,212,254,122,146,225,75,163,66,155,223,14,138,67,56,166,88,45,210,101,34,170,92,114,155,82,230,134,167,32,243,162,136,11,86,113,198,38,189,14,160,174,225,193,23,234,62,55,100,221,5,254,180,2,52,199,242,185,94,200,1,207,182,58,163,91,101,81,66,29,231,113,59,26,239,71,6,210,70,82,16,7,238,53,129,153,231,127,63,211,146,56,248,31,230,136,15,53,68,209,200,167,151,59,67,220,34,13,25,82,162,144,174,215,15,243,48,0,120,137,162,34,168,48,133,117,197,2,162,162,41,176,105,43,105,178,246,177,120,92,188,162,143,27,171,136,248,150,96,193,196,102,171,163,236,118,31,246,29,226,5,224,149,198,68,78,233,93,2,244,69,224,150,87,153,26,209,129,209,50,91,36,142,12,60,105,204,211,168,159,177,100,32,246,249,104,178,246,174,184,41,148,39,123,149,171,240,151,145,251,168,204,85,157,226,251,120,254,174,100,1,206,61,3,201,104,59,34,196,131,122,88,15,6,177,243,91,225,162,195,185,128,46,54,144,123,253,204,194,217,168,207,243,200,254,72,176,64,215,26,85,0,219,211,244,130,21,149,11,67,78,185,26,248,237,4,64,194,133,97,170,142,57,202,230,204,28,35,118,24,32,177,81,66,153,176,224,24,78,148,60,96,106,174,61,108,102,211,48,111,200,206,101,139,68,97,35,199,89,148,9,144,115,105,219,50,2,30,103,19,250,136,125,143,148,221,80,168,111,167,74,218,200,181,211,175,8,80,147,199,212,22,39,123,201,6,139,68,141,193,145,7,207,131,137,38,24,202,84,85,218,156,15,208,64,39,226,153,229,204,185,60,86,215,178,213,217,81,98,108,98,26,132,0,3,136,144,251,33,25,57,218,61,253,32,164,39,97,245,252,68,41,163,248,1,83,77,53,83,252,210,103,54,38,135,44,27,223,206,217,182,177,223,72,109,203,166,99,135,7,214,229,241,48,138,99,133,84,30,165,62,44,244,11,242,89,238,54,36,159,58,50,184,100,150,68,121,162,170,39,146,181,91,129,183,5,6,66,46,132,126,80,99,102,15,245,177,91,193,158,100,39,73,103,80,138,181,53,59,100,40,171,23,186,199,254,226,18,211,33,201,198,222,63,232,163,71,73,1,142,95,87,241,149,3,205,209,224,229,78,125,13,10,163,200,248,254,35,95,71,62,52,56,40,237,51,81,79,241,27,109,110,95,216,76,174,136,225,104,208,193,18,109,173,100,9,192,152,173,75,16,98,137,203,94,57,104,245,211,218,75,19,40,91,116,155,129,42,27,87,36,164,51,55,185,246,205,252,125,26,152,129,254,112,220,219,203,177,205,237,65,170,21,36,138,156,55,62,44,34,191,87,0,110,213,88,191,233,133,213,51,244,94,88,237,24,132,243,71,244,195,178,77,21,156,73,207,138,73,19,83,170,232,29,0,249,78,200,153,242,198,57,3,82,131,31,132,181,38,6,255,223,20,162,48,24,50,253,177,23,204,221,162,42,245,40,142,241,207,146,149,187,119,255,84,240,20,204,129,7,202,194,120,186,205,30,212,169,132,236,185,111,2,48,197,51,252,72,116,21,189,59,138,80,182,41,154,254,207,36,42,116,122,146,8,27,127,174,220,236,62,179,132,120,156,161,13,255,4,186,153,52,182,248,126,79,6,144,91,19,65,166,174,2,129,163,166,69,152,68,143,122,29,199,221,246,48,134,83,246,73,122,177,51,227,170,133,16,0,85,19,205,155,181,173,92,92,23,8,212,162,244,132,55,91,96,48,58,159,40,74,67,55,194,239,170,3,118,96,181,242,189,97,165,171,32,200,43,181,130,206,144,42,252,52,87,126,184,130,187,145,219,250,214,253,188,229,18,117,170,99,86,149,38,181,59,210,255,129,187,254,211,56,231,72,72,246,20,74,106,71,20,145,84,42,105,244,141,112,251,152,195,237,131,66,240,234,127,238,87,252,234,108,100,108,173,17,136,17,227,226,114,69,202,131,170,146,173,165,6,185,222,77,5,79,59,7,135,147,153,125,91,128,65,169,153,93,13,138,42,99,96,24,97,139,159,6,245,126,128,149,109,1,63,176,64,46,242,105,23,89,172,203,253,177,126,165,132,186,87,197,80,247,139,156,48,129,55,135,109,70,27,54,86,156,213,7,19,14,143,15,148,254,50,176,228,225,34,146,12,30,175,121,100,188,49,6,163,22,226,78,15,17,8,84,55,115,238,51,115,180,115,118,122,74,144,236,49,53,2,197,59,76,25,144,25,177,53,7,191,228,186,50,180,168,84,174,191,132,200,122,235,168,200,29,33,163,111,163,227,17,249,105,249,173,9,67,29,122,184,79,83,90,237,103,74,28,240,92,71,116,117,170,205,67,172,26,183,234,19,196,138,59,36,123,24,226,248,216,44,162,151,225,63,27,99,65,168,185,250,171,251,220,104,198,235,93,162,45,114,56,124,235,224,97,101,198,58,190,15,217,204,146,183,106,203,183,120,127,163,236,15,118,65,184,120,189,118,235,210,120,44,147,235,171,82,81,72,216,62,233,59,28,115,75,194,185,75,81,55,235,31,89,94,106,78,165,18,158,81,154,73,84,49,38,13,66,172,188,98,81,15,224,91,221,250,154,213,223,179,96,99,1,174,109,127,203,43,87,43,142,86,126,36,111,255,101,138,188,225,194,133,156,26,229,108,66,36,251,83,95,177,117,108,113,201,181,239,119,233,130,95,204,126,131,21,245,207,33,241,30,56,165,32,160,34,64,249,186,44,53,73,2,126,86,245,83,168,118,114,23,190,242,4,145,7,66,199,199,196,199,95,149,239,163,120,15,186,202,251,65,192,155,2,17,5,65,3,238,218,203,220,64,235,185,66,179,174,43,211,217,38,15,29,219,171,145,110,99,143,209,8,226,134,160,83,179,196,99,164,228,89,85,36,71,69,141,146,25,224,152,121,55,169,64,32,3,21,221,144,221,31,211,169,136,242,224,140,193,65,40,53,211,212,98,167,31,222,245,74,79,218,8,32,122,89,104,151,133,54,150,40,76,249,13,30,167,148,182,86,24,195,164,197,16,254,149,69,144,160,110,213,21,187,126,112,174,108,77,26,237,57,60,241,116,78,43,193,73,205,174,189,156,75,58,19,214,122,102,175,13,208,83,100,101,240,103,117,112,76,115,173,201,251,45,59,136,222,191,68,228,2,139,134,127,245,93,83,42,223,51,221,87,103,180,238,182,137,1,196,170,71,18,105,162,24,161,203,3,252,185,69,110,154,80,126,87,96,152,40,146,228,82,212,166,35,174,124,139,220,8,30,70,232,198,102,237,128,115,240,172,130,121,104,162,93,26,90,143,182,174,6,75,225,226,184,253,136,190,37,64,101,21,33,212,230,12,60,226,64,238,241,146,250,234,158,56,82,41,102,105,249,119,208,146,215,78,110,191,33,147,33,201,11,196,180,151,190,69,141,47,154,186,3,149,115,243,114,97,223,76,158,232,252,217,186,71,19,5,162,169,206,218,230,115,116,190,249,31,93,148,142,43,209,191,103,88,118,247,138,107,153,143,50,233,6,36,14,195,174,35,111,11,98,26,214,34,17,157,218,144,13,10,180,231,219,217,106,109,12,186,161,229,101,63,198,149,172,51,86,87,63,60,199,212,74,254,43,182,195,200,164,131,75,121,228,67,145,65,63,66,255,15,57,191,30,12,243,146,153,181,221,128,32,62,79,133,19,147,75,234,111,252,129,6,246,94,123,120,40,48,61,62,217,53,19,83,100,55,119,82,12,106,32,254,245,142,24,191,229,68,208,97,49,211,75,177,208,184,94,183,89,101,206,183,30,251,139,241,3,79,205,71,217,15,35,138,225,221,136,155,232,66,51,204,83,255,72,184,39,213,127,160,210,173,51,131,193,205,82,160,217,113,196,126,128,38,116,71,237,36,28,203,52,110,138,72,70,109,96,174,184,98,48,51,83,211,11,214,60,233,101,117,61,93,205,2,7,241,106,34,79,101,128,85,128,244,235,255,135,185,136,252,236,226,13,65,27,35,24,206,135,186,122,231,74,231,70,98,112,187,84,79,134,241,7,6,55,205,69,253,48,162,112,49,206,66,87,90,142,88,255,123,233,93,111,68,215,11,183,111,73,21,111,28,218,9,18,58,21,89,207,196,197,206,13,198,151,4,24,94,215,86,89,109,139,38,222,216,58,62,24,164,20,161,50,167,90,37,26,88,198,47,48,34,106,122,100,201,191,48,173,126,114,1,88,125,23,228,61,92,110,102,64,197,199,150,141,60,171,1,48,53,240,243,85,30,128,103,186,181,97,102,124,232,205,40,11,132,183,214,7,255,14,80,4,106,251,254,152,70,235,166,193,24,151,44,195,193,185,45,80,17,246,177,30,240,209,232,91,174,182,55,30,98,61,216,221,133,230,92,106,69,109,238,111,72,240,133,239,41,39,168,179,196,48,78,58,232,190,45,50,194,50,159,154,80,216,181,137,233,87,89,103,95,187,168,132,24,71,130,160,247,59,160,207,133,212,224,249,32,76,30,157,155,179,55,171,236,52,77,238,172,200,237,81,217,58,133,91,99,27,13,243,208,240,119,137,172,11,13,196,57,65,139,142,243,12,88,54,74,153,247,100,66,12,126,49,126,140,8,39,203,48,27,75,77,146,37,208,112,78,209,63,244,170,129,105,73,248,69,82,48,158,178,25,35,247,38,246,234,45,40,193,118,96,12,214,239,36,196,41,150,227,11,109,158,179,61,30,119,75,103,62,216,197,150,153,142,151,146,250,108,83,30,90,156,178,203,248,165,252,59,9,180,223,39,29,98,254,140,30,206,26,192,161,213,177,12,177,157,32,61,33,181,201,147,89,47,40,40,173,138,75,25,158,198,216,145,107,251,107,181,23,181,147,174,2,194,247,95,212,243,215,108,13,155,134,167,0,149,242,144,123,2,12,216,40,7,94,248,134,144,51,252,157,207,20,58,240,245,253,33,55,115,119,217,227,227,97,4,62,111,75,45,106,207,221,64,92,65,217,189,194,107,69,3,3,244,164,254,121,0,234,198,51,146,83,8,107,71,76,216,73,40,130,54,177,254,182,239,77,151,5,115,173,105,201,200,45,151,21,7,104,176,8,236,57,64,246,150,172,101,7,207,248,168,165,159,219,206,130,244,212,105,123,5,231,43,129,123,213,102,159,168,191,1,236,159,117,6,38,84,105,229,123,208,164,84,165,78,123,55,116,226,139,171,89,93,129,195,44,4,142,102,14,116,74,91,219,244,0,15,109,219,13,10,235,118,120,92,195,95,54,24,148,102,222,192,207,1,198,142,29,88,53,208,183,183,251,94,2,228,223,229,214,45,61,74,147,145,233,25,166,183,83,195,217,13,10,231,29,74,126,254,102,202,182,255,253,202,146,247,196,34,174,56,218,226,201,49,47,226,252,116,18,58,169,228,47,215,2,30,148,15,74,171,169,209,95,250,163,134,36,63,59,154,2,34,255,20,134,249,140,156,227,5,180,168,57,148,60,146,166,49,203,197,244,127,147,158,50,9,104,231,17,242,232,182,43,104,42,3,230,240,136,41,128,13,10,59,23,34,161,249,92,36,37,223,129,66,168,156,118,175,215,89,45,126,117,71,188,91,109,119,178,179,202,156,209,127,103,21,117,251,51,144,103,117,64,221,118,123,205,52,59,48,46,69,45,245,86,144,35,100,231,204,199,200,3,155,112,121,27,162,176,218,175,62,102,237,205,45,91,43,16,104,101,153,176,178,170,250,158,91,138,183,6,163,18,60,43,12,212,27,210,0,114,189,141,126,207,157,95,240,201,248,200,135,167,156,2,220,221,218,11,177,162,95,83,213,136,1,75,207,244,167,147,166,162,248,57,24,178,44,87,84,142,170,150,125,60,41,132,163,122,223,82,191,219,73,107,42,152,189,56,6,104,36,9,230,40,72,13,10,211,30,69,186,136,16,172,198,151,119,0,119,29,208,114,154,86,169,167,249,168,41,151,71,114,195,75,36,108,98,226,211,97,178,40,41,220,171,4,132,117,106,17,87,37,160,87,121,63,179,107,5,188,21,35,86,56,224,110,234,201,37,140,53,89,244,4,195,9,44,48,100,67,116,188,46,14,241,9,182,168,150,41,199,175,109,91,180,213,247,59,47,87,138,98,156,91,149,133,77,123,148,45,119,156,28,37,27,103,40,115,155,138,130,66,75,11,78,206,35,83,147,142,142,234,30,69,158,232,204,84,158,94,50,68,163,69,48,169,136,32,37,154,13,53,109,72,53,124,53,142,218,193,163,108,5,208,87,165,150,166,113,44,212,91,32,7,21,19,89,85,253,55,174,82,166,248,188,134,170,149,217,48,136,184,163,211,77,34,61,246,232,130,244,47,158,43,99,27,89,177,28,77,222,138,109,245,172,6,230,128,45,223,144,77,132,106,31,91,203,150,99,247,215,214,193,243,120,20,209,144,61,92,80,9,117,183,228,180,105,202,129,150,176,52,186,226,45,250,196,122,253,40,173,138,15,243,254,29,105,36,230,164,72,132,218,200,153,224,48,50,77,11,88,8,46,147,139,183,234,31,91,194,134,155,143,18,87,147,60,74,70,55,74,73,162,163,125,111,239,173,77,85,72,105,230,56,88,19,45,101,67,168,199,79,19,200,25,137,143,254,252,207,11,73,9,1,129,205,247,43,29,165,117,172,65,33,138,233,247,251,230,205,143,55,78,183,231,35,188,22,216,161,166,181,252,79,131,161,53,105,35,59,126,115,84,119,189,175,33,105,80,204,168,191,240,58,182,199,102,170,218,178,109,209,178,129,74,2,71,106,245,207,72,23,241,135,176,132,216,187,67,222,248,167,141,33,30,28,143,246,99,165,9,251,92,24,76,203,225,121,30,85,60,88,20,210,166,33,19,4,133,121,98,77,58,31,168,77,170,43,6,203,69,184,136,85,74,219,1,245,34,186,4,229,25,202,49,177,169,246,200,11,19,86,156,164,243,44,93,82,177,95,150,33,25,37,225,178,17,233,13,130,153,101,215,82,116,187,81,43,43,204,171,83,179,131,91,247,208,192,129,42,221,146,27,1,155,111,154,115,134,236,180,78,54,12,213,1,219,119,71,44,171,220,215,97,124,226,146,104,62,231,162,103,7,122,176,157,65,224,18,176,240,246,176,216,139,247,169,152,238,60,227,88,175,63,186,243,79,110,38,140,228,225,34,29,167,86,35,77,75,199,254,172,40,31,126,71,184,82,54,157,132,16,154,88,104,178,30,42,134,147,185,207,39,21,26,25,22,17,96,83,225,40,7,229,183,42,123,221,18,55,53,253,82,202,164,130,97,13,10,96,69,216,248,36,114,137,31,38,53,51,198,86,160,91,189,38,212,28,207,91,185,100,128,133,34,47,133,105,245,170,224,83,251,71,56,223,192,60,38,228,110,60,154,139,167,142,208,227,9,248,143,75,85,206,80,206,135,94,19,201,125,98,170,44,239,109,70,184,200,197,110,2,177,74,195,139,78,171,52,188,139,172,95,31,124,150,60,252,23,22,127,78,183,198,128,207,81,211,165,251,240,160,225,176,191,92,114,48,22,39,45,126,163,191,159,145,162,239,107,230,34,118,82,178,247,201,233,50,188,214,109,89,212,49,131,144,99,217,157,208,135,13,147,203,125,104,91,111,71,13,38,190,233,206,206,47,228,152,105,70,33,55,94,149,243,72,142,167,36,171,47,61,137,93,33,35,140,92,6,230,232,211,8,185,251,15,20,92,26,102,175,239,123,204,0,191,56,211,61,78,163,2,239,37,174,140,74,11,226,205,153,218,138,136,186,220,85,251,155,74,1,21,163,6,157,223,30,114,193,8,147,99,217,22,16,42,210,192,158,211,29,19,236,157,197,75,189,37,238,248,132,255,8,181,89,110,171,241,185,75,80,94,42,207,227,190,74,74,71,60,211,30,190,77,248,156,48,58,199,157,131,230,211,234,4,92,179,130,123,192,220,224,179,184,78,33,182,202,99,39,177,3,56,216,191,172,125,45,67,60,37,92,230,209,45,109,241,95,110,245,239,139,161,173,244,61,77,108,167,220,152,146,4,11,119,112,217,59,103,42,231,0,47,50,145,164,248,58,86,211,139,186,198,174,105,228,58,63,64,163,98,144,213,133,227,213,227,118,146,66,193,113,198,134,72,77,80,227,137,202,187,216,140,190,77,255,215,135,209,39,177,103,77,212,11,70,204,114,81,186,122,118,52,75,190,254,232,11,185,160,210,138,232,54,159,157,191,179,167,128,36,35,141,246,121,81,24,239,77,16,181,178,140,8,78,190,65,230,151,214,214,177,131,241,117,44,146,49,20,184,69,203,154,213,98,51,70,162,68,239,190,211,142,75,137,103,160,178,90,157,41,201,94,80,123,210,123,251,90,230,45,154,68,6,129,111,204,14,148,249,38,55,137,164,169,129,149,190,129,7,101,195,88,226,108,34,119,1,110,230,195,44,157,124,186,13,10,240,142,181,188,132,175,21,16,105,32,15,30,110,194,154,90,111,58,81,95,231,36,39,103,209,237,131,85,223,180,102,240,255,68,15,137,47,210,209,32,216,218,191,244,111,195,149,151,158,52,235,193,16,129,108,99,38,237,124,20,225,205,142,128,40,13,10,79,31,147,94,85,185,120,226,102,208,14,165,7,121,126,229,243,60,134,54,33,203,102,162,222,223,118,72,193,165,146,96,232,46,231,118,195,248,85,148,250,181,195,226,128,147,136,114,32,63,53,241,46,39,185,78,102,189,32,226,86,3,146,155,12,33,172,124,47,171,43,3,130,244,41,97,59,208,204,196,128,21,241,111,254,138,248,202,16,239,84,162,71,231,220,134,166,87,115,17,174,250,13,10,31,227,80,231,173,174,126,33,148,250,19,5,53,139,190,221,53,31,46,100,6,232,222,201,12,219,65,240,132,165,75,1,64,180,19,94,61,18,143,229,169,196,179,240,102,111,181,240,46,240,20,165,57,18,194,157,77,12,33,87,101,234,39,243,180,6,63,203,16,148,204,171,159,153,178,13,158,160,220,236,125,250,170,215,129,198,90,166,6,106,46,78,39,5,54,42,96,216,60,239,240,95,238,250,188,11,253,247,183,132,42,117,43,135,97,191,243,206,145,77,84,76,184,38,218,222,127,251,253,144,170,38,53,23,188,224,210,71,36,141,3,154,53,254,48,250,206,12,7,229,95,224,149,6,77,233,45,86,84,126,109,69,200,63,41,245,92,137,64,229,212,128,27,27,93,51,203,229,145,89,195,126,105,212,51,6,104,246,139,135,184,13,10,235,155,207,13,179,202,205,143,150,190,83,236,109,0,66,96,125,169,36,255,186,18,48,121,252,124,13,238,186,197,109,56,174,140,30,94,123,159,147,234,121,85,213,129,246,14,147,30,126,1,131,116,30,86,73,140,163,179,239,152,140,14,90,186,215,52,119,57,128,64,138,110,231,169,232,40,119,100,114,209,115,149,212,23,253,117,166,40,127,54,247,251,252,71,8,169,146,200,127,5,12,162,199,132,47,202,237,46,55,227,85,63,237,187,11,190,134,127,110,162,122,203,99,16,60,73,71,206,173,192,134,205,215,153,143,56,146,79,27,231,49,250,195,102,122,207,61,132,85,209,188,74,189,113,29,139,98,113,74,68,83,245,17,135,11,44,245,187,163,28,116,120,14,212,77,17,126,28,148,47,158,122,76,169,120,78,194,191,222,242,159,18,50,57,255,173,222,117,30,243,57,131,83,88,238,0,152,147,228,83,149,143,80,54,73,41,112,153,75,217,183,171,204,36,207,13,59,172,185,2,173,76,86,178,34,64,41,134,204,157,180,185,164,134,80,41,16,222,163,211,13,98,181,96,162,8,24,197,138,26,228,31,136,250,53,122,46,72,205,112,211,49,200,159,77,28,251,92,232,37,190,70,123,85,0,72,117,103,48,165,16,150,137,32,212,238,167,25,202,76,191,238,24,0,210,197,246,130,156,179,207,24,6,132,169,246,106,104,125,85,147,76,244,63,251,223,183,109,99,49,68,146,153,3,89,76,181,77,88,115,159,12,120,150,207,109,253,121,162,223,49,244,75,33,107,13,10,124,107,137,44,207,239,55,193,44,31,33,235,206,109,56,186,113,104,184,148,191,23,6,168,230,163,192,157,246,36,247,76,177,126,7,92,122,189,190,237,148,72,93,171,170,169,109,252,9,107,251,17,11,233,86,125,9,127,196,130,197,173,143,5,159,7,34,144,154,58,100,237,244,98,243,78,248,116,0,40,185,95,126,221,69,193,63,65,6,15,236,68,227,250,73,83,231,49,164,1,200,240,129,153,120,4,46,187,9,233,248,48,59,211,85,51,115,195,18,139,6,78,226,191,47,19,247,224,139,144,28,31,186,224,154,56,192,166,96,160,231,5,171,136,27,60,204,37,125,188,89,11,105,159,74,5,64,125,90,161,182,229,33,56,251,124,179,212,43,200,195,141,0,219,207,130,54,168,53,172,11,52,118,65,241,28,14,167,5,246,192,213,224,221,5,253,117,114,91,237,247,113,118,172,49,202,130,125,245,130,35,68,221,50,159,244,170,190,130,25,226,206,164,71,207,142,129,17,153,235,167,251,57,1,19,164,60,145,126,193,252,195,33,246,115,63,125,156,209,101,15,232,192,0,144,174,85,62,60,154,80,33,138,216,161,38,120,150,164,131,30,105,179,4,28,254,204,199,104,88,23,158,248,210,67,134,246,253,243,85,133,52,134,201,156,224,107,34,26,207,124,232,80,119,103,226,249,172,93,15,80,136,101,65,58,180,6,156,59,177,17,35,51,115,79,107,239,235,125,80,104,144,112,181,208,84,72,238,194,122,60,223,203,59,152,151,210,6,250,136,165,53,95,48,87,33,225,195,243,167,114,69,111,116,95,230,229,87,25,135,46,135,0,188,179,153,81,230,131,92,119,53,46,8,245,49,199,19,95,89,131,157,190,123,124,236,166,90,134,128,187,162,67,169,160,183,45,18,145,75,155,68,60,161,192,101,0,152,205,43,143,19,250,234,243,55,39,191,216,109,61,1,69,225,226,245,226,120,193,184,205,193,2,169,72,86,230,13,10,25,102,223,56,142,33,159,5,75,93,17,177,17,99,217,242,187,113,94,110,94,114,200,205,230,213,113,180,61,21,220,69,171,238,154,78,224,229,165,44,192,112,210,106,132,234,89,173,69,178,167,61,191,63,62,237,203,171,192,225,32,113,255,8,28,255,234,102,198,94,26,183,162,114,157,243,43,118,223,68,69,154,224,152,158,156,54,252,111,15,115,75,200,90,67,131,243,128,199,112,173,162,110,221,117,23,84,30,208,70,151,211,127,77,133,145,229,247,133,16,197,224,226,152,164,25,228,76,254,208,193,240,214,53,217,37,237,46,220,78,18,129,111,174,171,135,153,143,252,160,79,133,184,92,8,208,109,39,195,108,185,57,161,68,85,135,19,147,217,5,125,103,163,64,1,103,28,116,121,106,242,137,219,26,108,217,11,18,154,90,163,205,104,112,237,61,136,146,43,196,99,179,143,201,88,13,10,181,111,51,230,181,137,11,117,201,131,186,174,246,232,146,60,37,134,103,141,253,65,201,216,102,65,1,184,34,35,111,147,160,75,213,204,59,50,14,227,96,101,122,88,132,225,95,7,203,155,38,140,150,116,119,128,56,35,249,103,102,137,60,44,42,91,184,123,241,28,180,118,157,102,88,212,92,219,162,153,212,166,3,155,191,2,126,108,176,163,72,154,211,71,69,82,229,162,253,32,218,45,218,253,229,89,39,221,176,135,171,209,215,39,229,17,120,1,76,152,54,150,42,226,45,13,10,178,52,48,81,150,242,16,43,126,30,28,74,94,142,56,39,119,213,188,66,233,119,14,194,79,202,142,95,205,75,199,71,82,95,127,163,145,222,83,178,148,55,110,211,210,109,199,212,26,74,187,18,221,112,224,73,249,149,246,18,194,64,200,240,23,230,113,180,122,133,157,57,95,64,41,50,137,142,207,139,227,60,75,88,248,28,43,197,253,126,12,106,173,252,48,11,198,128,2,183,241,208,3,34,162,143,60,104,189,52,110,108,93,234,112,155,54,215,248,99,89,33,203,234,192,64,46,235,179,106,146,253,41,6,111,53,6,90,130,203,149,253,70,24,12,81,153,22,91,136,212,142,30,119,185,127,200,148,110,250,153,51,58,57,9,200,175,235,38,129,246,197,11,120,26,76,132,87,136,185,172,235,244,93,232,195,52,182,81,212,41,206,124,116,11,146,77,245,74,69,125,64,236,232,178,164,190,9,109,78,179,90,66,183,32,118,30,176,213,35,60,59,9,107,24,30,202,171,117,20,21,192,40,19,118,55,218,17,250,60,93,115,47,211,18,218,78,46,220,174,51,233,251,156,63,2,97,81,197,54,103,47,17,178,32,161,154,3,223,128,15,52,211,171,199,187,40,53,115,62,140,210,20,176,8,154,32,78,35,19,225,49,53,191,108,11,194,162,86,255,137,200,194,112,144,86,93,230,95,231,9,59,231,152,158,83,17,44,3,40,11,194,117,80,118,102,82,124,56,122,91,237,80,31,31,167,105,205,68,68,62,53,80,85,129,201,163,192,141,47,141,175,79,163,244,207,186,19,87,216,228,159,248,35,20,239,58,186,212,217,119,117,217,30,180,140,239,81,193,76,163,30,217,70,217,108,74,62,170,57,197,199,163,252,208,145,77,155,59,92,18,117,189,114,79,163,44,23,8,194,31,93,178,186,123,49,45,111,162,243,61,112,144,211,49,150,189,148,117,197,139,74,115,219,19,223,226,70,84,161,241,199,179,94,181,225,227,163,112,70,26,151,156,13,10,213,98,118,171,46,84,112,240,101,136,57,254,12,236,51,102,149,110,233,224,181,114,108,182,141,178,57,156,225,110,45,87,248,223,219,74,111,94,73,235,226,139,211,99,185,122,8,99,9,180,150,74,80,51,182,215,130,53,112,11,26,196,251,139,33,14,100,115,122,108,234,77,88,212,203,162,135,235,101,219,56,247,140,90,218,0,235,170,53,180,14,146,252,168,37,238,213,99,82,22,205,114,233,3,36,96,104,115,208,174,72,236,194,32,104,70,138,236,24,214,71,166,218,157,225,143,208,124,9,32,152,44,211,1,79,164,70,135,165,174,54,5,134,78,43,254,35,227,86,30,202,61,151,86,67,129,184,69,70,176,173,216,64,219,79,146,198,143,102,245,51,41,253,85,189,154,167,106,11,189,178,144,244,214,210,112,64,110,219,86,73,78,70,50,186,77,112,24,11,33,14,223,89,54,201,135,32,13,10,253,124,125,203,192,54,83,155,142,162,70,19,54,192,49,39,100,176,85,125,205,75,86,21,145,49,162,221,53,45,54,100,164,237,52,3,110,11,196,207,192,255,219,242,140,11,216,194,70,143,59,236,90,74,33,121,184,156,224,17,198,156,69,31,128,195,191,183,15,99,29,126,36,222,124,171,215,130,75,102,140,118,134,55,148,196,74,183,204,157,34,77,43,39,120,122,52,81,208,76,209,215,97,162,2,5,231,37,88,143,243,241,51,97,110,253,63,133,67,199,49,205,103,24,49,216,141,140,63,115,13,10,47,238,58,41,221,4,119,77,128,188,75,168,133,211,96,247,157,162,32,249,113,3,218,12,35,2,247,226,243,140,162,219,159,174,164,136,90,57,116,179,198,93,217,24,252,30,104,18,229,107,131,254,139,219,28,187,200,139,253,118,202,56,47,16,65,22,130,83,189,183,240,98,53,37,64,225,216,56,138,44,215,39,69,14,141,88,56,37,253,61,24,112,241,218,4,48,47,208,194,79,240,36,20,45,40,159,92,136,131,8,109,212,19,77,95,34,135,148,125,128,222,32,83,79,98,89,114,243,24,64,181,165,58,244,224,247,231,212,102,13,248,208,80,213,167,208,118,153,94,100,116,185,132,156,179,170,194,64,208,181,74,37,104,187,88,203,200,224,120,67,211,85,64,243,135,248,139,72,54,234,248,40,143,176,52,116,222,172,74,219,127,246,183,195,241,167,20,165,5,58,132,53,72,84,229,192,11,154,254,9,95,223,92,205,249,20,49,100,91,58,156,240,19,147,114,58,119,192,43,7,14,204,210,141,137,123,157,117,208,195,34,169,146,75,27,111,138,33,254,195,135,116,181,241,148,170,208,125,129,198,243,104,168,171,193,44,206,154,176,96,198,86,181,39,170,151,153,179,99,240,50,82,29,16,187,227,218,29,129,30,48,15,82,50,167,239,34,141,208,157,149,110,48,64,150,182,3,182,120,220,36,26,18,221,104,104,34,111,228,173,151,113,104,154,185,120,81,231,172,197,162,207,61,65,35,39,216,245,43,105,141,83,156,17,29,224,226,86,88,210,251,134,164,91,233,235,43,173,133,224,104,146,148,166,21,133,110,34,5,250,47,148,150,114,221,195,135,19,46,184,84,19,97,123,82,105,49,76,227,192,243,161,142,84,129,127,123,13,10,180,182,37,59,251,170,74,22,113,105,60,34,13,10,111,242,236,191,252,157,92,75,4,140,205,244,149,117,65,100,50,52,168,109,86,100,140,2,185,191,43,100,56,35,133,191,67,208,137,171,241,174,170,92,253,155,217,70,195,225,97,156,127,87,222,65,101,159,136,33,47,179,9,91,148,242,214,214,197,186,19,197,96,81,157,246,149,85,201,183,18,108,111,244,92,97,186,70,124,41,205,243,206,166,233,16,170,94,22,26,74,250,246,13,57,37,208,29,233,106,240,150,148,253,89,112,55,88,145,211,90,191,100,41,8,155,157,129,105,59,112,233,140,24,1,90,233,205,3,253,70,123,222,166,188,9,220,226,33,97,237,151,107,61,162,168,12,240,74,131,197,3,96,214,162,32,0,34,192,109,153,152,154,218,46,39,5,190,157,197,166,206,50,1,226,210,38,160,237,174,80,46,242,114,237,219,136,207,127,179,242,145,22,197,89,238,248,64,94,119,5,100,85,69,2,133,39,69,211,212,139,26,215,195,77,235,245,241,144,253,2,188,172,121,108,43,227,128,23,114,105,32,96,75,25,132,236,179,32,68,40,24,121,127,161,64,3,17,141,242,31,153,171,201,222,79,253,253,63,166,186,204,69,88,206,99,225,137,205,184,5,119,91,242,76,143,111,229,182,44,19,222,188,141,8,236,198,78,4,89,216,84,218,125,224,251,60,100,121,233,104,27,20,27,148,228,140,60,134,3,250,175,236,8,201,198,179,153,126,208,67,37,12,77,128,25,239,173,26,103,111,30,197,206,148,42,200,19,174,239,55,149,198,157,229,119,20,247,42,144,218,34,227,219,241,247,49,26,220,72,189,26,232,220,61,55,174,181,101,32,147,202,190,254,220,22,108,29,39,177,220,13,210,78,115,238,8,222,4,181,201,186,128,48,207,210,148,131,51,20,220,239,171,51,67,179,62,231,79,231,38,115,188,146,18,84,249,225,216,177,57,110,130,152,137,26,35,227,212,117,207,74,171,151,237,121,69,88,120,156,84,78,132,155,1,163,161,116,231,143,33,243,126,204,29,226,65,173,50,123,91,205,202,193,234,153,91,159,8,222,120,162,130,204,203,44,191,202,124,0,152,38,94,221,141,207,86,3,90,192,100,110,119,17,56,185,83,24,165,239,220,32,44,144,104,58,147,97,188,171,172,2,135,31,30,103,96,136,142,20,96,191,236,26,142,156,157,99,186,118,82,116,212,245,2,106,139,11,61,173,104,189,249,17,91,168,187,34,208,72,254,139,170,96,233,134,247,124,38,44,146,41,13,232,228,102,248,177,154,80,29,75,90,238,26,179,123,40,228,210,119,225,40,41,188,70,70,73,117,130,98,136,80,69,178,9,177,254,231,74,175,225,67,240,44,229,243,127,79,186,111,230,177,52,35,39,232,143,188,27,192,180,147,180,225,163,38,84,156,148,139,111,184,196,62,128,189,140,16,96,80,155,245,112,121,156,214,3,32,154,76,179,66,14,128,127,123,39,98,226,29,152,170,177,189,99,232,129,82,24,15,13,185,228,253,229,195,101,150,20,161,60,9,181,225,60,219,120,44,221,94,50,160,221,243,9,72,44,120,39,28,98,151,238,121,124,110,25,165,142,62,80,224,28,159,74,24,73,191,12,238,234,233,31,100,139,176,96,124,75,125,16,161,41,55,234,228,156,34,153,223,57,187,16,146,198,221,220,222,164,165,133,37,107,165,115,155,193,119,180,17,235,35,106,243,235,108,48,18,131,125,201,239,45,131,237,39,246,190,208,102,151,80,143,195,173,214,164,110,151,70,26,255,117,146,102,109,145,48,74,74,82,95,32,148,167,131,36,0,168,123,33,177,41,98,240,99,169,42,108,140,254,93,122,34,171,104,13,252,175,58,110,76,34,17,207,226,113,253,83,44,80,210,15,36,121,197,240,228,113,115,236,140,114,218,142,170,150,62,107,89,176,235,180,156,77,31,87,44,111,67,25,101,185,226,33,122,193,194,76,210,191,216,20,13,10,225,125,233,98,99,166,121,144,11,109,139,34,44,110,187,147,209,2,171,53,67,197,197,3,209,54,119,35,193,224,62,129,143,97,91,80,102,181,130,118,91,6,3,134,191,195,34,225,215,206,57,122,64,91,80,19,227,71,203,19,66,209,56,230,92,213,169,3,57,116,208,62,195,117,95,122,192,146,197,159,50,202,62,107,207,77,44,169,218,33,0,156,144,91,111,210,210,209,232,155,200,64,171,2,93,3,80,81,46,3,207,176,233,56,34,164,155,56,192,130,175,197,52,16,11,112,186,32,151,255,18,142,15,165,178,93,103,105,241,98,237,168,174,128,164,40,34,170,2,91,106,211,109,26,99,185,82,238,218,208,141,250,83,109,186,177,118,184,183,212,220,208,206,184,125,164,105,22,100,227,115,181,194,75,194,178,34,231,233,202,226,187,196,210,49,235,94,125,216,122,18,99,44,91,111,142,208,49,55,44,82,210,47,250,242,197,254,23,202,237,224,27,101,44,134,9,36,236,133,97,68,239,168,209,148,237,19,210,46,208,47,33,227,98,19,223,218,240,80,159,188,150,103,18,27,228,83,12,159,104,26,28,165,231,75,224,182,196,192,200,99,150,111,159,45,117,52,116,75,107,149,88,7,141,190,118,114,157,105,67,113,75,248,109,139,157,76,17,249,74,166,248,241,163,102,5,40,109,98,149,127,241,235,126,197,50,243,129,170,225,108,154,27,47,142,170,195,40,178,197,228,248,169,82,138,143,36,199,119,38,184,194,12,123,46,77,170,77,192,166,205,144,27,85,139,7,13,10,87,97,132,144,237,234,173,54,116,131,55,59,248,151,195,70,13,75,218,77,136,64,3,197,98,115,135,54,171,27,249,20,242,203,181,137,34,240,80,246,90,13,237,150,211,66,129,156,172,230,25,95,76,147,37,1,118,181,20,81,190,3,222,243,250,83,24,219,222,191,93,181,225,16,22,240,178,113,160,6,70,117,38,220,104,142,205,218,136,33,17,52,72,139,37,23,35,166,66,237,115,214,169,16,106,119,80,190,235,3,8,225,13,74,188,33,139,226,48,142,96,137,176,90,17,39,248,28,195,4,150,35,54,243,139,161,115,248,5,232,72,201,64,115,110,22,250,130,172,13,10,105,172,55,252,11,226,77,57,174,212,219,249,199,176,143,185,66,217,107,140,203,57,97,244,38,118,31,65,222,44,164,232,235,224,57,236,100,28,157,44,25,199,115,154,241,163,79,31,42,193,88,128,136,106,230,90,16,244,130,222,18,26,88,13,200,48,91,59,141,219,184,52,241,186,109,1,54,68,92,247,103,14,224,27,105,1,227,218,17,221,166,117,179,28,9,150,47,23,131,69,210,37,208,28,145,6,153,214,253,240,124,48,183,110,126,58,126,236,101,131,50,40,62,5,140,202,131,204,116,226,175,108,209,181,91,179,235,136,156,59,236,48,237,11,152,154,41,146,74,82,34,185,177,9,158,171,31,117,218,127,245,198,169,188,84,205,98,92,224,164,177,110,150,40,151,73,125,14,36,192,11,88,2,79,38,58,126,151,72,237,30,77,63,39,3,5,149,164,234,58,243,183,211,167,6,213,129,124,168,251,189,32,11,144,163,240,53,6,14,73,173,184,12,53,89,45,65,159,75,163,59,1,162,47,135,61,25,234,34,116,46,141,28,127,115,89,42,193,66,199,142,222,101,122,165,140,31,142,118,206,234,90,3,138,227,131,184,234,249,144,92,245,127,227,33,218,25,5,42,249,101,242,242,9,52,202,6,153,196,252,223,31,101,13,117,178,21,245,164,76,30,5,242,105,139,85,229,208,199,146,56,105,206,155,104,200,162,100,181,173,193,56,222,175,69,194,162,124,115,234,76,6,195,45,179,159,57,228,78,180,183,239,183,107,144,196,25,25,73,204,17,225,149,154,187,242,23,86,194,23,101,71,13,88,97,138,237,243,67,57,61,113,50,4,222,146,112,83,111,16,9,68,104,31,192,58,132,75,46,216,79,22,133,246,127,129,57,74,53,162,198,93,118,129,75,15,53,44,174,225,38,128,227,47,11,134,222,101,36,80,31,197,187,74,17,14,170,73,173,214,146,203,160,161,212,246,75,104,97,248,232,138,225,78,19,60,88,215,22,210,158,143,105,232,106,119,137,123,32,139,197,90,40,148,247,13,36,94,7,70,100,42,76,104,203,209,232,29,237,75,196,170,114,154,141,116,147,11,66,48,207,203,176,138,128,129,44,42,208,154,162,249,247,167,31,71,164,149,0,79,250,199,88,4,99,34,125,83,255,151,87,181,185,207,226,163,242,8,89,217,126,214,144,189,164,60,21,213,157,173,159,200,223,127,43,65,81,99,12,94,191,64,2,12,81,36,211,29,75,47,228,169,7,129,48,239,87,225,55,43,22,198,167,255,33,182,136,166,144,155,188,31,177,204,14,85,80,148,67,143,164,184,78,197,58,95,124,154,120,21,60,33,94,182,114,215,209,127,207,165,180,156,215,132,43,75,213,255,164,158,136,6,135,133,126,53,145,169,161,137,209,246,193,208,163,0,78,61,238,9,97,61,242,215,239,38,173,70,64,181,122,23,85,136,109,57,96,118,33,48,35,48,147,170,250,84,255,165,186,140,129,234,34,7,246,77,79,7,13,32,85,89,12,218,125,42,253,213,189,23,115,188,84,222,46,86,71,78,199,173,28,234,38,55,86,210,117,219,127,42,207,195,158,168,73,105,49,220,90,44,104,117,121,149,157,250,140,62,154,123,206,221,76,136,62,50,211,91,5,109,68,118,219,89,144,188,216,230,115,254,115,125,166,225,206,254,43,158,111,103,193,81,65,33,58,163,216,28,19,3,252,76,67,21,119,12,20,233,161,44,5,32,181,42,178,76,211,21,188,53,30,5,241,112,245,44,143,52,127,249,203,125,46,221,119,240,244,207,80,207,251,132,99,42,115,98,122,251,4,207,221,193,27,116,73,47,41,202,97,65,134,111,156,8,116,27,88,158,160,44,85,4,7,126,226,198,239,208,181,160,129,74,133,63,169,86,223,16,209,190,102,119,39,67,225,237,141,96,34,13,72,130,107,44,251,101,191,53,254,186,211,149,79,48,120,239,6,243,105,29,7,197,97,132,190,7,250,25,41,82,243,34,204,69,87,17,192,157,205,92,63,171,126,46,226,26,33,112,79,115,156,161,164,74,183,250,131,96,111,67,204,182,24,202,114,161,133,16,139,145,107,78,105,185,73,144,13,10,101,74,140,49,29,59,60,143,224,48,255,191,17,171,206,27,138,134,188,55,152,50,202,24,163,106,13,201,97,54,29,207,97,165,150,55,92,38,74,139,55,240,105,192,138,80,250,135,154,210,254,71,42,191,201,204,229,126,155,20,227,21,112,58,243,9,73,20,240,189,118,186,42,180,70,148,228,116,169,39,211,253,155,191,91,46,162,143,52,235,179,102,165,14,5,49,233,40,90,195,218,201,123,13,10,123,64,189,59,81,26,85,137,248,226,242,179,132,81,246,90,45,38,170,78,162,75,230,51,187,150,216,250,14,25,143,162,124,236,119,139,166,142,242,179,157,128,104,156,37,189,68,205,61,166,253,213,140,122,139,34,5,55,155,165,132,171,17,106,126,24,215,9,181,94,236,207,165,221,0,74,114,93,158,236,181,122,241,33,228,105,94,142,246,181,198,241,21,215,135,173,218,253,100,60,154,254,214,116,123,239,188,75,246,235,151,84,114,233,13,10,136,218,217,156,97,15,244,162,158,159,16,187,62,49,254,81,114,42,172,65,181,171,242,220,50,34,177,180,116,2,34,50,59,13,10,23,90,91,75,160,165,4,100,251,151,0,48,125,109,220,95,137,143,91,243,13,188,238,192,239,24,161,28,167,149,153,3,7,40,179,47,252,203,3,221,114,150,194,124,24,204,4,7,114,37,197,231,170,15,21,223,184,59,32,52,4,150,20,244,36,243,251,72,53,153,216,168,13,10,1,7,118,123,231,160,234,55,254,132,171,56,245,134,75,23,106,226,151,17,109,123,255,53,14,240,135,187,25,234,102,179,29,42,130,120,24,24,171,104,179,70,122,80,192,81,163,253,20,56,1,228,104,68,49,243,37,240,226,174,64,195,150,18,247,173,145,26,53,173,236,206,6,84,56,157,59,205,41,151,255,149,163,71,98,65,26,114,22,92,9,68,21,53,140,169,186,251,47,51,132,7,190,29,121,30,107,113,117,117,86,164,77,116,75,181,58,38,95,24,125,81,86,218,97,213,66,138,83,153,100,83,184,205,243,57,42,126,137,163,1,209,192,55,56,151,85,231,216,154,128,226,154,215,160,12,131,212,162,75,253,34,134,91,6,149,235,247,83,135,56,9,149,71,68,152,203,170,14,104,67,143,65,238,169,93,119,246,97,78,40,198,76,176,64,9,107,202,60,68,135,33,219,254,104,206,221,224,154,138,155,56,96,158,220,40,221,182,195,58,244,34,52,217,239,88,4,100,241,80,226,159,131,62,171,173,253,154,155,100,161,112,0,242,14,26,173,22,207,13,251,203,245,4,131,194,142,19,19,12,226,244,232,121,119,119,0,31,2,163,223,84,190,13,10,252,148,118,46,142,49,147,184,132,163,237,149,206,218,162,45,128,50,185,138,128,226,117,150,134,131,92,239,40,229,37,16,77,26,167,231,208,133,4,1,23,108,182,147,66,110,64,54,157,57,42,113,64,192,164,116,15,92,88,215,229,9,143,178,30,197,97,37,54,50,30,240,87,81,165,19,235,7,222,124,139,154,102,142,74,210,179,64,57,184,71,203,37,147,197,200,102,199,25,161,24,75,243,15,151,158,49,126,98,251,75,214,230,243,53,242,242,124,75,141,253,233,159,76,144,239,139,117,226,158,64,82,219,15,205,92,199,182,76,152,84,201,36,99,64,181,222,111,217,182,215,205,28,139,8,46,129,238,8,232,9,60,20,223,212,92,71,11,247,135,90,116,82,178,95,109,134,168,6,239,69,61,96,108,180,111,166,61,148,86,249,154,23,171,109,152,164,195,43,7,179,185,111,16,254,175,201,151,161,39,27,84,171,73,67,11,218,181,135,27,172,115,79,69,211,204,165,31,82,66,158,83,147,74,118,243,196,22,9,218,156,70,109,137,53,27,168,248,182,120,109,99,117,227,32,218,41,151,214,201,81,138,112,33,5,219,109,145,226,188,9,94,87,44,157,103,12,241,159,8,136,207,28,36,46,210,37,227,101,59,42,78,7,130,11,129,5,18,123,240,78,33,151,165,127,236,180,98,129,13,14,244,21,56,147,198,255,146,236,218,180,124,217,27,219,6,78,26,160,109,182,210,3,242,200,154,9,21,62,13,143,129,41,74,137,187,131,85,224,21,78,182,216,200,115,176,73,210,236,153,140,35,32,219,166,42,71,106,164,35,5,168,55,238,71,117,113,15,170,67,96,9,205,228,137,84,252,8,143,184,151,229,101,165,223,40,181,115,48,221,235,20,151,19,141,167,83,162,8,138,250,144,241,108,105,14,170,178,183,30,229,249,84,144,229,196,93,46,47,243,76,192,236,205,148,237,9,25,0,149,192,242,38,39,37,97,211,73,173,242,161,245,235,227,236,35,251,109,67,67,46,13,10,203,56,195,148,133,150,180,188,254,102,92,52,28,224,6,161,151,158,137,39,52,100,5,188,121,31,8,63,164,164,160,20,167,8,41,175,153,245,74,219,116,45,36,161,191,129,166,214,41,134,220,104,241,242,41,246,246,209,191,24,180,82,154,84,91,32,168,230,84,191,65,23,180,8,182,184,111,15,138,94,233,63,33,33,94,230,158,187,152,203,120,58,135,132,238,59,239,75,51,157,132,57,163,94,220,254,152,154,15,71,39,107,119,35,19,64,135,196,76,68,77,208,212,164,28,98,193,8,224,217,94,173,143,163,13,144,168,216,127,154,16,134,243,17,131,228,122,84,74,169,198,183,198,49,188,35,179,228,222,107,208,82,49,72,146,111,24,252,232,167,132,28,115,180,118,250,193,246,125,35,148,244,101,225,223,37,162,236,20,93,255,21,184,49,149,48,37,26,241,129,83,175,252,21,81,215,179,129,205,77,25,171,160,180,151,119,155,66,2,184,43,244,172,191,76,210,76,158,18,246,5,13,200,69,174,216,11,237,240,176,178,40,2,206,137,53,119,6,64,111,213,242,106,49,181,108,54,136,22,82,170,52,208,163,31,96,232,68,80,212,146,153,38,13,112,201,120,104,156,236,171,25,111,51,210,32,39,145,66,255,57,61,48,172,143,143,149,162,40,19,23,246,76,253,64,42,104,175,87,49,114,204,92,107,172,197,77,254,37,244,38,6,204,111,247,127,21,226,221,66,231,202,159,239,228,13,10,89,233,254,153,11,45,222,80,116,60,194,13,10,22,160,86,248,0,34,188,109,50,198,201,243,149,153,182,105,121,111,244,239,140,13,10,41,44,21,141,255,135,39,68,234,30,46,210,75,197,248,14,79,42,57,228,93,47,202,209,217,243,170,237,42,58,34,59,153,76,85,219,216,124,232,199,8,110,136,161,241,18,116,71,52,179,58,112,125,247,172,240,95,116,215,69,69,90,200,216,51,147,135,13,10,46,252,33,25,63,244,227,16,75,137,182,127,117,114,89,165,211,42,144,118,48,82,115,27,84,159,201,23,151,74,242,94,195,51,102,173,234,24,9,182,162,117,105,235,208,103,56,251,137,30,231,23,140,69,170,70,195,151,20,11,122,228,114,133,93,131,112,251,105,108,72,227,216,209,247,195,189,173,78,0,189,208,151,2,188,60,154,45,117,108,52,75,40,97,107,163,73,251,158,121,216,177,161,40,22,4,129,197,3,233,248,136,95,187,111,250,121,143,191,93,209,128,155,4,200,86,70,230,111,12,52,111,215,212,102,184,62,101,164,135,220,62,75,21,191,210,4,181,115,169,241,198,201,73,211,115,72,58,21,32,235,199,13,254,224,161,227,131,240,97,217,71,81,170,20,143,219,121,241,174,242,18,247,222,253,198,244,31,51,72,112,53,88,241,108,69,253,11,67,146,180,23,207,193,178,29,92,78,209,124,71,112,150,206,207,142,231,134,136,215,7,78,48,155,233,181,202,104,26,16,152,21,142,92,220,22,84,117,155,170,5,130,199,195,98,236,170,0,229,1,145,19,108,251,172,252,16,71,44,227,76,50,93,117,155,43,242,109,126,6,151,175,13,10,117,36,119,178,155,13,9,236,49,149,8,255,230,144,248,70,252,162,157,127,127,38,86,102,215,87,155,126,143,26,206,9,134,140,253,199,173,146,231,26,155,39,62,2,155,124,39,129,100,244,43,6,127,73,199,200,186,58,196,215,5,222,131,232,92,162,17,119,243,143,95,30,154,202,111,144,191,56,216,95,174,50,78,26,46,179,117,141,228,62,13,10,145,13,182,205,58,121,70,196,254,95,171,166,242,242,17,244,47,16,168,211,225,247,166,188,108,185,41,123,163,59,4,118,55,97,130,183,139,92,245,136,253,195,117,116,203,111,230,96,166,208,197,79,180,144,134,251,84,134,74,192,8,164,127,103,38,51,41,93,96,206,210,255,154,118,248,170,188,196,196,5,125,17,92,14,233,71,78,124,230,175,142,92,154,207,48,202,248,210,108,253,161,106,94,154,183,235,180,13,10,158,169,52,170,235,204,29,2,209,94,95,234,5,11,243,219,224,163,9,166,187,56,115,150,37,30,54,39,21,86,197,3,249,209,153,142,205,156,154,184,182,232,140,126,31,50,89,108,225,131,195,230,200,113,155,204,4,148,165,114,48,231,250,94,249,183,133,34,144,19,143,96,34,246,211,0,78,40,174,81,234,177,19,192,153,237,228,171,109,115,170,31,141,213,164,255,187,136,214,146,176,23,227,19,75,85,203,65,108,113,1,62,58,127,4,146,167,121,207,44,208,48,130,238,100,61,37,56,224,147,236,146,173,113,204,153,160,198,178,122,229,2,61,151,13,193,169,153,37,229,235,76,168,213,216,62,177,61,46,248,125,102,19,196,77,96,210,159,140,46,166,176,192,178,78,120,110,13,10,234,214,182,69,203,182,225,28,150,226,212,108,115,222,56,120,98,53,213,109,182,188,43,120,109,157,216,225,220,60,139,44,46,130,142,224,17,161,248,22,218,231,140,231,252,205,238,33,2,87,15,169,134,232,94,85,129,177,168,184,237,141,107,217,138,15,228,140,152,176,239,20,241,210,77,76,130,191,138,71,178,76,124,171,193,211,125,38,236,83,122,171,107,55,81,221,143,1,129,172,8,27,160,177,254,39,58,193,225,155,80,140,101,212,7,185,198,97,212,110,100,1,165,115,199,173,233,166,246,72,93,85,218,39,135,231,159,224,140,20,63,217,210,167,70,2,79,164,39,60,234,255,64,233,182,200,160,16,81,244,130,136,91,184,206,70,228,210,58,235,136,177,102,47,163,109,191,65,254,112,150,130,114,57,244,39,190,239,196,196,78,20,229,70,239,82,189,77,104,90,180,230,4,0,20,241,165,42,94,113,162,85,6,245,162,22,51,1,250,95,102,25,210,101,77,176,58,144,198,132,255,169,123,188,173,70,119,94,13,235,234,15,185,8,240,136,70,197,155,149,20,225,91,140,73,185,83,230,67,244,81,210,75,15,21,187,147,16,214,114,227,216,92,93,126,203,4,57,140,241,119,138,108,37,198,76,19,71,9,50,200,81,29,119,66,119,31,164,14,94,189,180,56,84,56,6,76,157,251,183,149,168,224,85,132,57,217,112,148,134,78,240,140,130,154,148,196,151,131,151,169,1,27,12,204,169,212,42,41,228,59,119,17,138,236,148,132,145,188,185,212,118,50,143,173,254,5,130,58,244,137,74,119,234,235,88,67,35,191,37,48,251,181,160,13,48,119,47,191,151,8,25,130,193,90,49,40,82,119,13,171,125,155,193,154,183,74,77,107,118,83,122,239,106,200,104,38,206,188,195,167,127,170,244,35,141,251,4,160,47,40,138,99,196,243,144,92,8,78,76,208,255,53,13,28,239,172,233,43,225,149,145,142,195,50,200,105,169,205,160,141,59,115,162,33,206,153,170,215,90,219,241,149,159,124,16,111,221,152,20,37,223,156,192,170,60,21,60,45,166,121,239,52,143,19,80,196,106,183,79,16,85,55,153,31,0,230,142,4,100,145,94,79,83,112,7,82,192,11,114,65,16,178,97,109,71,114,6,239,196,23,236,35,15,123,95,21,143,91,112,110,39,49,140,219,1,87,8,150,220,223,254,240,115,251,155,202,203,35,212,186,238,149,57,127,14,152,227,152,97,223,71,165,203,1,33,172,194,39,213,210,171,140,254,4,165,222,32,161,114,225,20,236,166,154,61,253,243,134,240,166,63,126,106,137,36,135,77,230,143,212,210,224,84,23,165,72,199,84,236,213,149,66,211,93,69,173,252,210,150,248,141,204,82,160,158,185,231,116,63,136,235,115,24,102,172,221,79,210,242,238,4,19,97,66,229,126,194,147,76,95,111,205,166,125,39,26,3,63,161,216,142,183,148,73,33,111,205,61,45,231,26,49,46,220,255,255,156,5,96,69,160,54,159,247,51,135,20,63,245,126,48,109,153,172,221,182,220,48,143,249,165,179,138,144,189,139,109,156,122,128,43,110,17,13,10,195,146,174,216,216,188,175,166,49,92,253,232,202,7,54,222,163,55,171,86,145,1,183,9,133,193,63,213,152,21,179,210,39,216,4,1,36,23,205,75,218,155,52,248,241,13,10,201,222,223,77,138,219,48,238,175,3,9,86,215,71,245,139,54,37,29,242,119,172,187,25,229,212,54,52,152,58,90,22,94,83,130,113,174,53,35,194,75,95,117,138,221,165,99,5,255,251,122,176,98,21,225,206,4,27,8,123,179,246,120,248,35,172,232,226,177,208,187,144,111,95,64,64,128,30,103,107,225,218,195,106,198,123,185,240,164,92,102,56,33,109,48,131,76,1,111,191,99,115,26,249,60,96,161,70,146,191,195,239,142,247,94,237,60,172,220,134,63,97,154,123,189,206,68,1,203,30,95,76,200,48,30,175,38,25,159,211,23,29,151,124,55,218,222,39,38,183,241,140,118,141,237,137,82,15,223,41,52,9,210,9,16,113,185,204,203,64,13,10,108,118,84,34,53,205,64,249,233,53,187,170,218,192,66,67,187,66,52,48,227,204,4,37,151,148,214,80,127,220,120,210,52,146,128,41,120,106,105,130,40,173,44,121,113,108,178,176,162,9,116,179,105,106,120,233,150,86,111,248,232,188,212,124,215,12,172,155,128,182,245,173,202,254,8,60,242,154,65,167,183,97,100,172,65,127,219,102,12,242,230,4,38,125,51,33,171,83,31,156,180,52,92,197,69,188,54,220,52,228,118,169,132,83,219,206,202,152,247,117,107,88,22,143,159,251,87,83,126,216,55,30,27,239,167,181,55,233,28,29,17,69,175,65,96,229,105,26,50,162,31,160,17,90,158,247,81,177,99,88,182,72,103,96,1,42,223,36,237,48,246,97,3,177,138,47,112,81,192,28,209,162,224,78,90,188,121,192,153,88,176,139,49,76,106,151,138,203,27,136,5,7,87,125,2,217,79,119,83,183,161,242,33,199,227,243,178,165,170,150,213,241,142,191,242,119,26,85,237,58,41,45,8,157,133,97,108,53,240,184,13,10,47,123,73,157,136,242,0,223,68,178,218,114,231,153,93,49,254,56,172,34,64,238,218,212,5,148,20,55,46,101,155,202,117,23,196,204,255,125,138,249,47,137,3,66,241,3,25,21,111,249,179,60,143,220,246,247,84,222,251,197,139,116,53,215,25,34,108,123,249,189,228,198,71,189,211,177,241,66,97,55,155,67,40,253,27,250,175,47,122,128,52,191,191,69,15,92,95,117,69,11,193,163,153,36,78,143,14,255,177,84,113,11,133,4,111,25,123,52,122,93,71,234,151,208,28,107,128,184,225,71,21,156,194,185,111,99,23,216,195,244,101,78,89,40,50,143,184,68,198,174,187,196,135,37,127,171,194,207,118,211,95,124,119,183,238,123,160,53,136,141,200,161,21,113,33,11,162,180,108,194,3,101,100,46,63,116,35,189,252,226,151,208,131,170,63,50,125,151,1,241,79,166,73,248,118,147,31,22,52,76,232,200,64,212,227,129,237,243,184,21,52,136,135,253,96,124,67,115,209,135,235,134,44,212,189,21,11,100,137,163,113,140,13,10,203,219,60,93,204,233,41,163,200,208,115,183,76,130,220,253,215,172,49,60,93,195,160,248,4,63,142,188,235,164,52,227,121,85,142,232,140,249,206,29,145,202,89,143,76,218,162,148,63,231,109,154,174,57,8,127,134,118,151,50,176,21,28,42,236,207,29,90,114,137,98,73,173,213,45,60,148,211,22,234,193,33,209,35,93,214,96,246,66,118,124,20,139,64,17,188,45,139,87,211,163,187,101,77,35,199,100,96,201,167,130,62,103,204,6,88,217,165,30,79,212,254,49,240,55,211,117,3,144,17,173,76,95,34,152,110,92,182,61,2,54,49,184,61,248,0,146,70,165,136,25,62,226,181,98,255,226,234,44,39,19,148,109,47,71,159,190,220,234,151,225,169,128,103,27,58,43,252,142,40,117,85,43,62,183,113,234,15,118,223,79,202,21,15,33,226,217,130,187,31,62,133,199,122,227,7,108,115,111,78,32,221,249,32,183,208,208,145,150,213,247,38,139,131,180,246,87,109,8,37,144,198,41,163,116,230,233,53,136,112,144,116,119,218,45,184,31,173,130,164,72,122,92,207,90,193,134,42,187,201,133,25,17,53,116,165,176,104,189,188,19,135,130,51,55,138,212,237,192,33,193,158,227,161,59,187,9,36,142,180,49,4,94,237,208,139,149,238,5,213,17,6,176,255,197,139,255,156,167,124,210,99,8,196,208,63,64,24,128,158,134,128,188,217,13,245,130,51,33,214,173,119,61,193,240,99,243,123,130,252,39,190,80,93,18,75,117,229,146,65,237,12,255,94,161,216,29,69,233,224,52,92,46,109,153,21,182,51,5,177,51,172,122,55,15,139,109,211,113,213,7,30,183,34,204,50,204,45,163,224,139,178,23,177,71,97,202,232,1,107,187,245,101,240,38,149,94,235,61,52,36,57,199,244,7,44,4,232,107,113,21,197,36,207,128,34,237,1,230,72,150,3,255,13,147,76,187,89,251,243,44,137,204,178,223,243,43,82,90,178,177,211,200,30,132,188,195,126,50,78,254,94,245,128,223,233,251,77,98,145,119,199,130,5,227,250,240,64,214,163,12,181,12,45,136,160,121,11,182,45,85,95,53,100,24,244,199,93,254,106,246,78,197,139,201,5,66,83,240,203,193,123,230,108,61,45,91,80,89,117,49,17,189,104,178,60,81,191,157,172,226,251,139,137,104,62,130,142,118,24,97,8,76,13,187,13,10,251,29,41,146,139,145,12,16,49,23,145,116,114,49,196,168,135,236,211,185,146,13,69,61,238,38,80,52,110,60,81,125,101,100,194,204,190,242,27,59,16,99,209,246,255,92,144,69,12,11,75,0,208,125,27,218,194,246,71,41,187,100,195,192,28,61,243,255,183,108,231,49,25,70,164,235,172,73,121,126,14,82,237,22,78,38,140,146,220,75,229,22,155,194,147,122,242,177,238,165,136,147,89,158,220,133,112,227,92,42,127,37,174,248,204,160,17,180,195,149,62,81,0,126,233,194,104,254,112,223,110,14,184,244,18,161,224,116,120,119,246,35,91,81,109,122,182,139,2,159,143,67,105,236,232,106,119,27,137,233,139,190,242,180,60,246,153,69,192,30,246,14,46,52,9,47,197,251,43,20,109,140,29,186,131,184,114,187,218,149,132,45,17,172,199,13,10,85,29,142,149,81,206,160,24,218,248,191,50,146,120,90,155,255,96,108,31,115,92,244,58,189,15,100,25,207,117,146,158,254,69,171,102,82,166,49,69,119,9,32,247,57,129,76,6,185,107,21,145,250,100,126,146,197,99,3,174,90,130,161,114,252,157,78,185,54,235,166,36,208,22,88,12,201,140,64,169,167,186,169,222,228,148,103,21,171,253,215,153,147,86,184,204,57,234,220,0,244,42,173,192,177,110,23,140,46,102,61,162,244,100,193,128,150,68,171,23,150,235,130,144,247,6,132,166,23,107,8,20,230,137,13,166,148,103,166,63,116,220,104,126,13,208,249,167,161,132,133,209,166,133,9,124,50,132,129,34,199,162,17,194,218,114,132,82,0,193,190,99,253,13,10,242,220,138,16,181,200,128,112,77,51,151,93,204,252,160,80,240,212,90,173,152,127,183,250,98,156,194,125,254,144,236,225,245,82,234,229,70,202,139,46,228,125,158,52,157,163,46,14,11,20,83,230,60,239,231,2,34,52,153,63,130,227,5,110,4,95,174,217,87,18,38,29,51,41,123,207,169,207,17,118,141,129,22,209,67,230,83,198,79,232,152,39,144,134,71,199,177,148,64,46,203,72,167,50,231,64,36,247,74,172,51,207,246,236,156,151,223,171,170,247,53,173,86,69,181,34,48,40,104,140,91,248,186,223,156,246,81,155,111,8,7,99,252,196,170,171,141,74,98,149,225,231,247,58,6,166,219,63,210,134,236,99,57,40,162,189,211,49,120,57,218,185,138,133,29,223,45,140,94,115,92,141,14,255,4,98,58,156,178,103,155,92,248,70,46,237,251,169,195,114,246,74,249,164,200,0,59,102,168,21,241,79,215,204,255,20,173,26,156,221,209,175,128,5,197,32,221,224,168,237,160,7,164,74,170,219,130,236,82,180,219,49,195,215,177,37,45,46,127,128,70,26,169,71,158,157,242,221,55,31,241,202,144,176,35,148,84,188,209,213,203,75,96,178,118,33,231,116,33,155,94,84,14,6,216,99,19,85,183,221,38,32,187,28,182,67,211,135,216,128,77,84,248,247,175,60,218,220,226,254,109,171,60,237,166,116,211,175,4,53,210,151,150,208,164,95,13,156,24,203,230,65,75,156,213,227,108,174,62,188,55,206,21,173,92,170,156,104,202,107,30,38,229,205,42,146,195,244,47,65,1,172,75,105,13,254,194,144,176,200,105,155,3,174,145,159,142,83,90,208,126,182,9,200,167,172,18,198,64,231,44,114,115,207,43,255,106,89,115,93,59,17,174,144,110,131,219,234,39,12,107,17,234,131,7,143,129,15,160,70,3,166,176,217,114,118,231,173,119,40,253,78,153,235,57,18,7,59,6,118,73,17,96,1,139,0,138,252,128,109,189,108,152,146,21,244,110,125,4,169,97,86,242,89,160,74,77,68,177,233,41,95,71,30,9,33,223,198,26,99,30,45,112,140,49,135,23,88,3,248,4,246,251,17,151,51,168,90,195,80,105,62,52,250,234,204,75,188,93,9,28,56,250,180,70,233,19,159,98,124,56,82,45,171,145,100,83,63,175,206,131,248,17,24,95,38,142,48,236,67,255,70,229,107,0,67,149,143,82,241,68,3,86,180,73,199,128,219,121,108,38,149,190,253,254,190,146,134,144,204,225,182,165,48,176,66,123,78,51,137,16,13,200,97,165,14,29,158,4,191,113,180,157,144,27,11,157,59,236,190,204,51,239,60,131,238,121,102,56,124,100,0,130,153,172,222,178,241,13,60,114,245,65,125,27,84,16,79,152,233,168,90,46,105,63,119,176,46,103,110,218,72,97,250,131,6,151,204,55,207,16,235,182,23,207,54,195,106,169,247,111,221,69,252,197,193,149,234,133,85,163,115,195,53,164,22,152,231,79,0,183,182,181,202,142,22,249,54,191,12,223,190,186,44,244,107,22,250,55,19,215,145,57,31,56,229,177,154,82,174,88,56,71,117,204,163,210,209,252,203,134,116,6,22,252,52,204,141,131,233,129,50,145,51,87,71,69,112,50,232,249,137,187,18,91,7,117,187,80,22,11,59,160,4,31,103,18,226,39,114,25,115,50,87,179,233,120,126,70,46,232,77,251,107,8,91,237,33,104,100,85,111,71,182,61,90,177,12,70,218,192,115,187,143,194,37,93,194,185,144,44,15,216,42,54,219,189,53,193,5,101,18,156,239,114,142,252,30,96,115,74,110,223,197,88,221,60,230,128,211,71,115,88,12,235,173,146,123,154,132,150,158,81,230,61,103,212,27,67,31,3,76,81,118,59,204,69,143,67,127,86,152,79,29,72,160,148,186,87,147,62,129,159,0,55,197,6,190,249,238,53,51,175,136,6,20,51,157,226,44,136,212,22,87,93,84,5,227,254,31,57,44,163,161,136,207,111,33,24,69,21,18,77,237,198,242,47,181,3,3,128,159,17,139,125,243,56,72,90,75,200,7,115,113,63,76,49,107,34,190,27,140,28,180,162,129,25,57,142,242,221,41,232,9,122,249,248,52,21,168,201,75,40,29,95,129,37,236,182,86,250,157,196,175,63,191,186,246,242,36,231,36,27,29,98,232,66,217,207,27,96,210,119,186,121,69,65,48,156,38,164,71,233,95,233,196,169,229,74,108,129,248,221,32,25,72,70,51,221,152,203,160,40,187,108,106,227,86,29,3,235,173,198,251,120,115,46,28,168,23,225,43,106,207,70,226,20,42,174,47,136,201,201,195,92,246,100,30,186,255,112,148,77,88,123,58,132,168,159,200,214,175,107,96,220,150,39,209,175,36,229,109,83,25,143,113,188,227,83,211,219,210,110,84,115,214,12,165,37,75,50,117,96,0,175,3,44,4,150,129,13,155,183,239,142,131,93,232,241,162,214,121,164,236,93,216,99,165,163,181,208,9,221,219,9,100,165,19,136,85,112,2,49,51,169,148,176,4,113,1,145,124,186,222,146,110,145,223,52,176,92,238,4,60,197,133,83,207,207,205,32,227,131,131,23,74,124,226,123,227,55,22,21,65,241,27,255,107,169,197,231,96,246,69,239,51,150,61,148,220,201,19,223,0,174,50,112,92,251,247,161,179,149,53,76,235,176,117,231,118,124,243,79,136,82,231,193,153,144,64,122,142,150,238,245,157,34,31,211,61,204,113,85,77,168,170,71,46,211,105,216,104,92,245,120,0,117,223,64,244,84,68,74,121,235,78,117,135,132,169,20,173,83,187,79,233,85,154,28,122,137,119,58,156,161,130,87,254,104,206,145,207,203,184,43,78,213,118,108,180,101,43,179,198,69,124,127,246,157,171,118,77,82,153,97,75,192,64,68,9,213,6,8,142,18,165,206,62,156,127,74,165,106,78,199,235,230,167,134,122,12,20,102,101,83,30,88,205,205,54,102,250,150,84,250,158,69,53,181,207,96,1,110,22,31,85,232,177,74,185,178,168,58,87,172,221,233,142,242,178,207,32,194,117,172,191,207,68,117,160,188,204,163,20,67,254,50,119,162,64,211,61,20,164,83,178,20,50,199,151,60,162,65,145,9,211,134,186,114,52,159,74,100,24,68,225,143,33,7,236,189,210,190,99,113,207,84,121,176,33,88,101,127,145,0,107,174,171,92,228,2,152,240,112,49,22,144,110,218,189,24,209,173,103,221,130,12,207,50,43,39,209,1,72,245,174,49,110,214,206,33,170,80,202,6,168,240,159,224,211,233,171,217,21,173,1,76,123,35,127,162,32,188,23,151,8,199,11,173,203,127,236,133,15,81,247,233,112,82,13,10,220,76,61,231,145,75,213,190,188,167,194,132,9,37,185,125,54,89,13,10,121,51,164,67,37,177,104,153,158,49,235,223,225,152,57,76,134,82,115,157,159,154,110,84,20,196,226,13,99,185,103,35,118,55,85,95,41,51,230,178,4,163,65,44,193,150,24,12,229,129,75,1,71,194,136,5,105,200,95,238,53,215,93,88,187,40,219,242,211,217,3,147,225,54,170,142,57,253,225,25,105,34,146,2,186,97,88,35,226,219,183,180,137,18,151,71,171,203,177,26,29,240,196,109,27,98,198,206,130,9,198,66,114,13,10,127,69,233,179,110,216,198,47,194,53,126,227,244,124,194,149,61,189,173,181,163,28,72,253,177,1,200,68,69,148,23,137,97,147,2,14,88,150,78,17,119,110,88,224,121,117,1,165,202,109,130,43,104,212,19,52,23,13,161,245,114,250,121,4,226,121,173,207,184,236,155,207,170,165,96,42,155,251,222,221,189,173,221,237,93,37,219,187,40,152,143,177,78,195,170,161,202,236,187,13,252,32,71,67,6,119,203,53,25,217,11,98,50,0,186,63,67,113,251,99,225,212,72,232,97,197,53,171,181,134,130,31,2,67,250,233,119,59,28,95,192,195,230,107,7,110,119,124,226,76,12,59,182,70,177,42,220,21,191,198,41,83,22,73,158,56,253,148,223,44,193,108,64,178,217,231,246,49,152,213,103,94,176,202,182,157,126,233,43,27,251,159,106,135,51,151,140,246,140,107,195,233,212,249,104,145,129,139,141,8,228,44,173,161,218,231,174,88,237,16,172,82,161,247,66,188,190,102,172,33,162,123,204,215,210,75,69,71,203,162,39,205,13,153,157,136,56,209,98,237,5,2,8,185,177,37,24,204,42,170,179,241,115,71,50,174,20,77,103,19,172,16,32,252,103,34,107,208,236,35,176,194,123,171,144,143,50,117,216,234,39,250,164,230,217,89,166,139,21,62,6,136,181,199,168,209,85,136,110,109,70,142,242,186,203,129,9,166,154,210,214,209,78,149,90,228,181,212,195,47,223,110,74,57,181,60,12,87,38,233,134,212,97,16,26,177,200,251,146,188,80,86,137,116,78,211,94,194,186,103,232,217,232,22,108,234,125,192,221,246,16,102,252,187,240,108,223,31,201,129,49,146,73,249,165,236,195,133,76,188,163,18,64,1,50,76,92,67,70,77,153,76,29,59,45,1,30,129,118,69,190,76,65,72,19,25,22,188,77,24,80,241,157,133,75,49,139,117,166,166,234,46,248,76,47,241,120,73,1,5,207,128,198,24,193,129,79,17,46,184,191,6,174,207,146,6,153,127,77,97,244,201,9,17,157,182,68,56,195,7,122,36,40,190,179,250,230,240,119,50,247,53,130,121,254,12,247,30,228,128,207,228,32,132,37,201,35,103,38,69,89,165,132,135,96,188,184,204,246,202,113,47,106,202,77,119,36,186,228,61,107,226,203,148,192,35,230,24,106,66,4,96,25,119,28,136,165,175,142,177,89,108,19,224,40,4,196,254,27,31,86,85,120,107,182,239,219,112,90,2,255,47,1,138,30,14,53,86,49,235,132,103,245,96,27,246,40,23,223,214,87,182,140,90,57,130,52,123,246,229,136,80,207,150,90,33,239,134,131,231,228,70,31,16,184,90,104,202,21,115,105,149,89,242,216,168,158,13,143,60,153,246,25,153,120,216,89,252,237,158,97,66,152,201,127,246,110,23,65,86,110,197,214,91,159,12,56,246,48,91,189,140,68,163,154,123,2,6,153,0,95,108,13,16,117,152,38,221,143,239,215,169,199,42,111,69,103,95,128,12,214,108,81,133,253,119,180,207,159,146,101,140,112,19,52,107,3,100,21,36,154,98,1,53,142,236,234,68,240,252,78,252,81,1,21,131,98,201,210,210,147,125,234,8,126,224,14,177,21,94,132,248,252,22,33,247,36,59,90,7,175,2,214,251,109,150,14,155,153,6,126,84,35,92,36,30,54,86,98,246,68,124,38,235,109,233,13,7,123,11,82,254,24,79,69,177,35,240,29,81,177,202,167,74,226,149,141,154,228,151,168,157,63,251,181,200,199,94,68,43,111,167,192,249,137,243,27,63,199,161,234,155,164,131,65,108,13,10,7,210,59,130,6,224,139,255,190,61,211,254,48,153,95,163,12,220,138,4,105,171,20,188,131,91,197,250,107,121,185,109,203,128,87,55,254,59,238,77,50,238,4,249,13,10,187,41,154,52,63,172,65,253,36,13,10,82,114,100,23,137,61,193,151,214,182,201,123,70,185,115,79,238,91,142,42,33,64,110,197,134,137,146,78,42,101,26,2,198,215,85,141,156,135,47,170,183,66,144,34,51,98,167,113,253,43,137,63,96,116,13,53,209,89,3,104,211,44,167,234,116,106,122,60,76,114,107,195,82,209,24,53,28,147,188,122,37,4,62,162,151,214,150,25,65,21,250,233,42,90,243,111,38,163,167,59,196,19,72,252,122,179,9,211,83,136,214,117,236,97,24,248,184,159,45,147,95,79,102,85,180,39,133,252,236,35,74,41,238,47,192,28,37,145,151,194,30,66,120,155,41,45,72,0,246,236,150,245,8,43,141,70,51,180,40,167,110,114,131,150,78,212,147,184,118,251,217,200,59,55,171,197,248,196,52,20,202,42,6,147,96,93,19,238,61,97,55,237,160,43,214,169,7,173,209,101,160,193,226,197,110,165,200,248,34,197,51,146,218,166,95,12,133,221,112,0,107,70,15,112,110,197,103,139,67,150,40,180,174,92,181,160,163,242,149,185,232,246,226,142,204,103,105,217,136,137,69,87,175,52,133,239,3,103,21,17,132,219,95,160,178,126,238,176,107,152,161,185,149,186,181,196,193,67,158,254,198,227,167,20,113,119,236,52,86,132,51,245,79,87,154,6,216,49,73,154,132,34,203,145,118,134,189,88,199,67,214,85,214,241,96,127,40,29,250,21,122,151,22,95,186,159,102,229,15,189,232,33,155,65,12,162,115,52,25,138,229,175,32,17,227,232,11,75,15,194,132,55,115,203,181,44,194,6,189,148,215,116,119,182,188,60,52,74,242,219,178,111,9,131,152,255,20,123,48,186,166,42,239,153,252,247,143,253,147,218,178,252,162,35,86,230,29,3,47,28,40,224,166,158,61,224,132,40,203,249,21,143,176,32,96,115,168,246,143,146,255,25,251,91,122,136,152,247,182,9,224,26,140,181,130,12,30,22,108,227,24,102,139,4,103,20,192,149,229,210,222,179,113,125,19,204,187,184,15,58,78,167,229,73,29,233,225,138,246,164,242,111,57,114,245,245,183,120,165,102,247,208,119,79,180,141,182,60,230,254,129,159,217,108,88,152,231,177,234,211,42,82,75,112,213,3,163,65,24,53,44,119,226,96,89,125,197,159,219,177,191,252,92,121,213,232,248,71,173,165,225,134,151,15,6,128,231,62,127,145,28,127,60,196,207,187,11,155,116,52,134,224,163,235,121,132,218,145,73,152,62,1,206,224,25,194,188,163,234,208,105,30,230,67,32,62,174,205,169,156,11,144,218,37,226,218,76,202,94,107,74,178,9,213,65,206,31,72,180,136,217,226,220,33,88,188,24,152,187,99,167,2,34,227,102,173,55,159,114,91,150,237,219,43,144,224,240,18,3,246,211,180,66,220,86,122,159,58,163,71,14,68,211,107,147,223,137,17,38,123,168,124,236,225,118,224,202,7,205,247,93,48,93,180,12,30,201,229,101,26,104,252,168,69,165,71,203,80,101,107,80,136,44,243,251,87,2,49,126,146,238,9,112,142,105,245,175,175,54,14,91,155,177,99,119,161,30,84,182,163,185,149,142,82,240,22,4,182,217,4,224,255,44,126,134,88,63,120,222,76,102,200,96,165,93,211,147,30,242,76,21,200,105,93,184,129,22,206,5,59,191,74,186,144,16,202,20,97,111,155,199,25,0,4,215,255,222,183,123,164,99,98,210,5,250,107,71,128,175,110,83,174,90,182,87,253,51,97,113,173,158,26,179,175,196,151,172,63,20,194,212,15,100,246,193,157,247,255,14,227,200,84,89,121,16,173,94,69,85,76,44,94,70,138,51,39,219,85,55,62,87,171,57,45,7,15,42,77,245,166,102,227,81,121,193,31,54,108,163,29,192,226,215,85,214,84,40,109,92,44,45,142,206,195,45,216,142,50,28,178,69,146,211,76,189,184,125,53,151,89,145,150,179,212,56,20,249,163,3,79,189,211,31,41,187,91,34,229,223,27,116,69,55,35,226,125,43,14,16,135,128,37,145,47,212,252,90,122,46,63,16,156,202,27,249,243,121,157,170,66,60,236,110,2,149,35,215,77,21,236,93,189,149,134,89,181,4,170,146,184,50,20,202,242,248,184,153,79,249,253,28,177,93,58,165,193,180,90,201,128,1,122,28,188,8,205,252,48,140,36,42,146,218,69,222,104,252,224,59,155,163,246,49,86,108,243,82,107,96,78,245,243,35,5,1,204,71,74,94,54,103,51,161,89,36,177,37,4,245,172,70,55,89,51,59,39,223,246,3,153,36,82,200,187,49,143,86,76,146,206,58,42,252,252,197,44,24,51,190,0,244,159,146,194,208,111,72,24,174,226,51,165,59,182,80,144,71,155,121,245,246,239,91,94,207,5,111,142,197,152,108,23,2,40,48,141,40,173,5,109,67,125,109,237,123,182,134,247,161,197,192,25,222,88,183,143,176,168,111,138,16,107,138,236,168,135,93,166,225,115,252,75,42,19,74,45,33,35,238,76,26,27,4,247,50,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen021003l=46198; +} +#endif //_PDF_READER_RESOURCE_FONT_n021003l_H diff --git a/PdfReader/Resources/Fontn021004l.h b/PdfReader/Resources/Fontn021004l.h new file mode 100644 index 0000000000..ac94474407 --- /dev/null +++ b/PdfReader/Resources/Fontn021004l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n021004l_H +#define _PDF_READER_RESOURCE_FONT_n021004l_H +namespace PdfReader +{ +static const unsigned char c_arrn021004l[]={128,1,105,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,82,111,109,78,111,57,76,45,77,101,100,105,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,32,77,101,100,105,117,109,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,82,111,109,78,111,57,76,45,77,101,100,105,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,54,56,32,45,51,52,49,32,49,48,48,48,32,57,54,48,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,51,51,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,40,166,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,109,177,127,174,24,153,36,3,74,105,110,242,96,21,168,227,104,167,145,102,36,58,89,186,60,156,32,215,5,177,140,184,239,7,107,120,92,77,167,32,121,146,126,28,254,177,114,48,213,232,103,30,90,98,32,141,249,204,37,102,37,59,219,107,214,129,198,185,11,71,84,78,125,102,82,28,241,180,220,218,225,122,154,135,189,235,130,135,151,155,79,30,9,108,211,188,184,50,237,95,182,201,241,145,134,186,205,159,156,242,31,219,22,0,189,172,1,251,186,27,81,41,64,100,83,18,88,37,80,19,100,169,64,174,203,101,139,89,219,129,18,126,205,213,57,204,43,1,191,50,227,152,24,198,214,129,119,65,45,155,34,136,164,205,161,153,206,21,21,250,189,110,76,179,90,248,12,197,146,209,104,237,129,161,65,129,171,2,186,73,24,237,242,102,87,148,35,20,94,203,103,18,183,48,119,195,52,137,129,148,246,183,248,61,244,29,108,211,93,73,16,253,198,34,211,109,166,139,193,20,94,56,218,38,155,136,147,156,49,121,236,180,41,34,252,129,8,24,110,115,227,109,16,117,195,52,47,136,169,179,189,182,8,132,184,50,151,239,255,97,152,197,11,214,26,180,184,37,139,26,114,79,127,200,108,220,177,71,198,234,194,64,205,246,179,220,97,253,210,228,111,167,0,32,60,93,187,48,100,196,81,180,18,188,234,202,208,190,222,40,122,79,104,89,11,121,147,183,250,220,243,253,203,120,93,152,63,67,229,0,126,230,126,78,151,61,57,196,143,248,47,119,2,99,211,241,240,25,231,103,34,9,73,197,0,185,16,87,131,103,181,195,146,196,153,65,101,118,5,227,115,106,49,181,178,233,19,56,45,236,133,146,222,107,118,250,112,184,141,137,85,28,185,88,103,116,203,151,100,24,87,132,206,205,190,51,255,25,37,26,4,95,194,229,81,204,113,67,16,31,54,67,87,49,145,145,242,30,49,197,19,11,249,239,52,47,104,86,118,180,2,248,59,5,136,17,219,114,12,128,44,227,132,27,172,159,73,130,75,8,247,166,83,103,27,12,75,128,167,248,210,33,20,219,162,74,204,86,59,113,35,216,177,122,20,108,214,188,191,210,221,16,173,55,216,169,39,78,53,94,23,188,15,191,206,141,225,252,197,175,99,142,4,57,196,250,173,6,224,152,55,83,187,87,176,4,46,179,169,228,248,29,58,100,215,97,228,155,22,168,83,179,225,210,115,29,3,167,150,95,41,211,125,96,89,238,89,91,131,198,30,236,165,133,3,15,254,206,175,177,236,62,106,102,55,253,210,142,151,121,15,240,1,187,22,48,56,41,229,175,33,72,84,243,36,1,200,144,181,204,80,125,229,100,111,207,251,29,30,5,231,52,165,191,0,195,98,140,174,165,138,79,58,41,233,117,172,25,66,140,51,251,46,192,117,5,118,243,98,229,255,102,51,23,199,36,75,53,84,1,136,29,47,133,170,142,35,5,203,255,185,171,176,163,209,137,182,225,28,82,110,194,214,244,109,243,98,202,119,28,198,146,201,55,86,129,22,180,127,130,149,4,63,45,178,134,250,45,229,160,20,30,189,52,79,22,176,200,244,156,18,68,78,166,94,229,101,209,21,2,116,138,48,46,196,215,186,116,109,148,135,155,28,221,137,212,79,155,185,70,68,195,225,167,84,4,216,242,141,163,41,212,71,59,44,149,71,96,230,158,106,161,169,140,58,184,182,122,157,164,58,179,101,200,157,251,169,96,205,181,237,97,43,49,214,83,150,2,58,72,237,191,16,129,177,23,155,203,142,248,239,241,133,247,108,146,195,200,73,78,139,97,160,230,76,48,150,199,127,84,231,86,42,158,166,254,157,141,202,241,204,161,148,205,67,109,222,129,45,7,245,129,144,76,127,79,195,86,142,73,71,76,119,189,133,63,113,118,39,138,135,103,242,160,59,107,83,25,213,7,103,162,13,10,244,36,209,105,121,24,179,206,135,192,160,58,194,143,13,10,180,216,203,41,72,213,171,86,242,74,72,5,234,9,22,178,51,36,41,201,102,26,154,162,40,66,87,72,24,216,226,227,48,98,27,22,44,210,172,87,198,46,206,246,138,42,58,81,198,65,214,5,30,71,235,231,146,187,11,247,159,21,173,13,10,97,61,218,12,64,86,228,233,18,207,253,146,56,96,125,163,116,248,18,106,227,86,137,237,62,135,37,168,115,215,189,30,207,23,90,227,58,200,193,178,215,65,220,157,195,247,111,69,122,229,55,15,220,248,53,90,187,162,33,209,87,65,90,203,184,102,243,20,138,226,42,77,190,198,225,232,167,21,146,180,33,103,179,227,227,162,34,24,167,114,8,163,106,71,88,6,136,53,75,11,109,225,185,254,145,251,168,236,208,94,210,34,11,126,89,28,97,117,202,148,178,91,136,182,168,89,108,241,1,245,64,253,19,240,53,15,154,151,142,236,80,173,194,199,106,156,137,239,216,171,60,246,60,149,113,173,18,111,74,123,216,202,29,146,98,27,41,159,198,82,199,131,20,76,84,32,67,72,41,212,12,97,201,99,68,252,196,64,133,5,223,78,247,111,253,71,29,196,125,240,249,161,17,33,249,62,254,38,47,137,140,243,43,175,36,24,224,195,178,241,181,109,160,247,207,225,198,9,37,197,126,75,130,85,185,32,60,210,81,205,129,203,138,252,227,245,38,216,243,40,168,15,51,188,67,251,81,123,46,205,193,111,184,100,161,177,202,54,176,86,162,124,1,214,167,246,85,64,144,100,236,146,44,181,120,29,112,217,142,129,146,190,198,124,159,187,166,93,226,188,132,75,33,115,102,19,224,223,166,249,1,218,98,113,51,236,103,206,237,99,119,163,47,109,93,16,248,212,27,21,95,95,11,125,175,252,1,250,59,224,84,167,217,152,192,246,145,255,192,238,69,23,97,40,127,45,122,124,8,68,182,220,16,85,93,39,131,102,107,181,23,138,196,97,97,111,22,105,156,225,29,213,68,108,92,24,2,123,113,189,255,208,57,146,100,116,51,229,133,206,49,118,100,155,26,76,121,95,54,149,48,193,153,69,3,70,173,235,239,30,210,23,81,16,145,58,142,8,47,82,17,245,115,64,164,97,167,144,232,168,64,78,2,69,201,50,35,17,120,101,16,99,75,93,162,225,188,96,169,167,35,1,241,57,70,187,214,9,64,53,63,179,157,132,198,117,101,71,85,139,209,166,125,15,238,201,198,246,2,62,67,180,62,226,119,40,230,71,2,3,140,237,164,199,185,231,170,3,108,163,16,90,96,185,232,208,212,5,2,120,21,27,66,182,195,100,110,38,165,136,102,217,186,245,45,1,50,18,185,113,200,103,14,182,86,120,99,249,63,88,105,138,178,164,231,49,155,109,71,245,160,177,213,24,15,39,107,191,182,94,119,245,202,101,235,207,21,202,104,215,85,195,138,210,150,39,115,172,172,143,8,140,14,84,1,198,39,245,231,118,207,1,90,144,166,173,61,222,8,244,46,9,80,111,172,161,58,173,102,239,109,107,220,81,16,202,171,74,221,120,150,44,252,60,160,89,167,140,52,201,106,16,200,88,39,58,63,148,169,37,26,251,129,80,254,172,13,93,70,176,20,42,17,125,163,150,46,132,114,145,56,18,242,52,156,145,239,61,39,221,113,251,225,112,58,28,220,220,86,8,64,171,225,104,48,16,136,153,108,173,136,135,247,226,55,224,64,150,19,237,68,148,33,229,50,198,96,76,5,156,224,23,140,27,219,237,15,49,252,13,10,215,53,136,221,198,99,226,173,46,107,183,178,148,25,55,106,158,172,123,136,113,154,179,142,60,110,168,149,174,18,12,156,214,199,93,217,107,156,46,234,107,150,102,42,23,151,192,8,214,242,151,220,211,119,155,72,209,95,33,216,52,249,185,124,131,151,213,33,127,249,141,91,218,62,62,3,76,82,68,130,223,27,225,129,13,10,229,173,134,70,145,159,43,29,243,175,102,99,216,40,51,130,11,221,167,130,121,150,199,128,181,185,242,188,148,40,173,177,133,142,205,219,122,236,102,166,99,237,126,252,182,86,45,175,128,200,24,96,123,27,172,191,79,213,83,17,228,183,12,174,108,140,118,13,60,95,219,231,131,219,181,211,201,247,232,246,25,172,101,143,7,38,26,102,195,17,113,246,72,56,229,242,135,80,17,251,174,57,224,123,80,98,167,164,254,150,252,205,5,77,164,23,167,35,163,255,28,236,101,212,152,23,185,138,204,46,147,177,85,30,117,13,235,252,99,61,19,34,247,75,77,197,129,209,192,93,123,145,56,94,245,130,118,187,29,90,29,120,115,96,28,23,82,206,8,206,136,32,84,224,235,23,1,25,233,15,247,200,70,21,227,106,178,235,106,42,162,222,111,57,205,89,145,48,73,45,9,166,132,45,103,0,168,40,3,50,186,34,82,26,108,22,71,48,4,102,35,96,37,89,197,5,150,185,255,0,174,114,249,66,2,73,130,194,83,37,231,108,37,89,102,227,198,28,130,165,7,55,91,181,246,203,86,39,191,113,73,57,66,66,57,198,24,241,218,222,53,79,21,112,129,110,212,0,239,211,115,82,146,94,4,222,93,24,7,0,141,63,44,1,62,2,108,15,75,108,0,248,244,246,25,63,150,142,234,123,24,106,109,51,246,11,15,181,55,212,228,9,121,150,198,60,55,145,38,102,66,122,157,155,16,125,175,186,56,109,230,68,31,107,88,95,19,50,238,232,195,46,147,178,3,6,176,169,245,195,55,30,187,197,178,83,131,89,91,40,73,131,197,244,188,133,66,4,106,76,36,135,202,89,192,174,171,155,247,126,74,187,236,131,231,31,28,132,132,193,174,156,42,237,66,21,137,217,152,13,147,219,208,11,50,185,138,239,63,95,102,145,138,67,210,249,48,8,95,157,220,164,33,73,99,61,244,176,137,246,178,199,155,189,172,171,112,225,255,32,135,175,190,140,202,67,242,109,191,175,78,64,97,21,5,250,234,79,107,69,230,58,31,229,73,132,219,19,96,99,93,124,0,238,15,191,127,68,167,55,102,98,64,242,223,1,9,129,26,183,143,172,36,233,168,5,77,61,107,99,89,166,187,235,147,146,238,64,190,120,225,186,216,239,196,181,156,59,189,81,19,228,26,113,145,219,97,19,150,80,17,126,101,119,106,189,47,142,155,171,24,239,87,247,126,244,31,108,248,192,254,188,133,156,14,177,186,31,178,66,222,229,170,106,90,143,208,157,56,151,236,191,234,74,103,122,67,40,67,242,235,42,94,216,7,153,187,223,1,123,56,111,245,15,218,155,219,79,106,152,17,89,116,149,133,31,38,55,47,28,34,247,47,115,55,113,117,52,150,4,251,11,144,127,249,152,40,14,211,207,55,82,173,229,207,252,91,185,149,57,124,194,81,9,33,87,89,122,40,219,204,58,77,104,98,240,238,162,128,152,8,138,34,238,209,188,140,9,118,220,217,4,220,40,6,218,149,60,2,106,122,98,91,190,204,188,169,189,250,238,89,228,38,229,190,203,117,70,176,59,61,121,206,183,171,233,98,64,80,212,223,218,37,21,73,111,124,152,139,146,110,95,192,128,185,253,158,133,46,202,79,5,19,121,167,82,33,210,163,119,42,221,173,161,209,202,168,0,186,73,97,115,196,212,131,83,145,85,88,132,239,170,120,161,162,173,255,166,19,132,87,132,40,175,94,221,231,102,43,250,83,158,91,217,87,120,152,122,209,127,108,104,177,85,170,212,114,164,227,116,4,92,187,203,222,48,253,207,128,115,221,154,158,64,129,48,98,144,193,142,223,171,199,169,158,227,253,231,31,134,209,109,56,115,232,217,166,44,89,202,83,57,79,63,21,178,20,0,8,15,195,88,18,75,136,57,235,201,108,175,98,100,240,91,148,205,26,28,130,83,22,216,233,200,63,23,132,88,109,186,69,123,237,242,232,86,55,115,152,187,121,251,228,87,145,146,152,189,241,49,230,92,145,128,6,102,81,174,153,168,139,204,80,193,186,70,208,194,3,235,103,101,37,159,85,163,64,18,233,7,245,122,91,16,176,249,79,189,83,236,152,65,194,73,122,249,107,239,68,105,125,69,183,227,118,60,114,95,137,52,217,53,34,61,151,12,19,193,131,36,95,27,115,60,23,83,245,174,87,6,40,44,107,175,27,144,103,199,115,112,80,78,238,74,129,227,204,225,142,31,94,68,83,164,30,33,4,208,138,157,13,10,92,254,11,199,234,197,20,222,26,145,238,132,234,166,16,150,88,177,92,99,35,110,26,127,63,99,169,189,230,122,252,192,182,174,88,221,68,91,242,28,44,28,146,1,51,173,209,51,71,62,20,171,241,123,183,176,52,82,118,121,143,26,136,133,153,4,110,74,60,120,89,195,166,12,194,85,188,2,237,193,125,231,246,227,65,234,1,124,70,38,78,238,176,171,15,63,67,247,59,145,114,158,165,216,165,79,250,3,136,52,138,21,118,244,65,83,98,202,142,145,179,199,89,20,123,244,63,80,245,239,124,79,106,223,176,70,116,47,113,33,33,189,253,147,150,136,193,31,22,36,44,70,150,161,125,138,120,29,25,81,174,254,195,195,51,178,1,144,175,194,101,226,148,87,88,12,207,13,75,206,27,78,148,149,185,100,79,88,100,31,94,162,64,32,56,116,174,91,180,129,187,45,50,24,219,214,85,94,68,52,143,65,57,104,211,122,42,54,243,242,74,6,140,245,151,167,164,27,61,164,197,254,11,13,174,48,207,88,78,157,122,146,115,177,87,212,177,111,189,198,40,161,140,23,191,177,16,27,190,195,102,230,12,24,65,107,148,175,133,237,237,251,21,103,67,154,247,24,43,180,101,1,93,27,44,244,190,114,139,216,200,169,84,30,59,141,128,24,68,49,66,219,38,16,253,208,159,36,212,52,13,10,200,174,155,107,74,36,52,66,253,212,219,213,40,118,90,15,55,19,150,250,117,48,213,119,141,24,92,109,47,81,213,203,173,50,204,202,242,209,84,222,86,170,247,166,39,118,234,189,200,33,18,81,205,73,11,17,99,23,4,165,86,107,88,208,43,208,221,223,182,132,197,116,42,174,127,218,98,162,195,254,218,179,84,172,162,190,73,135,45,229,13,10,216,89,115,225,29,29,110,109,54,69,36,200,141,110,100,145,39,103,248,181,78,172,98,58,147,8,96,243,33,243,44,193,26,221,137,65,55,95,107,200,84,208,104,152,223,135,29,32,33,222,100,217,186,179,244,249,20,175,29,197,7,165,211,21,230,109,166,136,228,177,111,249,103,230,236,39,252,105,186,42,245,59,246,177,173,119,151,102,12,201,51,16,37,240,37,101,96,5,234,177,233,146,156,156,238,130,194,101,14,7,162,25,234,147,109,11,98,57,247,86,149,161,66,75,179,223,44,158,160,211,20,221,154,232,122,31,101,82,86,59,54,218,93,170,56,217,179,252,140,88,75,245,242,51,13,10,252,24,162,129,132,22,41,253,198,78,107,233,114,99,7,154,190,186,0,0,138,100,216,162,68,107,205,104,176,242,209,126,49,209,209,175,107,177,84,46,203,122,240,253,67,83,234,219,34,201,35,115,49,144,116,7,174,166,150,80,130,114,53,250,104,210,118,104,116,58,46,190,155,238,42,185,61,234,202,220,61,116,144,251,218,210,104,214,11,22,201,76,248,172,50,160,120,17,246,154,65,0,179,252,170,151,73,52,54,220,211,162,151,189,12,175,106,51,200,108,45,181,89,7,78,89,70,14,57,108,100,72,211,45,94,215,123,172,209,102,118,50,116,131,195,170,123,163,231,227,238,182,144,135,15,161,202,136,13,144,154,35,175,114,231,212,174,210,14,182,58,238,115,236,54,97,128,247,85,196,171,233,113,206,1,199,77,238,121,129,176,0,77,190,130,184,110,172,109,111,13,10,12,167,129,182,211,22,204,183,207,57,182,207,139,177,69,158,160,113,62,109,132,85,253,193,63,47,45,219,82,157,254,162,109,189,17,114,193,181,59,228,39,189,249,212,43,107,46,227,104,158,72,78,170,218,175,244,27,13,10,132,101,210,230,96,166,152,69,193,29,252,196,107,21,19,249,42,48,109,26,125,213,142,240,42,124,22,79,93,171,121,90,37,162,187,70,45,33,78,11,236,163,165,36,148,148,68,238,123,73,24,143,248,15,175,185,217,209,96,185,219,219,242,178,231,182,244,119,236,11,165,205,155,146,108,60,154,248,157,132,83,147,121,115,97,186,64,255,234,113,157,231,207,141,33,183,71,1,153,47,188,4,50,109,145,43,237,171,39,36,147,136,9,50,171,1,48,39,65,112,102,158,14,135,102,137,174,225,6,133,18,69,103,31,89,205,54,196,170,98,15,3,205,134,126,113,101,234,112,180,129,137,98,218,159,51,74,1,251,188,170,153,148,233,238,105,194,84,51,204,74,66,246,71,34,95,109,149,25,73,143,101,32,12,42,123,12,16,70,207,172,239,192,157,225,133,232,100,86,185,147,255,73,13,10,147,162,29,1,102,114,4,144,161,36,167,25,6,13,10,205,41,82,34,0,202,200,238,113,130,236,42,14,183,139,21,194,153,42,109,247,37,91,70,3,4,96,70,142,13,10,177,98,12,245,23,21,118,38,219,95,127,43,196,168,18,61,250,210,116,151,53,221,168,250,5,44,201,113,66,25,151,179,36,104,249,220,179,110,92,238,247,172,187,169,154,218,32,88,143,231,73,135,120,221,88,230,71,145,73,240,75,179,12,186,96,196,51,155,39,93,227,71,78,11,137,39,154,139,229,94,34,67,17,234,13,10,108,181,190,50,228,217,46,210,66,242,161,54,66,191,71,117,161,1,171,237,51,181,151,241,213,43,228,41,153,239,102,25,213,59,56,25,168,19,91,160,171,162,137,229,175,21,63,157,76,186,121,0,74,98,109,50,153,254,136,252,116,154,14,33,139,75,167,7,183,202,28,147,158,153,181,98,130,84,181,254,109,176,51,219,66,247,62,155,213,43,247,151,226,19,143,72,198,111,181,59,74,33,185,85,125,65,154,23,48,60,165,72,171,60,202,76,174,182,22,249,53,14,172,170,172,18,116,12,51,113,106,71,8,60,239,170,26,52,204,164,234,182,78,223,45,50,121,154,172,238,164,251,251,65,149,121,0,81,42,15,213,11,201,6,90,84,151,48,160,89,52,157,25,70,226,13,10,173,191,110,121,69,26,144,201,20,139,132,112,74,24,92,25,120,228,33,49,45,239,6,94,178,23,106,141,161,204,217,167,99,213,117,170,46,187,145,159,165,128,92,225,215,163,8,152,79,26,6,159,191,44,202,79,78,132,41,166,98,239,51,168,33,51,15,80,82,180,62,66,168,170,237,222,212,252,80,112,200,137,84,117,84,151,84,165,3,141,156,8,91,172,149,224,48,102,84,162,150,216,155,19,184,170,95,29,65,250,226,185,168,91,47,102,31,254,38,180,136,39,91,171,150,141,32,114,120,241,68,91,247,61,100,141,99,34,234,245,15,25,220,217,24,188,98,126,125,31,88,165,253,137,241,11,136,61,170,239,161,178,118,170,183,42,186,46,231,212,67,118,47,200,226,173,18,94,166,198,124,4,180,69,90,29,244,224,13,100,61,233,160,90,179,129,207,215,89,174,17,236,146,171,211,245,103,216,162,205,91,238,198,252,221,75,78,160,58,87,11,223,179,56,172,87,121,174,246,56,163,0,68,144,203,96,52,163,14,59,52,230,40,2,242,103,19,59,173,109,111,141,42,225,0,175,197,208,199,200,182,20,121,40,160,60,78,202,55,202,36,215,101,41,152,221,205,172,61,167,70,83,249,82,91,207,187,236,45,116,64,233,89,90,112,114,77,21,123,133,182,14,14,78,144,193,5,232,112,185,55,27,163,116,58,90,214,42,201,62,224,244,131,166,123,1,80,227,108,182,24,205,159,32,47,178,49,186,211,14,193,137,153,57,227,224,238,54,47,54,14,142,156,104,104,92,16,217,252,29,90,200,41,128,60,39,117,165,185,30,54,34,154,19,65,242,81,214,64,177,98,38,185,161,57,205,159,149,83,160,16,174,222,172,224,30,176,183,237,189,155,44,8,176,100,189,199,58,209,168,17,107,206,146,60,28,195,234,80,184,0,148,147,146,226,29,32,128,5,90,198,61,109,161,31,229,227,220,122,104,110,36,218,41,196,48,88,93,247,199,136,113,154,29,97,208,54,36,21,88,39,202,91,212,243,187,57,238,244,31,189,120,120,14,18,202,176,0,223,159,168,68,7,26,90,21,4,124,89,184,166,244,91,52,197,217,227,3,163,238,169,125,67,116,31,166,49,48,244,236,76,214,78,103,213,108,7,47,175,94,159,239,114,189,92,244,99,134,214,151,171,236,63,217,55,11,65,195,106,225,228,151,223,110,69,126,45,90,117,224,230,172,252,144,53,14,252,66,218,68,2,13,10,4,89,57,13,50,56,123,184,38,120,49,26,157,149,65,111,190,234,157,24,199,242,198,157,117,236,50,98,51,140,209,199,118,63,113,21,184,167,172,236,1,13,126,54,207,164,28,158,166,78,4,106,48,38,225,179,233,79,47,158,113,90,226,20,192,152,9,193,102,183,219,72,133,255,32,93,53,54,30,168,66,212,220,108,233,27,131,175,240,239,252,26,182,80,105,100,68,135,183,134,166,42,165,148,123,166,2,135,233,84,150,185,27,207,73,8,51,34,23,99,149,185,122,101,2,191,106,54,244,102,74,61,233,67,21,41,12,181,104,44,124,53,42,72,200,76,124,185,86,133,63,68,253,245,89,35,101,164,81,48,2,92,159,8,66,211,39,94,87,5,247,147,73,161,231,150,147,115,174,196,53,26,83,74,220,0,114,150,35,229,170,6,101,61,239,26,160,56,32,111,223,255,185,110,60,136,160,147,208,68,17,181,71,151,39,4,148,253,67,177,27,31,107,101,85,3,81,101,3,181,248,69,76,9,58,134,209,72,224,190,252,177,223,20,86,210,233,118,204,226,7,215,252,215,166,137,243,205,232,50,1,245,193,67,132,143,79,50,80,107,65,245,246,92,92,200,236,202,129,237,29,207,97,250,95,234,220,60,217,195,230,151,234,19,196,39,206,215,73,184,253,253,222,36,141,53,140,129,114,189,45,57,139,227,195,227,207,103,188,95,232,86,75,249,142,46,212,3,164,216,24,15,240,208,207,51,181,85,86,251,214,209,58,33,145,8,59,181,241,120,203,140,106,98,67,187,231,124,189,51,46,181,118,64,202,62,58,232,107,130,112,62,42,221,108,210,32,184,46,67,150,18,245,15,225,159,58,57,4,238,34,75,119,193,69,212,136,87,133,212,209,240,125,87,210,113,223,35,52,133,12,199,67,118,26,40,241,240,145,251,55,6,14,112,247,93,104,183,124,11,52,195,66,209,217,133,103,249,166,177,24,11,69,242,81,114,28,46,108,235,166,232,244,179,139,196,117,17,42,186,232,49,111,224,122,68,63,209,114,188,219,179,233,40,8,119,113,211,80,190,247,13,236,182,25,122,169,254,11,228,120,154,20,26,33,51,67,189,245,135,21,19,225,195,114,99,192,116,91,166,218,212,224,45,170,7,21,242,144,1,107,156,34,40,101,140,105,36,84,222,243,125,194,29,9,187,71,90,205,218,194,135,136,80,75,9,44,38,225,32,228,83,148,105,95,147,154,28,105,166,210,28,227,236,56,150,219,203,186,83,209,47,21,183,60,17,194,1,108,29,220,163,192,221,46,69,46,248,44,76,70,232,55,24,52,130,16,6,172,189,230,36,60,204,96,73,235,245,147,65,187,6,207,127,200,59,19,48,163,105,2,2,190,218,143,178,9,232,192,98,66,0,178,64,26,91,152,166,249,152,250,184,183,4,112,106,186,151,64,50,21,163,62,130,159,155,75,91,155,182,112,244,11,191,204,180,172,245,231,139,5,130,213,76,215,69,235,75,61,137,133,34,240,184,137,132,226,48,86,53,202,238,203,89,100,169,127,219,8,4,151,8,17,3,91,217,199,173,16,93,150,110,243,87,66,185,94,104,153,251,105,165,7,206,152,1,132,68,118,122,166,137,16,33,237,164,130,66,157,206,243,219,240,128,49,145,172,103,223,154,223,174,121,24,238,233,4,12,26,146,71,14,58,215,241,2,44,151,0,88,113,210,212,71,62,43,209,102,125,230,120,60,101,252,63,246,72,176,238,122,226,203,123,207,12,162,26,229,35,243,248,165,51,92,55,33,111,76,59,33,255,125,17,112,246,147,202,34,103,82,178,29,33,146,49,199,58,91,95,228,198,227,149,109,251,46,113,201,159,17,253,127,219,134,71,242,21,174,173,147,171,229,212,227,143,7,83,197,181,228,3,169,1,66,9,61,88,73,109,206,174,95,92,109,185,219,250,178,154,248,84,4,255,157,201,194,12,108,227,94,48,220,236,180,203,146,13,224,83,202,139,131,154,138,122,253,135,36,86,184,245,4,84,115,2,253,50,233,172,14,221,73,64,135,219,30,241,63,164,152,166,13,10,127,90,152,115,170,115,117,23,87,255,83,129,97,158,49,240,7,57,35,34,247,28,190,174,70,164,3,221,255,132,110,60,97,39,16,28,201,107,110,193,74,33,159,216,184,132,100,250,128,156,161,3,54,19,21,139,52,32,3,120,172,106,165,241,6,32,73,16,166,38,92,16,85,71,124,216,127,127,67,113,239,97,112,250,43,95,154,43,121,195,249,235,93,39,212,32,125,224,45,216,148,147,185,234,182,11,36,205,219,187,183,25,197,234,75,42,135,202,184,78,143,165,56,195,61,89,143,1,62,161,65,23,23,130,253,91,50,81,151,240,139,46,214,218,3,59,224,125,111,214,245,221,113,50,29,32,83,226,179,128,109,115,81,164,167,143,194,191,119,222,17,12,134,17,121,174,213,140,43,38,52,234,76,227,106,73,35,209,239,226,237,201,119,186,86,84,179,27,43,196,249,50,97,28,203,233,75,135,13,35,93,196,144,239,39,43,254,184,157,67,187,178,133,126,99,7,207,76,169,245,121,79,171,27,186,17,212,101,24,96,138,197,217,13,138,191,124,236,21,46,41,98,43,237,84,100,15,116,176,123,205,144,90,81,208,182,84,229,234,228,106,245,245,241,153,154,38,15,151,101,192,60,13,10,60,190,230,36,252,18,5,111,52,59,231,172,133,94,156,126,214,43,200,46,113,39,35,223,243,79,149,44,28,86,90,174,141,145,63,252,28,230,112,85,192,87,203,235,13,10,24,235,169,251,59,53,180,13,10,137,26,125,217,96,55,136,206,172,155,151,77,62,100,25,168,20,84,178,179,183,32,110,242,134,212,215,9,146,33,206,49,189,117,245,203,164,180,46,195,123,19,4,98,202,193,198,21,66,89,18,180,45,186,201,88,31,102,83,138,171,57,146,229,239,230,120,167,81,234,218,208,95,218,14,138,122,107,141,176,203,165,214,67,19,70,200,132,49,141,67,202,181,5,58,23,137,212,13,43,247,98,6,76,37,224,245,109,138,234,168,57,48,190,77,66,97,145,73,18,14,99,227,185,124,139,176,140,220,250,103,125,137,128,170,4,213,254,71,58,63,215,153,125,241,96,235,135,203,239,229,106,18,46,218,32,141,248,247,9,152,251,24,217,167,102,226,90,56,246,47,222,73,176,12,9,185,82,168,41,201,204,141,6,100,238,108,118,26,162,225,165,36,231,99,200,52,161,244,151,171,16,6,232,80,176,175,99,165,42,139,181,13,250,224,212,240,80,102,15,81,110,128,91,32,234,61,203,24,177,223,95,139,19,39,219,148,26,71,64,219,82,46,78,248,165,240,34,131,125,114,15,7,157,12,30,180,195,220,154,119,86,108,188,214,56,181,104,91,196,144,79,247,4,149,159,38,140,241,252,218,146,193,74,147,64,183,158,193,228,247,90,226,247,144,153,223,255,42,3,65,249,164,133,188,220,7,96,93,118,71,113,135,223,142,185,34,111,44,183,201,96,42,193,15,234,71,96,227,17,146,76,254,213,156,107,168,192,125,31,245,26,52,242,120,76,142,233,197,80,156,78,66,51,0,105,40,3,114,44,122,62,118,91,55,198,13,10,242,227,185,113,34,9,65,183,82,73,204,138,82,45,111,230,154,220,46,69,221,59,240,254,173,18,106,119,145,90,133,135,37,80,30,56,15,84,106,138,171,117,161,193,229,254,147,31,63,170,27,242,59,55,76,55,54,69,169,206,133,224,218,247,165,68,253,13,127,30,11,102,114,30,25,220,123,50,83,253,113,216,143,77,238,106,147,47,111,186,174,155,170,81,123,13,254,102,4,93,160,172,253,20,164,40,127,63,89,17,157,154,19,75,105,169,188,76,68,129,6,7,188,90,187,76,236,32,94,132,153,216,164,200,71,24,236,226,168,148,223,114,226,151,244,157,55,164,194,105,134,143,73,103,16,158,161,202,26,156,128,216,81,143,134,213,54,136,151,211,173,168,181,19,181,146,85,165,221,232,201,108,24,81,216,105,159,150,17,218,229,101,91,207,223,242,217,8,97,13,10,149,108,167,118,160,0,136,1,187,69,7,174,235,206,138,209,16,169,99,23,144,112,211,184,0,92,65,166,18,91,14,217,70,146,162,40,55,7,201,251,126,221,173,29,213,183,198,43,199,20,37,47,127,32,132,31,124,109,160,1,88,147,226,209,198,173,68,75,251,219,43,176,250,53,42,136,233,129,88,32,126,206,33,63,71,77,8,58,104,9,50,11,120,214,192,128,26,94,93,135,188,42,55,207,122,208,75,243,202,155,0,223,254,150,84,122,184,131,3,170,120,155,99,129,91,172,41,89,223,109,146,162,174,236,108,227,45,34,122,149,55,174,244,158,178,131,106,151,92,81,150,151,98,80,69,37,184,218,109,155,172,82,152,161,116,183,78,100,184,131,138,232,111,255,55,198,104,121,115,159,126,132,157,57,246,127,219,5,177,74,155,200,212,52,52,70,67,248,79,209,167,175,128,185,175,207,136,215,46,35,63,45,21,238,215,214,167,222,24,219,116,226,240,35,207,38,84,119,145,201,105,241,35,229,109,228,209,140,220,53,35,228,33,216,185,213,1,132,231,104,229,76,178,202,254,129,250,209,205,231,215,225,58,220,245,161,190,82,37,251,225,44,58,58,30,156,58,66,107,199,14,88,180,208,225,172,157,234,9,5,79,37,21,95,151,69,130,138,198,32,165,1,153,213,211,165,175,33,252,186,77,171,100,157,26,19,210,252,255,60,229,115,96,120,86,194,210,106,106,161,126,57,76,14,173,48,121,168,243,91,11,251,58,45,48,30,251,239,180,252,87,41,73,221,59,249,241,79,97,192,210,12,144,88,101,226,20,235,145,79,41,96,177,7,18,189,108,251,91,15,72,145,7,218,209,47,80,187,7,33,159,180,195,97,12,106,12,139,208,103,200,110,23,226,206,75,8,40,9,106,76,73,109,184,44,59,97,133,133,155,33,47,126,42,231,26,191,62,69,217,76,68,205,151,96,54,193,114,2,139,198,91,205,187,163,125,3,68,144,43,207,112,23,203,146,246,104,165,234,4,162,67,175,39,132,33,5,21,30,62,97,62,6,30,114,246,204,165,235,101,134,46,118,22,219,90,47,121,13,10,101,174,203,200,229,105,74,93,251,152,151,23,148,193,204,236,110,116,89,62,7,108,120,42,125,71,33,163,43,240,121,98,111,78,183,203,202,13,30,143,216,250,63,197,181,41,207,172,207,237,207,232,55,21,22,202,72,246,146,202,160,196,205,150,40,239,177,22,58,144,141,112,75,91,84,128,123,30,218,193,104,116,209,78,234,159,160,137,247,50,13,27,155,162,148,104,76,249,141,27,167,48,234,236,27,220,19,3,48,58,236,13,10,250,65,55,164,151,227,249,181,126,196,113,18,7,179,184,237,206,132,243,50,251,80,93,179,163,221,147,226,213,91,119,208,98,52,148,1,29,139,99,0,139,21,110,96,214,210,128,93,173,169,34,119,130,48,226,213,235,100,103,165,221,122,102,1,23,16,239,91,208,204,103,250,215,240,61,19,171,179,201,69,18,15,184,47,188,77,103,145,255,170,35,86,63,148,191,145,125,100,249,147,184,130,182,21,105,214,36,242,67,217,224,181,66,94,106,182,192,114,194,2,179,172,151,210,159,95,130,139,221,54,224,59,179,50,110,24,229,110,186,250,212,143,241,13,226,7,142,23,250,13,10,118,44,77,56,99,150,201,111,237,156,176,18,214,124,8,16,166,255,132,226,47,80,194,164,195,16,220,130,58,170,202,185,60,184,28,140,177,223,13,10,139,235,44,250,201,223,109,11,155,165,157,11,85,248,52,41,48,167,81,147,104,254,99,166,140,27,117,170,168,243,83,93,131,83,130,124,205,219,51,5,188,85,90,203,30,166,112,66,32,227,84,238,20,165,46,114,173,59,11,226,115,139,183,189,45,97,142,235,149,91,168,195,232,92,137,56,227,216,65,169,216,249,253,114,238,238,244,221,31,93,150,251,91,175,217,176,129,106,111,125,33,230,62,96,162,25,199,157,246,13,156,106,35,125,45,17,236,168,21,120,96,181,136,231,67,83,5,79,94,64,149,14,110,194,247,86,121,29,48,236,253,28,237,232,152,60,203,251,118,84,204,8,126,248,214,170,199,172,49,155,132,79,47,147,137,235,91,84,191,214,113,158,188,53,135,82,79,24,31,48,71,117,107,252,45,32,95,171,100,186,82,123,74,50,112,227,64,110,255,66,164,223,211,119,66,253,160,47,58,111,253,87,151,135,209,208,168,108,185,23,20,121,105,239,131,25,180,171,176,55,199,80,171,71,252,203,172,205,40,146,240,207,177,99,136,61,37,130,146,248,95,31,154,243,234,120,225,19,188,97,141,43,83,225,118,84,71,68,64,75,169,244,52,41,138,238,237,156,132,68,71,81,87,88,107,222,6,6,46,1,232,197,229,198,33,15,154,182,203,58,236,186,31,21,163,50,127,194,67,177,164,8,81,197,9,4,72,115,182,175,115,241,71,254,241,214,170,145,148,11,64,182,213,168,191,188,164,54,120,3,174,193,67,175,200,81,134,60,79,22,109,155,222,212,32,42,65,89,27,179,93,236,136,105,111,182,79,40,209,66,76,66,113,106,120,243,194,28,194,207,116,232,218,34,12,184,34,178,3,59,149,207,161,254,255,212,85,122,13,10,152,217,129,160,138,161,83,229,122,144,75,166,141,16,189,16,99,141,132,113,239,128,195,118,225,18,29,15,116,205,97,216,189,147,147,95,158,131,206,20,48,224,66,138,14,101,230,19,177,107,147,37,37,233,159,122,97,91,190,132,208,118,242,234,87,37,53,213,91,31,119,203,204,239,72,208,59,150,115,183,70,171,236,214,159,197,151,95,21,253,13,163,133,149,96,106,112,193,221,27,98,221,63,130,43,111,245,52,202,176,100,122,32,165,146,118,198,51,131,180,217,147,82,119,26,35,234,129,238,200,188,155,63,14,169,98,234,122,208,27,197,58,15,58,246,80,24,63,57,225,23,248,146,254,197,148,105,96,83,204,124,228,228,89,151,167,131,203,97,20,249,87,230,13,10,143,30,153,143,108,195,220,209,53,239,218,111,32,181,149,127,111,116,255,110,22,202,98,30,136,112,148,129,8,92,229,62,128,220,92,214,255,179,176,109,35,212,172,189,140,201,244,36,63,108,190,76,145,178,25,45,163,29,138,197,127,238,33,52,177,82,203,165,219,58,200,178,93,128,52,207,44,155,96,12,175,62,44,30,1,239,84,220,104,157,62,41,218,225,74,211,164,183,209,37,230,146,84,78,39,249,82,64,8,22,55,240,39,85,175,172,134,220,1,207,198,86,205,193,233,151,169,183,69,246,38,178,9,26,32,130,40,20,249,244,241,219,148,203,144,166,236,178,31,29,240,32,136,187,75,122,172,161,31,224,132,38,73,111,104,101,195,173,74,200,124,131,132,41,199,9,239,122,100,82,120,252,221,42,23,183,169,66,183,64,0,0,39,95,17,207,251,91,18,253,64,67,74,91,91,189,82,245,170,158,64,56,142,135,129,204,67,154,213,28,160,93,6,210,68,18,37,241,119,44,156,150,50,165,23,255,189,151,234,17,156,166,123,60,109,198,25,228,98,249,100,180,49,51,210,228,162,255,71,35,20,136,40,11,177,76,224,181,89,172,24,0,130,205,208,185,226,31,94,58,63,68,70,161,247,202,109,71,242,140,32,206,179,2,185,6,253,161,54,119,150,74,209,174,24,121,234,65,8,148,176,135,104,97,31,102,150,199,26,12,213,31,17,72,116,180,58,61,28,43,150,84,2,70,17,241,9,120,141,166,194,184,152,157,168,170,14,62,235,180,47,100,45,217,138,127,195,135,147,156,96,239,58,195,175,195,192,62,99,113,163,68,88,217,1,148,211,82,107,47,84,231,52,89,79,1,32,232,25,112,20,17,217,207,104,199,114,33,22,72,68,195,115,16,103,211,82,38,52,135,78,221,54,6,157,251,237,3,251,187,33,231,201,115,178,138,108,212,49,132,208,43,123,200,174,26,165,106,211,81,2,93,225,158,231,200,187,171,162,184,150,57,150,172,138,219,112,39,110,167,242,23,52,72,209,35,141,221,161,162,36,178,147,74,155,151,22,111,44,157,233,1,7,64,27,237,34,169,232,59,124,133,26,92,28,156,181,53,33,199,203,92,98,39,157,15,160,116,191,143,234,196,240,167,101,191,199,211,210,221,104,206,26,230,52,9,70,210,206,74,86,99,93,18,225,47,129,229,35,208,66,190,143,206,86,147,191,65,157,180,77,6,137,67,48,35,121,89,154,121,59,21,20,46,17,96,122,75,247,118,47,85,32,46,203,70,219,185,226,113,113,120,180,244,252,215,42,160,110,134,186,211,194,92,38,41,123,130,231,253,68,248,71,77,129,138,251,160,110,63,71,173,247,155,147,55,169,154,208,216,65,28,132,183,94,215,27,121,119,219,12,111,44,194,162,77,87,91,174,14,66,52,7,60,144,181,174,255,13,10,182,210,226,115,137,39,80,28,191,115,38,183,174,145,165,221,104,225,72,67,181,117,196,170,199,147,19,41,242,22,231,130,135,11,245,192,232,9,193,121,56,223,48,158,206,217,230,47,233,24,13,10,234,23,91,230,29,31,119,161,76,49,112,120,211,172,27,113,78,35,183,86,211,143,131,11,13,121,174,97,64,208,186,80,5,101,120,68,136,90,150,107,120,128,172,252,245,221,70,165,155,143,68,247,114,6,16,6,177,237,152,188,13,10,136,82,255,175,14,216,206,40,164,251,150,180,204,152,90,5,113,230,122,82,198,38,247,30,147,13,10,195,13,187,193,14,16,134,101,175,144,160,94,221,64,178,178,89,228,50,195,36,234,218,177,234,45,233,244,220,162,61,4,114,221,13,10,161,104,176,15,60,17,232,194,161,185,67,90,175,71,199,101,154,202,88,11,181,136,211,232,220,201,196,60,165,17,12,236,100,116,209,105,86,4,60,38,212,231,212,103,178,135,239,98,25,241,97,203,96,8,142,61,68,154,172,164,201,22,92,97,193,238,116,255,3,111,174,149,2,92,87,87,39,102,86,101,200,121,88,44,134,254,49,153,242,55,23,179,58,193,160,11,37,153,137,27,0,99,40,251,145,52,96,104,101,79,186,18,232,228,211,244,76,69,165,121,201,181,234,163,46,107,235,35,127,123,255,25,54,61,108,88,136,41,190,93,38,210,161,206,245,153,18,75,114,23,51,143,4,252,66,255,148,66,211,184,135,70,203,81,195,38,247,212,134,159,91,252,42,199,219,12,217,71,199,113,78,147,114,182,6,172,199,121,68,199,121,19,167,74,243,181,204,175,8,127,66,208,56,208,182,22,163,159,94,159,7,171,116,2,204,98,116,130,33,64,152,131,18,48,194,179,1,243,217,156,99,97,32,11,248,142,29,203,54,117,199,157,243,130,122,243,180,104,121,46,205,34,208,134,247,232,112,97,48,234,23,161,119,163,160,143,5,67,145,192,250,90,252,188,147,206,54,45,169,155,124,116,142,140,34,198,52,174,108,94,134,13,174,254,148,199,23,238,82,47,167,47,227,147,61,188,56,247,228,179,255,197,164,33,238,14,92,13,87,185,243,98,248,78,182,74,141,123,140,115,199,88,124,3,145,136,42,26,21,209,130,150,162,217,103,2,202,14,146,126,247,216,83,212,233,196,71,199,154,50,216,169,251,45,210,11,204,24,193,193,27,150,241,47,138,124,101,135,229,70,198,228,51,165,197,145,239,245,84,143,178,126,244,219,96,103,106,210,17,105,250,1,43,71,99,141,102,251,233,163,93,174,62,209,105,254,14,242,186,235,8,252,59,100,176,145,101,254,168,122,132,61,98,45,50,31,180,149,75,188,25,100,141,142,83,50,52,106,219,44,57,164,37,55,136,152,84,244,167,145,59,19,8,83,162,91,72,248,132,80,174,91,218,211,22,184,3,195,139,137,35,130,42,5,236,54,13,133,116,114,90,192,205,89,191,166,67,125,162,183,36,109,78,157,238,255,215,177,253,34,51,27,144,158,123,6,214,79,55,181,78,87,59,91,187,238,115,238,13,10,173,20,166,20,139,148,202,192,6,0,163,188,181,89,156,211,43,50,115,4,53,185,153,208,229,8,93,164,108,51,241,167,174,15,31,178,119,190,159,73,46,77,19,67,73,244,148,248,115,76,228,27,143,252,221,223,82,141,162,160,194,236,182,38,157,73,196,76,147,253,233,208,242,224,2,187,24,14,153,6,143,204,47,234,175,232,181,106,56,54,49,70,55,184,0,224,74,67,169,159,3,251,87,210,111,160,136,240,251,139,41,212,228,235,93,139,115,112,210,127,200,167,60,188,218,61,147,12,190,181,52,62,136,3,32,197,155,30,9,228,4,79,139,40,252,202,217,186,175,70,22,156,65,58,54,232,16,117,110,70,113,72,230,154,51,184,58,132,116,142,61,38,145,255,230,3,166,224,131,189,219,157,74,2,152,140,131,76,18,93,151,247,20,159,76,191,222,18,71,234,100,169,124,213,96,117,156,202,178,35,178,8,6,142,72,30,171,203,202,200,153,52,61,19,97,153,123,54,140,58,149,48,94,238,95,209,247,236,132,252,67,178,97,225,178,169,203,237,82,215,59,32,13,10,226,29,4,4,220,115,65,181,122,255,253,14,251,95,221,202,197,98,217,124,80,209,245,168,65,13,10,84,252,42,197,193,132,13,10,218,112,227,40,71,179,206,91,111,27,166,178,157,219,185,190,159,9,26,189,54,254,153,217,17,248,198,189,164,63,207,175,177,134,94,86,245,71,65,47,34,4,9,45,194,13,91,156,53,105,78,171,248,214,124,133,117,30,210,62,223,241,17,130,231,142,160,138,68,71,110,162,26,222,126,122,69,123,149,71,242,61,181,196,102,149,107,246,194,251,117,132,14,97,216,71,116,47,114,110,133,17,167,134,73,90,170,201,43,192,97,116,115,202,72,29,166,189,115,148,191,31,199,208,109,63,205,223,157,248,122,26,57,51,23,107,109,47,159,160,183,175,231,57,56,120,227,168,13,51,76,245,69,188,241,68,169,219,89,30,47,230,65,184,54,155,169,13,10,104,96,220,147,158,224,159,232,69,8,78,186,123,169,180,154,197,153,44,26,37,40,153,253,197,139,215,56,161,229,78,41,246,155,162,111,181,231,238,21,30,233,154,225,35,155,11,147,47,215,138,53,131,58,187,61,166,149,6,247,21,136,42,243,144,25,156,40,64,162,243,48,119,230,49,160,90,29,35,181,181,131,171,163,243,191,220,73,136,41,34,221,165,26,123,54,53,50,223,225,185,101,149,79,134,207,5,184,148,84,217,207,160,134,144,77,63,78,148,131,117,253,92,76,222,20,161,108,85,244,127,193,202,253,3,142,136,47,5,206,64,121,81,164,72,80,109,152,218,252,81,120,242,116,243,165,175,38,102,204,241,83,49,75,7,168,150,170,156,38,179,243,3,189,152,156,63,216,0,157,116,171,17,16,79,12,45,182,64,36,108,233,131,196,2,255,253,13,10,75,142,196,13,10,139,157,53,232,174,252,139,111,60,245,117,152,24,201,231,34,183,13,10,197,156,93,53,106,102,27,97,172,213,175,46,124,104,138,241,244,60,7,32,71,58,78,65,74,127,200,101,101,176,91,234,62,137,163,107,213,210,133,255,115,177,247,174,76,106,78,164,169,108,105,109,44,245,28,246,222,134,139,71,67,151,253,67,232,68,4,5,112,202,172,41,49,194,211,89,133,255,143,194,46,255,9,87,178,161,60,204,139,147,255,251,133,131,185,157,155,134,239,116,135,198,21,120,135,167,78,65,190,176,114,98,71,205,122,180,109,162,153,50,39,130,18,240,99,162,184,65,2,40,6,125,142,221,129,229,146,246,35,194,45,223,240,29,193,163,254,8,128,123,57,33,236,122,86,61,230,26,32,245,98,165,179,154,238,198,60,211,83,225,209,145,142,134,218,172,184,96,80,186,114,26,244,64,231,216,207,120,73,97,42,106,141,204,165,248,83,40,26,25,133,21,92,253,197,91,217,70,126,93,41,193,244,68,206,77,226,108,118,182,103,22,12,25,29,118,105,63,188,146,134,55,63,145,156,6,188,33,160,85,97,234,228,0,13,222,94,94,147,249,5,151,74,11,55,7,224,13,178,0,236,4,95,81,230,26,167,100,57,170,24,39,191,51,228,101,202,221,109,207,103,9,56,248,116,215,147,123,240,164,53,17,204,193,188,118,154,218,167,92,16,129,85,75,52,187,19,161,109,208,23,90,238,178,93,61,26,6,134,58,157,6,6,110,186,128,205,215,68,62,252,238,214,22,21,1,106,9,59,14,207,20,237,19,146,64,43,55,214,12,28,36,14,178,150,62,60,108,133,26,156,55,204,32,156,213,5,206,21,99,28,72,227,178,67,27,252,211,242,212,147,228,141,210,110,14,193,201,129,231,5,150,127,191,106,29,128,84,116,66,42,128,169,216,67,58,152,156,197,225,108,119,13,255,154,247,226,89,161,178,43,255,63,164,148,245,251,250,200,4,79,71,43,63,24,126,7,178,141,75,168,89,83,198,172,144,57,189,204,214,222,230,203,26,4,58,235,173,58,154,191,149,205,141,120,114,2,248,181,90,132,216,101,218,82,206,233,108,113,136,165,191,74,172,42,128,213,104,76,80,66,132,170,210,114,219,122,47,45,207,148,160,120,76,5,175,166,130,210,9,136,0,250,163,62,220,249,208,70,104,171,176,242,245,49,92,175,194,62,212,249,203,205,181,128,6,144,186,212,141,244,121,56,98,253,143,183,87,95,111,92,236,23,244,222,3,42,226,121,99,133,114,222,173,165,124,92,36,106,228,231,216,231,217,35,77,12,108,130,31,105,161,87,99,218,101,213,109,176,116,153,66,174,183,73,235,82,21,43,176,75,245,163,159,239,45,124,131,167,84,166,105,48,96,14,73,218,23,102,193,169,111,164,156,49,222,238,122,182,190,39,60,239,198,223,43,200,247,14,170,249,248,195,125,49,33,151,36,181,33,20,44,201,227,8,37,227,200,78,253,38,254,100,161,177,202,54,176,86,171,166,77,135,41,122,35,42,54,16,96,179,170,61,39,122,67,157,133,179,241,155,101,221,149,166,170,133,209,167,155,169,133,179,5,241,225,133,100,43,42,151,26,9,25,110,231,7,6,41,55,106,91,183,110,95,225,116,48,221,64,102,126,168,156,20,75,41,102,247,47,218,32,95,3,69,56,18,189,19,1,241,36,137,82,238,183,61,0,1,16,15,16,125,126,127,24,114,167,117,154,216,67,61,93,252,36,160,65,82,41,106,138,245,230,203,91,65,60,208,66,240,169,248,221,124,190,190,149,36,221,47,228,4,138,17,72,96,15,151,192,31,178,245,5,204,130,232,184,218,25,120,51,160,207,136,174,163,236,174,103,30,71,193,13,230,13,10,83,157,83,238,91,90,151,154,147,242,64,193,145,47,180,100,0,154,86,222,59,143,167,71,198,217,255,143,39,72,133,7,99,34,232,81,223,223,19,21,192,151,241,235,131,94,113,184,37,2,145,240,198,246,170,252,231,161,159,154,205,200,103,21,168,184,90,219,122,114,146,170,216,30,91,65,134,232,101,21,19,13,10,98,221,220,177,187,37,26,198,217,35,248,3,170,149,51,222,234,141,231,64,164,193,50,241,240,80,124,138,50,36,17,43,111,47,88,117,48,209,34,20,163,188,123,5,132,217,67,243,38,9,132,9,229,78,204,96,71,136,95,65,5,221,104,145,48,188,86,147,23,28,163,164,67,156,59,240,188,0,106,201,113,195,64,70,88,128,210,38,0,19,111,33,39,54,21,215,128,215,98,159,227,39,88,199,133,82,229,177,183,244,193,100,216,177,116,176,32,1,105,181,32,180,189,245,150,124,139,72,223,223,46,29,121,212,107,48,136,136,144,146,134,54,103,58,3,28,78,176,75,28,65,241,191,52,71,75,92,50,235,238,216,38,192,186,210,237,224,121,216,251,23,253,177,29,25,117,3,241,110,19,229,194,43,190,225,167,169,124,170,110,228,30,218,11,246,140,201,223,177,39,232,108,200,115,237,206,102,73,247,176,16,9,93,252,230,193,50,239,195,95,34,92,196,144,130,186,83,205,120,122,58,164,100,225,68,121,222,158,191,185,140,60,224,6,241,89,211,41,155,62,122,142,39,49,108,20,113,92,195,187,229,97,13,10,217,13,10,92,255,236,142,71,2,77,52,72,24,30,143,208,214,161,33,72,4,14,49,192,68,90,253,126,162,3,211,52,44,192,100,231,99,101,243,20,61,83,71,84,131,26,85,139,204,221,29,57,147,87,234,158,149,241,69,125,44,253,221,239,154,194,182,103,225,74,100,41,232,182,95,244,180,223,52,35,61,7,19,166,84,173,243,193,17,157,104,112,241,216,96,92,76,242,109,215,188,79,77,31,200,231,17,104,59,60,18,21,88,67,137,86,41,193,106,70,34,14,82,146,56,101,93,47,57,58,206,80,169,142,229,60,38,24,93,44,243,96,19,91,241,22,221,138,35,173,208,78,59,4,190,33,108,74,215,133,249,105,182,36,72,212,32,20,223,43,35,29,165,100,44,131,97,211,51,97,213,214,203,39,249,250,4,87,238,192,224,228,105,117,68,245,77,210,32,53,209,92,28,39,217,34,199,249,167,132,3,108,238,128,13,101,15,226,67,203,77,62,111,176,252,255,120,108,98,52,251,152,219,129,146,219,122,245,193,150,75,234,21,19,54,22,143,47,85,164,111,73,90,213,68,254,188,209,27,80,104,202,203,131,204,28,190,109,248,88,153,160,136,66,147,189,235,231,202,54,249,31,191,147,214,46,222,234,7,216,14,22,60,179,183,188,122,7,23,61,113,88,138,12,25,106,2,236,62,90,205,106,85,237,40,250,123,16,180,134,94,158,90,53,213,67,169,115,146,93,111,180,111,176,81,190,42,208,108,136,112,93,4,89,27,127,231,193,81,0,137,73,226,0,181,166,217,215,187,141,73,31,13,10,113,197,57,214,7,214,167,64,146,167,16,169,168,164,59,115,245,60,205,152,108,184,8,48,155,14,71,85,121,164,201,75,231,59,101,159,74,138,138,138,235,18,114,209,145,101,108,108,61,133,141,32,17,158,204,90,11,172,204,44,63,57,210,146,75,74,163,31,157,248,130,138,59,15,133,75,223,196,73,237,203,118,226,237,128,90,155,57,62,20,130,81,245,154,197,145,224,21,230,18,77,214,37,239,202,24,62,137,167,250,133,160,193,166,110,98,123,251,125,81,144,48,252,154,139,81,187,141,69,20,189,38,240,65,224,238,77,140,6,193,140,49,92,210,57,14,60,144,194,78,212,139,25,32,24,23,218,121,120,48,181,220,117,240,198,52,196,222,131,254,255,133,148,91,53,149,101,115,182,126,30,222,64,0,42,85,233,205,128,192,150,79,195,202,53,43,2,28,185,120,156,177,46,253,41,54,193,181,14,171,214,33,22,237,64,42,15,70,2,125,222,17,192,204,192,15,118,32,132,245,167,89,162,255,190,80,143,253,196,125,117,94,163,164,159,12,157,167,205,83,123,242,166,123,90,30,5,188,217,232,115,5,28,115,121,250,195,86,111,221,39,97,71,119,31,217,137,171,110,208,23,60,6,79,55,151,8,186,167,242,33,40,92,240,84,78,231,228,157,44,34,124,215,172,158,214,157,21,248,22,227,240,187,165,151,5,178,142,82,213,58,228,113,71,77,217,178,218,101,22,116,86,55,169,205,162,204,39,128,3,205,162,20,41,226,31,154,174,68,227,233,240,181,79,9,111,247,47,252,230,88,2,79,128,242,9,161,146,221,96,80,101,6,237,224,172,54,36,198,125,201,57,199,180,174,189,165,209,207,140,137,205,143,199,5,20,73,7,45,138,152,222,27,222,83,204,185,29,110,205,163,181,68,117,254,69,4,74,166,161,63,5,163,95,254,65,28,54,141,200,93,18,235,140,15,108,129,170,82,123,215,106,123,75,234,165,35,95,125,229,98,226,160,217,15,143,184,150,213,21,59,214,239,98,54,93,43,245,69,79,232,113,207,67,240,230,80,61,103,59,103,39,13,10,41,12,199,117,104,201,93,154,254,203,124,188,74,4,155,36,49,133,81,86,30,227,32,207,26,54,214,44,105,246,44,254,197,187,163,250,80,201,151,61,3,90,86,108,6,205,182,59,162,181,134,107,242,223,71,121,248,114,126,168,140,68,64,98,29,21,115,156,136,30,243,163,79,61,107,79,106,17,2,242,2,224,148,237,61,237,218,226,148,218,45,171,1,194,151,7,85,172,241,47,22,165,190,154,5,133,129,18,80,93,239,230,137,228,246,85,54,16,36,11,166,38,103,74,215,244,175,52,83,82,178,246,97,111,117,3,179,108,18,27,184,101,124,105,89,177,211,163,151,102,85,1,212,18,66,57,1,41,212,158,126,154,252,169,246,230,110,117,250,15,99,124,224,219,180,195,171,230,52,208,123,8,70,163,76,73,240,233,202,207,138,92,235,240,23,7,40,223,110,84,99,46,35,171,198,108,147,160,229,203,100,179,120,169,139,165,244,18,74,90,8,194,113,217,3,78,232,112,76,237,21,53,53,234,38,203,46,150,92,99,189,15,7,253,75,204,132,248,221,53,24,130,219,149,7,206,253,119,237,119,252,34,59,62,121,69,20,27,99,26,38,218,196,44,242,112,146,100,254,166,122,175,148,72,101,104,219,198,2,147,170,192,4,108,52,194,89,231,49,170,164,202,154,185,240,204,153,3,111,230,195,255,102,107,56,208,160,29,1,211,193,95,116,252,192,152,141,232,38,86,214,130,191,46,175,193,43,191,197,114,99,175,218,116,53,200,108,119,113,60,226,21,134,240,4,95,79,143,253,68,1,153,237,145,158,85,37,126,165,211,76,146,210,18,113,94,59,146,73,59,182,117,71,241,232,155,210,214,68,236,94,80,175,4,172,152,199,243,149,199,141,251,101,52,142,101,152,184,53,160,185,61,140,81,78,50,33,18,214,248,78,99,165,65,115,239,20,217,178,48,117,98,144,103,146,206,26,88,63,240,25,30,232,89,78,200,149,124,248,0,53,97,117,51,233,173,252,204,133,129,254,185,153,141,115,244,111,43,41,81,219,133,135,242,150,139,132,198,216,92,216,251,37,21,165,244,158,124,91,254,190,31,134,102,229,155,219,248,159,129,18,125,134,218,211,174,108,9,122,228,250,62,42,88,144,242,114,220,45,168,240,16,191,244,171,72,50,26,189,58,78,236,211,183,27,120,237,141,76,7,123,170,51,155,215,116,21,22,96,252,165,194,56,31,196,237,201,183,53,47,11,50,55,113,44,87,86,55,169,205,162,204,39,128,1,107,104,248,143,177,18,58,18,21,125,225,88,21,5,113,134,204,54,123,133,91,167,56,50,166,139,216,85,82,206,83,100,216,74,116,173,48,4,85,136,121,233,174,104,37,227,99,0,127,178,18,136,135,82,187,232,14,214,31,188,86,36,185,243,167,219,135,62,134,1,33,196,191,156,83,110,4,21,186,200,139,29,91,192,169,249,161,224,115,15,15,83,156,141,180,17,170,197,177,2,31,227,144,152,102,192,204,225,224,73,218,111,181,50,95,231,125,85,78,168,182,131,78,69,18,59,20,68,45,11,245,133,63,186,186,74,164,252,64,175,150,118,87,65,81,135,150,27,159,218,235,39,208,252,120,245,132,41,69,8,165,165,216,93,121,20,92,245,222,179,231,132,49,226,245,210,39,44,204,120,24,86,255,169,141,135,216,67,45,196,94,51,24,207,211,197,255,23,181,29,209,111,163,224,50,22,112,88,49,30,79,175,39,16,13,117,0,240,83,107,87,231,154,201,249,36,38,217,24,61,54,133,47,99,198,163,148,84,52,59,206,236,187,146,220,78,218,92,114,198,248,140,161,70,52,22,67,240,92,223,20,129,167,92,73,226,48,97,153,148,165,174,24,201,250,131,0,87,169,112,63,128,38,42,1,90,14,138,154,68,149,210,6,45,161,216,105,177,237,133,98,74,235,208,145,17,213,199,221,55,130,155,214,88,12,210,174,246,235,49,58,100,24,97,160,106,93,63,141,222,24,19,168,78,50,110,171,252,188,61,189,203,122,35,108,245,53,216,88,42,189,148,125,78,38,127,235,152,193,129,30,19,69,221,234,167,61,12,213,235,227,142,183,104,167,213,250,7,213,8,191,63,99,20,38,172,200,35,15,87,35,57,53,71,70,255,244,5,55,130,63,209,41,18,120,222,115,108,194,222,197,8,4,101,209,177,136,136,29,166,28,114,254,230,101,241,20,93,59,20,40,185,146,64,71,98,38,176,120,31,174,238,62,31,27,93,212,165,5,117,103,139,186,181,42,190,48,57,158,180,106,228,165,171,234,166,4,225,33,12,120,86,107,88,51,130,17,98,60,181,214,165,47,187,134,179,47,221,155,121,86,188,8,68,56,52,113,62,181,212,17,205,235,25,23,164,37,38,189,83,46,27,44,157,58,217,84,67,59,233,39,211,50,115,226,30,41,210,149,147,238,184,150,8,22,243,195,13,235,162,172,23,63,228,182,223,209,147,64,173,24,68,91,105,247,39,127,210,213,13,69,99,244,250,169,151,98,102,37,223,126,83,144,118,167,52,189,62,163,2,168,198,94,125,76,96,116,223,63,238,211,220,30,252,232,60,100,69,215,136,33,211,142,25,238,5,220,153,91,224,196,90,46,76,243,77,113,140,119,56,111,217,88,16,37,166,86,67,13,147,218,180,59,158,144,33,38,78,200,9,33,40,228,97,177,206,250,219,37,249,151,85,174,25,59,71,238,98,217,102,85,34,54,93,22,45,225,193,99,24,215,50,63,155,103,82,173,63,174,232,219,121,202,34,242,134,125,201,157,240,69,134,35,67,81,188,101,110,167,149,152,245,169,201,248,147,238,87,129,243,114,251,195,64,214,189,196,127,200,146,64,209,38,237,124,160,130,243,221,196,168,253,43,92,58,61,33,27,58,55,121,27,158,159,207,201,55,63,193,94,26,187,19,234,171,73,203,203,186,17,118,174,1,163,71,92,62,61,212,30,127,161,198,136,219,16,142,6,39,110,32,143,40,18,246,127,211,56,106,164,175,210,170,6,152,157,200,240,77,64,187,104,47,231,147,36,177,174,193,185,106,94,76,75,71,147,88,101,22,222,120,200,253,241,252,138,195,181,140,41,19,73,102,227,120,224,131,34,251,159,137,139,5,113,138,3,91,96,14,203,154,142,133,197,243,106,63,101,8,241,82,247,168,143,35,184,68,170,134,52,251,107,172,214,173,118,43,74,209,122,134,46,205,143,92,156,89,58,104,154,188,2,181,118,153,46,212,129,69,2,220,98,180,221,54,46,83,36,241,188,194,250,38,228,204,250,175,250,128,116,247,203,40,45,170,160,145,102,50,168,210,21,82,130,51,187,225,176,9,175,17,100,153,55,7,220,229,180,93,199,179,216,153,101,91,149,70,111,206,4,207,202,23,212,163,61,178,249,188,113,22,75,79,75,193,188,99,87,17,35,54,22,47,252,96,6,70,4,45,58,57,67,141,190,166,3,43,99,186,203,154,225,73,183,213,8,173,246,171,207,197,176,170,242,144,12,108,14,199,128,100,30,140,43,96,141,152,50,179,123,170,17,4,50,17,101,205,100,184,49,142,69,224,247,8,108,235,19,202,24,183,130,99,247,4,41,71,78,46,101,207,93,171,177,232,26,246,251,244,77,84,162,202,185,110,131,255,180,18,157,240,68,44,126,239,240,227,149,45,214,151,184,51,33,8,20,139,146,120,200,44,48,149,53,102,229,185,186,160,219,199,96,129,139,176,63,127,217,5,8,118,90,103,28,9,131,19,78,201,37,17,8,77,215,70,126,117,163,239,56,92,122,147,197,146,236,152,57,249,84,128,150,191,96,96,56,2,135,205,105,13,113,68,82,217,166,127,219,237,160,99,19,89,83,245,68,217,243,34,245,155,101,115,185,217,48,240,119,0,13,191,17,89,85,251,125,91,104,132,56,169,221,84,204,129,36,39,200,209,102,224,48,101,146,250,185,43,108,89,75,38,20,79,63,110,108,213,228,69,11,181,243,113,207,45,71,254,147,50,119,241,202,101,169,8,18,180,198,245,187,66,78,68,84,237,165,238,211,52,213,119,38,123,107,219,69,212,36,88,2,216,174,56,202,35,124,135,39,171,141,68,102,87,129,29,120,242,3,148,251,0,242,76,47,145,76,126,191,66,33,244,229,246,245,177,231,251,77,210,26,163,66,15,158,141,85,92,177,41,84,50,134,245,156,175,67,177,50,30,198,99,149,5,183,30,53,198,73,44,243,20,250,242,176,137,113,6,124,19,232,130,106,50,229,150,231,155,239,48,253,28,98,86,108,129,90,151,14,45,73,66,202,127,129,203,29,199,62,72,36,225,11,60,164,179,105,121,215,104,145,147,149,124,47,176,247,12,61,126,189,229,35,119,46,3,26,145,176,151,7,58,39,140,132,214,164,177,89,71,145,183,196,68,219,106,62,196,72,183,247,51,155,87,38,179,132,198,84,87,13,11,87,239,62,58,54,33,183,48,199,159,112,64,13,10,210,38,143,13,13,10,61,214,97,228,197,254,214,232,173,18,56,51,82,106,72,100,233,123,57,120,75,8,53,111,13,150,30,128,12,48,76,132,182,214,245,4,94,243,42,89,172,136,38,11,164,27,166,34,173,45,187,225,191,175,210,120,114,150,42,29,158,163,245,162,29,30,184,161,44,187,26,73,68,165,255,250,90,173,161,6,166,127,212,41,200,119,233,114,33,177,66,218,142,36,217,229,73,67,214,37,37,229,14,250,119,92,97,246,204,229,254,33,37,248,27,159,241,228,206,21,89,34,213,126,159,222,244,229,16,41,47,184,30,82,252,27,32,163,238,237,130,81,3,40,85,234,164,245,7,72,2,240,195,141,40,78,226,235,125,204,109,168,136,208,17,47,53,218,39,157,31,13,225,92,83,70,170,2,111,31,251,233,140,5,75,44,55,233,189,51,57,206,41,180,14,54,152,51,126,150,9,13,3,90,84,139,162,41,200,171,246,236,38,91,245,158,45,99,170,233,1,26,120,191,62,153,79,54,223,15,202,173,109,165,100,36,13,187,73,210,79,194,69,186,37,73,2,75,64,79,198,169,255,22,9,69,2,80,8,114,180,151,94,85,215,231,127,163,202,197,161,95,195,203,177,230,20,24,246,114,91,221,120,131,101,146,67,81,31,148,134,13,10,109,12,161,3,90,228,57,157,225,151,43,171,119,42,134,42,215,20,139,234,179,33,204,94,158,113,202,175,90,23,213,205,76,7,198,179,57,219,89,26,163,82,47,204,25,174,214,115,18,237,53,105,166,254,135,109,9,150,191,247,249,95,75,127,218,126,216,51,171,61,69,101,77,84,200,163,152,210,124,62,231,154,183,124,175,62,58,50,76,12,214,115,156,56,150,116,6,74,13,235,232,123,222,220,136,200,200,41,149,50,197,148,3,86,230,89,73,96,138,224,29,39,200,21,181,218,179,154,85,155,153,149,33,78,179,73,46,54,176,244,218,4,5,30,228,175,196,3,93,39,185,71,147,150,17,108,34,21,5,60,248,217,245,31,133,249,53,237,114,167,220,67,17,14,128,62,30,141,172,131,14,48,60,1,170,77,26,157,56,243,85,3,113,112,167,142,162,26,202,66,109,180,188,18,222,171,128,226,92,110,49,139,207,25,26,223,82,15,230,176,187,15,2,29,119,122,209,140,135,201,130,6,191,173,205,49,104,126,13,10,113,83,76,165,98,160,106,152,173,108,193,188,146,131,228,156,222,128,159,23,16,189,236,144,233,6,166,184,109,76,29,136,124,151,118,57,27,179,7,147,118,150,170,139,38,68,19,36,162,40,47,60,93,71,55,239,121,146,5,204,235,226,128,112,32,60,241,35,40,115,79,163,34,44,218,110,35,170,194,109,181,39,194,156,170,43,152,122,195,194,197,135,240,99,162,120,152,86,14,216,15,143,125,122,28,75,35,250,179,167,244,37,235,133,222,142,247,40,55,237,239,150,24,173,65,218,174,116,32,88,166,114,195,253,49,112,6,1,17,39,210,134,144,248,14,59,100,150,228,120,94,86,146,255,78,245,151,48,233,91,146,212,12,56,85,106,102,30,212,240,119,249,31,255,14,140,105,62,246,143,0,199,201,22,223,28,45,23,73,220,99,69,116,39,217,214,214,236,236,64,60,166,14,243,174,67,77,115,235,248,113,175,254,82,101,239,235,147,39,140,48,204,150,155,103,89,204,3,12,189,252,54,116,72,235,127,233,209,145,140,209,165,22,117,254,62,204,201,134,73,41,177,226,172,89,45,165,167,72,117,45,3,29,202,40,115,189,188,60,221,91,131,5,42,57,71,162,14,115,98,21,7,228,79,82,124,237,126,241,136,19,114,59,236,118,140,151,83,156,195,28,113,231,1,55,47,222,176,208,14,122,153,211,44,15,115,29,116,251,79,174,171,110,197,211,174,248,84,241,24,20,28,231,21,185,122,80,139,236,78,103,247,53,222,184,212,213,96,184,190,98,106,168,209,134,252,215,17,127,204,115,133,166,234,132,227,105,37,8,212,41,198,37,133,119,208,135,7,31,125,14,194,23,163,133,44,130,227,207,218,251,98,186,103,154,77,77,110,125,202,194,79,78,203,179,95,30,129,64,74,57,253,178,115,182,224,143,81,231,211,133,241,234,0,19,104,168,206,112,74,225,195,20,215,158,17,190,58,250,243,140,20,101,147,27,80,14,111,139,77,77,50,242,247,192,2,49,157,0,8,102,105,25,80,139,27,197,134,139,95,147,35,217,147,238,143,126,43,252,183,79,115,129,231,49,59,111,245,183,163,113,56,32,214,21,186,138,228,200,120,115,220,154,87,3,68,254,107,178,0,242,35,242,245,58,213,254,220,177,150,14,131,208,22,147,61,205,205,190,178,242,224,122,180,2,65,20,219,193,217,191,173,162,115,48,113,61,247,5,72,103,12,88,145,153,87,203,223,192,196,77,131,150,214,31,107,50,210,238,20,28,229,69,204,243,42,186,93,245,122,21,19,201,61,29,93,228,246,235,196,143,103,253,1,181,254,193,191,141,114,155,1,175,240,245,206,131,244,246,92,72,236,84,159,233,66,114,2,57,161,181,34,227,156,161,178,45,122,142,25,193,230,168,234,161,184,79,168,233,125,58,4,140,11,159,180,51,175,203,251,16,240,21,156,103,212,171,126,202,6,74,72,67,200,92,56,129,18,222,59,220,138,148,28,87,79,132,126,227,47,114,5,103,46,245,147,98,3,186,235,220,203,15,227,75,201,207,237,98,17,41,119,176,237,172,8,77,33,39,123,199,193,68,205,63,12,78,231,106,100,187,137,235,161,247,200,44,67,9,121,223,237,112,157,115,118,150,208,243,241,72,235,146,227,19,45,99,65,150,18,248,158,99,16,38,12,149,94,49,91,114,125,42,226,56,144,173,251,241,172,102,124,17,231,153,103,167,159,101,236,166,231,45,138,0,54,84,6,117,28,49,139,118,150,74,81,154,129,82,119,108,83,89,214,150,18,94,99,76,113,248,74,155,233,72,84,87,224,128,38,209,122,128,109,72,135,150,193,213,104,33,11,204,150,231,125,193,19,90,169,87,116,13,125,47,135,198,102,99,233,83,49,110,22,195,121,11,167,32,164,246,189,139,55,223,4,200,14,174,2,110,83,107,162,15,152,224,72,239,163,214,47,13,241,108,214,192,179,136,237,6,162,56,104,140,90,221,39,125,235,95,126,11,103,156,13,95,224,46,156,71,247,75,189,178,60,177,45,128,28,237,220,39,247,22,28,37,1,72,23,65,242,11,41,57,101,104,20,255,96,223,21,104,196,177,93,101,31,168,183,32,76,84,20,173,75,165,212,106,136,111,199,98,255,65,169,3,253,86,51,87,219,248,206,49,47,194,24,97,43,25,110,127,99,157,171,109,191,44,65,163,63,69,223,102,132,211,220,45,125,233,152,40,14,156,25,158,140,182,226,25,244,185,89,100,207,73,107,149,102,65,154,175,190,13,10,39,189,189,57,237,95,213,197,126,7,192,19,18,135,91,234,237,217,72,170,239,9,50,226,207,148,124,198,244,240,44,103,23,222,191,144,48,238,161,142,97,231,151,111,26,150,110,243,76,44,32,16,152,53,249,110,51,59,4,174,192,125,162,85,78,209,146,251,7,135,51,107,61,92,49,84,202,31,116,173,160,75,148,165,157,110,15,99,170,163,65,3,38,94,142,139,146,193,95,201,26,225,119,49,91,118,140,180,136,160,24,104,248,100,114,17,78,186,132,147,33,226,16,84,101,231,176,171,179,135,175,150,6,121,93,0,199,80,56,196,224,59,156,61,99,156,96,232,199,253,197,162,63,150,190,153,38,255,227,78,43,205,233,29,247,148,228,216,208,125,186,236,243,121,127,174,229,145,121,7,221,76,20,26,25,205,79,57,197,214,224,117,147,112,51,154,174,184,119,179,252,242,183,51,34,207,243,224,83,190,134,229,89,179,125,34,229,135,102,187,53,87,136,39,15,181,102,250,205,200,158,177,229,135,140,243,121,90,5,20,251,203,40,69,179,143,142,105,22,214,22,76,22,225,56,86,39,91,241,156,125,12,186,201,220,1,209,81,118,43,243,156,126,24,75,253,118,82,146,108,16,77,219,122,142,51,172,93,3,200,4,158,111,33,211,239,76,231,222,239,0,168,134,20,171,57,66,208,87,148,234,174,56,188,8,142,126,168,92,12,140,229,161,170,4,8,158,84,68,215,2,130,120,176,155,255,159,239,116,17,166,61,186,223,100,137,193,250,200,189,124,52,182,152,72,79,238,237,105,57,138,187,34,75,224,66,28,176,44,0,159,17,15,159,63,252,7,234,172,188,150,86,170,251,250,0,243,169,36,75,168,166,135,28,108,37,43,165,253,153,145,57,162,206,78,249,24,205,146,14,50,132,141,55,184,242,98,229,170,144,92,22,139,236,130,86,240,80,219,58,131,61,149,151,90,206,42,148,27,101,213,177,7,82,62,67,74,103,173,91,22,61,194,205,9,229,92,85,55,176,195,31,91,44,25,55,97,235,198,58,57,172,25,44,180,140,209,86,108,47,220,242,46,183,108,106,23,111,108,72,235,149,210,21,48,56,237,98,138,141,166,47,152,229,222,58,153,195,219,42,144,128,67,64,81,70,200,224,21,32,83,21,128,79,147,145,255,250,138,125,246,201,223,19,70,152,248,247,176,91,193,162,56,200,28,63,46,50,208,60,224,156,247,226,136,100,193,157,233,114,25,102,23,168,203,77,255,32,251,45,150,200,249,150,250,182,240,28,19,255,69,0,125,11,84,125,46,161,110,169,129,13,34,246,219,92,158,159,12,223,50,3,11,175,161,149,225,52,206,98,62,107,92,224,76,35,137,209,170,50,19,163,140,121,215,224,202,63,129,52,4,135,196,228,244,127,207,127,14,4,95,13,10,14,81,74,85,78,66,150,139,153,137,48,215,100,123,228,210,236,120,176,219,180,212,146,186,4,252,54,229,215,84,79,250,254,66,234,69,166,145,52,249,108,212,35,134,194,52,169,230,250,84,238,118,53,208,28,241,126,146,178,142,8,112,214,218,81,112,150,117,88,40,41,55,29,75,21,239,4,133,46,150,100,136,82,253,112,123,64,237,239,29,218,48,218,149,181,162,78,73,116,12,43,13,132,128,224,234,123,96,158,111,195,144,20,28,24,51,56,229,57,230,158,25,149,182,178,188,147,69,192,157,148,81,88,36,29,85,172,252,193,219,53,198,225,78,241,226,250,245,58,148,56,224,177,138,244,17,75,148,93,53,245,77,193,209,156,169,1,232,59,153,73,208,85,141,89,208,106,226,201,153,193,181,200,189,11,30,215,69,196,14,201,17,240,65,47,155,250,144,135,194,1,57,1,158,97,246,169,103,33,115,195,169,72,104,23,205,35,253,221,255,178,44,14,173,41,21,128,57,180,199,39,110,203,34,128,175,232,17,62,194,251,92,31,117,232,3,135,25,6,242,135,167,197,193,48,171,166,54,129,40,30,206,159,181,181,81,207,25,190,79,50,123,97,134,186,185,172,120,18,181,6,13,250,28,92,186,252,14,201,253,253,247,252,101,161,49,96,184,75,33,240,167,115,240,9,143,131,232,180,27,204,169,96,209,41,149,131,140,251,143,58,225,59,134,231,118,209,113,197,12,63,65,129,132,7,112,85,82,182,246,192,139,177,226,174,75,193,115,237,194,13,10,246,130,108,149,241,70,138,56,44,138,105,107,63,212,52,253,225,50,155,127,197,82,105,57,226,63,42,98,2,32,33,19,102,116,126,55,164,203,76,191,231,29,191,49,87,115,17,156,111,87,4,206,99,73,48,63,63,106,91,26,40,168,195,97,97,58,2,133,114,214,26,250,184,178,178,1,138,58,47,134,213,189,173,140,45,103,53,159,143,246,224,88,7,190,84,165,134,119,170,85,150,142,186,232,174,146,189,193,232,218,123,45,23,19,126,255,181,29,162,210,27,89,198,39,18,13,10,42,228,97,65,233,107,51,214,49,197,96,209,157,239,140,111,203,221,243,50,97,95,42,151,211,246,96,238,35,48,199,158,75,250,77,119,32,117,225,160,179,115,65,24,228,125,52,225,150,95,146,165,175,55,59,176,229,249,12,188,247,176,46,27,214,44,190,87,92,105,154,34,175,3,5,163,11,93,35,113,126,204,94,69,177,117,95,183,120,15,197,64,205,172,51,12,171,228,124,21,45,116,169,166,13,10,105,196,172,181,133,228,83,120,67,222,125,187,5,209,164,109,69,240,184,234,98,168,74,197,181,177,113,156,124,127,40,211,105,69,155,101,205,34,71,142,13,10,99,247,143,52,96,66,30,4,123,45,207,15,182,172,73,225,196,59,21,223,169,237,14,43,133,186,128,30,214,44,135,255,44,117,74,119,152,233,7,124,243,43,219,174,175,252,22,116,243,83,93,171,73,14,32,171,235,66,202,118,199,191,203,142,123,203,31,35,88,47,35,2,212,164,31,95,156,191,232,84,71,74,223,132,87,139,203,165,154,108,49,109,27,252,113,202,179,247,205,79,129,211,211,58,6,53,116,62,160,156,38,185,31,122,237,136,215,183,85,153,44,16,22,52,19,23,255,150,235,138,240,249,57,103,181,167,65,178,82,247,203,162,102,0,24,6,167,244,254,74,245,157,4,59,224,34,176,138,105,232,100,56,171,110,90,195,202,146,192,101,160,198,234,92,198,167,148,247,253,127,81,88,13,10,93,26,64,38,94,128,46,151,243,161,131,34,233,11,156,161,32,70,44,163,225,247,74,166,236,46,17,150,208,36,169,16,33,57,72,35,55,229,198,134,103,192,221,165,117,27,0,16,19,94,110,95,38,59,64,2,240,252,138,146,228,123,179,140,228,123,175,141,35,191,24,94,245,16,45,156,118,22,9,80,103,57,178,5,82,203,105,14,77,157,107,68,82,110,36,96,146,237,28,187,239,100,253,176,75,60,96,177,208,158,95,119,173,93,11,114,250,54,235,181,49,23,99,236,16,56,76,148,179,199,108,110,164,246,249,54,176,73,204,131,108,151,88,223,47,166,252,20,98,183,71,98,36,15,227,213,15,90,226,212,202,111,237,102,113,130,129,179,156,108,34,58,133,155,98,40,145,93,63,81,146,62,238,87,246,26,116,142,1,227,119,217,78,84,64,131,77,81,68,159,210,188,173,235,17,155,113,30,182,253,96,11,122,149,122,140,95,151,141,182,157,233,138,156,218,254,63,169,242,99,172,179,20,128,12,47,22,223,109,225,168,25,116,205,50,79,209,129,200,111,253,145,222,67,147,169,224,8,86,125,5,210,146,197,243,175,128,72,136,213,37,9,72,77,186,160,24,20,218,176,130,27,188,130,212,42,117,159,183,243,197,118,142,165,24,248,52,59,204,36,179,180,45,132,149,177,14,147,152,56,51,111,91,95,245,113,93,4,155,144,92,137,124,235,88,226,208,224,70,244,81,183,82,102,223,21,45,150,184,244,76,173,246,179,42,204,105,47,126,125,24,209,35,213,138,2,228,77,245,182,170,92,207,232,239,15,131,75,228,213,236,94,246,24,77,39,230,236,243,191,48,149,91,227,159,63,237,182,8,193,120,185,207,199,245,151,57,242,110,115,24,200,175,127,225,27,157,161,11,52,44,169,165,248,65,1,4,152,105,64,82,181,181,149,196,60,136,210,236,50,180,102,210,28,155,47,177,182,242,27,26,128,187,104,185,78,216,23,7,56,86,98,13,10,120,149,9,191,154,252,166,212,97,247,219,122,194,34,191,79,117,67,28,80,94,69,20,9,240,88,20,60,206,25,80,252,175,69,161,203,153,222,155,52,9,100,241,42,98,253,17,167,84,15,130,50,188,127,118,89,241,184,214,115,201,235,88,5,213,48,40,94,104,199,73,97,254,118,117,93,167,27,161,49,223,48,95,197,251,245,92,11,36,153,14,18,1,145,177,51,126,247,3,230,252,91,102,153,128,247,179,225,130,42,249,163,108,39,195,139,67,217,84,78,168,116,106,13,10,144,83,41,108,141,34,111,53,169,15,72,99,173,91,36,209,61,128,170,218,14,195,75,123,156,152,214,201,190,189,1,46,122,170,99,166,255,62,147,72,214,234,166,129,120,254,207,160,58,53,53,32,99,125,69,187,200,231,33,193,94,249,94,183,144,79,187,81,101,33,24,172,215,188,98,210,190,190,177,247,177,255,23,135,74,167,204,205,127,154,100,144,113,180,101,14,153,70,50,241,169,81,35,36,187,209,227,1,185,179,182,16,120,174,5,167,45,209,32,1,248,108,169,49,83,222,251,188,116,213,86,173,229,114,34,104,253,53,21,91,18,74,152,153,147,20,23,60,218,216,166,103,122,144,229,220,163,155,73,97,108,105,154,48,86,241,155,172,164,99,105,206,172,78,217,74,119,102,78,83,42,221,172,72,131,245,23,181,195,254,137,160,169,193,148,24,175,114,217,86,178,162,102,0,45,6,96,149,183,213,222,41,6,246,45,92,13,157,181,48,172,251,62,91,239,141,123,148,36,68,56,238,58,206,52,13,10,1,23,126,141,82,33,100,76,20,36,251,135,2,23,13,233,119,187,172,193,177,6,228,44,79,114,115,24,14,79,23,31,130,127,138,200,122,192,223,57,226,50,22,249,146,92,161,162,237,67,47,252,32,183,199,110,58,62,121,128,155,0,237,48,6,47,53,87,208,80,98,16,196,217,123,195,209,241,201,58,110,45,195,3,240,229,234,219,188,179,49,229,122,84,204,135,81,226,222,12,86,4,112,160,32,221,158,184,54,232,9,94,30,4,173,54,12,208,249,219,148,115,112,31,177,148,181,93,160,21,191,184,237,174,242,33,89,218,199,178,119,22,125,229,92,13,10,200,143,119,182,245,125,132,141,171,127,249,44,22,225,87,61,77,194,252,167,174,76,120,181,9,151,229,29,245,150,220,255,241,233,201,145,185,200,218,167,43,54,104,202,13,52,194,57,196,254,233,192,128,254,47,177,138,81,128,68,128,24,73,146,161,23,131,15,170,137,196,74,253,114,178,57,234,181,177,27,199,136,50,0,233,163,70,102,32,11,17,168,142,168,118,157,78,149,237,71,3,130,180,23,175,136,65,158,41,120,61,137,213,110,157,129,78,26,19,149,211,220,195,152,65,236,38,0,159,233,2,134,200,212,130,52,245,138,123,143,168,223,233,57,211,96,179,147,220,136,146,106,177,22,198,169,2,8,231,73,102,3,93,129,220,194,38,85,112,115,242,132,104,127,206,8,85,242,88,119,225,14,68,119,113,226,203,141,114,107,50,91,26,251,114,130,39,61,171,79,100,130,248,213,93,249,195,92,223,105,239,155,229,101,42,96,205,14,191,224,200,245,30,156,201,62,219,32,208,15,167,164,34,127,176,100,237,194,182,191,166,8,184,234,196,253,104,110,45,90,91,70,125,250,185,75,30,67,115,60,173,104,70,214,135,209,7,127,130,179,129,78,13,10,164,15,121,52,235,101,110,135,224,54,183,102,105,64,36,171,241,25,108,117,140,238,73,167,84,131,133,232,48,101,118,36,242,197,53,68,199,71,104,202,188,119,204,240,163,103,158,247,29,75,124,179,31,130,72,132,161,85,176,16,169,238,212,73,36,241,67,81,117,201,40,206,3,233,71,173,47,227,216,183,38,59,195,185,218,39,32,96,71,152,201,39,210,196,137,13,174,251,60,4,223,198,100,247,135,141,3,40,214,37,240,154,202,197,109,27,53,179,41,97,186,14,77,207,58,245,218,230,70,28,241,231,68,126,13,121,54,191,15,50,254,156,39,175,155,20,45,21,110,192,184,244,129,183,128,108,202,243,216,112,188,55,206,21,180,185,124,200,38,213,206,156,168,12,68,13,10,111,220,157,25,232,158,210,228,91,139,147,60,184,36,255,242,84,24,214,114,243,160,5,138,245,207,152,163,36,67,5,5,252,187,54,132,230,192,225,18,63,26,119,102,48,67,143,185,80,198,191,96,30,47,79,32,137,123,214,185,12,54,97,108,147,191,118,58,139,4,91,208,95,58,41,225,239,31,130,136,13,147,62,135,54,76,240,78,211,44,25,49,74,198,115,107,178,137,177,103,6,85,91,186,83,152,203,120,7,122,158,75,13,18,69,253,126,15,88,108,191,45,250,51,16,19,231,7,207,36,244,221,85,119,250,68,22,127,179,81,207,155,95,110,83,8,142,83,199,2,4,61,80,212,131,123,39,7,75,155,172,212,5,201,49,145,4,199,125,186,198,170,207,8,14,196,145,190,255,192,101,153,222,92,112,199,108,21,239,227,211,46,91,124,64,53,112,186,65,210,109,191,154,30,208,164,133,168,45,223,124,214,9,54,115,31,177,193,236,198,52,146,150,43,104,95,232,178,125,13,10,21,8,153,93,15,37,102,20,169,43,176,172,39,43,25,23,128,230,230,28,243,222,188,172,50,97,77,255,192,241,48,254,250,206,213,175,181,30,132,68,151,108,53,215,34,228,253,26,112,183,59,113,47,196,117,114,126,177,91,26,27,107,169,36,128,250,17,18,114,161,209,214,163,177,214,182,90,74,144,88,239,51,171,42,206,231,150,19,221,102,234,53,155,219,6,134,11,177,211,162,93,177,231,216,138,82,8,103,239,26,112,136,247,106,33,163,17,112,68,38,244,176,56,126,50,128,38,201,21,203,241,120,210,223,177,18,188,108,44,31,56,71,199,36,3,148,243,207,95,222,137,13,10,198,2,4,138,233,163,116,228,166,2,71,107,94,21,187,254,87,74,95,144,9,0,11,117,44,250,213,210,137,107,25,170,221,111,199,60,124,94,30,61,228,149,17,78,95,126,155,214,54,14,248,255,113,211,59,114,200,62,14,24,162,197,171,28,123,137,253,216,18,178,212,57,149,229,239,20,140,113,189,89,203,134,1,235,174,188,105,228,199,80,77,80,155,193,135,143,113,250,118,5,181,57,78,90,15,191,147,218,246,84,26,111,60,195,219,71,42,46,77,130,89,173,142,143,175,37,219,59,109,103,150,83,167,209,100,28,17,192,52,119,95,96,218,207,96,224,206,240,178,182,225,42,170,197,177,31,206,66,232,219,13,10,218,51,164,99,208,58,179,54,83,76,226,76,47,137,140,248,41,12,50,91,188,189,117,67,191,244,126,149,154,15,88,104,144,214,6,109,190,153,139,247,234,132,76,240,220,36,12,136,147,72,67,255,175,97,44,184,162,202,206,164,170,50,79,162,125,178,7,141,252,196,55,221,238,57,167,0,57,74,224,72,251,45,207,155,95,194,30,137,20,100,106,7,136,153,6,99,215,216,139,74,162,188,232,134,91,139,24,55,172,48,84,147,42,39,205,84,63,227,47,253,115,146,243,217,60,20,245,181,158,32,6,90,234,113,140,135,125,132,70,52,12,133,178,154,50,95,158,104,216,232,64,63,175,128,56,192,60,87,65,131,216,51,62,125,250,197,4,182,192,153,228,216,107,53,128,229,24,34,25,207,115,112,136,24,123,21,60,59,101,46,218,223,55,107,60,184,86,216,155,69,87,199,25,44,110,175,140,143,12,62,59,232,67,13,10,201,126,242,209,138,21,90,232,62,72,41,21,97,40,105,23,3,220,126,139,83,57,144,199,129,8,71,43,105,159,232,255,210,220,35,15,203,226,224,175,39,132,124,66,148,137,177,215,1,106,91,160,135,190,239,94,77,161,218,24,205,240,196,24,51,42,186,107,127,213,176,19,243,213,34,228,141,13,138,99,109,51,80,38,135,89,198,190,250,253,229,140,105,91,178,62,207,78,248,150,210,186,190,124,188,184,229,248,147,236,115,89,172,64,198,40,92,22,250,50,49,116,69,184,177,114,247,219,89,240,189,240,22,216,4,172,43,7,147,77,184,249,36,138,220,192,11,203,189,111,203,104,178,148,194,148,203,173,95,44,64,56,227,181,252,232,252,174,229,159,234,100,76,77,189,150,137,4,75,113,247,132,2,0,169,137,198,232,92,238,165,97,93,6,17,81,248,192,115,190,78,184,177,195,238,219,75,96,175,102,161,41,235,41,25,217,69,162,75,83,229,58,69,13,10,123,243,105,0,252,144,26,100,36,134,164,254,65,183,215,73,226,0,219,23,50,1,20,77,29,195,6,185,118,9,51,89,215,168,90,179,61,199,152,225,141,39,107,38,173,149,132,46,181,86,18,63,104,86,34,46,6,14,175,76,13,86,144,65,65,38,60,254,55,75,188,21,180,175,248,36,157,53,131,27,32,179,176,50,134,37,12,161,86,66,23,28,75,233,203,138,112,136,121,80,25,159,168,67,134,88,211,180,40,13,34,162,229,56,252,140,44,208,76,151,193,101,109,164,46,158,134,241,141,28,192,48,78,239,202,127,63,73,202,80,56,182,30,56,148,211,185,251,129,49,4,127,97,191,122,214,166,72,35,14,149,75,74,109,166,97,126,170,119,118,221,240,193,80,231,13,30,217,123,90,90,187,135,250,243,87,120,188,149,168,236,172,154,155,83,83,44,188,222,179,68,54,14,77,165,97,132,190,150,119,67,230,164,41,193,32,4,60,242,38,226,19,114,254,154,240,230,125,150,65,133,184,84,1,121,92,152,113,28,247,186,101,49,218,107,58,240,40,252,218,192,27,162,86,222,115,252,27,199,69,106,109,229,125,57,80,250,109,206,228,204,201,167,219,195,154,101,7,27,117,34,172,145,7,36,114,226,139,178,153,161,164,40,133,41,70,139,27,118,29,73,180,8,216,96,74,78,55,175,223,179,242,171,89,227,109,227,217,237,228,48,88,194,152,23,75,176,1,177,128,236,0,205,128,165,221,75,193,232,28,62,135,154,102,91,11,46,3,254,44,99,177,112,139,120,246,171,239,79,191,162,216,193,6,45,51,75,229,101,193,243,66,60,44,234,224,25,130,186,81,122,101,216,93,125,209,106,71,195,101,199,83,89,41,56,229,7,83,53,29,81,0,121,159,7,251,103,78,227,125,27,126,12,227,56,222,246,145,222,8,160,14,88,238,141,138,111,89,190,56,3,87,112,28,207,185,170,123,159,14,78,108,237,177,149,14,85,189,248,213,62,88,218,114,224,241,103,156,9,142,153,156,88,162,11,238,134,174,144,176,233,56,191,214,88,149,90,62,231,155,184,48,162,246,154,173,228,177,34,17,111,41,18,187,12,127,135,205,63,180,139,229,22,115,38,225,173,218,144,103,78,204,123,211,157,38,208,81,130,4,201,62,207,147,17,68,198,228,72,105,19,81,19,102,231,100,244,54,62,250,185,82,189,6,151,186,121,47,109,96,221,59,160,144,121,102,33,126,201,9,138,125,210,203,96,93,105,56,56,207,146,63,27,56,73,225,149,158,191,3,220,167,11,76,58,17,176,183,215,25,53,239,35,185,229,200,148,206,85,235,199,169,16,242,225,242,228,30,178,191,166,79,176,175,196,192,2,198,170,69,193,3,15,251,233,141,239,173,254,112,158,90,91,88,83,170,123,155,19,141,43,81,113,242,117,219,207,86,156,64,38,14,242,190,221,100,234,93,93,100,202,78,249,91,108,241,138,11,99,149,145,200,131,68,209,200,47,176,175,195,143,217,51,218,144,211,131,254,226,203,233,86,96,96,226,214,169,151,101,177,45,179,130,92,176,9,105,2,157,219,61,115,150,132,220,30,169,155,58,199,105,40,227,41,232,31,43,31,64,252,223,233,107,132,28,253,120,223,221,120,170,25,255,35,248,164,152,78,92,108,133,136,242,224,203,56,99,157,162,76,25,150,217,77,35,202,204,214,18,115,177,14,88,164,226,11,171,225,0,14,240,172,178,159,72,30,7,233,229,128,127,139,36,124,181,145,133,84,39,241,144,209,87,174,81,203,226,110,44,224,237,133,54,91,55,107,11,47,147,250,178,221,73,163,167,1,213,86,87,119,61,72,174,190,213,243,150,116,146,24,158,22,39,220,38,193,71,97,78,176,74,75,226,133,130,2,37,219,38,190,229,239,109,30,221,233,26,17,133,17,114,217,107,101,127,80,150,185,44,169,62,39,125,13,10,145,234,53,141,143,139,128,203,225,244,46,115,155,100,133,237,129,97,196,59,62,94,16,100,34,137,14,79,181,77,145,249,252,4,52,199,245,206,135,246,37,183,252,51,159,138,16,222,214,238,30,197,110,85,222,175,54,182,117,17,89,142,198,197,55,197,15,92,84,6,20,221,136,33,39,61,73,31,1,162,3,195,176,14,50,38,34,146,169,28,13,41,9,53,155,236,56,209,51,149,146,144,169,56,217,71,129,51,89,238,54,36,159,121,191,94,195,171,73,180,11,108,23,104,169,11,17,15,110,78,20,30,235,29,20,220,4,111,139,12,163,14,213,236,204,83,122,133,187,63,6,55,167,67,195,52,249,86,247,53,72,195,163,121,83,253,136,249,120,228,201,60,48,125,220,76,103,174,73,120,164,192,103,161,193,7,236,107,13,10,84,206,3,42,118,78,197,28,178,147,140,200,55,171,12,204,226,14,171,163,30,47,203,175,106,119,63,246,26,52,128,29,4,241,36,47,243,33,136,182,93,58,61,154,166,121,217,206,123,76,50,154,125,245,80,170,181,77,71,226,169,47,70,76,228,198,183,112,228,32,22,48,3,182,128,133,87,62,67,58,76,184,198,6,17,243,172,254,71,117,155,65,60,214,140,61,201,24,144,200,32,119,31,46,138,207,208,154,42,79,44,176,76,116,178,144,93,12,104,224,41,117,15,190,34,212,237,7,151,51,96,77,106,127,89,4,210,48,20,248,24,72,139,253,11,213,140,60,54,102,97,160,140,128,164,138,79,255,217,76,22,244,77,40,40,23,91,243,131,61,103,208,159,196,80,161,199,94,45,143,9,217,192,193,123,171,62,177,8,148,94,55,189,87,20,199,154,210,165,194,43,152,69,242,147,92,72,216,191,136,177,184,88,247,120,41,22,5,220,47,82,82,13,49,59,157,42,234,1,33,191,37,41,136,30,134,148,98,110,66,177,55,81,48,233,228,165,6,159,41,73,238,142,159,101,38,71,174,208,73,130,126,22,223,247,205,186,172,228,162,62,196,218,211,76,206,61,13,10,95,56,64,176,233,173,238,138,214,111,97,169,12,239,179,13,121,23,119,122,100,137,98,25,147,165,104,153,46,229,159,73,18,240,193,193,24,95,223,155,63,125,200,34,134,31,133,56,51,198,173,127,219,13,10,185,221,47,254,248,198,179,115,225,116,203,250,66,190,0,115,66,2,156,75,3,245,189,250,125,204,219,1,176,182,96,125,100,98,184,251,134,132,131,236,194,174,238,163,65,59,54,195,3,198,133,83,201,28,232,155,16,7,255,101,95,57,7,74,61,8,106,37,109,222,139,152,253,28,175,192,152,197,13,191,146,12,207,3,149,204,62,31,52,190,155,212,124,20,148,252,13,39,177,44,54,65,9,6,58,222,224,250,97,118,59,206,33,201,125,175,253,50,160,32,154,97,135,218,73,103,55,240,238,16,209,87,177,87,79,95,124,231,245,228,217,43,27,138,20,191,26,235,208,206,153,241,94,254,92,92,95,7,55,230,214,60,47,185,204,227,62,200,69,181,31,155,40,50,112,127,110,185,17,185,207,197,254,2,214,141,142,203,227,33,149,189,242,131,6,200,251,240,123,131,51,114,170,236,35,249,130,192,198,193,143,100,12,80,78,7,103,14,153,185,186,65,191,96,120,2,133,178,105,13,1,36,253,230,101,217,231,223,184,244,194,83,39,143,8,248,112,163,230,159,201,187,210,189,58,125,200,60,16,200,100,147,58,231,175,44,200,179,86,103,241,195,171,214,140,57,113,84,125,107,215,117,199,107,134,16,130,34,23,227,82,175,121,226,79,115,90,94,93,246,247,85,47,130,166,195,207,42,225,66,207,231,150,111,206,159,127,243,155,102,3,73,32,124,200,11,171,185,64,251,76,114,70,230,173,91,145,19,0,230,137,29,206,175,147,86,221,153,246,51,81,82,56,1,193,198,203,216,21,185,86,85,252,29,68,114,17,149,100,97,63,138,107,20,192,210,94,17,19,176,127,235,156,121,190,36,203,2,24,2,100,198,242,241,147,48,0,210,178,64,234,174,238,50,31,225,247,170,107,190,198,239,180,217,212,160,78,142,196,153,244,54,194,153,156,197,143,184,143,157,13,10,151,108,78,9,56,215,132,103,207,151,173,251,157,151,198,1,38,236,248,229,231,37,132,205,145,215,83,156,171,75,70,79,216,144,184,246,228,168,228,247,92,44,79,35,58,183,221,46,202,141,246,103,226,244,225,13,10,149,206,56,99,164,62,208,183,33,124,208,53,0,235,188,17,142,8,196,147,230,99,216,128,171,25,234,8,120,227,244,37,52,167,51,88,174,229,194,25,27,92,90,37,21,99,194,116,37,171,13,10,111,144,169,252,152,196,108,146,171,251,87,8,31,135,170,156,176,54,187,137,221,14,226,72,23,136,230,15,3,125,116,54,177,39,198,208,59,117,83,87,253,197,181,13,10,14,55,153,134,39,114,178,65,214,178,153,186,44,222,100,13,181,91,17,219,153,27,191,234,216,7,15,55,231,215,29,187,232,178,225,108,204,94,253,135,0,130,109,66,106,95,139,187,27,55,27,230,222,223,97,115,190,246,211,124,68,230,169,101,185,13,10,101,168,83,49,46,143,4,114,177,177,216,164,12,118,154,53,237,35,229,191,113,21,158,160,31,6,38,88,104,49,243,39,115,61,114,187,121,14,202,21,140,151,55,217,9,218,230,173,199,143,34,240,210,254,203,118,14,17,139,184,83,229,89,231,234,38,31,27,227,142,4,131,123,247,182,61,194,234,81,177,106,230,145,233,219,69,129,112,99,8,177,108,39,180,88,190,93,238,175,125,221,209,154,224,194,40,215,127,29,195,183,132,160,246,150,150,166,104,78,158,119,9,93,142,109,167,45,168,102,136,41,16,110,91,84,166,189,18,192,107,12,210,4,89,177,16,215,83,111,254,86,173,237,31,68,236,152,39,113,93,141,194,237,26,150,6,233,57,23,169,183,78,228,86,123,95,78,216,180,228,54,177,104,133,143,147,147,175,154,165,230,13,128,239,106,122,173,17,88,156,87,131,22,225,239,141,222,85,13,10,63,124,130,208,140,13,86,34,205,238,198,225,74,146,108,226,117,201,85,92,156,123,144,96,3,138,230,51,14,59,211,196,108,82,237,47,29,211,138,87,171,13,10,216,170,175,167,223,17,94,160,92,195,173,229,179,161,243,35,218,0,172,24,67,153,187,173,169,163,66,238,3,32,127,195,149,75,240,179,183,170,101,15,215,239,138,204,250,139,100,24,115,157,136,49,119,46,162,120,1,20,97,239,61,183,24,93,227,188,238,134,67,244,50,83,175,172,35,13,10,236,105,173,140,230,208,48,138,45,7,76,252,140,139,73,196,244,67,202,188,133,116,215,251,89,177,141,140,43,179,2,59,3,159,156,50,89,184,252,239,49,94,192,87,204,116,29,197,141,244,177,123,12,139,62,3,123,80,145,32,135,75,26,169,223,73,119,24,243,127,74,142,211,128,16,186,214,63,112,133,250,63,93,38,56,90,34,48,180,103,54,146,163,8,137,2,71,110,187,42,20,184,102,205,14,251,205,250,98,207,147,137,45,252,173,45,37,190,229,62,222,255,101,93,197,3,235,143,187,18,132,176,96,114,218,236,40,112,3,140,205,207,92,144,140,202,81,107,133,25,38,247,54,209,106,100,195,2,0,148,220,29,119,142,248,162,176,219,68,211,142,75,11,100,150,215,151,83,168,224,98,218,55,17,168,211,188,142,90,32,65,82,213,100,190,219,1,39,49,151,143,249,241,155,219,6,199,62,98,77,149,79,139,240,131,249,17,188,16,140,213,68,80,219,209,169,216,134,159,113,21,204,255,64,238,21,82,255,7,201,102,182,27,1,24,151,17,54,248,34,209,245,107,25,95,196,42,92,167,98,244,184,94,19,41,244,152,111,189,127,230,131,11,136,217,26,234,179,147,13,124,70,70,172,139,64,92,15,58,49,35,19,201,46,62,82,65,74,155,225,9,148,138,229,92,89,107,19,183,175,71,191,4,206,46,117,94,154,215,45,145,253,226,82,209,64,134,42,141,48,13,10,119,3,222,140,65,100,188,99,86,84,171,37,207,87,243,53,164,230,34,209,127,101,30,73,41,203,78,55,35,7,13,172,57,148,59,239,92,156,126,52,122,49,212,46,23,204,172,9,129,173,181,121,211,20,127,39,204,218,162,153,32,29,149,20,38,24,203,177,108,149,62,87,198,117,189,208,132,113,37,3,178,35,212,214,34,214,25,126,209,45,81,176,52,42,151,22,70,58,197,77,101,195,213,29,246,45,102,173,250,194,7,110,60,218,44,169,185,13,133,117,110,187,150,181,2,134,146,220,247,171,161,158,162,171,177,60,226,249,180,222,180,26,33,190,229,81,45,112,115,36,203,11,56,90,65,179,55,98,152,22,88,139,246,172,200,59,162,190,123,64,189,83,97,177,41,104,129,70,97,21,94,169,148,13,182,180,197,136,120,156,202,179,84,227,228,228,116,6,66,247,165,60,113,134,253,54,31,166,148,91,11,100,248,154,182,175,31,121,69,240,86,76,27,255,131,16,26,227,66,65,94,50,41,225,187,139,49,163,123,95,64,157,101,248,102,206,167,209,229,89,43,95,54,100,134,171,189,212,239,13,248,210,228,101,44,112,25,44,238,157,192,74,179,153,210,154,80,57,25,173,66,4,45,71,102,24,108,23,117,1,69,60,118,215,83,93,100,110,46,111,114,95,147,181,153,104,133,131,96,15,187,201,187,204,113,164,148,243,112,167,50,148,119,69,63,107,15,204,132,125,128,144,224,134,128,184,218,213,15,202,7,107,91,189,207,107,159,41,72,220,222,35,65,250,42,243,14,53,202,192,142,162,27,84,4,73,136,254,199,230,62,46,48,60,157,41,48,226,198,119,32,72,188,92,8,103,65,113,57,193,33,160,72,139,41,142,193,42,226,84,223,203,43,193,191,172,238,67,104,182,27,105,44,214,214,101,93,151,175,13,180,88,255,189,167,7,3,89,34,82,195,191,12,6,12,133,207,125,189,65,16,127,240,239,114,53,144,118,148,110,8,246,6,66,84,81,239,232,2,182,209,247,71,76,200,3,60,143,235,236,128,77,21,192,254,245,187,14,60,2,251,169,243,12,83,235,254,181,149,4,185,155,72,2,142,75,126,232,236,43,173,35,38,242,131,192,116,233,95,252,96,253,123,143,76,66,248,139,44,176,212,123,120,112,75,91,135,68,13,10,151,140,255,120,25,246,63,151,116,2,99,122,86,238,133,225,254,235,98,237,109,106,156,75,212,171,52,148,104,209,200,58,83,117,217,45,100,28,93,37,106,126,177,17,84,100,68,192,81,164,113,242,184,199,58,233,210,89,108,153,69,144,127,6,113,176,149,230,36,203,92,198,198,28,42,151,25,146,243,43,111,204,6,93,156,55,65,252,23,145,134,60,30,206,159,20,53,2,119,209,119,133,81,7,235,153,219,203,224,239,125,111,240,0,85,133,108,215,142,199,6,11,196,31,253,118,182,85,6,234,172,82,117,128,122,129,34,18,95,24,163,3,95,59,73,58,255,124,64,252,224,84,67,195,24,239,41,76,207,191,27,183,127,67,197,183,44,20,67,117,162,128,156,197,237,131,3,165,129,120,72,188,184,247,104,254,195,112,101,41,81,242,163,43,249,123,64,214,126,125,234,172,26,229,240,197,58,0,235,25,77,221,213,155,203,191,230,173,157,184,63,174,226,54,153,98,146,135,176,26,37,152,153,114,73,101,102,116,210,13,47,142,102,16,45,158,234,213,55,113,247,128,21,80,162,192,49,176,200,195,72,47,93,255,153,188,5,133,123,180,215,42,152,199,45,106,133,223,59,103,37,227,43,198,137,100,215,9,194,6,254,167,127,69,17,34,103,80,200,81,139,255,158,15,176,57,24,128,179,134,151,207,177,166,128,45,2,236,133,117,247,236,240,117,174,245,233,194,62,82,102,213,212,217,179,85,168,177,132,38,2,152,89,158,166,77,246,86,197,36,225,92,126,93,208,136,162,94,247,133,27,212,52,77,25,31,88,185,25,120,216,86,91,22,92,41,44,13,10,252,127,158,174,226,126,167,205,163,159,154,58,102,175,63,251,130,48,59,217,61,45,188,176,110,29,70,85,59,209,208,105,231,33,4,199,158,124,2,180,51,33,66,237,216,91,127,78,147,12,163,231,6,71,175,47,202,80,116,177,238,236,253,94,70,196,150,243,192,13,221,56,237,233,25,138,47,77,8,43,113,30,113,38,56,112,27,150,123,85,251,231,111,202,227,111,108,107,202,68,195,247,167,38,68,135,192,45,210,119,183,153,72,156,190,39,164,122,176,53,99,66,228,72,116,38,153,27,114,53,61,38,93,191,111,91,4,82,112,90,177,153,205,116,225,192,23,227,54,80,226,79,165,221,15,127,192,50,168,113,25,251,200,208,211,103,43,182,237,77,46,86,148,183,72,110,1,240,242,45,139,216,188,170,132,131,231,250,114,43,14,66,176,195,13,237,142,9,176,145,163,220,59,100,116,31,74,199,127,190,52,234,56,116,196,135,250,28,4,13,194,14,132,102,172,37,211,134,44,124,219,205,113,87,28,38,14,190,234,204,222,2,146,192,26,234,237,117,228,120,22,229,155,230,49,155,243,216,94,36,37,118,33,96,54,12,215,211,137,129,227,43,81,183,163,78,75,134,158,114,118,165,203,195,201,230,92,122,78,253,39,102,40,243,226,198,7,0,79,205,167,152,97,121,169,53,56,155,70,12,135,11,236,100,132,235,225,93,23,239,113,74,40,85,146,151,40,148,156,244,163,227,148,207,138,28,68,128,72,204,152,29,78,74,222,132,157,218,126,99,131,136,97,158,186,40,120,149,179,131,41,139,215,120,56,74,206,52,23,22,189,108,116,57,8,173,52,103,187,240,54,200,118,2,161,13,63,101,223,108,111,2,27,85,53,59,74,73,3,4,189,0,204,208,231,157,82,13,242,24,92,20,108,59,37,72,163,133,139,218,126,252,204,221,1,183,248,111,161,136,213,178,132,210,139,41,149,208,223,53,170,37,155,234,125,161,146,210,3,33,68,214,35,116,203,68,47,37,163,249,244,16,38,227,8,249,176,39,174,221,58,211,204,243,77,74,84,124,44,238,126,186,65,194,44,247,185,24,137,196,176,146,25,250,48,18,76,46,152,239,96,182,16,214,55,81,184,205,137,41,89,19,165,180,9,62,67,202,151,84,63,69,174,174,11,98,49,152,20,135,55,200,166,174,60,7,119,229,119,160,182,3,90,60,224,50,97,31,171,178,88,67,252,28,130,242,93,49,204,135,148,183,119,199,228,248,116,50,135,161,51,16,20,191,3,38,251,217,157,141,183,94,2,199,144,41,133,128,234,189,228,13,10,218,34,248,11,229,195,116,38,163,107,20,231,134,193,239,143,55,222,162,60,203,247,65,45,30,108,108,17,1,1,56,2,215,39,163,120,158,218,45,156,189,248,69,200,80,147,15,130,62,60,162,212,135,59,49,1,209,182,201,64,98,113,7,85,42,234,186,71,182,64,128,67,104,225,44,237,112,90,242,70,236,51,95,145,2,79,202,8,45,191,27,199,77,221,93,147,101,115,183,114,86,235,217,234,181,155,128,118,139,69,98,85,5,232,205,25,60,233,37,223,78,78,97,253,207,43,190,13,131,41,67,242,172,149,245,190,72,145,205,88,75,25,239,15,61,246,145,155,175,164,215,25,250,19,89,226,206,181,46,38,124,62,243,233,60,6,27,90,30,185,254,129,35,97,120,79,215,15,51,41,190,121,103,204,71,210,52,112,6,179,150,159,128,158,145,217,167,181,124,221,231,47,201,88,194,165,37,225,64,93,110,143,0,7,244,6,135,118,129,145,210,28,172,243,32,255,105,93,220,225,165,96,4,13,10,143,211,152,2,34,60,97,73,207,237,179,180,162,14,61,158,140,149,106,249,174,236,178,205,19,145,184,111,189,182,226,184,229,226,72,215,133,211,200,182,79,248,141,70,26,9,177,69,222,113,41,229,102,101,50,24,214,161,123,114,109,232,231,77,139,216,175,245,6,82,221,215,138,13,10,13,10,41,68,79,78,230,74,170,227,18,33,73,228,248,96,168,176,145,11,70,206,26,166,23,196,148,210,184,103,26,6,232,22,79,228,146,67,89,30,170,240,119,55,223,214,227,20,25,1,107,206,253,66,210,230,195,199,180,143,103,207,141,59,242,102,137,34,219,23,141,216,196,31,165,201,70,97,38,176,200,20,62,103,45,176,76,141,48,182,46,19,87,54,83,219,170,194,132,232,246,62,57,254,62,173,134,37,168,41,70,205,253,145,146,14,204,43,34,70,125,202,132,91,174,217,73,117,49,119,254,152,160,77,95,89,243,115,185,13,10,122,231,38,220,205,84,242,230,176,60,241,38,65,181,128,88,60,132,107,42,59,37,8,247,8,155,69,143,100,216,18,188,241,193,96,97,55,171,136,227,81,180,207,108,32,153,141,202,108,29,39,132,205,201,192,247,40,40,40,233,49,120,97,56,217,236,213,90,229,255,136,13,41,35,187,195,132,193,57,203,80,231,144,155,97,142,75,57,11,66,174,155,14,46,102,165,228,69,63,233,157,46,94,103,207,122,61,143,199,134,74,125,124,161,59,24,101,17,28,109,236,96,202,54,197,3,60,240,173,12,160,213,236,205,184,181,95,236,214,99,80,13,10,155,23,246,217,27,155,72,119,51,145,187,68,147,76,21,94,212,67,79,78,154,199,177,78,82,117,233,229,108,57,104,78,35,215,140,171,128,187,47,16,203,108,23,221,98,156,131,250,84,214,197,50,188,85,8,22,63,214,73,46,51,105,121,172,138,41,121,156,222,250,170,30,40,98,111,29,188,236,27,201,45,55,55,128,142,169,192,167,84,166,16,37,35,86,250,150,232,63,55,231,183,191,27,207,185,120,143,52,224,161,232,142,57,53,51,170,75,107,153,122,201,216,111,102,83,195,199,251,37,32,13,150,234,64,45,156,67,212,104,97,106,36,162,116,229,240,27,36,6,155,136,120,126,73,153,147,56,95,105,239,2,206,241,42,193,188,54,248,123,176,27,88,208,236,190,214,240,206,110,173,194,100,46,105,66,150,22,242,29,34,224,48,88,252,45,233,117,125,182,132,150,243,140,33,42,132,232,32,168,249,122,156,191,250,132,158,203,53,92,109,126,95,123,25,238,130,240,15,121,116,98,44,161,58,101,130,2,23,215,4,60,51,0,6,35,79,28,135,186,80,105,138,90,167,25,219,143,127,151,142,147,29,126,48,79,122,15,190,116,11,81,110,230,131,50,44,82,87,117,137,124,199,105,7,0,237,207,50,116,126,161,74,119,165,54,42,42,138,163,202,13,10,215,48,118,99,252,233,82,125,176,142,28,241,119,190,31,6,174,59,159,252,11,170,198,255,22,101,92,194,236,81,45,33,211,193,139,67,147,30,59,187,216,48,171,116,227,97,189,87,66,134,185,240,111,242,54,232,57,16,232,186,174,15,116,161,9,96,86,20,251,118,45,120,207,181,18,247,43,41,11,22,52,216,30,6,128,123,111,51,22,209,134,225,36,232,40,155,100,174,95,27,65,116,237,161,150,82,226,108,71,251,189,27,218,162,128,76,84,165,26,107,248,203,241,69,147,25,218,126,248,222,69,109,237,60,45,198,62,239,236,99,29,43,31,38,202,90,11,252,56,8,121,82,81,120,19,65,169,255,170,251,174,234,60,16,98,236,244,191,148,158,227,178,214,137,206,240,187,114,24,17,27,40,117,253,79,95,58,98,1,132,102,135,41,244,159,168,214,97,253,212,27,108,204,170,22,14,214,81,230,246,87,29,133,63,39,160,41,165,94,143,127,73,29,243,13,198,165,151,215,175,105,9,96,178,60,123,97,136,205,174,59,129,24,226,208,143,49,111,116,207,185,113,32,213,108,43,151,123,87,22,190,170,121,68,72,217,78,62,203,255,78,6,52,247,82,134,104,218,113,101,193,112,157,109,211,46,149,178,86,251,13,10,241,14,29,30,190,17,27,105,252,216,61,114,33,186,82,255,101,210,125,150,159,181,108,130,65,175,232,62,203,17,64,6,255,253,240,159,185,185,229,84,201,113,216,212,42,177,23,67,166,158,237,175,11,119,18,5,162,81,80,173,104,92,176,124,181,201,3,21,161,167,142,211,204,149,99,180,238,37,227,223,140,150,169,120,146,22,49,0,67,119,232,29,96,62,198,107,68,123,166,55,110,24,74,167,89,249,21,247,117,24,57,68,85,64,127,82,29,29,70,198,120,253,95,41,75,89,156,26,199,143,171,167,111,35,34,130,37,193,125,141,143,42,218,213,95,165,241,181,240,125,129,243,97,83,66,163,148,77,224,61,40,115,82,121,176,41,6,208,57,148,157,59,147,187,94,13,2,70,81,212,71,235,241,156,164,230,30,77,206,157,137,240,161,83,106,106,158,233,141,216,13,10,181,235,26,121,82,100,44,197,202,119,130,251,6,154,166,156,115,75,72,74,221,213,195,60,180,119,243,78,213,141,249,246,43,221,189,38,190,84,193,210,9,193,202,239,6,98,104,56,3,5,19,174,73,24,23,16,229,44,22,180,247,78,54,236,172,194,158,170,41,150,38,192,135,41,67,108,161,69,176,169,98,212,41,85,91,253,175,52,67,200,163,250,154,187,215,177,25,46,168,158,93,44,232,165,61,222,22,61,77,241,121,198,30,13,10,45,114,85,84,161,86,173,11,199,5,4,188,114,3,94,189,3,91,49,193,231,116,40,1,145,87,56,164,29,29,32,48,90,29,80,96,64,3,61,29,163,7,151,248,51,121,238,33,7,25,164,43,246,163,229,18,111,21,27,79,50,51,218,142,204,216,136,66,35,148,221,214,66,215,98,32,112,225,46,21,22,53,9,251,9,201,175,146,152,207,239,90,76,36,149,53,101,149,115,188,192,15,157,139,220,58,255,11,206,102,75,171,78,210,119,223,147,169,25,237,235,90,17,156,60,176,85,123,234,75,71,131,1,131,21,146,199,153,4,107,165,35,136,51,13,10,153,176,111,73,215,18,177,137,122,178,142,201,42,193,239,64,128,110,24,145,127,95,34,1,122,173,179,199,127,83,156,117,233,85,105,105,222,157,77,127,124,205,13,10,132,255,205,141,66,211,171,170,176,86,11,146,159,89,216,218,69,221,7,17,154,168,246,71,168,154,68,98,47,64,95,234,167,248,121,253,237,106,204,239,221,107,225,198,118,166,121,2,108,233,151,182,247,190,240,197,45,41,247,234,199,96,27,88,101,30,39,204,48,49,143,166,75,189,83,163,55,65,235,239,35,95,151,27,157,51,242,179,35,239,134,171,69,243,189,223,225,176,196,9,146,210,99,42,228,53,113,149,218,141,212,239,131,16,166,24,75,82,164,33,61,232,242,209,162,126,31,166,176,52,231,237,182,105,164,62,98,125,226,4,173,190,74,163,173,237,24,69,72,239,71,125,30,202,61,99,180,32,123,243,152,24,230,21,59,57,12,3,15,230,253,171,198,213,138,171,146,56,121,217,233,254,179,214,214,248,61,138,198,133,74,18,28,184,228,220,80,158,144,172,135,224,39,128,121,253,61,38,126,118,220,250,131,42,153,81,168,150,110,60,32,127,140,96,121,167,17,37,123,82,159,127,112,180,154,216,125,209,198,76,143,198,132,198,156,246,119,43,216,108,250,187,169,81,35,98,252,22,48,135,70,180,38,133,40,134,226,63,38,6,157,169,179,61,69,9,206,76,16,77,13,10,5,81,199,0,126,20,88,168,98,32,117,50,112,208,6,139,173,162,142,248,245,146,239,144,182,253,130,201,36,168,115,164,4,172,187,228,190,51,146,183,150,177,18,152,42,171,238,203,225,9,201,227,240,220,250,151,80,13,90,1,220,12,140,202,200,191,172,252,240,121,13,42,79,54,162,116,228,109,246,252,174,217,132,128,40,224,89,198,123,29,153,211,182,240,233,183,148,88,106,156,209,28,132,242,11,118,5,118,36,41,63,51,54,213,118,212,8,14,31,181,68,107,132,204,58,247,148,129,13,196,254,80,222,254,175,115,244,3,86,72,140,222,207,105,212,179,214,67,204,177,33,135,173,235,68,245,179,175,89,182,175,103,43,107,179,107,182,67,137,169,101,117,149,238,47,171,13,194,120,7,156,208,42,123,80,73,94,180,226,21,149,109,42,186,144,204,97,36,73,51,171,88,176,83,243,94,163,235,193,229,112,144,138,219,230,169,61,65,76,108,5,198,213,48,138,140,145,87,104,166,100,190,40,223,113,133,35,37,196,225,203,147,236,243,140,67,114,75,152,194,160,164,130,186,34,176,25,137,84,181,146,228,197,22,6,184,206,82,121,78,80,127,229,56,8,156,71,46,96,141,20,69,123,66,189,167,21,4,209,67,112,201,255,124,218,39,245,54,201,28,103,202,152,157,191,132,255,65,125,233,3,206,166,67,248,71,215,26,76,122,160,172,207,143,232,185,227,202,98,25,226,26,179,180,210,153,150,251,59,146,52,143,231,74,229,184,206,126,230,138,154,197,181,206,13,114,0,54,108,148,170,250,127,180,13,10,66,53,1,149,20,237,209,204,98,253,234,67,66,140,111,236,210,226,58,27,58,96,61,13,95,221,237,34,201,125,55,85,153,80,171,67,175,188,65,178,59,51,86,181,58,244,53,193,12,132,111,101,34,218,14,9,77,141,200,157,2,237,76,69,184,114,245,230,44,173,57,78,138,128,246,87,222,6,59,24,155,44,40,214,31,151,205,36,128,14,41,112,120,179,81,225,46,158,28,196,186,52,229,104,187,77,226,236,197,27,225,237,59,48,28,205,230,51,153,129,85,14,233,212,86,178,78,206,172,246,35,117,207,168,78,149,179,191,91,124,46,74,207,30,35,212,189,156,116,211,31,94,164,179,188,19,169,135,36,23,166,21,109,156,87,106,206,210,50,38,28,17,120,244,236,64,149,201,79,248,208,224,155,18,55,84,247,117,37,7,222,209,186,111,91,34,235,5,219,129,28,179,188,182,194,67,154,63,77,145,40,79,169,17,200,21,100,133,8,125,23,27,66,9,236,215,105,219,24,212,252,194,234,168,157,195,62,35,40,28,61,187,72,129,94,66,49,103,25,138,213,51,161,227,94,74,146,114,105,135,93,24,191,46,125,170,105,219,141,166,141,193,35,127,102,53,231,82,91,29,61,178,236,223,58,206,241,110,78,56,193,213,110,11,144,32,19,92,19,243,83,145,179,37,13,10,4,189,181,81,97,125,113,45,60,16,103,16,244,177,131,18,215,66,140,79,148,52,97,50,80,248,61,159,163,82,88,181,232,0,173,216,69,152,5,189,56,169,185,80,123,122,43,167,87,83,174,253,96,247,67,3,73,227,236,90,226,114,238,83,169,95,62,21,128,24,34,54,85,18,96,183,184,54,226,217,160,181,9,228,211,219,98,41,17,56,57,19,143,219,181,129,42,138,180,13,239,254,249,168,171,147,146,17,222,142,60,104,44,150,47,190,74,205,194,251,111,5,105,158,246,32,17,68,248,167,42,198,52,101,136,85,17,233,126,118,148,19,36,231,232,63,206,72,66,202,69,143,53,156,61,221,28,103,84,233,244,84,210,51,112,144,255,41,214,181,23,124,200,201,222,45,41,105,156,156,72,124,205,145,158,184,106,73,239,103,25,54,18,91,209,33,63,28,200,252,125,138,68,163,190,237,131,67,234,108,109,143,132,79,182,139,38,149,215,63,140,139,175,177,170,55,139,150,163,129,148,223,255,111,25,59,151,240,18,139,215,109,67,97,147,63,203,35,221,68,224,91,220,101,255,115,19,241,218,230,67,81,8,27,87,132,126,183,169,197,65,59,119,54,125,211,45,105,126,204,226,40,254,228,128,147,152,70,99,4,19,133,99,90,4,248,169,103,70,218,235,184,62,204,40,70,210,66,219,157,181,81,220,126,69,3,75,185,16,124,74,82,78,91,137,172,135,57,168,182,212,40,93,167,2,13,10,30,41,233,149,191,3,160,238,58,20,28,34,13,10,90,195,97,250,167,165,104,6,99,238,249,245,88,174,173,37,20,108,214,248,254,207,55,89,15,46,13,79,158,136,115,198,138,100,81,185,23,62,86,20,73,156,241,253,240,5,223,128,203,181,198,228,58,193,206,177,160,42,33,185,252,107,24,175,183,135,212,182,134,104,13,230,152,207,38,178,167,84,11,240,26,237,66,23,47,79,41,16,56,72,183,247,94,15,59,217,190,110,124,139,220,175,141,35,219,70,227,233,73,167,107,176,111,21,88,26,241,252,182,59,176,104,33,121,36,212,113,78,94,39,88,104,204,110,102,227,96,141,166,215,87,33,247,139,117,20,105,152,121,90,117,131,212,67,30,217,91,243,78,148,186,166,141,122,155,156,21,18,58,58,57,210,135,138,206,130,209,17,188,195,147,24,81,2,69,61,182,13,160,176,183,131,144,133,231,178,38,39,89,194,164,147,64,18,39,193,24,90,101,140,214,215,115,48,210,196,88,109,168,73,124,1,96,19,85,98,48,13,10,87,248,176,154,180,27,176,77,143,41,190,139,84,89,83,163,13,7,38,113,159,198,175,129,35,243,58,93,249,94,90,236,254,8,18,231,229,166,127,90,119,107,149,57,210,42,217,31,224,205,119,113,165,239,235,115,185,206,171,152,165,229,34,255,98,174,132,152,68,39,3,103,90,242,28,69,46,0,143,102,122,136,70,98,17,105,95,14,61,166,26,225,59,230,179,65,7,152,69,81,6,193,38,31,111,72,241,241,9,31,231,55,86,5,124,74,245,212,238,237,143,224,156,192,142,50,126,208,128,207,77,242,17,35,166,36,142,165,58,217,157,20,250,30,127,192,29,203,69,67,3,229,176,227,106,34,116,104,29,138,56,134,119,84,65,45,197,114,56,203,192,172,46,202,143,143,190,47,254,138,11,3,131,243,238,175,211,123,3,167,48,71,215,113,201,138,59,3,171,196,164,79,137,94,93,67,194,88,229,109,44,167,166,152,211,107,38,201,246,253,128,76,43,20,217,117,167,198,132,171,220,179,145,103,241,5,185,45,53,169,147,80,86,62,105,19,234,206,92,108,65,211,235,63,78,206,38,6,44,85,193,52,119,45,118,239,202,36,217,250,170,225,51,234,132,38,232,104,90,234,132,50,150,45,158,188,123,163,230,76,249,25,133,197,6,237,183,148,108,147,189,57,107,63,240,31,119,149,157,64,43,69,157,226,15,33,192,77,20,102,46,12,49,24,166,41,50,252,2,120,210,46,106,30,198,246,121,168,246,104,151,241,189,178,103,114,180,11,69,109,26,21,203,23,99,104,112,206,126,78,15,222,251,128,84,84,208,172,166,94,0,37,214,200,251,122,72,55,120,59,19,102,198,96,167,67,117,67,108,29,249,116,39,113,103,130,40,216,204,30,47,67,80,133,113,129,61,9,52,35,233,49,17,144,154,83,28,49,60,21,254,96,193,133,53,87,156,4,149,18,207,211,7,110,232,250,191,242,169,238,97,237,141,33,139,181,188,40,216,227,4,122,236,227,73,188,103,93,199,205,63,108,180,74,162,66,129,62,196,15,74,177,96,28,145,133,214,26,49,84,54,20,94,111,186,33,30,123,78,134,120,203,59,105,215,179,159,71,136,143,225,255,13,121,183,176,22,117,154,117,19,206,39,15,65,36,232,90,108,115,114,191,134,64,36,7,9,94,194,147,55,205,16,178,236,88,173,16,68,44,254,16,110,181,168,54,228,206,164,165,178,154,130,231,250,224,205,180,84,119,173,172,82,8,67,116,14,118,232,77,130,8,187,187,183,157,234,109,64,82,172,115,221,199,117,200,14,253,6,56,178,174,237,11,60,241,23,58,217,162,44,9,111,86,107,123,168,198,148,182,160,85,48,241,188,238,232,49,85,52,146,24,197,209,138,26,125,187,157,38,226,59,237,127,132,199,62,187,247,226,222,0,46,180,105,37,109,107,13,10,101,165,209,121,14,106,179,222,218,77,12,103,111,148,148,113,163,196,112,226,118,128,210,190,8,138,77,130,210,111,1,7,36,13,10,61,107,60,208,62,112,32,11,187,245,43,249,13,10,186,49,206,37,34,62,74,86,46,191,182,212,247,154,163,44,19,152,82,44,87,65,82,20,29,47,230,191,6,246,164,94,54,250,113,8,145,180,2,47,5,14,254,64,153,7,12,150,97,86,222,166,226,247,170,113,196,113,140,198,6,79,226,249,18,204,115,181,12,255,13,10,47,153,153,122,185,156,248,181,27,189,45,247,115,29,58,232,122,49,62,14,73,159,44,137,79,245,58,152,15,79,148,139,157,132,18,87,171,49,28,163,250,140,103,63,226,2,166,120,114,128,234,13,238,72,254,230,78,40,208,158,23,82,43,157,43,52,93,94,109,146,255,85,19,106,157,171,252,51,74,187,212,1,141,150,197,212,130,159,13,10,43,154,210,93,77,39,153,129,88,207,88,43,18,111,223,82,68,232,146,54,46,166,179,192,64,209,218,237,143,16,221,122,204,6,31,117,67,22,243,62,74,51,111,180,218,255,147,212,177,206,172,248,102,59,161,53,246,180,88,202,173,230,164,241,41,252,159,253,126,138,41,174,230,199,169,38,57,117,185,152,75,199,12,188,245,199,132,137,186,167,174,122,167,22,11,189,152,107,109,149,182,35,151,24,47,55,143,235,57,238,33,117,65,164,193,239,160,129,202,162,57,177,209,206,203,155,5,202,96,32,11,252,173,117,197,200,106,35,207,119,172,238,46,118,29,172,139,198,183,200,241,177,76,96,139,248,124,114,32,42,64,13,10,131,218,142,61,121,174,148,149,167,38,86,4,32,67,93,39,93,249,152,63,254,65,60,158,201,83,40,5,229,52,216,21,59,247,153,33,194,13,10,189,230,165,217,174,136,123,32,38,90,98,219,38,248,160,75,90,134,3,170,135,110,95,129,19,70,200,7,157,87,179,14,9,102,197,50,168,34,146,170,165,49,214,224,146,59,24,159,254,171,67,59,5,158,8,15,233,209,167,236,139,101,2,83,66,27,140,227,59,84,243,124,141,46,198,186,64,203,180,14,125,133,83,181,183,21,231,197,165,138,184,239,106,38,110,78,53,97,241,24,41,152,7,159,124,142,9,144,140,90,240,9,166,18,101,166,24,35,212,51,202,226,143,20,171,13,10,84,151,199,7,221,254,129,39,227,193,240,209,243,39,241,75,198,94,243,52,150,211,29,226,163,228,79,70,12,236,229,108,59,206,77,64,41,154,91,247,70,37,108,81,249,169,172,214,163,140,105,189,75,211,38,220,32,139,220,181,128,46,7,158,158,192,27,239,13,90,135,217,38,73,237,181,141,24,194,20,162,48,153,126,230,11,9,9,61,125,99,167,76,84,78,101,47,91,158,142,208,77,200,189,1,243,219,125,137,43,91,147,27,108,127,204,56,128,155,206,48,98,139,89,78,201,65,202,207,222,100,83,232,228,181,60,225,48,176,106,35,160,246,42,165,92,94,65,217,198,2,1,235,78,145,213,221,56,85,168,153,190,103,62,29,124,118,87,126,155,150,70,216,126,161,219,30,35,159,148,13,117,160,121,139,249,132,117,187,142,50,26,254,93,40,113,197,34,31,93,79,236,221,46,11,91,221,207,134,201,187,101,183,57,113,126,174,8,164,90,239,255,130,124,60,80,176,136,155,210,56,238,148,173,160,116,254,200,197,94,218,137,27,47,201,74,64,114,215,108,3,144,204,97,206,207,42,202,219,119,59,180,169,105,211,91,134,55,251,18,53,202,65,143,247,139,184,120,162,72,156,162,202,60,76,69,194,208,66,182,151,239,168,113,85,23,32,51,149,80,1,119,178,11,128,228,240,230,41,36,88,249,202,233,25,229,107,32,174,108,77,171,74,201,206,155,251,57,60,207,46,100,36,25,190,114,117,228,249,234,45,158,187,46,69,252,56,97,84,40,9,188,219,30,42,157,222,60,97,169,6,64,88,189,179,136,198,170,66,95,91,128,52,193,208,41,196,60,51,18,123,116,183,242,125,69,28,65,229,242,105,148,233,175,60,239,68,127,21,0,238,34,201,91,18,183,163,173,1,235,137,191,192,214,13,64,115,128,50,60,182,64,117,176,3,97,9,127,149,35,34,55,13,59,118,64,151,82,20,162,55,243,205,92,117,137,108,43,131,191,209,191,84,93,3,42,13,247,88,221,234,51,31,190,247,236,234,85,210,107,102,3,43,79,144,149,0,155,82,243,82,242,204,206,169,178,254,113,13,241,50,142,242,195,162,83,190,44,232,226,77,132,179,48,38,112,56,43,12,127,126,208,205,90,175,113,95,247,180,230,101,23,70,77,90,79,224,89,212,76,235,7,230,47,167,35,115,65,83,106,224,84,155,53,234,125,118,208,99,175,214,28,172,40,79,219,206,181,146,181,143,190,155,233,135,21,149,198,130,206,183,226,74,150,229,0,214,96,170,115,49,72,214,163,107,67,28,157,47,163,117,2,225,241,6,98,125,192,161,116,210,208,250,218,178,87,83,237,229,187,119,54,240,82,225,209,146,17,222,178,98,80,151,225,229,168,180,103,246,160,2,122,27,81,138,91,33,222,196,117,73,142,116,158,62,239,207,105,29,180,182,15,7,247,216,39,118,22,71,8,193,31,51,67,156,172,59,168,204,160,119,82,188,180,217,38,247,84,101,90,60,134,40,176,17,108,56,237,21,33,203,160,182,76,183,2,170,216,160,205,126,14,37,125,177,131,162,13,10,7,50,60,157,47,66,210,122,219,61,2,163,61,8,208,136,143,97,26,243,4,236,178,143,111,235,15,240,87,49,168,84,107,241,160,134,108,225,43,58,5,199,211,254,165,157,0,223,253,90,218,240,153,30,223,197,30,142,220,72,78,35,199,199,81,133,95,223,58,115,62,132,244,18,65,5,36,236,113,248,26,142,12,146,81,221,76,104,34,168,152,53,48,87,166,218,235,46,142,203,76,227,42,51,75,202,149,59,54,119,136,62,181,240,177,80,86,61,2,27,213,227,142,181,20,206,52,200,154,156,67,13,10,152,103,164,121,0,156,103,125,226,65,224,100,104,108,202,108,55,94,204,242,79,161,93,96,152,126,124,4,182,211,227,136,199,142,22,45,125,19,154,227,248,187,54,225,181,171,100,22,243,86,254,241,190,31,167,136,164,53,90,213,250,144,69,37,158,81,89,140,112,174,28,71,233,19,218,131,166,189,201,128,75,165,237,49,113,146,229,24,22,203,147,103,250,128,251,229,177,208,66,61,15,105,55,39,100,15,237,182,248,72,161,8,203,61,158,75,140,89,147,180,128,135,193,244,34,77,203,106,113,191,104,114,204,191,128,189,239,51,245,46,202,73,228,63,103,85,18,175,159,170,56,23,222,170,36,185,181,23,8,219,92,158,167,101,51,151,240,73,127,98,31,17,114,226,72,132,25,241,130,120,130,140,72,210,132,151,52,229,249,221,204,84,181,198,19,41,0,212,232,74,89,160,39,127,145,142,205,76,83,254,220,141,193,158,15,106,250,83,129,109,118,115,131,165,249,240,126,99,189,143,203,254,245,60,144,89,192,99,156,155,193,35,122,91,21,86,214,193,41,7,13,10,85,199,235,88,195,32,112,163,42,226,147,255,7,81,35,57,71,190,25,249,1,16,76,45,61,173,103,252,30,215,110,159,46,93,72,165,187,34,137,190,119,76,108,86,247,19,195,211,253,71,74,201,151,80,126,253,43,94,195,22,208,206,159,27,125,13,81,220,131,82,193,212,82,192,113,54,168,3,220,37,93,236,55,67,203,145,88,200,41,215,99,240,63,29,50,3,84,220,216,170,60,206,109,199,212,14,203,21,52,85,164,60,17,8,173,80,225,60,54,6,102,98,173,14,233,251,122,48,147,109,48,98,139,227,143,113,77,189,151,196,147,144,83,220,250,75,197,74,209,104,199,106,91,22,212,247,24,47,185,141,109,8,41,148,98,157,182,242,73,226,137,87,1,88,142,194,125,8,40,60,148,195,205,163,106,207,38,191,221,14,35,63,215,1,163,77,131,165,23,95,188,232,31,96,177,227,174,248,84,128,139,203,226,13,236,29,165,96,252,72,14,13,10,95,2,149,20,27,152,171,54,235,23,43,70,179,147,208,162,127,211,46,109,190,230,51,87,214,98,152,253,21,78,206,47,117,181,22,106,81,90,244,131,71,164,121,164,61,47,52,245,92,216,188,140,253,54,211,30,99,28,73,17,185,28,207,144,208,2,232,191,75,244,103,134,155,19,75,245,35,105,47,197,111,105,132,102,90,129,59,60,87,183,188,229,25,21,149,234,105,24,194,85,182,20,75,140,146,122,244,204,139,243,193,168,59,6,117,114,106,209,37,232,193,138,166,81,28,31,165,31,29,244,184,16,75,238,137,237,79,204,221,239,189,125,163,70,54,120,192,88,11,80,58,251,246,127,14,240,9,170,228,226,27,80,70,57,102,148,235,241,176,95,245,106,142,48,75,97,51,251,179,58,224,84,14,232,77,50,117,245,161,15,215,241,9,112,227,96,109,193,144,77,47,178,76,65,55,36,191,247,170,43,165,48,59,114,148,141,250,165,115,111,130,169,49,125,117,83,180,66,23,178,120,155,13,73,116,101,242,30,167,134,240,57,45,56,112,125,118,24,4,44,112,134,143,113,53,216,250,177,65,24,163,171,146,63,72,203,48,215,107,218,168,77,185,97,117,12,30,13,141,117,72,176,128,136,180,39,214,201,252,41,92,11,206,193,8,173,210,136,233,113,190,249,110,34,160,93,103,80,61,197,20,75,103,69,164,203,74,8,208,242,190,19,232,18,213,1,228,117,213,168,52,242,157,207,51,65,27,25,225,244,193,217,162,33,46,50,183,150,208,209,116,35,146,159,226,30,147,170,231,215,98,162,109,148,108,48,154,118,157,193,117,134,158,152,77,107,229,163,1,168,115,134,193,195,136,210,72,142,58,140,80,20,111,123,227,225,241,215,86,177,132,20,229,60,142,67,247,255,188,43,170,148,189,226,37,55,115,59,207,220,88,40,202,163,248,137,202,15,245,203,88,232,168,46,248,79,85,48,179,210,244,144,82,101,201,119,247,82,254,154,231,47,151,137,209,82,133,92,22,183,120,144,251,216,160,245,5,18,132,191,67,224,254,227,111,192,135,118,172,11,11,224,109,3,44,238,186,86,41,76,230,86,245,163,216,107,188,7,253,27,177,234,238,9,178,39,33,162,126,226,187,29,248,49,33,123,199,123,30,7,90,75,23,46,214,185,20,235,169,134,235,148,62,179,127,148,205,109,163,213,89,160,208,237,230,119,25,111,154,251,246,115,180,131,109,226,43,152,141,146,183,180,154,193,12,40,237,142,55,145,253,191,86,207,63,45,174,11,180,145,83,194,200,78,91,227,103,176,14,67,62,83,178,242,37,21,208,57,165,183,201,154,163,99,19,151,82,80,34,185,138,236,147,197,19,220,63,136,66,119,53,145,49,159,255,126,39,7,183,173,192,205,213,107,13,191,151,115,79,68,56,54,37,148,163,129,105,67,165,58,51,251,153,140,23,115,36,194,190,238,221,96,64,107,21,227,220,153,32,63,166,18,100,51,22,203,66,13,10,91,125,168,205,220,74,187,114,133,253,83,115,143,32,210,75,141,99,36,223,245,126,197,52,249,0,154,15,217,219,212,244,29,106,221,157,90,144,245,144,114,49,214,64,149,39,110,150,253,184,197,159,173,117,57,212,91,151,207,222,115,60,187,165,219,79,8,171,43,64,228,93,177,1,66,72,17,81,204,89,132,232,150,12,147,188,170,141,134,184,230,106,223,154,253,253,124,79,244,54,181,231,157,65,49,100,104,118,124,174,100,143,11,212,238,189,44,58,69,192,140,207,63,88,100,225,226,179,140,40,132,162,210,76,129,188,138,33,100,126,6,172,252,252,99,94,201,138,162,248,153,144,42,72,86,117,245,4,115,243,90,118,232,119,218,123,73,101,118,145,22,198,164,165,127,13,10,37,240,107,14,230,115,4,147,111,97,120,203,178,76,126,208,224,51,196,226,217,23,169,180,213,14,102,210,130,121,97,137,206,68,7,39,237,104,222,16,150,88,206,51,115,121,142,89,166,14,70,32,78,136,231,151,205,168,130,21,110,99,168,241,54,80,139,175,20,194,66,146,64,165,174,113,239,62,42,136,106,216,195,25,105,99,187,7,225,46,248,27,151,22,250,234,133,202,162,39,51,130,189,14,4,115,199,56,6,24,200,231,22,247,122,110,219,115,63,130,185,2,73,237,121,176,160,234,16,245,1,9,57,133,149,181,141,144,250,57,220,60,114,253,252,100,82,16,16,124,127,198,191,150,195,126,121,136,235,24,2,189,163,100,125,15,121,58,130,140,50,241,161,161,245,26,111,230,43,35,84,200,152,160,12,255,118,22,70,201,14,253,93,155,139,76,137,135,112,55,84,152,106,136,13,103,109,36,179,106,42,181,244,27,175,29,196,134,107,249,231,128,151,85,192,156,128,12,137,245,140,255,97,18,35,251,63,230,168,197,197,203,231,198,105,32,46,229,65,140,202,147,253,127,91,22,60,21,148,105,177,89,15,76,108,58,214,161,163,87,109,145,200,177,154,69,70,159,80,27,128,164,159,230,253,171,63,140,133,245,69,52,8,31,174,247,227,157,142,12,251,184,96,6,95,187,195,241,241,239,83,20,242,46,140,66,61,199,210,235,116,145,126,223,133,24,128,83,119,81,194,141,15,150,93,34,231,87,49,253,71,167,20,202,151,160,95,42,38,132,129,90,110,223,167,144,216,130,71,114,123,45,95,246,56,148,220,158,61,100,162,11,80,196,42,56,147,202,114,126,206,9,9,41,7,19,248,108,11,189,13,10,204,41,11,222,114,177,70,103,114,26,34,14,211,17,115,176,117,168,232,213,57,62,129,202,59,212,106,126,253,66,187,48,27,124,78,185,211,229,189,0,176,214,155,13,10,52,141,245,194,98,69,176,50,201,231,54,13,165,214,108,118,86,196,11,213,65,68,73,150,46,80,131,164,200,174,0,109,172,219,160,209,88,33,32,225,211,108,5,52,205,172,129,79,198,8,18,124,125,4,60,19,83,119,91,140,114,252,213,150,178,52,197,123,44,95,27,244,151,250,193,253,230,250,36,127,133,172,143,83,133,126,185,130,58,164,244,190,54,42,28,70,219,194,223,154,105,175,158,111,205,163,215,99,253,3,203,199,249,214,38,32,28,214,254,82,15,75,150,96,165,122,71,46,89,246,57,174,181,204,136,163,207,148,175,24,58,182,148,100,98,82,47,96,215,149,147,227,226,205,205,80,136,118,98,33,11,93,25,61,191,69,113,96,15,111,58,19,177,125,202,32,124,81,246,77,194,26,215,147,13,10,38,38,26,102,66,22,243,196,73,6,36,13,10,148,231,84,31,184,244,192,110,163,72,21,240,229,209,177,78,225,199,245,130,121,74,255,170,248,232,27,67,124,186,37,138,161,66,236,217,53,55,147,47,32,70,156,188,51,92,83,57,120,48,134,204,198,209,92,55,73,11,83,164,75,30,179,47,70,91,225,245,3,61,158,238,150,49,37,4,219,208,90,88,29,199,220,63,78,144,29,193,30,156,123,227,103,193,155,60,16,187,161,167,139,232,78,165,117,72,188,122,75,167,13,191,126,79,100,209,89,12,101,181,169,60,135,23,31,37,148,77,208,225,235,237,212,219,153,40,145,170,215,181,127,37,151,32,198,72,147,253,64,12,26,67,218,183,167,150,116,7,78,134,60,143,233,45,106,64,178,175,29,83,63,238,201,174,3,126,45,146,171,67,208,126,133,86,252,0,75,222,158,250,125,219,226,92,116,92,213,64,213,244,86,184,236,21,56,225,183,244,197,137,18,87,69,234,255,150,42,213,173,220,252,3,66,178,104,224,48,188,49,26,254,38,247,22,190,44,150,53,0,35,211,235,76,162,220,205,185,32,194,204,90,136,39,172,79,81,151,147,193,71,158,106,9,180,50,4,156,13,20,9,169,66,57,5,88,171,60,217,13,10,140,83,82,177,28,85,192,158,151,37,4,66,159,221,17,245,2,207,87,205,132,93,39,147,169,90,165,196,218,33,254,32,22,112,170,52,43,67,202,248,44,68,165,38,199,182,120,150,240,201,118,87,138,215,102,218,16,184,63,229,62,22,252,166,165,12,34,205,230,162,185,61,208,153,187,122,34,33,249,0,16,228,130,154,198,100,96,89,54,25,59,152,183,210,153,55,124,54,91,206,28,214,216,82,16,115,122,31,21,51,198,132,206,51,35,84,127,130,254,158,26,63,254,156,151,7,212,12,27,76,43,174,119,60,220,177,114,40,205,166,224,189,8,117,114,88,28,202,211,23,122,202,5,214,151,25,104,162,236,34,112,57,226,125,115,200,197,144,22,170,116,143,147,129,159,57,97,238,208,219,95,208,230,84,33,163,135,17,109,95,143,146,55,148,74,225,181,37,149,97,27,223,113,165,190,248,215,220,98,106,23,141,197,57,13,10,175,28,243,103,75,178,116,94,161,8,199,50,114,74,102,121,102,97,46,58,98,157,154,137,85,39,11,164,170,27,50,108,240,238,154,20,150,76,109,34,184,83,227,150,113,184,130,5,69,88,227,235,114,240,27,64,232,131,183,229,135,21,186,203,87,111,157,60,159,117,75,178,17,166,129,135,153,52,122,200,109,117,26,38,21,32,138,66,38,127,12,138,99,156,140,87,48,144,98,28,188,200,177,135,201,104,239,48,159,59,64,139,13,10,226,85,57,214,132,44,86,37,230,248,190,160,126,224,3,234,240,7,123,130,83,28,89,69,45,126,95,125,177,225,253,27,27,241,47,181,52,119,180,81,46,31,236,227,155,112,91,170,104,188,11,132,179,238,164,220,12,13,10,235,157,64,78,113,204,173,240,39,90,189,75,210,179,43,95,73,61,79,147,150,8,129,2,72,245,177,123,93,204,56,91,231,103,124,66,2,177,167,30,242,231,214,220,76,216,239,225,178,251,234,114,1,188,50,213,38,3,217,57,167,46,90,127,120,18,111,37,55,44,235,206,148,15,49,167,111,139,138,253,34,249,216,188,11,240,164,221,44,176,56,184,1,24,16,90,43,67,63,213,205,233,24,147,210,240,19,195,84,33,140,27,100,100,13,172,53,154,225,71,215,254,4,96,36,149,211,13,10,37,141,225,250,26,50,0,227,79,43,13,196,52,115,15,101,237,175,240,115,174,54,250,222,237,231,113,205,120,109,249,72,6,232,213,235,229,94,9,2,13,10,103,157,208,245,225,85,97,191,111,97,169,107,26,17,246,77,188,229,136,167,186,173,204,44,7,96,189,244,146,78,207,5,124,179,52,121,229,110,87,137,98,123,224,156,213,109,103,78,18,209,57,148,130,81,130,186,79,183,34,102,92,59,96,186,205,175,169,200,13,10,201,215,147,21,62,153,123,80,96,191,213,247,61,54,192,59,194,77,211,141,45,206,27,253,121,182,42,214,19,186,84,142,188,243,171,6,195,63,66,215,103,34,246,235,5,104,0,155,163,165,90,79,148,36,243,175,100,166,240,127,99,2,222,156,75,237,24,62,109,246,138,29,250,140,89,85,238,56,27,229,91,35,99,252,220,229,203,153,218,230,79,165,125,64,49,92,42,127,195,205,35,50,85,21,205,194,40,89,118,114,207,15,85,198,119,214,2,119,57,100,210,6,184,38,99,49,204,71,6,201,130,3,48,239,216,244,37,177,30,36,216,229,13,10,250,75,80,40,129,29,234,239,36,238,61,5,1,46,148,26,61,75,196,150,92,155,167,187,84,253,147,62,174,182,80,116,112,47,121,74,121,24,27,8,50,3,209,188,196,50,230,219,64,94,39,9,196,252,182,132,247,142,45,85,103,188,7,159,115,232,185,199,108,58,60,39,239,178,79,161,226,143,16,252,0,151,225,167,157,7,76,48,251,136,212,224,114,109,16,208,228,136,74,101,112,20,245,232,242,231,117,128,172,180,65,189,245,205,137,211,195,184,143,157,119,47,110,80,152,13,10,126,111,98,129,148,173,246,145,170,49,84,153,224,199,25,21,13,10,238,3,232,58,138,57,166,214,134,29,208,52,87,39,51,177,89,35,46,70,173,168,63,199,94,159,21,219,192,245,211,119,167,243,213,60,105,44,131,63,249,126,139,223,28,202,186,177,221,69,168,25,214,152,88,80,128,78,153,180,243,109,214,153,232,39,237,12,184,175,44,107,134,229,64,206,194,23,180,195,241,241,145,217,109,5,142,178,242,28,94,135,50,216,242,109,13,212,181,180,162,174,103,193,94,22,36,110,230,176,5,191,171,133,208,79,230,57,168,80,203,164,114,131,35,39,186,49,172,23,147,127,183,58,105,76,143,141,196,79,186,86,209,54,245,179,76,59,42,105,160,129,63,74,142,176,101,70,77,247,8,221,55,238,43,225,37,197,24,109,92,141,140,149,227,233,43,212,136,0,13,10,70,108,108,186,1,200,248,125,182,59,235,224,93,229,232,228,208,121,255,175,69,26,71,237,215,70,130,206,197,190,253,147,69,135,47,138,119,23,113,187,34,174,244,215,76,11,27,235,53,40,148,216,131,169,202,159,183,74,45,188,194,173,180,245,133,224,143,175,240,128,11,245,42,222,7,160,220,4,133,19,114,194,135,145,41,201,100,19,63,207,53,78,46,171,155,171,57,235,246,104,96,127,73,158,28,81,150,254,255,248,19,58,165,60,57,106,138,193,194,85,64,144,131,79,199,7,143,243,58,145,254,7,165,41,112,1,54,115,87,255,226,191,15,145,40,106,162,46,189,63,172,72,231,211,39,131,90,52,203,142,221,162,160,180,26,124,22,196,108,191,161,185,208,170,181,32,133,210,27,175,244,238,212,196,37,6,12,54,112,192,125,221,16,112,8,180,67,129,176,41,40,90,6,235,234,97,187,129,13,253,49,112,167,232,232,5,38,159,137,51,107,160,232,249,45,90,98,169,16,11,184,91,30,137,84,74,127,67,223,85,161,3,51,169,236,22,241,55,68,137,0,67,225,118,174,75,86,42,75,86,169,15,250,59,143,129,251,241,250,224,77,125,84,77,183,240,126,155,83,72,149,138,65,212,217,131,201,189,212,179,195,146,157,17,123,4,193,218,185,198,165,12,123,13,79,153,133,191,118,76,82,99,56,12,191,219,106,167,177,159,206,186,252,5,180,90,104,249,112,64,236,113,174,241,217,6,98,208,12,102,35,230,174,190,89,101,31,22,102,137,23,50,180,18,89,94,250,231,191,226,251,230,126,162,2,113,57,251,59,168,75,173,129,218,254,246,113,165,94,239,3,2,187,208,175,204,162,2,155,72,236,31,46,239,32,66,74,39,53,152,192,241,29,129,46,7,62,37,87,143,118,197,105,190,128,206,82,21,169,74,188,7,206,199,36,176,109,39,202,13,10,32,233,120,101,219,68,210,242,56,78,173,170,25,253,34,26,127,240,85,137,36,8,21,79,88,249,30,96,187,101,13,10,72,191,207,27,230,129,88,97,89,76,91,155,195,139,66,212,104,232,187,56,110,133,113,197,214,116,227,22,69,150,145,95,15,47,253,9,13,81,221,251,0,136,246,36,120,95,186,96,72,154,13,10,176,175,25,237,145,124,73,199,212,181,180,178,149,219,120,3,184,70,240,243,80,132,250,216,39,84,254,124,148,142,186,53,249,36,239,16,147,251,194,184,177,43,4,241,246,202,32,116,170,121,105,23,32,172,177,203,153,141,118,67,64,206,149,121,82,131,153,232,107,208,251,148,109,39,208,235,44,227,150,155,134,125,53,164,102,247,169,243,4,120,177,156,19,157,51,231,157,33,195,44,11,132,117,36,252,24,92,104,245,114,134,63,255,151,204,69,8,203,220,69,8,229,34,54,14,186,248,127,232,152,132,251,178,175,51,62,218,58,124,45,6,243,223,6,126,46,235,165,19,31,163,134,61,212,247,41,100,45,189,107,196,164,175,99,247,78,150,190,197,84,183,235,226,115,223,48,117,180,58,118,238,71,210,104,189,40,214,162,254,42,65,83,37,100,13,133,161,111,253,132,108,3,108,244,91,182,102,240,215,91,134,143,145,53,131,180,159,74,39,220,142,45,91,51,144,113,7,222,192,162,117,255,227,207,155,38,77,225,173,60,63,161,74,188,51,47,106,60,14,7,219,29,79,73,212,196,125,64,251,143,151,255,18,91,237,168,251,39,251,134,234,174,210,136,68,79,148,150,56,214,72,254,5,46,183,218,217,28,125,172,113,2,202,82,24,190,239,213,20,85,102,30,177,58,33,136,177,217,112,26,8,178,131,194,136,58,61,209,13,168,77,232,104,239,233,123,165,6,117,220,109,20,56,167,161,119,85,248,7,118,101,109,56,212,26,151,247,40,188,245,209,83,158,133,107,169,227,183,101,230,22,242,124,165,131,104,117,114,252,78,152,104,65,58,177,74,9,117,98,40,197,107,243,202,150,177,198,246,58,149,74,79,126,255,12,174,241,55,42,3,138,228,73,3,19,191,199,89,159,220,181,126,126,104,92,115,62,247,216,142,97,162,157,157,93,114,111,75,158,110,63,230,24,152,112,17,39,16,148,197,213,100,102,157,84,197,232,232,166,55,143,205,102,83,231,83,72,250,88,13,10,114,218,11,181,226,92,0,168,95,71,189,188,100,232,234,111,86,13,51,79,251,142,221,38,209,165,143,2,182,50,59,181,34,243,15,247,92,130,146,231,145,155,0,137,237,131,174,190,186,175,77,178,206,236,132,16,122,158,87,108,225,34,32,89,130,108,237,195,161,37,187,4,218,139,96,74,37,41,92,162,183,180,241,202,19,33,135,144,225,195,125,47,84,130,153,176,98,45,70,142,130,19,210,14,62,13,13,10,90,143,154,21,64,173,254,56,126,101,79,128,47,131,144,244,91,81,67,235,25,109,245,15,4,4,87,248,142,44,190,174,170,250,82,83,2,208,44,36,175,18,90,88,202,153,12,190,237,37,231,2,64,104,27,24,149,58,72,175,244,244,65,150,97,106,229,81,216,53,206,71,94,164,99,44,1,144,44,155,239,153,193,3,126,191,235,140,136,239,81,25,82,212,43,219,30,226,1,59,21,96,53,203,217,76,34,226,41,25,152,27,162,7,27,15,170,166,108,244,54,159,85,205,182,95,67,140,226,177,126,245,247,227,34,168,176,101,72,106,204,14,62,99,136,174,222,159,205,133,9,121,11,46,105,115,198,101,75,87,103,35,214,208,181,215,134,168,213,155,237,48,70,73,43,233,137,239,200,93,194,219,152,55,40,100,60,37,1,171,138,128,82,118,186,1,62,45,25,186,118,222,22,46,165,95,163,161,205,87,73,92,110,208,187,164,233,248,73,39,217,64,41,142,166,221,164,206,186,92,150,18,142,92,157,186,107,241,167,48,214,189,162,77,138,235,143,247,70,133,228,87,221,14,239,61,125,60,161,58,34,213,233,156,241,94,105,8,195,166,246,103,55,186,126,125,203,32,199,163,117,79,30,237,228,244,197,145,203,128,76,78,195,147,44,8,220,165,131,191,121,94,79,145,153,75,107,205,179,198,103,80,30,179,43,41,222,74,233,219,133,228,90,185,202,115,243,138,21,118,152,202,237,98,196,129,173,60,95,90,8,77,62,61,236,204,140,225,32,161,208,239,250,161,210,251,250,20,100,175,122,54,147,207,230,247,139,56,60,159,140,21,247,146,128,76,140,50,175,19,191,26,219,31,43,111,152,183,46,109,188,244,225,90,46,67,69,62,190,101,211,9,175,232,101,15,178,48,207,67,222,97,35,136,35,153,111,68,30,191,13,111,69,198,40,144,41,38,93,24,204,216,157,202,75,24,198,69,69,107,124,74,15,121,34,195,140,162,168,48,151,161,100,48,98,53,64,121,25,47,197,142,43,116,189,210,6,1,71,52,75,57,96,60,148,169,2,52,77,213,154,53,59,131,96,78,122,22,75,106,81,251,17,134,177,37,222,114,57,53,99,129,28,63,169,94,160,213,70,91,133,119,184,119,169,42,173,254,185,253,252,17,150,85,140,239,82,161,230,144,27,121,207,122,237,124,193,169,216,161,231,165,30,133,244,166,3,236,197,235,247,144,205,57,236,169,194,46,225,165,243,135,99,47,154,16,0,226,94,218,239,9,175,98,250,1,7,99,38,234,26,77,30,167,122,159,184,124,194,218,29,152,186,93,185,155,124,32,12,19,17,71,72,171,117,139,49,131,87,170,88,236,31,19,64,93,28,99,167,251,72,191,0,183,157,102,57,200,199,117,102,20,169,50,197,147,240,83,136,176,238,123,236,255,153,130,19,244,238,105,232,81,105,101,29,134,165,3,84,119,154,45,192,68,6,23,155,86,209,206,54,206,85,97,45,53,22,45,157,237,243,40,126,236,241,112,45,93,119,26,151,192,138,32,212,74,201,211,188,207,190,193,90,159,188,148,159,130,180,223,80,217,117,109,231,17,155,221,181,144,22,11,178,179,48,85,220,181,253,93,237,78,13,10,244,32,240,142,145,180,16,0,135,131,143,38,163,202,40,243,108,7,47,191,197,21,154,4,174,17,226,181,190,92,173,254,54,55,112,154,9,178,53,12,177,197,107,180,74,165,175,139,80,128,45,169,254,156,120,67,248,51,71,206,27,36,136,28,162,238,251,17,188,194,25,180,45,143,106,58,204,158,207,125,16,66,112,62,225,5,240,239,213,101,152,244,118,31,26,181,65,97,204,82,25,250,173,253,65,186,212,212,218,0,145,83,179,137,142,115,122,217,30,133,25,242,103,200,255,207,146,80,156,200,31,73,13,10,96,96,11,63,163,232,186,102,163,47,120,185,50,147,126,191,8,165,163,123,210,54,33,185,163,0,49,198,197,243,231,192,111,254,143,100,173,137,163,109,251,134,52,227,185,34,154,98,239,118,212,66,174,244,4,99,81,216,171,195,164,215,154,68,15,136,40,247,197,31,145,35,166,78,100,104,169,73,65,164,102,165,29,94,124,147,232,68,130,196,28,183,78,187,128,233,244,46,220,44,235,95,254,148,71,171,243,56,107,102,53,159,11,179,232,106,32,211,144,139,227,174,159,202,63,188,86,179,3,163,53,37,212,60,80,140,4,49,155,139,175,59,133,3,241,227,184,194,67,21,105,235,125,33,125,107,146,63,217,205,216,9,91,176,9,61,157,252,255,177,186,186,82,78,83,137,92,36,160,140,206,31,94,96,220,24,159,221,165,148,46,245,194,208,79,160,231,90,64,42,38,248,245,161,89,16,225,250,171,161,250,163,136,17,235,98,231,251,28,28,72,251,108,124,163,12,47,96,61,167,158,216,143,132,93,190,173,149,51,192,34,17,60,206,58,195,61,211,196,20,87,38,104,18,147,14,180,12,203,127,157,173,145,89,173,109,122,85,233,41,49,35,216,85,52,25,15,224,132,149,6,42,136,241,193,206,233,194,56,80,128,7,120,50,137,53,28,200,126,119,41,237,223,211,52,117,251,193,120,180,169,164,206,149,112,8,249,240,26,69,233,160,105,219,173,82,40,153,99,36,150,0,151,101,59,87,44,131,78,234,18,29,96,100,7,176,20,195,193,167,163,72,93,218,11,132,180,123,86,195,156,114,221,11,55,19,195,15,191,94,33,28,18,170,245,43,85,22,234,158,52,169,234,3,166,105,146,173,71,219,5,147,205,241,214,19,106,46,8,4,53,91,95,160,115,189,110,155,137,43,119,79,169,234,152,80,220,19,237,97,254,102,109,65,41,137,39,106,148,251,221,132,195,226,156,233,245,65,3,49,138,244,193,29,34,136,6,97,95,132,198,235,46,101,203,223,30,251,112,184,43,204,185,247,117,181,173,243,171,161,43,220,30,235,112,90,109,116,60,84,154,211,217,190,111,2,113,141,76,20,78,22,108,169,61,217,245,204,63,213,4,183,21,128,64,5,173,103,11,248,60,220,214,231,155,141,25,108,128,19,30,92,23,206,139,134,139,215,55,219,56,108,6,159,50,205,138,169,127,40,108,215,76,151,241,205,162,144,39,144,180,97,72,180,169,141,188,134,26,222,13,65,156,52,24,198,128,130,204,135,123,15,52,164,82,26,154,236,183,185,215,171,140,207,159,118,153,105,209,231,92,2,140,152,84,52,142,118,105,139,31,12,11,214,180,11,97,134,5,8,117,111,53,61,93,193,112,52,174,222,6,120,242,188,35,5,51,27,110,233,128,19,195,75,64,191,67,233,168,16,139,206,85,238,251,65,107,183,122,100,165,8,110,127,230,155,246,35,52,78,138,218,65,87,121,63,4,197,194,153,64,123,85,174,11,83,204,33,207,20,109,136,167,69,198,114,186,155,203,153,251,250,13,100,51,234,99,204,171,233,212,209,157,160,17,172,139,75,119,182,77,182,70,149,27,151,82,237,151,52,228,191,107,213,245,198,123,222,13,56,81,4,199,192,188,216,1,6,145,243,75,22,167,116,8,237,203,162,202,238,167,225,240,100,181,206,25,30,60,52,149,4,184,83,161,122,184,135,203,35,226,251,84,166,44,199,167,151,93,249,106,222,99,252,238,203,187,148,104,139,249,151,169,231,120,83,24,69,116,158,148,125,53,33,5,114,137,168,20,90,252,180,108,50,226,242,106,126,251,169,229,84,74,29,80,43,231,107,56,159,215,59,220,156,232,253,176,3,219,78,17,79,165,12,123,9,247,179,8,100,208,250,143,29,53,30,69,12,64,177,186,29,228,119,194,191,201,222,24,114,21,209,85,98,45,40,41,179,252,81,155,8,247,65,25,161,90,17,234,221,24,234,181,158,69,146,236,254,162,215,229,87,9,114,116,71,59,26,27,75,177,250,100,29,213,24,230,217,156,164,210,225,95,114,166,111,234,179,230,41,110,118,192,165,167,9,245,150,129,14,144,240,221,119,70,26,254,64,171,130,200,185,106,21,54,79,137,49,87,29,115,81,117,47,175,145,41,69,117,99,33,132,189,18,36,13,188,220,248,111,170,93,203,57,122,79,203,178,9,44,202,244,226,189,27,28,199,177,147,133,166,144,74,175,179,82,248,241,199,157,120,132,199,82,196,55,158,154,100,184,51,178,3,110,59,122,157,130,196,223,181,172,173,44,197,200,247,38,38,222,180,227,221,147,253,209,96,178,71,244,123,3,81,21,161,59,68,77,176,1,18,218,129,187,103,49,131,249,93,244,188,212,7,112,46,175,67,141,244,234,116,208,179,160,104,196,105,24,44,91,207,185,42,250,239,185,119,226,92,36,208,14,228,197,123,235,202,73,188,36,29,235,121,157,126,216,194,103,121,254,29,48,40,194,43,166,219,183,59,166,52,1,4,63,251,161,138,18,171,237,5,13,46,155,193,108,131,178,118,82,72,101,2,88,71,136,181,221,177,14,215,17,11,113,82,60,52,6,249,49,121,45,207,2,220,51,92,104,192,17,0,188,213,246,121,136,233,209,16,28,155,127,2,84,182,165,252,171,174,228,144,60,89,26,132,6,226,74,61,212,107,168,68,138,102,90,176,150,174,198,70,95,137,249,235,221,181,97,141,219,64,35,46,67,67,72,183,122,205,101,38,84,190,14,36,38,197,33,51,137,99,101,142,8,36,228,143,39,79,27,16,175,165,203,138,80,101,28,203,74,123,93,23,151,66,129,23,242,146,240,15,143,87,252,220,57,5,167,205,214,74,177,160,225,212,245,72,8,246,89,200,64,72,109,164,253,174,191,173,74,130,186,253,157,22,67,251,199,158,78,249,206,155,137,242,232,129,195,195,248,98,211,97,25,208,17,194,133,240,218,246,241,242,219,199,129,173,210,14,88,56,250,221,26,49,135,137,58,33,175,38,168,67,103,14,85,203,238,156,118,126,234,196,103,108,47,155,61,6,46,64,215,132,229,221,94,0,142,254,98,247,104,210,217,115,180,131,237,0,84,152,157,93,62,4,3,176,24,156,79,23,202,148,96,161,82,65,33,40,171,238,171,225,76,206,88,21,209,77,197,255,156,140,253,217,51,108,200,212,88,47,143,91,48,112,86,4,162,156,5,195,3,159,117,1,221,255,245,229,208,63,165,140,191,61,120,245,233,206,13,109,123,21,31,225,100,131,11,0,116,144,69,19,107,6,65,150,81,217,239,158,224,47,64,116,185,38,225,112,146,67,156,130,53,222,214,238,163,252,34,255,249,142,177,244,47,222,143,55,60,242,59,178,112,174,28,46,60,159,51,216,250,130,79,115,227,124,39,239,141,226,245,143,166,77,167,50,121,237,183,248,60,39,152,0,105,125,231,187,192,240,241,231,201,236,226,215,252,39,143,77,4,92,228,47,219,97,133,90,83,94,13,10,74,74,90,250,236,193,73,209,224,199,149,11,103,64,100,189,86,120,37,106,219,49,203,171,242,51,93,45,163,55,174,183,184,26,173,130,205,77,187,21,240,113,30,169,12,170,63,156,101,205,45,59,13,10,133,170,168,99,251,129,116,173,13,10,14,66,56,179,48,201,84,47,6,242,219,135,110,122,91,179,25,149,8,102,221,50,90,41,128,118,178,73,161,95,185,35,143,206,20,165,103,47,100,81,84,172,92,82,137,222,133,66,109,111,66,242,190,213,169,121,92,171,30,215,156,13,181,217,133,121,243,48,224,88,139,1,99,248,49,28,201,89,134,129,232,223,103,164,209,239,69,45,96,85,114,151,167,221,228,203,99,188,101,53,84,155,223,255,116,94,32,33,60,132,231,222,229,205,24,228,215,226,36,68,249,213,129,31,15,74,94,255,153,169,28,30,139,37,20,78,29,103,127,164,164,62,202,17,15,167,135,35,168,91,170,32,239,222,254,193,32,123,38,243,11,218,33,171,140,138,215,44,172,175,174,129,64,191,150,91,94,198,244,111,73,13,227,255,227,30,141,213,222,75,42,246,45,252,102,6,254,222,241,242,141,233,205,24,28,195,168,59,134,85,78,211,5,238,60,141,0,55,233,74,42,86,218,60,137,202,146,154,109,235,8,120,113,7,0,130,148,246,73,32,136,215,163,146,191,105,69,42,253,66,194,88,224,250,76,56,171,200,250,194,180,13,104,153,194,84,61,89,225,191,104,1,197,166,44,211,9,234,210,138,56,98,191,236,84,135,105,240,31,147,161,164,213,147,112,146,16,121,29,147,35,1,20,75,11,162,199,138,247,107,134,248,122,97,103,161,192,146,215,134,252,53,150,233,138,19,236,222,185,75,236,150,16,126,100,246,221,145,138,109,249,61,82,121,234,234,41,253,91,184,202,36,124,177,161,216,133,139,169,132,127,52,144,8,155,64,23,183,102,69,228,76,219,198,159,66,232,235,124,6,207,202,233,232,42,129,73,170,197,95,247,184,117,160,192,69,248,204,116,55,180,114,229,37,18,148,219,72,250,116,216,146,119,183,64,155,29,134,158,178,230,123,45,6,161,89,225,206,236,226,219,254,24,252,136,177,126,88,183,116,81,21,36,221,180,2,59,56,127,14,179,194,13,10,230,96,145,46,172,60,38,98,139,160,101,39,151,25,35,174,210,249,230,140,63,126,120,67,58,115,125,101,48,242,40,173,77,198,72,108,240,169,73,60,221,193,239,54,69,239,196,111,201,80,135,223,186,157,91,53,198,153,158,250,155,187,207,81,201,205,14,88,3,20,32,92,229,81,233,31,125,16,153,222,179,2,173,128,43,59,209,143,17,55,178,236,11,126,91,36,47,80,219,164,79,255,25,69,23,147,3,154,130,116,224,47,249,61,24,5,195,52,50,125,161,104,201,195,50,63,112,236,50,142,24,223,195,33,2,208,51,173,4,121,158,185,241,190,241,86,34,109,209,236,168,178,193,63,32,138,113,192,142,46,56,191,22,246,36,175,37,62,240,46,128,45,98,193,55,75,251,210,176,229,157,229,183,69,72,25,21,135,226,104,28,172,93,161,170,102,153,111,85,88,93,255,16,62,139,127,171,133,121,29,177,227,42,188,110,254,16,13,10,131,137,191,158,211,65,143,170,185,252,123,210,253,56,165,160,140,59,75,128,80,65,216,219,231,232,41,181,132,199,169,70,65,67,82,179,210,42,228,7,181,67,190,228,126,23,106,207,229,178,96,251,246,170,221,75,125,218,69,92,174,82,18,162,114,254,168,41,251,49,237,184,185,176,107,190,149,100,29,216,55,149,162,101,20,252,23,212,121,120,206,254,165,243,26,38,23,141,140,23,5,175,67,200,85,89,92,200,34,97,184,7,142,98,241,121,185,77,134,57,213,35,191,9,29,131,169,236,102,139,11,8,32,167,45,31,158,62,173,49,73,134,226,106,168,57,109,105,110,26,215,67,145,54,196,137,34,166,65,98,81,51,115,243,115,5,24,121,178,143,146,243,40,254,64,77,200,163,155,192,184,65,139,206,7,50,238,126,118,70,47,11,65,90,167,75,195,65,65,227,163,234,43,25,106,141,125,128,235,11,207,110,167,61,13,64,47,60,175,199,122,237,210,137,249,17,42,32,193,69,85,34,189,198,58,204,34,36,56,150,247,125,93,179,88,157,50,176,39,193,132,43,55,254,181,221,253,164,27,240,167,242,125,42,39,251,172,178,155,148,135,48,114,24,174,33,76,87,177,196,38,165,220,127,6,207,225,160,146,48,73,214,73,244,246,29,208,20,50,117,189,244,24,188,199,48,92,165,102,161,188,69,69,233,178,31,133,61,9,182,244,238,228,177,77,163,228,11,124,226,2,245,40,47,103,158,191,204,91,136,210,87,145,48,6,132,86,225,221,195,14,246,243,160,146,109,72,182,61,170,75,2,149,22,179,196,226,21,24,46,64,166,203,222,152,40,46,16,33,102,240,247,21,254,230,113,132,23,169,46,81,56,171,128,63,35,121,162,87,51,36,199,245,104,88,244,64,205,64,1,248,250,107,76,148,14,231,195,50,216,45,13,10,21,75,229,221,219,221,215,207,246,136,58,2,71,79,126,173,209,171,164,250,220,42,43,182,88,42,123,74,71,141,113,204,225,99,202,213,114,137,221,231,160,16,200,155,144,119,234,148,132,76,206,152,169,145,54,51,78,189,242,99,178,208,87,251,241,157,152,33,13,10,140,245,133,162,65,95,198,191,233,38,235,197,211,177,246,52,45,204,53,190,178,67,59,93,81,159,82,130,123,13,136,88,80,192,202,57,242,131,252,51,161,15,24,196,108,91,188,109,53,84,222,95,73,51,80,222,135,58,51,105,32,153,93,145,226,106,84,252,141,156,158,26,121,62,56,154,185,62,34,88,127,200,57,97,129,79,143,55,178,119,213,91,195,78,166,48,105,42,66,253,196,149,13,27,65,32,16,92,198,184,108,102,45,105,7,49,0,103,28,170,111,224,51,60,252,17,96,38,218,55,5,205,173,13,10,74,61,231,127,40,5,26,119,126,189,215,120,102,57,67,63,189,22,162,252,73,5,34,59,250,124,207,230,189,147,67,152,143,105,209,199,157,43,24,183,36,129,109,176,14,134,126,140,199,243,194,124,234,184,129,234,70,177,4,246,51,152,204,53,113,66,100,140,225,174,40,155,104,235,253,221,255,73,54,30,211,107,138,150,140,3,161,193,237,30,118,149,192,214,13,117,22,127,128,86,1,52,110,206,213,77,182,230,122,97,150,67,243,78,115,14,147,251,162,218,51,197,81,108,149,230,2,217,70,137,43,181,13,10,124,1,201,156,186,99,194,224,141,177,194,158,53,238,90,81,176,58,1,118,174,44,191,224,211,228,176,2,67,179,87,165,170,218,134,154,218,75,163,76,65,28,34,177,53,244,2,136,134,218,107,96,203,16,9,137,27,241,60,37,242,119,164,89,171,118,20,228,60,175,205,76,26,195,20,41,92,83,244,116,192,157,56,16,198,101,57,225,237,121,78,128,154,86,254,42,57,188,155,35,86,83,117,247,196,153,193,3,206,91,141,148,33,200,106,74,125,9,59,176,167,97,80,207,234,116,82,1,55,93,89,182,117,7,195,62,177,17,70,119,118,129,180,91,113,33,34,154,135,62,238,71,128,142,143,241,255,248,63,219,74,149,214,96,180,166,166,185,7,117,99,116,250,11,151,77,161,120,6,12,81,46,225,173,151,134,22,226,86,53,155,170,28,65,23,71,152,132,122,237,92,223,230,138,173,242,167,37,74,79,166,44,176,231,18,120,122,37,117,118,197,39,38,36,32,130,196,161,116,150,23,99,11,13,105,114,68,43,194,234,79,85,70,216,49,212,190,5,199,177,67,201,108,233,102,91,57,36,134,225,153,247,12,42,110,228,91,171,154,23,126,144,82,35,138,206,161,190,69,97,138,227,30,129,50,117,12,86,102,188,159,51,254,166,49,98,31,3,249,55,63,25,167,223,95,55,111,211,205,106,70,17,178,101,141,65,139,153,54,22,206,209,150,149,193,85,115,220,109,212,175,208,40,255,193,155,41,125,47,157,111,71,91,225,131,52,68,84,82,109,98,180,114,219,67,19,82,115,155,176,249,89,101,199,31,143,46,80,192,111,86,12,76,248,66,95,208,160,217,65,2,155,230,54,16,56,25,89,201,250,124,240,152,68,108,12,47,222,168,196,57,110,12,36,113,34,104,142,3,122,99,7,13,176,120,68,197,220,78,63,66,242,88,134,136,35,146,148,175,226,28,62,50,210,123,158,178,2,12,144,142,64,111,27,52,184,148,125,85,126,118,199,183,21,39,14,112,7,184,203,57,180,246,17,90,220,29,175,70,16,188,76,133,226,234,220,0,105,64,218,126,176,239,237,186,170,20,40,65,176,40,106,107,119,115,253,103,0,83,73,1,35,108,236,91,228,189,24,227,17,18,234,139,95,117,16,23,14,228,35,150,60,241,3,130,211,224,85,62,11,233,63,136,74,189,1,61,50,211,249,164,98,206,113,3,94,77,137,220,108,1,90,162,126,189,247,235,2,126,254,13,45,35,198,183,18,138,134,242,24,83,97,232,108,187,22,204,63,26,42,190,245,208,204,225,121,42,180,202,248,37,196,151,198,135,48,190,236,133,28,236,101,154,230,103,211,210,133,238,7,119,43,197,112,149,127,254,59,171,72,0,131,136,129,159,185,152,136,15,227,178,20,180,18,27,118,130,13,233,119,187,171,161,17,133,50,189,108,160,176,44,202,23,146,83,245,244,96,90,102,217,42,148,34,235,140,195,227,229,181,139,250,8,177,130,65,66,2,27,24,19,133,113,49,103,159,70,164,95,92,188,211,196,248,35,79,230,35,121,251,61,42,58,123,57,239,98,54,63,78,37,35,193,115,114,55,207,241,23,166,237,112,9,238,15,111,216,106,185,168,102,207,218,51,13,241,60,247,61,38,103,231,74,246,24,206,70,153,61,135,214,80,127,180,37,76,162,55,119,15,99,57,37,186,15,193,184,200,179,190,211,49,112,94,130,23,221,40,51,199,255,60,245,1,177,234,194,71,189,157,90,36,105,122,214,164,241,186,197,205,231,135,54,39,219,40,228,250,66,60,56,184,50,174,182,52,214,131,73,49,52,238,217,213,64,158,220,57,180,43,151,138,95,14,167,11,13,10,142,157,108,234,70,22,245,158,212,110,149,44,20,195,84,108,190,76,190,17,118,218,221,81,231,49,17,108,181,244,71,167,121,23,190,30,146,24,249,35,215,74,80,104,144,37,220,90,115,168,63,19,84,59,99,26,100,83,230,136,153,215,84,180,50,145,227,72,239,81,37,114,215,197,95,226,2,101,185,48,71,223,26,22,168,113,123,32,218,150,105,203,191,155,149,18,69,190,131,146,137,171,51,204,75,86,64,237,215,146,61,19,212,99,218,252,22,254,57,218,12,180,13,191,2,237,181,176,72,250,108,229,20,70,168,74,214,151,133,64,141,240,79,4,201,183,118,5,132,154,166,67,128,29,175,81,86,146,155,185,52,73,252,85,26,133,31,165,38,146,83,84,237,112,217,21,25,208,9,130,6,160,44,26,239,33,206,239,131,162,27,232,60,124,153,45,129,74,57,239,189,181,34,131,230,2,90,36,103,232,83,168,158,15,78,107,179,48,115,246,233,238,156,70,233,49,211,203,159,224,131,208,63,80,46,125,191,32,140,46,190,222,240,116,6,178,2,134,140,95,39,111,159,68,87,153,2,65,178,39,185,22,50,156,144,184,82,53,50,196,183,185,223,109,40,137,217,196,202,230,24,63,196,153,99,251,192,27,20,86,190,48,177,68,96,198,20,20,23,82,246,120,161,145,196,250,135,142,231,78,192,244,2,163,89,219,166,245,15,79,209,145,223,92,178,33,249,216,22,167,18,60,167,61,188,138,222,220,219,233,83,73,110,220,176,127,24,157,11,187,21,154,127,76,167,234,74,174,246,131,82,165,65,173,67,33,242,51,192,146,202,91,176,65,156,161,85,131,174,217,253,244,98,13,10,31,31,129,233,4,92,24,35,24,187,216,31,137,221,184,30,236,101,173,227,188,46,58,238,56,71,183,187,8,218,56,119,239,128,9,109,108,80,148,107,1,4,130,44,80,115,76,146,224,5,252,125,191,204,119,150,154,173,7,117,120,57,90,153,51,193,127,100,169,191,174,16,214,244,91,92,65,70,190,79,136,83,139,139,190,150,7,132,141,239,224,189,80,199,152,107,75,102,197,64,216,69,55,126,69,254,235,31,81,76,223,188,171,113,144,63,104,116,183,117,158,21,13,220,139,145,213,9,19,98,140,92,137,71,149,72,118,107,133,239,141,13,226,136,82,44,91,167,165,167,216,214,88,58,76,171,62,21,233,65,209,92,154,48,122,215,225,168,138,74,118,223,54,116,60,229,103,250,79,196,153,51,3,175,223,61,134,43,137,70,61,199,165,188,61,97,195,231,186,48,79,243,87,83,194,162,114,193,71,219,66,157,59,18,69,224,3,227,169,183,64,2,92,50,210,145,217,147,68,80,203,75,159,235,127,222,70,180,162,129,170,191,4,234,108,68,84,67,79,110,3,20,178,48,1,197,120,192,180,109,125,114,93,111,33,111,141,225,224,241,13,105,20,15,179,190,210,185,67,86,254,190,203,88,169,97,206,130,217,103,19,220,204,100,167,104,94,136,67,246,13,32,95,142,66,138,33,251,125,41,250,59,254,6,185,149,126,252,225,247,13,10,196,59,177,212,117,31,254,194,19,213,92,75,76,67,234,70,198,120,66,252,105,182,199,151,7,80,223,90,72,222,106,110,181,52,11,124,169,93,49,144,124,174,36,17,22,175,208,131,58,89,49,110,143,225,207,86,44,157,84,117,175,221,70,26,186,25,112,248,204,236,177,225,186,226,168,100,225,180,223,139,97,253,237,137,135,88,4,237,78,91,179,241,9,156,73,3,94,243,90,54,2,34,185,151,51,134,207,152,22,158,127,237,164,201,104,53,141,1,151,75,94,43,153,242,142,13,188,20,136,58,90,117,161,189,182,102,178,34,244,101,97,32,248,226,244,155,62,150,97,124,73,152,43,182,81,248,222,83,39,129,250,127,85,160,230,3,145,33,20,18,149,66,127,93,232,4,143,23,97,195,128,27,83,135,51,212,41,226,220,9,20,52,235,211,116,41,20,69,34,90,81,32,14,219,90,59,36,187,96,40,122,1,85,102,122,242,117,80,106,27,239,160,227,70,88,70,92,243,187,177,189,60,71,123,47,177,20,112,218,201,197,220,206,144,96,181,142,36,11,225,233,65,207,129,235,183,2,16,119,108,139,234,74,205,13,10,100,241,132,30,38,131,171,182,75,120,220,59,66,158,151,38,127,97,102,126,238,78,69,70,15,60,5,160,125,75,223,0,145,251,101,202,224,142,155,4,108,63,113,76,232,134,163,214,159,193,161,130,151,52,95,143,184,160,194,175,81,92,74,147,203,208,131,89,204,56,106,94,177,53,95,225,11,106,175,11,52,33,81,222,29,216,213,171,140,166,109,148,227,151,52,76,183,126,57,213,82,129,193,161,159,32,21,25,9,248,56,113,64,119,207,148,18,137,158,168,23,9,155,192,63,62,249,149,100,119,250,46,252,46,191,23,195,118,75,87,31,216,193,140,129,222,229,69,230,65,158,212,215,88,130,238,122,50,78,178,22,123,174,50,86,237,69,178,37,235,85,216,239,84,172,92,38,68,166,55,233,43,145,72,77,141,133,127,102,104,21,134,53,183,41,85,212,250,195,169,89,55,121,66,41,219,181,92,36,242,43,247,90,188,97,187,15,207,30,239,19,76,134,30,161,59,15,51,188,17,243,80,208,156,132,7,76,243,171,131,12,98,163,197,90,1,159,163,81,239,124,184,228,31,49,244,51,31,90,151,213,63,202,73,130,226,90,179,188,172,164,157,171,156,42,51,4,82,74,40,226,185,16,224,184,146,46,52,95,90,233,150,167,237,247,249,128,187,57,115,51,35,226,68,254,152,198,138,139,242,106,157,122,169,232,21,165,195,60,62,37,171,71,127,61,21,145,186,213,245,96,44,151,126,245,51,199,6,73,52,251,83,11,172,127,189,187,162,240,48,107,56,54,253,126,20,14,245,87,235,222,239,30,81,21,117,9,75,134,75,51,94,190,254,83,90,28,53,3,214,26,187,133,41,238,250,19,95,231,51,43,93,48,93,114,248,29,180,162,86,13,10,225,118,97,58,189,61,118,206,121,17,49,92,127,252,208,114,242,54,115,139,57,250,13,10,106,106,216,81,48,100,43,249,91,225,223,47,236,107,146,66,54,78,135,182,38,212,242,86,119,85,225,5,167,240,78,213,228,46,228,187,226,129,107,189,179,185,105,117,242,190,187,94,222,177,196,75,169,171,66,50,168,141,171,202,146,110,186,113,18,157,102,176,186,160,41,227,79,37,27,140,46,168,74,216,43,211,102,106,170,5,158,215,76,194,188,237,75,207,1,238,189,181,187,151,164,9,151,232,66,161,54,99,59,244,93,131,236,166,32,7,158,235,101,20,218,163,88,153,138,226,136,44,171,152,207,15,158,188,91,196,169,7,198,184,118,252,162,140,152,56,190,198,12,225,147,117,248,54,161,44,26,113,130,98,162,82,67,195,216,73,8,50,65,242,239,193,31,125,253,244,12,128,228,81,74,12,139,82,43,78,3,110,149,110,43,255,118,91,113,14,251,143,119,206,7,238,44,163,123,37,243,211,72,180,4,239,172,148,73,21,229,40,6,194,245,50,197,71,239,101,233,107,9,41,46,0,229,140,131,198,209,214,165,83,68,81,56,231,65,245,250,23,99,140,231,17,88,39,227,202,3,240,74,194,21,24,44,64,240,80,245,100,17,212,76,157,162,108,78,69,134,3,195,37,246,178,190,183,84,21,161,51,59,63,102,40,142,27,101,102,169,124,89,161,235,49,156,176,165,52,137,212,134,150,156,73,154,164,112,3,11,8,84,214,229,31,153,204,166,73,132,172,186,148,144,191,157,0,181,27,100,20,220,239,143,112,110,114,188,237,109,148,165,142,28,93,148,78,153,210,253,197,143,151,167,151,82,85,53,85,216,203,4,249,199,156,119,217,13,10,147,226,7,32,0,110,196,97,96,222,31,17,237,115,26,203,237,100,120,237,251,93,191,146,39,13,10,209,246,179,212,161,185,191,59,178,77,64,231,204,134,138,187,44,229,178,193,69,48,168,248,51,128,142,224,5,75,22,176,90,76,147,243,168,236,159,27,65,80,249,142,253,177,46,167,218,227,99,192,159,88,66,56,53,208,118,139,84,180,70,81,248,175,21,97,181,38,4,157,24,213,158,80,124,126,223,23,154,228,228,218,83,85,34,205,155,28,240,217,0,2,163,120,92,69,220,193,116,101,27,110,31,189,111,95,161,26,219,6,170,220,86,148,93,65,17,118,173,152,123,48,160,245,55,53,171,246,70,195,13,10,233,151,160,195,77,15,245,122,62,68,101,219,84,69,149,209,234,149,41,1,108,133,101,206,50,85,239,13,202,36,147,61,5,255,94,54,106,175,174,82,221,192,254,203,203,24,61,67,17,142,211,13,61,144,112,54,107,198,94,205,123,251,130,115,157,222,233,217,145,25,216,64,220,22,186,17,224,221,165,215,142,119,1,14,216,56,18,213,145,152,136,86,141,228,31,207,191,129,202,25,1,74,204,13,16,15,220,62,165,96,181,43,85,196,33,28,92,173,100,24,210,105,2,29,78,252,144,66,80,4,80,86,129,226,165,19,231,253,99,185,44,44,170,2,222,79,2,122,110,108,221,204,121,133,131,202,14,156,7,199,122,4,147,32,255,204,66,152,214,246,215,221,89,133,63,229,231,14,7,187,5,53,212,243,148,30,212,231,77,144,160,192,120,252,165,5,222,115,179,169,149,218,204,162,58,222,2,21,223,41,77,196,92,110,228,172,224,136,28,27,163,133,125,181,127,52,193,140,183,86,55,191,16,255,106,48,57,217,200,17,128,145,140,124,80,172,5,147,22,207,251,97,4,224,188,132,147,90,179,197,188,71,106,25,34,163,152,153,11,100,40,167,33,28,194,144,126,157,253,236,107,248,179,85,246,62,0,174,129,157,23,28,250,117,27,45,132,43,222,97,194,144,194,88,185,187,215,1,222,124,86,70,55,28,29,155,16,197,43,94,218,21,153,46,140,17,95,146,107,184,58,129,231,12,82,230,99,28,60,105,50,34,80,94,182,65,33,251,14,124,210,161,39,120,198,166,94,252,154,223,240,172,153,125,190,51,102,32,102,132,211,220,105,49,122,124,31,119,226,205,211,104,213,227,90,71,220,82,72,132,249,243,139,140,229,160,154,92,20,130,114,152,99,32,49,118,67,55,170,208,165,223,76,87,110,170,18,250,0,234,38,199,146,5,21,201,189,226,230,194,39,215,5,80,190,104,205,100,9,170,6,212,70,181,249,19,84,251,79,157,51,211,144,66,172,90,47,192,99,202,125,196,75,55,221,104,153,164,7,104,12,68,119,206,167,252,28,114,35,224,207,188,220,61,194,160,117,184,40,115,84,147,119,4,173,212,135,28,63,134,194,33,229,178,201,233,76,71,130,209,68,192,71,87,160,243,35,91,19,222,242,39,179,191,224,20,73,226,84,48,250,43,166,129,99,125,76,65,60,111,149,111,47,255,132,255,175,198,115,20,230,211,82,0,43,14,82,194,229,94,124,80,127,248,76,2,237,91,204,224,27,242,130,124,223,154,5,227,94,125,180,68,156,48,107,13,214,100,163,231,51,81,255,146,127,174,2,71,146,85,150,71,40,60,213,41,233,237,221,98,157,249,54,112,0,142,170,181,223,178,188,180,81,87,217,40,4,184,121,37,115,155,119,9,73,222,173,13,151,102,119,38,107,21,237,11,96,78,31,69,121,133,110,152,228,161,100,111,116,191,210,82,230,84,115,180,113,16,232,72,157,22,47,145,175,27,27,101,123,135,7,12,92,18,155,8,3,123,73,201,224,97,55,103,79,232,40,56,103,154,30,8,80,117,228,66,107,89,218,218,174,9,134,113,243,191,99,174,162,223,94,179,23,25,205,232,225,211,13,10,101,249,251,167,43,86,13,10,254,155,133,177,35,168,207,66,151,180,65,91,165,110,182,77,232,215,63,160,44,139,235,117,160,11,114,205,97,15,107,110,163,64,219,32,163,246,117,148,123,134,165,79,149,246,21,92,128,221,22,101,246,131,251,142,107,173,85,158,228,214,252,171,251,244,209,209,95,13,10,92,199,69,217,227,156,112,173,74,59,252,40,46,88,105,171,153,24,148,69,92,188,110,6,246,127,190,211,98,134,136,14,171,14,110,227,129,87,173,213,189,0,105,24,78,97,179,255,167,82,241,227,184,198,96,224,44,245,1,42,239,157,52,244,214,119,189,229,126,50,205,156,118,104,229,185,249,249,237,101,172,45,96,52,122,248,241,125,153,243,140,93,181,125,230,85,122,60,174,226,48,251,39,145,60,61,178,104,212,240,41,116,169,76,35,133,106,40,24,232,54,2,247,234,228,186,216,124,89,103,101,109,112,238,170,213,24,208,125,108,56,167,232,51,230,26,0,74,38,63,72,38,60,39,57,128,133,48,99,167,248,26,165,190,87,22,162,96,41,234,157,158,52,191,31,231,79,203,243,29,161,184,174,105,205,165,22,60,56,156,4,190,16,33,117,193,214,141,159,2,47,132,48,188,68,211,78,50,71,122,140,168,192,209,90,54,84,169,254,23,40,155,11,21,195,60,49,143,65,229,253,36,92,22,93,60,82,124,2,4,67,191,115,220,69,240,98,208,141,125,211,9,41,189,33,88,73,223,111,123,100,8,97,229,251,200,184,13,237,51,247,183,234,164,166,138,235,219,25,39,170,122,252,97,100,65,79,130,98,140,146,134,24,255,154,187,250,82,127,124,144,13,10,93,212,162,11,120,214,150,157,129,97,187,27,156,66,8,139,39,78,173,85,73,211,99,191,25,76,38,199,199,155,116,251,205,148,22,212,61,235,90,61,200,110,5,132,36,183,9,124,6,157,81,200,74,83,222,73,170,140,218,18,154,32,176,90,2,239,19,245,217,188,120,249,64,105,59,89,95,188,37,62,79,142,186,143,166,136,65,203,142,118,51,95,97,6,169,171,24,254,4,112,102,151,24,212,251,250,153,61,255,109,75,216,115,253,164,77,86,72,118,240,129,122,157,92,244,33,69,127,180,71,15,205,163,81,253,129,165,75,73,164,85,37,96,63,91,162,182,135,93,165,58,246,157,209,208,123,95,216,103,63,205,53,224,177,56,66,138,149,210,69,165,147,188,63,153,25,240,249,131,128,230,160,244,58,198,208,180,37,234,190,125,109,127,157,191,216,219,139,25,225,82,243,81,67,63,227,177,4,38,204,121,223,142,171,24,35,54,77,174,63,17,199,151,137,39,233,39,52,224,58,189,172,83,241,195,232,154,216,249,232,225,170,0,197,189,11,222,162,18,231,118,81,90,182,219,129,157,42,226,187,154,75,39,165,250,216,133,206,164,196,135,53,152,17,112,137,19,193,128,228,211,76,154,73,3,253,150,80,148,182,68,58,127,54,153,38,214,124,135,205,166,63,224,203,74,226,51,136,81,179,165,88,16,46,252,251,242,98,247,38,89,66,112,202,150,52,81,46,200,166,243,135,57,236,110,66,187,238,70,19,234,75,53,197,5,25,84,17,11,35,101,247,217,226,192,39,253,185,130,118,254,39,151,205,192,6,1,81,73,133,83,252,89,199,86,146,225,85,232,243,191,172,200,241,152,217,139,248,49,195,231,239,111,117,33,183,166,166,77,168,66,213,119,156,213,44,118,167,253,162,39,173,220,241,161,45,184,127,130,235,58,69,97,48,37,35,101,244,66,23,92,118,13,49,163,12,68,33,134,182,57,63,206,26,102,108,0,222,124,193,228,65,127,49,17,9,147,102,242,147,25,28,226,87,234,228,145,70,132,179,116,113,202,150,28,179,222,72,166,83,60,218,66,78,215,53,253,91,131,163,42,192,97,207,61,108,104,69,60,230,56,255,172,105,142,154,183,111,182,120,96,226,183,48,154,146,72,247,254,16,193,79,23,232,234,103,14,68,204,126,242,168,129,23,98,233,166,63,33,39,194,255,83,41,56,207,236,82,152,231,120,163,82,249,199,223,47,23,148,246,96,92,190,99,141,154,251,41,108,127,82,12,175,211,85,227,148,227,145,154,96,127,58,58,173,164,200,147,11,107,246,235,170,11,145,232,56,223,83,74,135,7,50,3,94,149,58,79,21,78,194,224,221,113,55,229,11,7,56,207,151,192,44,136,203,247,46,204,84,177,173,238,250,191,151,208,50,68,180,182,86,118,203,9,36,198,65,12,17,126,116,124,249,206,235,46,179,27,39,128,191,241,14,38,15,187,138,125,91,59,68,202,249,231,91,100,130,197,107,238,44,104,249,248,103,94,158,21,107,220,217,147,89,167,64,166,104,253,59,209,30,169,212,239,235,27,156,37,231,32,43,51,245,37,61,232,121,164,130,255,119,153,44,200,119,240,120,209,240,112,181,65,71,63,130,82,227,79,169,206,37,82,81,67,77,206,192,70,179,78,47,211,189,80,64,208,142,241,137,173,204,49,68,26,24,149,16,225,141,206,151,187,60,238,186,127,5,174,167,1,218,31,217,255,132,225,97,137,187,145,249,61,234,83,166,176,12,196,227,147,204,125,199,254,184,5,229,211,81,45,101,141,47,49,155,57,24,223,125,237,126,136,165,58,170,227,129,225,40,15,101,95,7,225,151,214,151,219,45,215,13,34,168,141,159,9,2,131,86,148,252,42,16,49,143,52,220,37,167,62,100,82,200,77,161,97,57,215,41,29,141,11,157,184,99,237,140,170,142,194,148,234,194,227,135,241,108,142,56,240,66,15,215,159,185,22,19,172,106,132,189,50,113,80,230,46,73,20,247,26,61,161,154,56,152,230,36,210,234,176,210,225,210,126,88,97,174,190,196,64,8,155,75,237,252,179,239,137,228,165,40,78,158,205,221,17,247,195,155,118,91,185,225,54,151,229,38,25,240,247,235,146,64,100,56,174,204,14,191,218,201,83,253,250,182,104,57,231,151,158,152,206,22,27,83,226,125,218,42,109,147,28,169,64,39,198,201,95,202,184,156,64,102,176,9,211,176,250,180,237,86,122,97,102,104,240,30,91,121,13,10,40,134,236,55,44,247,141,161,252,52,25,206,51,48,255,94,175,140,120,194,223,154,2,46,115,31,124,48,245,153,215,197,211,82,128,86,239,222,135,87,189,64,114,168,151,60,204,248,23,69,85,157,15,145,154,94,155,227,114,229,121,120,137,180,202,106,237,96,13,10,132,91,5,1,129,64,102,116,30,247,131,219,177,80,47,106,188,171,42,65,50,249,125,232,218,131,38,190,73,80,241,104,193,213,154,89,76,135,105,17,64,50,92,203,236,78,78,141,42,206,230,46,59,214,209,81,183,186,111,189,152,57,96,104,99,153,84,76,83,139,49,13,12,125,32,182,251,110,134,158,81,49,121,57,198,108,247,111,52,143,96,82,176,78,161,241,162,92,63,112,177,29,168,169,41,136,30,110,4,60,107,11,130,205,73,60,121,62,80,171,23,193,18,89,83,93,214,144,190,134,21,42,63,13,63,189,49,250,201,162,235,52,99,206,76,234,33,64,78,144,179,148,14,86,164,201,117,73,132,17,18,147,72,6,191,43,99,130,52,32,234,60,181,156,251,105,143,172,80,244,14,127,20,196,69,119,119,166,238,142,228,241,36,40,101,24,135,217,212,243,55,149,101,224,221,181,89,229,79,16,19,76,37,35,104,49,115,122,136,5,76,13,10,23,59,205,112,53,24,147,159,45,2,114,22,43,206,65,54,21,38,193,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen021004l=44925; +} +#endif //_PDF_READER_RESOURCE_FONT_n021004l_H diff --git a/PdfReader/Resources/Fontn021023l.h b/PdfReader/Resources/Fontn021023l.h new file mode 100644 index 0000000000..c623f30c73 --- /dev/null +++ b/PdfReader/Resources/Fontn021023l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n021023l_H +#define _PDF_READER_RESOURCE_FONT_n021023l_H +namespace PdfReader +{ +static const unsigned char c_arrn021023l[]={128,1,126,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,82,111,109,78,111,57,76,45,82,101,103,117,73,116,97,108,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,32,82,101,103,117,108,97,114,32,73,116,97,108,105,99,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,53,46,53,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,82,111,109,78,111,57,76,45,82,101,103,117,73,116,97,108,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,54,57,32,45,50,55,48,32,49,48,49,48,32,57,50,52,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,51,55,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,236,168,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,109,181,185,156,141,95,171,182,6,109,229,153,4,146,205,238,99,98,107,15,175,36,117,216,181,143,196,3,253,207,67,192,52,128,117,214,108,186,105,34,149,170,98,99,143,170,187,66,143,124,156,194,42,47,63,184,31,59,194,102,157,2,219,247,210,45,178,169,223,163,73,52,222,3,142,130,223,66,107,71,51,211,255,211,239,176,8,195,246,13,10,43,95,162,118,61,173,216,96,100,195,222,184,129,250,51,224,130,242,120,254,230,139,70,246,16,178,86,84,174,150,32,125,129,72,224,245,78,249,187,120,41,99,254,235,108,189,54,100,24,66,25,91,75,30,66,23,57,114,114,97,229,127,74,80,246,41,105,135,222,143,102,95,88,35,56,136,175,31,251,61,189,87,124,151,112,83,59,172,6,160,227,203,145,223,182,224,49,14,141,241,218,31,219,92,50,91,186,97,36,4,179,152,227,146,205,236,69,164,87,209,226,183,47,77,173,206,77,72,196,57,85,212,193,148,222,240,193,213,243,180,11,197,60,207,102,8,119,172,202,236,37,205,230,59,51,195,140,244,231,39,216,76,84,24,187,237,114,175,81,17,234,161,83,123,203,105,131,16,69,29,176,236,81,40,97,174,222,206,126,72,242,228,139,82,129,35,224,84,93,186,201,97,246,143,70,2,205,13,148,212,117,120,135,142,81,192,106,43,67,201,237,239,41,25,166,143,120,157,33,205,7,233,163,221,228,59,118,29,51,136,47,253,115,203,210,166,68,235,233,193,234,246,253,92,238,72,178,43,65,125,125,183,243,13,143,249,231,215,177,138,33,173,133,154,31,4,238,160,251,59,80,135,41,165,254,45,99,130,242,176,248,224,120,128,58,157,36,83,85,218,2,211,1,106,178,200,178,88,59,77,119,211,172,251,195,74,85,157,53,187,208,55,233,197,112,92,231,39,194,100,148,32,119,123,32,67,220,149,227,38,132,229,158,48,0,149,69,206,0,142,88,145,137,15,48,229,155,9,133,193,106,178,24,212,55,75,153,232,20,71,4,13,10,198,120,187,13,10,165,132,63,32,104,133,71,156,206,124,219,83,63,170,128,214,37,241,89,194,127,134,65,189,199,101,247,8,13,53,189,188,156,45,21,163,28,102,135,8,41,167,14,127,207,97,72,137,53,229,53,182,114,236,87,40,198,125,232,206,169,33,180,147,208,141,211,59,144,36,166,162,87,172,188,255,61,154,13,98,39,223,30,140,140,241,178,20,154,158,175,161,98,241,139,90,232,73,199,169,105,109,76,113,175,155,70,44,124,13,165,71,27,24,187,153,242,174,118,85,22,250,3,185,135,86,183,223,118,13,10,196,208,185,248,133,43,188,103,134,150,255,156,149,124,100,178,147,158,205,109,220,24,133,93,224,103,71,178,245,245,196,252,4,81,246,159,166,16,236,104,191,14,146,61,207,54,181,125,50,146,242,145,244,77,51,197,166,181,190,127,80,101,228,28,108,175,176,101,124,44,248,236,248,198,66,163,177,225,30,154,127,13,68,182,90,103,139,29,224,235,5,25,162,49,174,94,150,109,142,132,198,110,32,242,223,153,0,247,220,131,133,152,32,232,246,208,215,250,138,36,46,189,255,13,10,105,215,112,198,202,14,53,142,7,110,53,224,99,11,75,158,147,182,73,171,217,143,226,158,70,163,99,93,42,99,94,40,108,183,50,228,224,50,71,218,2,69,117,22,78,22,151,170,252,207,18,74,243,192,104,40,250,122,239,4,100,248,13,10,149,85,43,79,43,149,82,200,6,175,134,128,206,30,172,65,161,165,89,229,208,226,123,82,48,14,253,185,145,140,109,72,70,182,2,231,148,11,173,224,129,185,150,5,161,244,173,78,111,102,240,50,126,141,90,70,135,238,95,220,6,87,31,188,115,111,216,202,80,207,251,110,46,139,135,27,150,253,78,15,60,223,89,172,136,8,38,168,152,142,31,35,122,57,239,62,205,45,43,86,189,15,47,194,212,249,17,103,93,235,9,116,25,60,127,214,42,131,150,71,157,173,249,221,80,6,175,40,103,174,108,40,125,22,249,96,7,175,166,90,244,251,100,234,73,212,133,54,129,105,213,80,5,160,36,74,227,91,69,35,120,93,167,175,248,20,84,68,162,198,18,218,221,187,9,242,90,91,29,150,63,72,88,40,150,55,116,210,38,201,179,251,191,233,223,61,211,125,89,253,77,186,25,64,172,31,83,168,239,72,184,77,0,31,92,151,182,88,29,187,227,25,95,6,195,88,119,23,194,159,238,13,10,78,63,100,169,149,198,208,119,224,223,128,174,187,92,169,180,196,151,173,238,154,222,200,203,129,124,74,213,38,96,58,229,31,244,66,102,50,242,246,251,182,128,187,15,176,135,224,89,193,114,120,180,48,19,218,6,255,65,24,236,150,81,196,112,96,199,15,165,138,12,225,44,242,47,141,2,190,7,173,204,156,86,35,231,218,83,69,62,225,230,114,140,7,31,195,250,101,116,226,202,28,53,146,149,199,210,150,32,116,51,74,132,64,136,95,44,133,40,200,131,118,198,249,61,87,139,71,250,187,17,245,240,83,143,255,84,113,99,41,154,8,33,228,44,151,204,162,204,215,177,41,228,39,253,122,186,254,90,116,165,161,223,72,187,209,114,204,230,205,43,96,236,33,38,95,175,80,236,161,134,171,166,206,111,182,61,112,7,67,35,29,48,51,190,97,28,138,209,111,169,162,245,36,241,29,63,195,103,228,97,171,245,101,189,222,171,175,56,91,176,255,182,52,91,120,54,149,48,14,73,97,228,63,62,116,53,183,149,87,158,227,81,217,151,218,88,17,205,69,106,196,22,85,25,18,168,157,50,115,157,3,232,226,67,12,119,206,151,172,119,179,138,229,187,3,227,166,126,239,143,178,7,172,176,225,221,17,71,71,98,98,4,58,100,45,102,164,253,172,251,14,154,191,218,18,24,221,98,91,100,252,229,212,178,76,37,4,5,13,10,136,28,160,126,206,161,59,103,195,130,39,114,182,120,231,253,82,35,185,86,217,69,128,143,155,151,199,53,163,171,136,219,49,168,177,76,42,198,125,160,197,23,79,196,159,228,27,97,47,204,5,45,8,193,118,4,171,67,219,226,6,62,57,226,121,157,177,231,107,96,59,8,243,74,33,254,67,0,170,13,122,145,28,250,230,206,53,41,22,69,175,190,217,205,0,32,78,126,176,52,59,101,71,252,206,156,62,115,220,228,24,220,186,129,209,160,63,206,135,50,222,84,64,255,152,53,108,6,52,161,37,198,72,129,220,5,73,226,154,130,200,46,180,175,153,152,127,111,253,81,95,190,87,211,144,134,119,39,83,35,159,146,54,162,182,170,187,219,196,25,239,226,189,170,12,43,222,132,196,51,244,215,83,246,204,15,3,231,159,90,89,33,0,130,203,189,109,132,172,76,170,34,234,48,243,223,77,107,180,32,124,188,27,103,228,9,134,205,79,33,53,4,176,204,50,254,132,45,137,101,169,227,181,242,56,191,226,250,79,88,114,131,238,117,176,198,241,143,236,193,206,55,52,135,44,219,165,48,233,121,92,190,210,199,202,168,226,146,33,23,171,1,87,161,217,122,138,217,237,76,132,91,71,122,82,240,190,125,34,20,233,29,223,152,1,0,108,246,253,126,78,248,186,74,195,17,181,117,15,60,234,23,230,246,235,6,142,154,210,203,48,212,164,224,175,220,58,167,170,178,73,247,6,222,33,104,16,136,4,164,220,27,245,34,184,96,146,229,201,144,152,52,94,178,18,55,104,156,145,76,218,205,142,82,168,7,65,125,67,65,95,192,107,14,193,105,40,31,111,202,121,65,215,204,56,176,157,254,94,60,217,238,132,18,144,44,184,141,68,49,159,186,144,71,233,3,195,70,126,81,217,1,238,71,79,200,174,92,201,252,123,74,41,255,185,229,3,38,68,44,20,148,143,121,128,102,90,53,130,51,198,91,218,93,111,6,84,217,184,117,233,92,168,22,169,21,113,128,104,254,179,91,161,24,190,180,86,3,163,152,224,88,5,7,99,117,2,71,170,73,161,143,18,48,88,121,226,48,229,170,90,193,116,35,167,193,123,190,131,175,86,144,40,35,205,56,253,245,60,129,86,221,209,150,89,109,13,82,129,194,152,66,24,188,78,82,1,229,136,213,115,41,127,225,227,75,39,126,180,17,70,204,189,163,112,130,128,134,255,182,131,7,131,147,137,78,158,41,55,38,121,56,56,133,40,197,43,103,231,141,205,13,96,175,144,200,241,149,52,202,105,23,32,67,14,13,225,39,140,213,104,169,170,113,30,49,197,118,120,121,170,109,218,188,251,41,132,190,126,243,216,154,32,16,98,56,77,11,107,202,92,119,99,178,131,89,24,101,24,209,1,125,14,240,244,151,214,156,40,224,67,192,189,179,136,52,168,252,225,114,155,88,47,245,39,115,69,20,84,47,1,228,133,127,89,219,168,96,96,233,240,153,250,113,93,236,226,107,14,250,196,84,197,64,225,174,184,83,29,169,232,124,47,13,122,3,111,228,72,210,97,175,26,222,187,198,231,122,116,170,214,70,250,83,59,238,16,145,75,61,59,43,113,255,223,246,100,117,233,250,234,200,154,100,67,149,159,174,244,51,55,238,22,135,226,23,19,51,8,27,146,0,150,160,96,147,41,111,211,196,102,226,112,176,21,111,114,90,104,244,12,71,36,22,179,19,5,132,201,99,35,25,178,83,219,179,41,64,190,22,23,176,17,161,29,43,173,17,98,2,68,52,13,10,234,193,135,1,69,80,74,98,42,101,143,207,159,37,120,163,48,96,27,237,18,124,112,24,197,152,235,55,153,206,221,19,44,85,26,187,221,235,56,166,126,204,87,197,132,35,26,130,40,4,151,92,73,99,37,229,73,111,84,239,122,0,81,255,106,17,231,56,212,94,222,206,138,146,67,227,209,102,151,197,255,188,235,196,196,189,170,237,253,46,191,125,72,219,190,217,81,190,150,236,25,232,98,161,195,128,51,153,156,152,157,192,205,170,48,160,135,197,142,118,64,234,139,50,68,170,225,55,118,169,184,100,56,52,94,209,196,235,112,157,5,170,94,192,211,106,166,220,108,32,179,90,63,43,169,91,194,83,204,35,12,220,116,24,232,214,56,54,81,91,141,14,20,162,6,244,172,214,120,127,157,76,77,201,67,21,50,215,91,12,180,88,150,44,174,63,63,206,74,46,68,133,109,218,208,132,126,254,68,199,2,176,222,61,147,114,24,184,122,103,129,221,56,177,164,172,228,177,36,17,11,234,214,254,119,44,242,105,4,123,63,225,20,60,193,132,201,118,13,10,186,156,190,171,222,52,113,109,213,186,196,131,48,13,101,11,189,30,25,181,199,56,249,177,176,75,237,164,80,42,189,18,230,179,2,151,98,76,81,19,1,77,204,228,122,138,186,224,244,102,31,210,207,223,53,173,68,34,178,140,242,135,161,82,60,87,53,171,98,28,142,206,111,86,228,203,243,125,99,130,79,129,8,149,221,87,56,13,46,44,56,58,98,7,247,241,52,119,164,70,167,8,33,186,107,144,133,36,246,100,27,221,156,203,158,194,82,158,255,114,200,102,42,105,73,243,28,184,47,77,190,112,136,37,199,186,153,31,198,71,122,245,145,212,48,237,184,81,23,103,56,18,224,28,184,49,122,219,180,41,208,8,70,140,131,41,187,192,118,61,186,83,208,40,3,221,241,234,194,237,224,119,199,93,91,193,220,82,194,52,68,113,66,64,157,200,52,198,68,197,242,41,92,101,52,137,139,81,68,227,58,242,102,214,162,1,148,134,118,143,224,177,102,98,197,215,65,113,120,190,166,38,236,26,204,68,134,196,254,225,114,99,53,173,3,97,45,57,77,166,222,122,60,137,73,102,52,69,158,11,62,199,100,19,148,25,55,57,35,213,106,210,93,212,168,5,142,145,228,80,105,188,176,163,55,229,76,3,213,108,237,17,17,90,247,125,181,63,128,90,135,63,253,96,245,163,131,211,222,197,139,12,79,217,58,172,8,251,219,252,185,37,47,204,218,60,210,169,193,147,203,14,44,186,44,110,178,13,10,14,0,54,252,60,217,226,253,227,132,13,10,164,45,17,151,84,218,235,76,136,198,6,215,81,233,84,200,24,141,29,228,233,97,57,81,170,207,102,200,9,59,13,10,145,106,4,29,181,68,246,210,2,233,129,111,134,217,225,35,116,37,67,8,246,89,210,112,68,112,242,63,28,196,94,229,183,41,238,80,42,134,36,252,108,12,148,32,43,164,96,50,168,22,137,1,236,126,43,177,57,21,116,92,127,33,241,43,248,59,14,84,173,165,115,255,61,64,156,134,252,175,95,171,170,234,233,152,8,6,228,3,121,244,24,6,183,195,215,50,13,10,110,107,2,83,117,67,198,227,158,130,84,237,251,172,197,227,233,73,114,7,49,220,228,247,13,10,34,30,236,212,37,255,156,217,149,222,175,233,224,11,1,250,215,112,93,141,250,225,164,108,85,11,174,9,151,156,180,193,63,221,119,21,237,222,26,208,178,96,210,87,48,248,121,207,103,167,244,171,70,220,173,13,10,6,136,224,88,171,50,226,27,113,143,203,56,200,73,184,39,138,129,240,84,188,140,63,105,147,11,101,207,183,187,147,91,26,17,123,255,80,88,67,99,237,178,14,116,91,38,205,47,169,215,196,78,164,190,18,189,134,254,76,208,57,187,69,128,57,77,219,176,100,187,94,111,22,162,197,29,150,142,12,216,220,160,67,219,64,25,188,129,34,101,79,3,249,191,249,197,27,163,102,212,42,134,24,148,187,145,121,127,104,13,10,251,3,123,182,39,224,251,61,232,202,55,4,8,111,164,23,129,69,220,26,200,192,217,72,251,144,90,41,98,29,18,242,217,248,95,219,238,152,38,218,1,221,15,225,176,92,142,173,159,158,169,220,31,47,39,148,28,88,228,245,11,144,109,142,94,126,249,26,193,172,56,15,53,203,125,78,56,46,42,72,21,157,221,79,77,252,188,114,184,43,196,228,237,221,211,92,196,221,56,119,134,128,154,188,162,18,159,94,194,72,148,255,236,218,178,212,34,170,218,80,97,31,192,242,91,4,113,61,95,28,135,121,79,66,86,2,11,242,60,87,92,192,8,193,162,51,81,20,67,110,206,239,158,174,190,217,235,156,190,159,50,192,235,172,158,61,89,232,82,125,6,250,201,29,49,130,40,243,3,0,50,251,41,125,201,159,43,38,248,65,23,86,86,85,99,209,108,97,91,119,68,155,94,96,140,107,99,112,28,58,221,80,11,198,227,33,165,92,185,111,194,191,87,197,246,76,185,83,104,161,32,36,192,73,16,153,145,32,71,14,175,175,32,159,127,128,204,147,9,202,43,165,85,226,125,160,138,185,222,176,243,41,42,138,209,8,216,70,13,10,55,58,43,119,230,80,112,115,88,196,56,138,157,35,139,78,31,146,188,22,227,159,59,50,182,107,174,47,138,221,63,50,224,233,52,129,83,251,7,123,70,157,97,163,136,142,57,169,20,28,200,61,201,4,155,141,217,250,224,64,233,121,207,250,132,68,120,106,164,116,38,57,211,194,205,75,199,197,70,219,174,151,118,27,247,231,133,135,172,126,249,21,46,231,71,34,61,245,108,164,182,203,107,122,31,95,139,197,167,77,142,78,211,206,20,181,56,140,226,95,175,147,49,222,99,4,242,254,235,144,153,228,76,20,187,165,55,147,139,135,105,67,116,229,138,102,13,52,98,7,81,50,231,61,247,185,242,53,72,76,157,190,143,224,173,158,53,178,150,164,222,62,25,43,149,148,98,115,103,4,133,44,140,154,19,75,91,67,223,92,232,211,157,97,143,79,118,97,115,146,33,133,61,253,250,7,254,148,1,26,11,135,101,41,161,117,14,29,243,252,148,84,141,55,57,178,96,204,234,210,2,170,186,113,78,234,246,11,17,179,193,24,194,188,123,58,69,214,255,13,10,106,32,50,113,185,88,98,17,49,208,241,25,223,134,182,47,70,227,132,139,115,103,223,104,195,222,32,101,167,114,115,179,98,2,109,77,234,221,186,105,35,253,140,110,38,207,159,176,3,157,165,246,34,249,49,74,254,66,133,199,49,53,19,58,28,132,54,215,17,121,1,85,225,7,164,62,244,121,5,142,195,32,236,189,124,151,147,201,165,104,196,2,229,182,78,211,22,216,225,175,115,184,184,41,133,150,57,254,244,235,255,255,187,116,100,0,58,27,228,230,120,175,104,255,219,65,105,53,191,210,179,183,76,246,250,141,15,25,166,200,145,196,216,151,51,121,209,68,141,154,221,99,255,204,233,173,241,22,156,31,40,207,196,137,50,153,156,102,207,192,123,89,79,26,145,31,57,21,56,224,104,171,166,132,172,94,133,49,127,72,242,112,56,104,78,27,70,9,47,190,239,120,20,79,55,31,22,164,126,135,31,58,137,180,19,252,151,204,69,234,129,188,109,44,26,248,247,33,3,241,167,65,45,33,69,239,77,179,249,179,126,19,152,0,131,31,210,90,154,124,207,7,22,196,224,172,51,179,105,235,250,27,171,193,58,75,237,21,242,91,234,233,175,48,58,223,165,85,241,160,230,197,227,23,27,65,147,106,102,175,141,31,41,143,107,139,228,196,219,92,152,108,173,208,208,111,231,74,112,62,62,143,62,253,187,149,109,45,116,120,11,42,194,147,45,17,162,23,116,232,2,70,214,38,157,213,185,254,48,180,254,182,215,164,170,144,178,114,58,64,113,88,199,104,247,149,198,137,25,251,193,102,60,117,215,137,22,186,152,52,247,76,22,116,32,43,70,6,30,84,17,239,55,212,250,32,37,13,10,93,47,48,189,15,159,188,50,165,187,112,178,154,115,173,194,249,127,135,197,146,148,12,108,19,58,81,121,186,150,212,196,43,0,227,101,33,254,185,69,168,6,237,222,65,251,248,52,154,174,245,251,104,125,104,233,71,15,3,127,221,21,230,217,253,46,114,5,253,213,61,72,244,240,18,9,164,35,102,76,191,41,18,214,133,30,34,96,34,207,3,213,105,115,140,56,53,78,147,193,106,126,46,53,207,194,76,40,14,142,92,252,223,172,233,135,16,215,49,112,167,124,241,179,11,188,233,236,67,6,92,124,97,13,10,241,26,182,117,193,207,101,61,58,224,42,125,124,19,237,23,235,19,137,13,10,3,130,98,195,105,13,10,133,169,184,89,129,17,101,194,193,147,168,147,153,172,55,180,201,180,11,16,32,168,230,39,65,142,201,6,67,26,188,45,11,221,14,86,160,50,29,224,207,57,163,35,22,8,123,76,175,173,239,179,121,69,102,50,231,253,26,36,230,85,105,102,21,232,117,181,55,151,110,81,70,33,222,41,1,224,7,239,240,40,13,195,68,212,50,246,151,67,66,170,85,246,146,125,105,83,243,240,29,2,198,221,187,121,13,200,50,50,131,78,8,249,81,133,69,187,251,128,39,82,182,8,214,106,4,3,234,141,255,62,47,101,201,78,99,35,29,34,184,126,97,133,34,119,64,137,49,220,116,133,231,14,140,128,71,232,80,126,248,214,141,87,36,112,69,49,37,59,250,211,24,13,79,36,45,247,81,231,5,233,218,227,45,60,61,23,126,173,249,187,26,230,245,113,95,220,195,119,177,65,150,71,23,161,15,119,146,221,191,79,203,70,215,39,166,99,202,94,251,92,140,202,50,15,20,73,211,224,17,41,132,32,209,81,199,177,30,211,213,132,132,229,94,51,225,134,193,31,191,39,210,6,88,213,162,63,120,77,47,225,12,62,58,9,255,34,150,164,16,5,18,44,59,146,187,150,0,201,150,131,192,190,113,128,178,227,223,228,218,35,152,47,186,195,114,23,117,133,249,183,250,250,113,137,82,28,120,174,244,125,225,105,75,64,134,3,160,52,253,61,229,93,151,13,247,155,196,209,175,99,170,32,13,214,133,222,112,22,192,135,97,43,52,136,13,10,150,116,33,165,8,209,125,13,10,71,99,241,212,145,216,136,105,30,69,82,166,167,196,63,85,45,174,52,15,75,202,20,96,50,18,66,135,175,94,59,150,122,197,99,114,241,121,116,166,11,84,42,219,214,49,174,19,67,75,77,206,68,130,233,186,209,206,76,182,173,40,25,25,255,184,14,225,102,204,76,77,17,169,140,187,99,89,23,13,46,43,62,59,103,25,11,246,253,163,159,239,83,236,73,92,185,185,141,14,49,40,152,115,130,13,70,76,67,58,173,141,189,68,246,242,224,47,139,240,37,236,144,170,104,185,165,109,29,17,74,9,99,229,145,13,10,6,45,153,81,122,53,188,69,24,22,208,67,58,245,222,137,154,164,62,145,152,12,70,107,62,194,32,199,25,182,58,151,64,172,49,206,96,210,24,168,153,110,205,220,235,152,194,73,102,168,226,208,183,203,152,149,24,181,73,61,126,53,7,60,151,189,42,57,168,19,252,72,145,180,158,252,163,74,190,126,145,58,207,199,151,235,1,168,119,200,36,46,238,223,116,193,184,165,40,213,157,140,215,81,8,205,213,179,23,56,250,93,151,55,31,81,79,254,0,193,170,27,227,65,137,141,120,251,251,9,31,68,171,86,245,52,152,45,239,97,24,154,114,18,111,91,35,43,0,5,165,92,103,23,80,37,69,3,187,12,175,77,244,65,82,230,16,175,126,161,92,163,36,80,129,7,6,114,154,180,201,186,254,234,187,161,50,30,222,11,254,93,84,166,31,31,107,126,96,142,6,4,99,210,52,42,0,230,2,92,28,71,113,77,176,145,155,102,197,249,38,149,250,163,53,221,206,223,170,39,174,107,188,98,141,109,217,237,44,109,38,218,58,194,117,238,57,244,39,191,247,186,93,134,28,212,43,237,179,185,177,33,50,62,35,136,226,98,43,129,102,234,206,95,24,145,229,65,12,120,86,213,64,182,20,115,213,33,38,30,5,177,215,104,142,9,245,41,227,182,155,137,42,164,63,86,254,95,133,188,4,2,88,219,46,96,219,169,7,181,11,21,229,109,31,143,2,215,137,46,24,233,24,182,229,13,235,207,61,64,176,3,157,229,130,9,80,174,176,216,158,123,29,13,10,29,136,238,33,18,95,121,79,188,68,212,27,215,31,128,74,121,23,5,188,217,232,115,5,28,115,252,177,83,90,6,197,63,156,49,36,152,172,254,246,250,172,109,233,65,201,173,97,37,165,98,145,79,121,3,37,91,57,116,44,234,153,237,4,71,36,194,200,109,108,236,87,255,232,76,152,54,62,164,184,49,22,210,151,199,97,43,42,252,239,132,224,60,96,190,112,19,118,200,123,42,153,25,185,120,130,232,241,58,179,72,53,204,79,57,62,83,1,57,190,23,219,203,231,235,31,158,79,165,18,1,4,213,244,130,112,105,145,44,88,213,156,27,55,159,121,116,30,77,241,214,213,6,66,113,137,147,16,185,55,168,80,199,34,175,83,212,46,236,39,230,232,91,184,147,15,170,135,165,12,147,123,80,134,149,241,60,119,138,26,129,13,205,134,204,60,231,14,201,100,52,102,189,88,92,75,5,117,6,85,136,199,60,208,174,236,62,70,106,232,3,177,16,98,34,157,139,96,29,184,195,163,165,142,21,226,201,8,185,86,2,244,101,209,173,75,32,47,170,176,67,204,39,47,166,7,196,137,214,85,84,121,95,56,254,47,216,181,199,212,8,23,155,201,137,54,219,19,169,58,132,22,222,247,71,158,6,112,139,46,244,253,97,87,22,119,72,139,94,68,135,62,253,162,147,56,11,90,4,164,147,246,55,255,187,104,45,244,108,138,32,143,195,20,64,83,212,202,106,45,104,18,212,103,111,59,26,96,220,242,126,135,178,24,109,147,29,145,32,145,14,33,85,173,79,253,100,106,78,160,228,36,44,99,136,109,167,0,110,181,192,4,181,79,54,110,24,180,150,172,119,96,67,24,79,151,128,182,125,17,146,74,175,0,86,94,176,231,15,147,170,217,121,217,83,103,116,214,130,198,205,17,35,203,165,62,146,203,223,116,134,172,138,211,132,180,123,204,232,165,191,49,43,164,52,89,187,79,101,136,252,51,164,104,116,127,86,121,106,143,67,66,81,127,215,85,160,141,206,103,19,246,82,72,171,175,7,146,1,118,166,118,25,92,102,158,121,44,13,254,92,60,81,38,253,7,202,65,1,134,244,203,78,250,102,158,188,197,22,35,238,2,82,118,136,5,19,31,87,95,91,189,210,117,133,80,174,103,95,65,239,237,153,207,196,228,78,213,179,118,136,160,226,79,20,169,228,78,108,75,173,179,176,79,37,160,199,24,40,29,67,121,229,146,222,123,114,238,198,48,106,124,177,112,41,165,118,135,126,188,93,21,213,64,191,65,106,134,249,118,221,153,129,13,10,156,130,81,17,36,82,193,143,141,12,98,20,87,220,161,166,127,26,40,157,180,141,255,38,243,178,198,110,154,13,182,123,15,61,213,171,245,92,189,137,66,198,171,146,189,63,144,158,230,100,170,227,125,41,47,34,85,254,53,184,248,131,255,198,187,179,102,199,5,128,55,173,21,148,126,204,29,207,166,6,123,25,4,20,181,247,98,124,25,197,146,91,254,102,18,141,167,44,145,79,209,239,11,121,140,233,241,120,122,183,67,215,233,31,240,4,109,77,136,197,217,47,185,224,53,86,178,132,128,210,102,207,92,46,131,73,183,157,161,72,16,112,109,20,72,75,213,147,30,75,179,130,64,31,189,33,28,129,147,116,149,5,96,79,210,148,93,205,197,240,57,5,161,13,25,137,0,186,169,15,59,240,2,46,102,87,238,105,234,211,39,223,163,196,135,251,174,181,212,251,242,238,88,133,14,108,108,249,229,202,68,236,16,202,191,87,88,185,158,76,145,173,233,190,48,25,250,50,106,217,146,248,117,49,86,195,63,135,124,215,36,239,25,83,152,19,223,104,111,223,136,145,167,177,169,132,2,218,235,91,19,225,204,41,141,154,119,253,107,52,28,123,160,67,151,158,28,70,232,111,224,30,177,147,75,132,99,20,12,106,112,170,4,122,240,23,246,147,222,64,125,128,7,81,195,244,194,115,64,179,115,212,23,1,104,156,20,144,161,107,164,21,179,23,255,58,112,143,170,216,210,143,160,166,245,46,141,204,212,141,216,219,13,243,212,158,62,185,90,122,26,19,183,13,110,130,2,185,209,70,90,35,224,11,16,19,212,170,188,124,86,194,120,172,129,248,56,51,71,37,243,133,230,54,248,44,107,73,126,110,48,130,211,158,113,45,140,175,84,0,212,213,64,95,14,240,238,199,177,37,192,108,87,106,116,212,214,221,238,243,109,107,44,186,203,76,108,98,141,99,33,146,95,123,153,19,209,149,161,94,173,108,223,73,220,134,4,54,13,10,121,39,30,19,106,130,247,226,37,17,66,22,221,180,106,190,146,7,176,184,213,75,63,131,162,48,196,12,219,152,37,57,189,244,53,164,208,216,32,52,143,180,229,131,184,14,198,166,201,225,109,197,171,33,98,206,151,34,145,21,189,110,155,223,206,36,100,214,67,104,40,130,17,116,158,90,91,88,83,170,123,155,116,170,189,126,89,236,103,48,161,210,229,177,91,5,37,210,212,170,142,25,216,214,139,166,97,132,12,72,88,5,37,44,68,8,45,184,24,193,116,167,3,112,216,211,195,102,102,239,97,103,219,54,83,104,84,193,211,68,32,91,86,65,51,212,240,245,33,133,127,163,252,183,103,190,252,101,178,67,244,213,40,241,119,44,156,150,50,165,23,140,104,173,167,77,32,243,23,32,79,130,30,74,91,114,151,28,37,59,90,5,91,158,144,245,43,25,122,179,12,225,83,145,74,249,108,237,150,191,204,100,123,13,10,122,225,3,113,75,17,49,61,225,153,82,244,39,128,166,6,135,81,57,219,189,141,32,145,49,239,211,174,151,155,121,156,217,24,54,121,37,177,18,253,47,140,52,247,81,83,115,255,107,64,219,230,106,240,103,89,223,170,228,78,174,30,74,234,82,8,24,11,89,184,40,154,132,145,236,166,126,88,237,145,146,94,215,122,59,101,101,28,223,127,122,233,89,76,104,128,37,186,79,110,171,180,104,101,164,174,65,104,172,159,199,234,85,228,9,124,130,8,58,249,253,249,160,27,59,148,200,244,210,238,202,182,136,223,56,100,191,138,20,171,110,85,176,184,161,246,253,148,47,178,95,25,156,7,179,101,175,184,58,90,120,230,140,176,222,166,86,104,8,93,126,215,229,183,212,152,15,44,37,141,205,13,10,242,153,5,98,188,54,53,153,54,240,174,218,236,108,43,62,201,120,107,225,246,204,161,236,200,6,50,190,83,7,233,121,120,54,202,11,29,82,164,162,134,244,188,54,50,78,26,233,72,198,92,54,49,212,78,129,160,110,73,215,129,60,133,21,224,133,223,20,61,53,150,99,239,226,140,35,79,162,224,117,185,254,234,85,94,172,164,215,141,172,16,140,161,255,148,240,136,139,26,146,239,148,174,169,218,218,242,255,112,138,255,104,168,60,252,247,72,190,71,166,196,208,213,123,9,239,143,244,198,174,110,12,203,50,103,178,190,91,129,120,230,242,13,10,23,169,125,53,105,115,31,228,171,137,51,249,186,136,155,191,126,41,223,87,130,222,34,89,193,79,22,160,226,235,6,252,239,172,138,181,141,203,36,72,235,153,122,238,111,130,156,206,152,123,42,180,78,148,34,97,140,140,182,77,207,57,109,115,245,12,252,249,12,189,41,230,33,147,88,30,57,88,124,239,236,182,239,204,81,181,60,0,222,143,130,63,66,73,115,102,59,110,110,246,251,100,194,191,190,21,229,20,51,205,241,163,237,130,97,61,173,38,198,133,43,153,147,242,217,146,68,165,239,92,190,98,245,4,30,110,23,83,33,35,163,167,168,208,53,122,91,213,67,153,84,26,76,112,155,154,211,183,118,251,0,134,226,206,28,183,75,70,106,253,196,32,125,73,33,196,13,13,10,158,175,182,13,10,144,250,175,81,190,60,31,238,218,231,206,20,98,126,251,227,190,253,60,235,198,111,205,0,115,175,250,50,100,141,129,106,16,176,163,81,36,150,71,120,41,109,6,205,65,170,24,125,238,192,204,207,110,15,39,225,181,108,69,17,12,170,241,67,202,198,209,111,132,9,31,113,187,54,217,78,82,159,166,7,147,232,34,163,158,16,124,119,219,219,254,228,250,30,34,196,80,118,27,202,146,135,202,136,216,25,123,17,225,176,170,209,13,99,233,47,9,88,21,220,7,81,169,38,16,70,113,232,72,20,78,76,150,238,112,43,99,131,28,79,203,143,255,165,102,203,209,15,79,123,32,147,216,54,135,157,103,249,77,252,155,14,124,129,39,190,76,214,108,163,28,199,102,242,174,54,235,182,155,5,162,68,219,127,14,209,38,200,84,189,8,111,164,105,142,28,163,22,202,233,182,130,83,48,154,9,190,27,138,97,50,136,73,88,242,2,111,119,118,136,159,39,234,90,50,123,222,88,217,52,50,9,199,15,105,203,148,209,105,51,40,185,82,92,164,245,87,118,68,11,152,100,231,69,200,203,46,67,211,236,110,172,130,31,131,114,40,66,58,3,65,174,253,42,35,136,250,254,250,29,66,36,30,139,190,195,53,218,52,225,9,105,158,187,207,218,221,243,129,243,55,32,23,3,58,96,14,212,202,109,167,37,114,132,40,186,69,254,181,231,196,161,38,78,230,73,224,240,14,243,188,112,133,92,13,253,208,35,233,33,107,97,106,1,227,122,223,230,101,189,19,213,26,19,160,87,16,188,227,128,99,121,143,122,109,75,128,142,244,2,78,173,92,191,63,94,61,137,58,222,160,92,194,169,100,40,113,251,212,29,215,21,108,94,216,74,248,173,196,222,209,51,26,138,207,213,29,216,249,217,40,36,159,225,129,80,49,78,202,164,226,145,235,19,231,187,95,219,42,37,145,120,229,241,55,31,231,128,127,131,130,173,20,145,248,105,88,219,42,15,193,215,2,129,37,249,79,183,35,96,8,231,11,22,187,59,103,21,206,115,246,50,14,127,188,233,143,35,161,215,27,86,86,19,17,209,9,51,150,28,225,34,77,2,1,185,91,199,248,98,162,59,40,220,183,71,190,95,227,125,107,66,102,118,174,154,244,135,71,40,62,29,240,154,253,228,162,105,214,50,149,199,193,95,58,69,245,107,39,231,210,205,99,175,176,172,138,37,99,164,182,204,228,255,51,6,162,139,48,122,13,75,213,7,31,177,198,91,148,245,222,50,165,133,156,203,130,111,140,137,71,55,191,230,163,50,195,132,194,31,110,215,163,175,203,15,206,226,55,134,140,149,41,99,79,106,169,21,43,22,139,59,5,238,122,118,141,179,139,196,239,205,54,228,243,129,194,114,94,51,51,250,109,5,82,37,225,222,175,251,159,207,70,209,36,190,15,134,100,117,38,179,176,17,54,111,26,25,222,186,151,38,247,94,120,179,118,93,66,28,145,93,116,223,30,59,70,75,229,1,107,116,17,98,51,232,49,189,104,169,208,76,180,186,70,138,25,194,241,199,237,179,95,93,239,84,231,193,231,139,141,131,39,57,129,136,245,13,10,133,180,192,212,44,105,127,82,207,30,171,66,198,242,68,246,176,155,45,243,108,122,212,24,220,17,63,83,236,80,198,177,201,44,151,233,211,40,166,128,33,39,97,162,123,211,190,151,109,73,99,191,24,214,211,4,79,53,142,126,108,236,28,148,22,182,193,196,156,150,9,244,234,30,6,129,27,198,154,222,163,211,0,173,153,123,146,221,79,248,47,252,47,85,87,216,87,95,112,204,52,167,249,145,103,192,52,145,153,154,169,114,132,93,179,119,61,152,210,84,44,158,140,29,53,77,28,108,89,134,230,250,179,143,233,72,85,125,44,182,197,192,184,24,61,100,157,146,102,190,185,100,71,49,189,165,128,189,71,41,81,101,32,199,33,82,5,128,72,162,7,100,50,214,93,225,19,117,90,163,41,40,167,94,212,136,8,33,204,125,59,192,81,187,191,68,3,101,0,231,166,98,167,105,20,171,40,146,206,194,127,25,80,114,183,137,88,95,17,242,74,176,152,103,33,68,64,243,202,21,219,34,128,16,139,27,37,72,41,22,175,141,57,89,105,158,212,67,216,103,211,147,7,150,206,94,212,183,49,127,159,128,195,32,90,66,80,189,122,50,180,57,168,251,86,0,202,235,226,237,63,34,124,251,97,181,252,240,209,94,15,35,58,121,16,227,97,119,15,113,18,211,87,65,44,13,107,253,200,63,101,176,230,191,122,98,142,117,222,45,237,166,100,32,194,203,127,235,247,193,224,216,67,20,64,187,184,94,148,146,253,106,145,130,166,135,180,61,210,225,221,252,33,89,184,176,115,75,11,220,54,238,143,236,230,217,90,43,122,68,188,23,22,193,76,192,111,4,127,246,188,167,210,179,248,203,254,164,165,212,244,15,172,103,27,196,227,142,9,209,207,165,200,38,124,221,110,191,190,156,111,178,184,72,124,36,102,194,245,219,212,152,61,136,155,93,185,104,63,175,41,200,109,135,101,54,181,87,7,245,208,37,110,194,144,221,87,69,198,20,41,144,127,18,58,156,19,58,226,19,169,171,43,202,13,10,57,17,184,217,147,98,28,160,9,59,136,82,43,131,23,149,233,8,82,164,152,5,162,45,196,27,102,255,105,83,120,76,142,151,188,181,73,239,167,196,42,71,122,165,89,166,184,141,139,220,219,96,106,184,179,5,229,170,105,85,163,61,167,154,117,42,60,197,250,5,178,24,225,244,67,68,195,132,26,250,223,127,120,53,41,187,19,193,60,142,117,112,218,152,3,204,17,54,200,201,191,197,173,157,170,241,130,154,19,62,84,128,60,171,182,67,81,180,107,236,96,194,125,34,252,26,162,238,88,48,222,16,175,183,126,91,129,253,43,83,108,83,193,227,81,206,142,122,181,132,122,177,5,63,77,205,19,62,2,214,18,59,54,116,118,159,70,117,3,131,95,253,4,122,146,31,213,103,120,45,87,85,40,136,224,148,42,231,89,0,95,7,148,52,107,169,55,205,79,254,38,210,165,175,243,78,113,137,163,4,181,119,189,118,115,129,52,28,211,171,25,24,164,176,222,79,97,163,229,140,200,5,222,230,100,30,183,207,66,49,211,22,237,19,223,3,201,151,103,101,64,197,46,80,20,229,4,237,189,57,132,180,117,192,68,43,77,101,221,62,170,168,122,211,124,79,123,252,9,13,167,187,66,200,170,116,78,152,120,205,90,185,50,28,120,71,163,96,89,44,110,99,2,84,123,228,170,18,238,119,23,251,184,77,142,188,102,244,196,9,12,196,20,19,219,210,143,49,239,55,175,124,193,84,13,10,119,63,87,26,116,253,62,106,68,78,95,25,181,8,67,36,226,21,164,17,76,112,15,187,41,223,47,177,130,39,97,148,8,177,55,119,40,88,209,168,154,91,18,120,208,187,87,15,133,200,15,99,172,191,224,112,3,3,64,147,195,103,238,15,13,87,45,134,28,122,45,100,4,96,131,130,139,142,223,107,109,21,207,8,135,131,184,215,157,195,185,157,126,104,26,155,49,208,113,3,236,247,13,10,196,59,177,212,117,31,222,24,81,215,152,145,47,221,93,31,136,106,200,88,234,68,20,30,0,250,244,135,209,118,41,183,6,78,170,233,79,15,236,70,87,214,159,29,136,107,113,213,200,66,111,136,15,140,9,33,215,209,21,194,76,160,84,212,94,119,206,36,181,84,166,117,211,247,149,92,146,222,110,33,98,38,157,216,78,143,210,32,142,147,249,235,50,67,236,255,83,148,29,192,75,243,132,245,53,245,142,218,51,98,5,7,115,71,247,3,179,166,48,244,175,139,132,236,231,241,220,132,233,170,113,226,17,52,83,81,78,14,190,4,24,93,83,31,165,150,113,140,227,234,127,103,230,95,147,242,134,249,48,218,13,10,202,248,49,201,31,63,96,118,58,5,209,130,169,56,221,251,82,144,120,226,163,182,200,163,122,208,118,233,164,25,240,138,131,72,56,157,48,82,52,73,110,67,13,10,26,41,87,211,255,162,85,161,109,63,246,8,51,75,179,177,165,198,188,122,172,233,174,149,159,126,81,187,81,51,78,74,117,114,241,31,112,43,194,126,58,102,152,234,90,229,64,93,97,119,34,249,153,170,70,95,129,104,109,241,107,40,212,151,49,94,16,184,218,33,180,58,239,76,243,59,63,62,8,224,125,58,116,6,134,111,163,139,200,179,60,193,59,136,158,254,214,166,205,46,188,171,66,209,183,148,77,193,5,74,14,101,72,198,19,236,241,164,129,205,249,176,196,30,205,48,54,72,61,236,59,68,55,74,194,247,37,148,246,165,83,44,218,58,62,53,22,185,73,180,97,167,17,244,103,191,130,50,31,53,249,178,66,204,43,87,95,64,251,147,155,66,139,17,47,26,18,187,220,182,13,202,129,192,109,26,164,0,174,91,152,55,165,239,177,241,137,222,244,248,160,88,187,138,246,1,240,240,219,213,145,166,23,236,116,3,115,60,137,210,112,8,22,237,202,104,255,251,189,214,131,218,102,232,234,161,45,47,184,24,162,198,183,192,3,154,189,173,135,137,21,40,103,0,63,87,6,26,211,86,132,95,129,156,29,115,220,228,199,44,19,172,94,140,151,208,47,131,45,121,139,5,192,64,63,133,133,130,167,84,119,46,171,108,200,72,100,133,236,182,46,173,137,115,174,119,179,43,46,129,179,244,32,19,205,188,40,143,177,87,154,133,106,20,46,186,192,80,64,153,126,210,89,249,45,191,73,80,79,206,221,238,132,225,205,220,170,34,43,75,198,119,251,145,129,160,158,144,196,8,3,41,147,239,86,155,150,167,79,150,111,211,83,92,76,77,254,104,182,18,115,23,114,219,153,106,215,16,144,215,255,253,106,202,185,191,212,207,210,126,104,61,177,83,28,206,26,8,169,111,196,43,150,21,64,212,93,63,155,57,0,95,23,106,113,114,159,9,186,56,160,195,32,22,159,242,34,66,130,186,25,233,181,47,41,196,164,169,248,239,235,20,203,130,102,11,126,134,34,173,83,26,149,115,204,57,232,166,172,3,188,73,221,72,43,38,199,43,207,183,39,240,210,153,207,156,2,180,193,197,32,60,92,110,88,211,232,76,247,98,146,124,252,204,216,1,15,200,73,207,149,196,30,141,101,202,110,153,32,81,109,235,59,114,181,50,71,142,13,10,108,221,40,186,87,68,213,91,107,75,141,70,143,105,16,252,207,2,44,70,187,112,253,190,113,162,173,59,13,10,104,161,248,141,21,228,78,75,55,199,29,138,183,24,221,199,31,241,79,88,242,33,31,143,80,23,123,60,218,87,212,46,188,86,33,220,246,14,32,178,211,184,95,229,235,225,38,216,192,203,4,164,14,93,212,194,30,191,102,141,21,131,123,221,9,86,5,163,122,48,57,235,22,125,249,245,235,253,124,181,133,1,8,18,90,254,16,182,138,189,114,149,244,82,250,78,243,251,242,75,211,158,116,56,23,96,96,37,179,160,236,143,13,10,110,77,38,149,60,17,172,16,157,25,101,139,210,120,230,118,150,21,111,4,31,218,91,59,27,161,204,63,90,195,121,8,122,115,210,247,171,234,173,67,121,204,154,202,210,1,146,39,29,16,252,225,4,95,82,49,87,56,200,239,22,102,202,139,62,225,65,29,129,205,174,211,15,246,50,26,227,0,67,53,47,109,108,5,23,219,175,203,85,191,152,49,103,48,246,207,185,234,174,121,129,220,136,70,217,50,141,146,242,47,101,134,169,243,56,186,250,129,42,245,113,252,73,124,53,43,122,40,38,206,168,168,85,94,80,227,179,252,199,82,78,229,83,147,1,158,30,4,7,221,19,67,92,5,248,20,32,243,204,122,116,100,63,237,163,88,23,30,174,19,72,209,253,120,50,138,118,37,170,250,57,198,14,225,83,160,139,206,28,219,2,73,193,38,190,8,30,116,237,116,100,206,207,4,149,92,37,203,12,94,193,117,67,28,177,182,114,152,168,150,79,222,152,225,63,161,25,39,56,159,30,135,109,227,208,108,194,206,229,207,116,11,230,216,95,143,111,118,247,55,216,151,138,171,109,64,182,165,2,123,31,89,146,251,193,125,44,7,73,151,172,244,138,141,68,59,204,179,140,112,79,186,30,34,159,14,142,255,27,68,215,165,146,232,165,34,182,224,126,30,168,137,224,110,79,122,221,174,84,21,107,158,124,200,192,65,141,130,245,69,160,209,78,193,172,28,91,97,127,94,248,119,150,23,140,67,118,46,129,251,173,67,130,23,9,127,133,130,83,78,87,223,153,95,135,51,188,68,48,209,161,187,219,145,145,46,197,205,119,140,40,99,116,118,62,23,24,50,218,9,67,210,84,254,100,190,14,5,85,157,159,202,119,24,70,64,246,28,12,168,194,163,30,96,66,219,205,189,25,189,182,102,158,172,92,81,88,134,250,108,164,34,88,33,68,215,204,232,127,73,144,135,40,186,154,132,14,55,167,212,205,84,210,176,185,201,174,91,108,235,43,42,60,42,216,89,207,52,248,92,90,174,129,113,226,202,217,79,71,245,224,52,72,54,51,26,195,134,19,81,182,182,174,188,65,204,252,95,40,250,92,226,88,188,142,92,74,237,166,20,98,69,197,105,21,83,105,70,225,160,255,135,106,238,185,193,222,33,73,114,76,138,230,240,11,145,171,163,60,42,222,39,112,199,65,105,247,209,224,232,113,68,73,222,43,160,3,123,121,227,109,63,5,202,13,255,90,177,73,137,81,110,136,12,97,3,195,190,247,238,189,82,87,102,229,143,13,10,243,59,34,64,210,87,17,13,10,182,63,254,226,48,143,249,234,105,186,42,82,242,167,36,26,127,82,73,139,3,31,143,251,106,224,210,113,243,0,36,192,72,7,37,129,8,3,192,22,107,152,243,94,111,110,226,74,63,55,94,124,84,189,225,1,138,173,132,98,22,25,16,38,169,190,215,75,154,209,30,92,127,82,61,64,126,152,173,47,36,98,3,102,242,12,25,22,80,248,180,19,78,51,1,137,157,41,180,111,165,41,133,218,211,34,249,75,157,62,82,137,13,10,188,209,136,208,159,228,209,252,192,183,165,15,226,99,187,229,238,83,21,195,22,58,94,238,48,82,131,107,230,161,174,1,14,204,128,72,18,24,222,212,72,240,189,122,18,231,210,181,43,108,46,207,141,126,174,214,35,103,169,9,72,131,17,108,201,239,4,170,245,38,169,146,162,8,140,249,2,122,95,132,174,108,13,213,94,70,218,122,71,59,203,228,131,13,10,181,210,226,106,130,174,76,94,83,189,1,1,129,218,201,185,86,69,125,123,100,128,92,221,34,190,182,132,227,23,205,89,80,9,229,44,206,80,31,94,51,145,53,144,7,152,112,192,43,51,174,218,150,192,218,140,50,130,139,148,231,134,93,165,147,155,250,67,95,229,233,200,206,223,23,201,176,145,78,38,135,17,195,31,229,95,124,158,196,239,165,17,157,187,65,58,237,232,1,95,83,221,89,148,81,76,140,135,20,141,209,243,69,110,227,170,238,154,166,119,134,59,3,151,213,39,99,235,1,250,122,165,190,234,93,252,158,71,12,191,204,251,229,96,160,20,162,183,88,12,130,247,91,190,12,50,64,134,9,81,199,20,63,203,3,185,160,228,187,184,28,137,231,131,166,164,111,115,204,229,233,95,120,141,43,19,235,31,232,102,171,113,6,5,180,99,254,209,160,27,16,120,205,179,108,250,82,78,170,73,165,2,136,158,220,221,50,78,17,45,168,110,26,151,195,189,79,202,52,55,232,213,97,92,64,66,205,206,136,246,228,100,102,58,247,161,77,80,66,89,23,252,181,234,198,251,74,120,158,184,143,193,146,63,191,192,1,218,243,124,243,155,132,92,246,115,61,61,165,202,90,46,247,104,189,119,110,238,30,164,181,180,78,93,17,176,131,225,122,165,242,15,37,177,226,208,56,46,144,220,145,9,147,155,238,180,81,225,208,129,213,141,169,50,178,82,59,175,18,196,102,148,14,209,54,240,92,210,104,98,170,104,133,232,82,250,126,98,135,208,251,211,188,21,101,127,204,153,28,42,227,76,70,194,167,99,218,255,102,66,34,184,215,132,101,34,82,218,116,56,73,85,37,39,128,141,204,92,112,177,44,185,242,136,123,141,171,227,3,242,28,16,182,119,177,181,73,11,67,144,237,237,100,200,80,238,163,102,150,224,23,222,28,91,224,16,161,93,8,169,138,5,218,55,216,242,56,131,103,73,184,66,236,23,237,110,118,251,173,92,87,177,247,197,39,47,118,99,6,109,118,172,177,239,142,117,186,112,152,68,151,13,10,66,186,180,78,237,115,122,164,20,158,223,128,92,208,61,212,20,84,172,76,169,40,64,217,101,229,17,159,39,98,147,235,251,239,21,9,254,61,88,199,174,235,40,1,184,133,179,35,155,164,157,157,38,220,47,254,48,123,228,163,219,150,73,239,117,33,210,245,142,106,123,51,241,217,163,231,146,124,20,84,28,226,236,148,216,246,29,11,179,92,44,66,151,9,166,71,108,191,17,201,243,84,69,170,79,200,54,110,152,178,86,226,41,50,155,102,210,60,237,227,95,219,25,113,189,225,166,40,252,145,254,222,48,250,4,118,97,195,8,192,55,58,124,172,30,17,13,156,69,177,72,38,146,232,196,72,126,31,117,3,118,227,161,53,214,130,105,49,7,209,46,114,27,110,39,136,123,104,156,41,93,183,38,1,210,71,32,198,204,180,213,242,144,132,43,142,123,213,3,82,201,175,42,237,239,187,0,73,110,64,22,43,169,168,106,29,234,225,56,199,250,131,23,13,172,16,94,242,253,76,62,115,58,59,55,21,236,94,151,224,240,180,77,135,209,132,101,53,147,147,88,214,121,136,24,199,240,0,117,231,122,6,162,236,11,113,24,179,36,77,235,90,115,24,0,4,132,140,132,57,71,118,249,255,247,48,115,29,93,138,240,165,228,238,69,1,155,166,255,125,244,121,112,149,68,54,15,217,177,36,29,70,132,222,247,8,167,247,60,91,229,65,15,54,127,193,215,75,222,167,121,48,244,210,12,31,67,18,133,117,233,241,93,58,73,67,212,194,134,4,224,68,103,124,199,0,97,105,226,83,6,224,100,104,99,202,239,147,19,70,1,251,114,107,135,109,115,104,212,201,29,27,124,188,150,131,224,237,134,166,18,121,213,68,239,39,133,247,196,40,136,47,99,142,17,32,32,124,188,98,243,105,107,13,10,249,242,80,56,145,15,33,204,42,211,71,142,194,121,230,255,131,211,65,122,117,125,107,51,75,107,179,191,227,189,204,230,137,119,196,36,2,189,124,151,230,205,157,120,170,40,153,222,5,149,90,196,49,200,147,96,125,248,229,212,131,31,135,206,246,166,18,98,48,183,185,248,13,10,208,152,130,87,176,199,11,238,59,23,248,56,150,137,46,182,159,122,158,127,4,232,238,183,100,233,63,173,208,163,8,53,173,121,251,127,204,108,158,28,45,216,190,18,56,153,196,106,162,213,196,64,166,47,117,128,116,83,202,120,228,101,198,178,44,135,211,149,145,166,38,201,36,19,153,159,183,103,31,61,203,20,31,163,238,43,228,77,122,74,2,69,208,59,238,179,221,234,149,232,204,73,85,136,72,154,128,163,182,8,35,29,41,32,178,110,242,206,204,73,177,214,155,150,208,127,45,97,142,9,110,106,187,184,185,192,122,142,183,176,146,161,100,94,77,16,223,224,7,232,23,143,63,174,157,218,66,55,254,140,54,61,158,172,65,77,180,52,0,235,27,93,97,97,123,85,127,195,251,87,69,57,160,65,109,106,16,227,90,16,150,56,69,124,86,114,2,124,185,9,60,208,41,49,147,43,226,124,77,160,74,88,220,167,247,58,87,18,254,150,53,204,217,89,49,93,231,206,86,15,68,104,5,188,108,126,107,76,58,238,65,64,73,38,30,155,226,247,107,187,32,240,223,37,52,175,214,23,145,43,131,103,126,9,29,206,82,28,209,251,23,200,30,231,163,30,69,16,245,25,171,106,68,124,133,113,106,98,243,39,161,1,138,198,145,120,46,183,168,7,23,36,117,241,163,194,100,223,18,100,132,119,34,3,243,206,117,126,2,102,11,129,146,243,116,99,223,21,231,1,126,243,215,115,40,203,84,239,218,22,188,162,51,6,252,194,237,242,210,203,255,167,125,136,130,129,186,254,6,230,77,120,81,74,60,64,161,193,117,106,210,50,197,86,13,10,187,131,56,143,232,208,110,216,228,75,199,176,142,184,40,91,62,234,172,88,43,59,253,26,176,78,11,147,148,4,206,63,41,255,8,46,187,105,77,183,25,228,254,219,167,248,2,31,33,182,29,216,17,32,18,217,208,4,36,214,31,251,184,95,220,5,176,117,52,231,167,75,60,108,189,80,152,137,54,39,25,188,56,181,74,43,108,153,189,6,169,172,165,197,119,78,139,95,6,84,147,72,15,218,28,80,83,255,110,187,248,6,186,209,208,197,201,156,5,208,0,122,200,26,217,165,203,148,88,116,32,23,202,30,14,164,0,47,247,180,101,212,162,27,5,152,112,96,172,171,241,132,176,212,175,182,2,80,76,35,19,164,74,35,143,215,107,214,244,132,144,90,177,248,169,35,228,229,38,173,139,251,111,140,19,13,10,133,123,5,125,1,155,180,195,197,11,99,188,57,120,167,99,182,245,0,253,76,65,60,8,99,246,155,60,255,181,122,139,162,136,55,105,110,61,47,120,187,118,71,13,86,70,220,62,58,237,46,82,169,137,87,196,16,252,187,226,246,74,163,56,49,147,142,147,146,222,125,243,233,168,82,105,111,254,187,182,186,23,211,175,75,202,181,249,9,171,70,174,88,55,143,211,105,154,210,125,108,239,251,107,7,40,234,253,136,153,193,50,222,51,232,74,217,67,45,250,8,255,178,71,199,166,247,228,51,3,161,42,140,58,15,215,26,174,225,84,26,182,181,239,34,18,228,100,183,177,167,61,186,114,237,192,170,105,167,216,191,251,100,249,127,102,3,191,196,235,23,104,198,203,212,23,243,228,255,142,23,208,223,66,115,194,65,183,246,131,13,103,113,241,3,185,23,157,111,210,200,146,159,146,1,57,84,250,168,112,108,16,130,36,15,237,52,140,185,193,228,93,166,178,58,14,169,188,43,183,120,62,135,243,13,45,85,59,215,72,188,181,23,238,131,32,169,211,112,187,26,23,146,210,249,234,90,124,105,144,116,91,106,130,78,255,233,76,45,45,110,44,53,31,249,165,99,91,83,2,248,76,1,232,91,120,149,101,54,138,169,243,114,141,244,79,218,196,186,196,240,171,67,218,67,157,239,155,22,212,168,144,49,62,112,89,78,181,195,7,64,159,154,179,80,87,181,176,213,148,253,97,66,191,196,60,212,150,101,167,34,203,53,160,35,35,221,16,217,159,22,190,238,66,100,152,152,191,38,127,45,117,52,197,72,100,72,252,213,15,21,2,209,90,16,190,201,182,27,195,62,35,98,213,168,224,28,138,168,7,133,240,240,18,215,82,113,106,1,33,29,102,89,181,1,47,84,104,238,190,159,30,186,13,53,25,171,13,10,190,47,163,176,2,51,172,164,188,229,213,251,79,241,169,187,107,218,19,98,108,169,215,67,62,242,187,15,6,154,157,97,133,100,79,105,200,73,92,225,147,145,51,140,81,32,123,1,190,123,219,121,123,96,17,133,2,40,117,144,48,94,176,207,13,84,147,98,241,7,84,30,19,192,121,223,227,192,93,206,249,200,6,62,254,35,199,31,225,38,118,73,13,164,248,169,82,56,172,14,5,101,78,174,119,255,98,146,71,128,2,167,140,126,184,82,156,239,59,187,123,236,13,226,175,197,247,39,66,0,219,113,166,41,55,137,76,164,145,120,88,179,59,234,141,124,252,136,238,222,234,183,207,27,13,26,219,153,134,232,38,182,217,141,89,12,226,22,172,214,78,220,135,51,234,140,26,20,190,38,31,181,255,148,128,30,145,95,241,252,201,177,139,223,203,90,157,75,189,224,46,165,46,210,2,249,141,0,253,253,23,81,105,232,59,158,209,176,73,145,74,57,238,203,187,201,5,150,239,108,56,230,103,222,166,165,208,208,157,35,252,214,153,126,234,23,81,179,253,117,139,83,150,176,205,5,237,153,134,244,221,77,29,173,98,199,7,151,90,101,11,212,240,241,74,214,143,98,180,166,118,192,214,169,149,123,253,191,57,80,130,66,150,200,183,209,25,25,80,139,50,12,62,213,121,1,199,172,242,7,18,95,201,145,21,247,40,35,49,142,16,69,54,216,26,196,125,236,196,213,128,29,25,7,98,200,200,20,253,142,6,58,73,237,88,208,79,78,234,135,231,184,208,111,167,195,246,207,33,228,66,18,27,23,207,240,137,121,46,181,170,126,122,13,169,9,49,215,158,224,120,233,52,106,194,24,84,144,132,230,44,187,86,84,127,180,98,139,155,219,217,6,171,90,174,99,116,53,189,27,203,188,131,34,3,204,214,46,23,68,129,164,13,10,204,116,93,123,36,87,238,36,201,162,199,189,163,87,117,232,233,199,189,204,143,35,138,108,76,201,139,129,200,108,52,225,61,176,160,174,82,174,156,74,33,41,129,254,91,41,56,92,57,120,78,167,116,202,210,236,164,88,221,241,83,240,198,92,250,227,251,84,46,105,52,4,38,9,51,25,123,113,237,16,207,195,114,223,28,253,93,72,31,236,101,170,48,239,80,95,36,111,33,91,142,237,203,93,132,47,163,86,140,162,210,150,175,133,82,219,124,81,209,240,251,215,197,200,94,156,169,99,5,101,173,127,184,226,5,70,193,203,219,246,110,239,80,30,51,5,51,195,74,232,57,152,251,136,63,202,47,51,69,27,47,167,45,35,105,205,202,95,15,226,17,246,245,197,236,56,119,157,91,196,168,138,142,203,240,3,248,102,88,25,47,161,152,52,11,138,189,95,249,208,38,120,104,45,147,194,157,133,163,25,90,219,212,90,75,67,163,190,59,188,74,166,135,177,236,89,72,130,58,23,109,131,135,202,66,13,10,197,167,31,64,38,42,215,120,88,79,176,178,5,120,48,59,72,191,151,102,16,191,245,239,142,52,202,50,231,74,68,252,85,146,70,38,104,43,38,253,5,200,252,118,217,241,228,59,90,104,47,31,77,20,255,177,25,71,176,208,215,200,231,107,229,32,13,10,153,85,91,219,62,112,91,83,33,12,92,215,34,141,228,50,40,84,142,0,128,13,96,11,213,30,210,234,163,32,74,218,251,42,34,85,7,189,146,77,235,132,159,246,64,24,172,151,182,170,153,132,63,127,27,90,18,15,142,174,205,164,107,129,0,101,38,45,196,194,202,195,120,81,218,22,64,255,57,27,171,56,107,53,127,37,135,45,87,123,186,225,162,68,219,138,178,74,221,53,92,1,196,247,13,17,87,37,98,33,147,49,120,247,228,167,252,14,56,185,80,119,251,68,235,156,7,174,76,116,233,71,251,148,122,132,154,11,20,80,18,59,129,154,219,197,25,219,73,31,61,138,18,144,238,161,194,69,114,26,60,143,117,128,81,204,26,92,175,6,206,54,97,127,140,247,95,100,255,112,164,45,74,219,44,233,103,129,124,35,26,214,196,165,73,47,97,108,150,88,227,32,50,145,127,89,248,59,153,167,138,97,18,134,120,176,238,171,93,188,238,14,160,235,152,103,204,43,71,102,2,14,243,247,179,133,204,60,94,238,19,62,160,131,224,74,111,254,122,36,6,119,215,241,202,180,254,247,109,125,19,19,132,44,56,107,82,80,154,67,218,119,115,87,190,167,64,132,21,196,170,231,69,238,74,243,132,252,236,241,169,199,84,48,185,73,137,71,174,16,184,6,201,11,127,150,253,164,255,101,253,254,45,25,202,182,61,190,150,51,77,122,206,115,148,43,206,70,194,93,200,74,156,43,196,239,215,163,68,182,130,222,82,126,64,186,48,99,166,91,154,28,27,57,119,129,50,152,59,202,85,19,38,244,244,24,126,41,54,84,33,73,156,16,90,155,18,244,226,222,184,174,117,30,110,95,94,86,157,209,89,164,110,198,155,110,165,149,242,122,148,113,118,119,200,184,222,78,105,80,52,40,134,243,49,236,174,168,42,22,240,65,55,175,57,90,181,195,18,88,130,189,237,241,253,13,10,194,190,102,37,216,40,12,245,140,79,107,147,92,134,8,127,165,6,71,249,40,220,183,252,217,228,154,249,174,50,252,164,81,163,17,6,55,145,157,183,160,108,151,96,74,226,118,250,117,195,234,77,204,209,116,140,95,177,55,92,92,164,195,4,3,152,109,226,66,140,170,187,150,230,98,245,212,182,183,201,70,113,240,178,123,7,226,99,224,171,181,210,0,149,240,200,87,192,195,238,213,74,217,226,43,61,61,156,70,221,36,106,4,208,37,64,82,139,103,54,171,245,98,167,63,1,243,11,204,9,205,93,22,240,101,127,97,233,237,110,195,121,224,124,44,249,173,161,70,196,186,173,11,161,79,69,205,64,108,112,30,253,157,42,212,235,235,56,111,30,13,52,7,82,20,172,163,117,234,167,86,183,189,216,219,165,158,86,25,0,199,0,71,203,36,74,154,155,251,220,17,54,37,137,96,43,164,118,157,168,15,169,248,33,91,104,42,202,54,54,13,10,201,155,26,40,89,192,93,63,186,252,128,192,69,179,11,163,6,55,202,132,63,18,228,163,213,104,26,48,109,195,233,203,242,215,48,181,176,98,218,53,13,10,54,170,157,45,66,148,45,88,76,19,210,236,74,205,60,219,190,240,22,167,255,19,99,169,240,16,117,50,4,220,218,97,238,80,30,44,102,142,150,89,246,183,254,94,12,224,253,109,223,15,120,244,27,44,172,96,117,139,62,64,29,71,102,96,101,181,214,22,93,124,229,14,22,250,71,89,56,178,161,193,20,2,19,143,61,203,220,105,157,163,1,34,136,74,117,218,173,65,183,21,26,54,194,15,73,104,159,236,21,96,164,1,32,130,161,0,228,187,218,176,131,7,28,137,223,94,232,175,239,54,185,141,182,212,239,68,4,13,10,16,204,183,195,181,202,128,63,3,45,32,78,196,124,254,98,83,79,87,0,195,29,109,223,115,255,157,27,32,90,196,111,30,122,81,153,218,231,192,179,66,71,92,219,98,108,92,207,219,196,67,125,18,94,177,247,244,22,26,218,91,116,69,55,104,228,78,107,44,98,179,152,129,12,55,55,111,109,170,30,125,69,56,93,235,125,103,150,109,158,117,213,117,156,131,177,39,30,207,112,4,35,253,191,94,200,162,64,217,108,13,10,154,45,198,102,25,239,111,129,237,169,16,115,161,54,112,1,57,189,32,41,208,42,134,211,73,84,248,128,252,212,154,25,243,235,145,96,210,205,244,123,200,111,102,228,142,110,21,229,46,101,144,32,33,47,120,227,216,65,26,37,242,115,53,166,228,248,18,69,72,51,114,42,14,94,66,108,41,76,77,192,44,153,71,67,98,172,107,156,217,46,156,109,238,58,223,199,241,168,39,63,144,42,38,91,230,58,42,47,200,116,100,205,195,93,27,49,7,3,191,39,81,43,208,18,186,248,100,1,163,4,99,81,95,239,131,198,206,35,224,19,80,233,60,114,97,202,13,10,98,113,49,185,94,93,238,184,248,140,97,243,148,152,24,167,112,180,241,204,58,205,252,35,135,107,5,207,82,28,42,120,176,32,118,57,40,99,220,231,194,179,214,154,109,218,32,225,4,9,160,5,150,67,35,18,2,53,163,94,126,221,178,58,134,122,72,62,196,29,89,137,208,252,172,212,67,36,13,174,130,53,100,242,12,31,48,217,168,81,73,166,44,32,66,248,6,135,24,84,157,225,212,152,112,102,246,171,33,198,82,242,68,134,155,202,4,237,4,167,165,31,33,4,91,15,33,114,235,38,99,187,141,232,90,240,42,220,80,199,96,67,225,199,36,3,130,59,124,60,246,212,53,131,51,193,178,185,8,65,123,184,168,47,156,126,155,194,201,17,116,123,245,28,210,53,44,90,255,53,148,175,232,60,96,81,2,181,183,64,27,180,75,107,56,78,233,73,37,73,87,249,199,114,174,118,210,32,172,111,48,110,40,118,126,165,75,31,190,246,22,120,98,169,135,209,83,174,104,45,153,48,26,231,142,243,191,3,248,29,193,98,42,138,190,87,52,132,187,39,220,214,67,252,122,132,13,10,240,97,227,137,111,242,245,6,227,219,61,103,162,70,179,217,215,100,241,8,74,34,86,192,69,63,233,150,98,91,39,13,10,129,115,240,214,9,253,81,85,61,11,169,201,226,106,49,243,163,207,91,15,88,180,194,80,242,20,223,122,248,18,62,198,106,38,248,8,11,248,107,158,229,114,84,91,232,244,198,25,217,55,143,135,161,233,110,102,217,74,210,38,108,1,42,122,158,125,184,44,113,35,209,61,19,34,236,17,46,40,45,133,193,1,24,148,158,166,231,110,191,243,53,58,170,39,212,7,135,204,192,116,245,252,140,189,227,35,145,208,82,140,183,105,32,146,201,128,124,119,164,130,151,114,106,194,127,42,74,82,245,220,219,170,172,198,97,217,117,92,34,133,240,17,94,99,143,33,121,231,2,205,53,132,47,58,116,71,39,79,197,140,122,116,44,16,147,4,198,74,123,4,234,42,133,219,122,177,186,34,9,217,101,62,107,166,20,191,160,133,25,158,175,1,3,184,119,219,142,168,239,16,247,115,113,32,56,18,31,51,220,53,163,137,205,139,192,187,231,172,72,241,190,78,57,151,154,94,204,147,143,94,136,254,53,113,50,196,115,74,240,157,7,75,241,51,174,143,177,58,122,224,79,4,21,109,104,79,74,35,129,42,72,132,243,1,215,182,33,173,99,63,155,0,149,201,77,50,88,169,164,79,11,203,30,130,155,245,99,23,105,122,75,122,144,178,45,120,249,223,200,251,181,227,229,90,87,151,225,229,168,180,103,246,160,90,94,83,176,248,237,89,105,106,49,249,162,208,5,12,117,42,251,156,151,159,148,103,118,65,56,225,26,184,247,41,217,167,171,103,208,195,206,122,75,232,110,74,103,233,244,83,241,165,38,73,156,130,253,183,174,52,235,231,144,1,174,45,157,193,194,173,225,143,160,144,184,54,29,68,133,104,218,88,228,156,167,152,28,233,134,135,139,94,33,33,75,116,177,222,99,131,80,86,209,5,233,19,66,149,252,52,33,198,220,81,12,172,182,28,207,61,4,188,27,166,207,34,194,104,0,244,30,241,17,193,243,237,253,30,26,226,204,201,204,41,15,201,220,59,184,97,30,219,102,235,187,205,195,47,241,75,182,38,42,232,169,74,98,38,55,235,12,223,61,138,158,178,230,135,81,153,126,150,249,237,128,23,84,64,63,105,31,125,99,201,23,200,38,38,95,186,38,80,171,141,45,218,212,115,15,18,202,15,159,188,112,95,65,146,101,148,173,158,25,20,240,133,239,131,236,91,198,85,132,214,164,211,201,160,106,202,128,121,31,252,31,248,88,59,62,182,81,94,112,183,211,52,84,88,55,45,116,90,181,115,76,244,14,141,48,111,151,194,179,178,55,198,146,94,12,181,189,150,198,45,148,20,244,3,73,146,191,22,48,199,121,61,14,162,133,122,172,100,40,195,106,247,34,229,141,172,106,85,110,158,39,11,117,99,211,230,159,188,204,139,230,157,138,77,175,44,107,11,255,24,139,122,211,110,0,72,13,68,220,167,75,250,29,28,2,159,83,52,79,242,59,245,176,16,19,27,189,145,56,245,64,215,187,65,211,223,142,124,197,184,4,236,91,44,165,33,98,167,230,200,73,115,102,216,171,190,126,49,190,239,179,24,157,180,67,137,50,198,112,255,100,99,144,20,76,47,69,181,251,188,14,249,129,199,111,50,39,97,154,216,198,135,14,126,60,120,11,132,168,184,209,68,97,232,106,140,182,248,175,128,7,179,242,122,89,70,69,109,251,229,69,183,46,52,79,189,218,241,205,88,120,9,54,218,248,244,214,122,100,39,118,36,77,217,45,5,207,145,73,119,149,150,57,204,78,195,75,164,185,183,199,193,151,115,196,252,24,145,114,179,140,59,108,24,58,107,170,157,235,138,34,38,213,154,127,61,96,22,51,107,27,7,168,2,78,252,113,155,247,49,104,197,169,41,255,145,143,198,8,67,209,117,29,29,240,136,107,13,124,41,165,126,59,162,215,88,173,175,44,238,212,201,51,72,90,99,144,236,219,57,25,72,22,79,5,15,245,68,133,211,169,127,130,81,98,66,240,51,74,93,29,42,38,233,152,27,3,50,215,211,197,60,155,29,1,62,175,168,101,46,37,47,232,70,19,78,62,7,21,236,227,120,120,11,6,102,110,115,140,78,177,128,62,60,30,244,45,147,223,69,16,13,7,119,32,155,75,6,71,186,213,187,95,141,13,10,227,166,244,98,245,105,23,176,187,226,244,155,179,156,243,153,77,104,180,195,227,123,93,136,18,115,116,52,197,181,218,202,86,13,179,209,176,193,253,134,12,118,11,58,17,131,213,89,65,206,192,249,151,184,214,150,148,17,93,174,214,92,27,56,124,142,107,101,192,153,97,57,193,167,20,6,15,100,57,233,204,166,18,84,250,116,86,250,227,41,167,177,103,75,165,133,48,135,98,214,158,222,161,73,47,45,45,232,71,50,214,241,236,1,223,41,244,66,0,96,174,128,164,235,11,222,97,197,55,2,64,160,117,42,45,218,105,100,204,169,0,238,248,116,129,194,92,97,16,68,242,227,18,199,115,111,56,64,58,34,20,219,187,119,198,158,136,2,136,74,82,173,18,165,28,117,122,176,224,210,154,73,170,130,56,134,202,238,228,61,169,139,180,131,254,194,90,252,38,70,212,57,97,44,208,2,186,122,85,51,171,53,232,135,206,161,222,151,233,96,172,146,83,53,243,91,145,130,69,77,109,111,11,32,81,49,25,49,145,201,143,89,48,95,45,177,166,189,119,172,231,157,11,179,49,253,171,21,188,30,75,96,26,155,192,81,163,12,155,194,9,35,87,212,46,58,83,174,122,217,244,89,197,64,130,85,35,18,129,108,151,172,55,244,177,230,94,198,234,169,255,194,40,16,209,159,56,96,22,137,183,59,215,81,22,150,111,139,197,253,136,82,23,134,129,245,60,179,229,39,148,55,105,35,44,119,122,98,196,223,16,235,215,109,115,108,127,73,192,28,8,181,106,41,228,44,152,177,224,251,110,38,228,109,204,227,221,250,219,169,254,4,70,174,106,254,203,46,160,236,109,247,32,44,2,136,60,94,73,182,163,122,214,202,55,163,189,126,204,26,207,99,21,197,234,176,172,237,131,47,229,232,129,46,218,228,186,40,234,190,171,148,186,178,99,250,38,128,165,161,231,254,164,1,50,15,13,63,15,90,46,115,189,11,255,191,152,77,139,202,45,121,196,111,46,63,0,132,195,221,178,174,117,60,205,78,82,214,120,73,46,240,99,61,115,192,113,206,17,29,180,239,82,94,211,130,15,70,100,130,35,146,184,4,51,42,128,72,139,223,204,91,43,188,117,97,226,81,14,77,4,71,59,38,253,141,124,85,44,95,181,172,255,16,238,131,245,13,177,33,176,228,83,189,123,234,206,90,182,188,67,242,183,207,173,177,171,99,255,114,138,182,210,13,10,42,254,253,25,107,224,211,67,152,202,118,248,195,140,168,70,142,97,103,139,78,228,21,70,171,158,245,20,177,196,145,170,104,121,48,81,75,155,131,97,160,71,226,145,230,136,28,225,11,104,138,23,208,9,83,115,44,104,20,229,53,201,24,158,65,103,110,94,25,171,47,179,13,10,230,87,153,72,67,187,25,125,141,80,125,101,138,226,137,53,104,216,63,196,229,130,110,190,234,27,80,209,103,240,127,126,157,165,86,90,14,21,187,113,238,139,95,229,253,103,5,204,51,105,245,165,150,126,65,122,53,34,16,208,162,177,23,242,108,83,105,169,73,245,131,189,155,95,157,23,236,15,127,91,154,66,246,142,19,104,93,251,1,215,218,250,92,176,26,196,108,129,199,0,179,216,121,199,36,76,109,221,63,146,117,141,44,90,67,46,13,157,82,22,184,158,92,79,67,59,155,114,96,78,201,207,231,166,43,93,11,249,37,236,222,251,246,155,196,249,11,68,242,123,247,172,103,104,42,139,154,99,39,129,130,22,88,169,143,41,45,56,27,72,137,168,111,182,120,111,98,247,66,105,26,186,42,207,233,237,184,128,166,87,126,180,60,28,129,100,186,153,242,173,82,90,198,205,57,111,25,253,222,9,87,207,236,215,0,208,32,56,176,129,183,93,106,32,198,6,88,214,30,78,193,191,254,208,117,49,57,11,97,110,109,171,35,223,109,49,0,148,40,239,196,69,127,28,47,13,10,139,32,96,157,9,96,150,52,240,103,81,28,178,73,143,94,223,110,12,19,170,255,117,183,3,236,245,91,191,137,226,201,118,167,116,49,186,105,93,5,171,128,67,37,204,36,51,157,143,149,36,227,112,181,182,48,3,20,5,96,251,69,242,50,137,228,34,177,148,231,26,117,33,167,141,29,201,193,97,167,76,60,140,237,165,178,73,75,116,212,95,112,45,241,152,244,237,43,218,203,251,205,173,246,174,57,136,84,252,202,70,12,199,29,77,9,237,21,191,203,29,197,83,21,136,168,132,214,173,154,113,244,206,95,90,4,167,116,184,80,53,126,19,115,0,7,52,120,57,68,88,83,148,212,232,112,181,122,54,29,214,63,3,43,83,237,44,46,149,57,140,11,233,43,216,248,92,23,227,114,221,165,241,24,61,192,29,49,133,217,121,96,253,14,25,113,166,4,15,225,207,152,193,219,35,68,154,83,43,170,69,242,219,89,94,31,133,48,82,151,4,8,118,251,90,188,54,96,199,56,113,226,253,225,91,202,244,52,228,169,186,95,56,24,161,186,73,100,190,18,245,119,117,72,22,184,223,230,41,118,25,142,251,61,41,244,61,87,247,7,24,73,143,79,172,250,13,10,180,245,14,104,163,179,200,187,115,29,176,82,219,147,64,147,210,148,235,19,86,164,216,251,206,13,175,114,4,2,63,216,246,103,92,79,100,206,254,138,132,140,144,39,176,197,18,78,48,59,231,208,178,220,126,221,87,223,23,86,232,196,63,225,175,21,157,171,20,188,3,179,17,153,151,45,120,190,113,209,110,140,215,161,131,66,159,165,40,203,204,177,223,18,84,90,34,37,215,135,224,146,148,184,70,73,172,200,182,93,85,122,65,127,179,8,142,1,30,250,179,31,119,120,131,50,244,183,89,183,63,175,222,185,152,79,202,13,238,200,121,116,201,80,156,75,13,210,33,248,137,205,85,145,241,27,204,35,107,239,129,57,148,196,43,101,125,140,172,102,49,27,135,183,140,82,238,242,133,33,108,250,99,215,31,247,46,164,89,47,59,196,43,204,79,161,122,124,3,196,113,227,101,29,23,251,211,161,139,252,5,183,215,248,218,46,187,160,192,53,20,39,65,215,246,29,86,173,121,192,84,114,39,222,159,249,97,71,247,242,161,105,212,131,232,112,88,50,178,163,65,43,155,217,166,255,127,131,152,65,65,84,226,15,22,126,242,92,96,66,153,43,61,91,66,218,97,237,132,78,195,153,187,142,91,38,129,60,194,125,149,93,235,123,69,28,208,224,137,36,173,153,33,229,27,2,128,236,224,115,227,22,43,225,185,185,235,244,187,155,174,20,60,152,30,16,21,154,234,61,163,157,7,206,237,136,133,82,101,25,158,200,84,119,167,254,240,214,76,153,211,154,247,159,151,237,30,137,168,209,99,237,215,168,87,103,106,226,252,178,40,11,0,163,47,164,59,14,55,166,194,124,238,12,25,232,129,168,126,58,102,233,171,84,184,228,126,7,196,175,156,13,10,234,174,61,154,202,235,147,162,36,167,33,242,114,113,92,144,242,78,106,84,12,33,26,7,201,24,211,126,167,223,133,65,72,13,138,82,35,115,185,48,204,213,140,13,10,219,250,34,60,246,225,112,118,84,103,213,100,243,104,71,130,159,27,116,88,135,53,184,51,195,197,227,228,144,147,67,94,236,119,189,57,130,179,68,225,70,129,90,116,219,52,178,145,27,206,253,135,241,12,147,189,110,240,188,123,131,83,4,71,54,47,3,101,116,212,197,6,184,231,143,61,172,140,101,239,182,86,20,60,213,188,115,113,244,13,10,163,24,150,198,222,187,227,223,157,134,153,102,194,133,108,222,37,130,234,146,245,255,35,96,13,123,175,160,217,250,89,63,231,198,245,205,115,97,68,224,36,157,198,147,46,225,230,0,7,176,28,185,34,87,27,142,94,220,248,52,113,176,173,192,87,153,142,111,140,206,163,85,114,13,10,133,61,65,166,171,172,227,73,138,196,151,181,228,140,88,163,18,239,33,5,200,212,169,238,89,161,47,107,6,184,34,57,48,48,26,213,57,22,64,80,6,252,37,79,124,54,105,112,64,162,198,231,9,14,224,57,68,202,6,231,219,41,148,181,119,223,230,83,179,198,93,195,173,199,189,184,226,131,2,57,243,54,53,105,176,107,114,203,110,92,8,16,102,86,180,149,215,232,59,30,166,109,154,207,32,233,42,114,236,240,156,220,166,143,130,41,211,50,159,20,42,24,25,215,160,71,46,139,23,181,222,27,141,90,65,50,38,174,190,210,87,13,115,197,43,30,71,54,78,36,80,141,114,207,44,75,8,13,167,178,193,101,51,221,199,33,251,14,124,212,8,65,79,147,216,221,20,188,114,138,126,179,142,201,145,179,208,247,128,118,235,92,145,231,120,210,15,56,249,189,119,105,73,129,23,85,110,252,250,9,240,215,233,214,182,90,106,252,180,99,117,242,210,207,151,13,10,235,103,162,179,76,24,122,179,12,225,83,145,74,249,133,97,87,59,47,76,95,6,49,155,55,45,68,125,170,28,147,92,106,170,182,149,26,57,115,183,124,170,14,49,135,115,150,78,251,0,196,156,22,54,167,112,32,117,155,108,91,69,7,126,77,189,184,207,180,180,203,184,118,227,2,45,131,74,101,211,12,20,6,205,202,20,176,246,168,111,210,97,155,159,75,78,79,194,47,9,147,16,252,183,182,21,159,135,99,192,107,26,228,152,204,90,113,162,135,34,98,196,31,230,140,13,10,151,144,161,226,186,171,34,24,131,83,121,149,221,59,94,23,97,113,32,178,87,156,51,247,58,62,47,220,111,67,91,233,182,135,189,72,110,254,214,222,91,157,84,217,203,95,244,197,15,90,40,52,186,157,140,182,242,109,153,214,110,177,54,76,203,249,41,66,119,81,228,220,251,32,52,197,26,64,90,53,91,92,56,167,240,197,223,137,141,247,217,61,13,10,209,138,19,215,15,190,102,163,4,239,109,79,59,105,56,92,46,204,208,30,159,90,175,23,177,127,95,166,64,235,230,229,115,113,110,149,173,122,226,29,248,18,238,36,198,85,179,230,197,214,67,61,141,70,105,29,236,122,17,40,200,52,14,246,2,246,196,165,96,68,203,14,54,113,213,250,246,205,230,150,83,72,150,247,169,118,195,45,147,37,74,171,159,175,17,36,182,11,169,36,220,167,90,47,219,231,217,116,72,117,22,252,203,13,10,141,29,254,163,130,123,103,85,220,185,37,76,127,96,109,234,37,128,64,199,217,73,237,238,204,58,198,98,136,207,188,253,27,83,140,221,138,122,121,3,154,33,107,244,21,63,132,226,158,25,105,220,239,53,253,80,153,182,128,220,31,233,90,20,149,229,247,81,138,148,191,145,222,133,208,237,219,73,232,119,47,240,230,126,225,148,59,0,249,84,128,40,153,239,60,162,83,29,174,17,82,42,9,249,208,48,194,211,176,201,213,202,24,23,98,112,182,153,42,183,97,86,11,147,226,66,63,35,56,135,247,34,131,117,13,235,217,188,204,233,208,221,89,6,0,137,152,139,102,89,139,150,135,118,192,221,76,165,31,251,197,222,36,41,236,9,62,122,247,238,147,14,162,230,112,38,118,154,79,3,13,75,49,59,73,58,141,161,142,174,188,134,158,46,180,52,219,247,44,203,143,244,69,173,148,1,111,20,129,53,168,131,191,24,223,2,81,129,147,164,75,179,67,86,229,159,155,184,142,17,1,132,71,67,11,88,24,153,55,199,112,214,71,156,123,66,95,253,199,238,181,253,115,196,15,17,93,145,13,205,20,20,101,62,60,230,60,95,28,23,113,218,63,66,99,77,114,222,245,84,149,123,105,171,125,198,31,233,132,170,222,54,81,119,196,190,105,126,219,90,131,92,113,20,177,19,216,0,30,199,105,26,140,192,242,156,96,46,215,71,202,89,48,40,186,250,82,33,157,197,14,111,160,121,83,15,239,159,222,72,217,82,180,3,178,243,57,89,46,110,168,229,155,106,230,17,236,165,30,156,119,144,0,229,200,180,124,99,43,198,177,161,7,23,180,146,16,38,49,42,191,242,187,158,201,199,33,127,237,93,213,193,164,148,118,198,156,174,80,221,190,160,94,194,185,40,248,212,217,82,232,165,112,169,199,227,69,252,134,217,76,168,179,147,50,178,47,44,67,195,21,214,204,18,214,193,8,143,172,246,217,112,96,97,150,4,31,91,54,26,69,174,0,50,66,91,239,44,181,174,103,78,230,178,177,189,95,38,161,231,39,252,191,23,22,188,131,16,132,160,41,123,205,144,41,226,149,201,190,235,169,32,73,85,39,75,243,14,73,171,112,202,192,133,192,118,193,158,208,116,65,82,80,41,166,37,244,87,144,29,101,56,67,160,93,206,35,233,68,57,106,29,21,73,26,249,217,112,167,182,172,247,154,11,152,77,17,148,16,155,181,82,23,78,240,250,41,222,194,169,196,111,86,235,189,233,102,13,10,233,242,227,229,128,205,248,233,185,234,207,60,48,230,150,189,211,20,228,98,252,92,159,121,158,53,194,255,228,90,7,19,105,14,66,7,207,223,112,140,176,164,101,208,69,231,89,110,251,22,65,57,203,108,231,212,92,107,131,33,36,216,149,72,140,35,214,52,195,5,195,163,225,238,80,92,168,164,180,58,142,167,108,204,174,184,151,209,96,241,38,215,178,11,146,73,223,214,98,143,13,10,131,239,169,34,13,20,114,246,64,75,26,166,3,54,219,166,27,136,135,214,105,146,9,88,110,37,89,144,8,179,107,207,21,31,43,210,253,170,246,117,219,93,122,198,245,31,155,128,220,39,37,123,192,122,105,191,184,105,150,83,177,146,17,188,22,254,171,194,211,72,237,136,136,39,220,47,231,224,49,233,20,77,78,96,231,46,145,216,6,45,18,190,115,144,250,109,150,166,86,215,250,199,108,178,66,164,52,201,190,204,41,171,46,169,144,249,252,4,198,240,11,221,17,219,192,16,227,214,60,70,189,7,154,185,161,181,202,238,228,0,156,187,142,240,35,4,67,175,59,197,65,251,187,84,111,232,185,201,127,239,190,154,229,31,128,23,172,161,241,36,29,59,93,202,125,55,182,91,47,82,112,25,159,52,171,214,137,79,191,150,207,172,253,197,196,134,1,53,75,239,183,134,172,216,84,49,96,193,18,121,237,19,157,101,56,32,251,62,234,153,47,248,171,115,94,101,218,249,217,137,26,95,92,76,202,63,88,175,31,102,214,9,56,132,4,103,223,204,122,77,48,200,240,252,94,144,41,4,188,65,75,240,107,81,33,146,132,237,69,24,92,154,83,87,42,217,217,209,166,226,249,83,188,18,245,89,193,41,130,135,3,86,109,7,75,208,118,3,235,3,172,182,52,90,26,12,42,222,239,150,229,83,5,40,100,42,29,147,158,92,186,98,205,34,33,214,238,40,209,80,131,228,173,249,73,43,143,199,197,235,238,182,237,42,94,40,240,253,2,138,59,84,53,245,96,225,219,239,175,68,243,218,25,247,115,97,33,222,221,94,156,74,21,235,231,55,5,28,85,98,90,209,105,203,66,26,17,254,138,176,128,224,160,212,74,158,101,140,143,214,55,209,97,102,216,113,105,75,86,175,89,40,183,210,108,195,96,35,56,199,79,241,59,107,224,45,252,24,187,219,111,217,109,195,143,219,189,130,159,218,114,101,232,172,240,6,174,32,199,3,11,142,82,250,163,81,103,164,199,192,199,144,143,225,145,22,242,86,20,160,52,144,255,2,90,114,145,218,113,54,146,23,154,181,54,143,244,20,129,214,40,80,0,197,215,34,17,225,60,245,186,40,110,36,236,189,80,132,55,218,218,160,115,237,143,109,111,66,241,45,104,150,177,200,217,57,107,36,112,82,42,138,185,192,102,225,82,124,189,147,133,26,95,21,198,156,242,107,168,226,7,14,19,166,175,211,100,204,204,16,86,129,27,228,241,122,59,91,205,255,30,11,215,96,251,66,77,222,103,97,215,215,34,219,130,254,52,31,26,219,162,78,74,174,144,159,175,192,36,150,105,219,14,106,68,153,164,59,16,180,158,9,26,2,199,248,209,199,61,147,135,107,143,198,15,87,88,28,166,137,104,111,63,38,59,192,2,200,54,119,101,162,135,179,22,240,105,73,208,141,37,17,90,2,131,194,115,18,229,20,139,199,25,83,186,169,77,27,218,132,31,243,192,180,226,153,48,176,89,107,132,109,113,226,45,124,50,221,106,37,175,238,118,232,203,61,80,77,45,37,81,46,242,207,161,125,2,59,228,234,142,167,229,186,197,159,167,59,72,13,166,8,125,78,195,43,32,135,234,204,12,164,78,140,29,58,191,76,16,193,131,36,95,27,115,60,23,109,127,186,11,121,23,200,68,69,77,148,61,202,187,165,110,242,134,3,195,127,98,237,45,108,52,245,200,105,109,127,16,199,96,153,197,84,125,192,207,165,128,111,248,200,102,158,178,222,132,183,8,206,144,149,69,160,7,47,213,218,53,150,62,159,33,148,193,180,134,66,242,243,149,9,18,69,33,193,12,19,221,11,252,13,145,85,75,105,250,19,249,239,122,128,250,157,78,171,163,187,8,84,108,53,119,232,122,222,147,212,227,251,180,139,235,231,168,230,104,192,181,76,106,231,113,119,62,134,135,92,164,252,198,71,93,55,120,48,184,35,74,138,85,212,68,17,210,59,95,33,40,57,81,144,30,182,198,244,119,117,203,213,158,126,189,114,52,216,228,89,109,218,197,184,54,55,231,54,46,47,131,228,160,122,223,235,140,223,167,7,108,234,192,106,42,219,114,231,203,146,170,199,38,188,168,245,55,218,126,119,24,14,63,199,30,252,186,192,53,39,30,51,125,200,214,36,128,213,97,234,171,87,144,112,190,143,215,99,179,129,68,198,13,81,242,86,104,183,136,98,81,85,242,156,166,214,171,227,6,79,116,222,118,182,29,173,178,11,172,230,225,190,49,91,96,170,201,51,34,107,204,229,50,36,188,80,14,64,187,119,210,127,136,213,107,209,84,243,107,77,169,71,23,41,140,141,226,114,238,20,6,104,235,11,216,33,248,185,149,130,99,91,195,22,33,194,197,220,20,144,47,58,242,137,1,102,75,205,46,17,159,223,231,0,66,59,166,39,137,138,78,84,226,7,30,191,166,188,244,34,201,164,164,107,203,66,120,134,112,72,157,165,196,137,182,17,178,40,147,238,17,66,156,223,72,170,139,99,155,79,245,104,125,212,53,224,238,20,233,87,55,48,219,231,5,248,109,68,250,101,15,97,242,211,43,173,166,93,191,12,0,235,169,222,243,198,63,161,215,135,105,9,202,90,94,252,37,2,232,141,159,148,41,100,21,175,114,20,135,133,170,58,191,90,32,168,19,223,47,112,243,91,220,238,218,235,81,77,68,16,80,218,11,120,55,255,55,104,117,99,21,135,197,213,223,157,229,162,54,51,137,170,180,226,217,191,79,39,225,106,254,74,195,31,88,53,235,70,155,72,87,81,151,46,13,10,148,112,3,39,188,170,67,65,29,74,198,5,212,66,201,239,114,179,168,234,8,73,86,12,129,90,23,195,240,15,207,140,106,99,191,56,23,167,99,242,12,97,89,209,85,243,38,123,86,49,17,228,203,112,56,75,90,187,101,133,40,13,10,174,126,239,198,92,125,40,189,202,45,50,79,94,5,158,77,205,224,236,59,186,155,118,7,245,144,120,203,182,88,81,38,245,48,43,8,114,173,85,119,60,124,175,99,105,26,32,157,151,78,113,71,95,215,0,199,105,13,11,12,164,72,100,32,164,192,162,228,32,99,225,57,127,42,137,217,163,106,252,29,44,11,25,96,178,134,201,126,21,137,79,169,97,5,157,84,244,182,220,4,79,34,112,104,102,103,152,151,40,38,244,135,143,98,185,91,135,96,70,41,129,25,179,226,204,154,77,76,231,63,80,239,208,36,145,122,240,122,201,238,137,2,72,153,188,46,61,16,69,242,181,91,13,10,16,90,178,169,26,111,232,108,153,209,115,53,57,193,240,58,173,21,211,135,218,117,25,64,250,240,26,112,249,71,236,100,231,73,4,16,67,125,255,204,200,214,120,77,139,205,118,148,228,181,14,164,214,229,242,214,239,219,38,68,185,158,126,84,44,187,110,80,148,73,16,123,16,193,149,54,20,14,94,128,165,148,233,9,74,139,79,200,123,86,144,6,87,240,24,255,34,119,124,31,109,144,206,22,23,163,24,15,123,56,144,238,83,228,29,41,240,76,239,104,89,157,157,22,22,206,240,205,30,28,88,118,55,170,190,151,129,56,105,150,136,18,161,225,178,187,188,158,241,202,176,35,242,246,250,176,238,105,63,56,84,150,67,167,97,74,189,51,130,186,171,206,32,164,228,183,147,88,95,244,207,103,13,10,237,142,246,50,245,140,159,201,23,19,169,142,228,162,116,63,122,53,199,76,133,1,75,60,55,96,99,34,251,255,241,74,114,243,182,216,193,13,10,9,228,235,148,161,47,82,13,199,2,0,36,203,128,25,92,158,40,49,211,77,28,38,197,252,78,164,71,102,107,130,232,78,198,69,4,77,63,35,51,149,71,190,188,171,8,50,239,7,62,53,151,131,179,82,84,173,208,160,13,225,75,119,0,202,68,74,125,113,83,239,165,101,8,41,112,165,201,246,36,97,241,227,66,45,120,50,99,4,215,105,120,185,33,170,241,72,203,168,177,72,209,231,3,211,74,245,186,165,221,46,23,99,76,136,37,140,131,14,208,216,123,132,140,98,221,119,56,25,12,73,87,9,166,91,173,42,205,114,205,233,55,85,96,168,162,94,220,82,41,33,84,20,172,19,250,91,30,194,227,135,165,223,13,10,37,3,221,147,210,110,24,226,25,160,18,181,85,226,69,32,218,124,136,186,180,12,123,35,83,15,76,226,252,209,235,1,59,31,253,151,143,228,52,155,231,125,152,117,166,225,45,150,36,148,188,171,88,170,165,109,15,248,42,168,39,173,182,76,92,255,232,105,94,52,215,47,136,162,191,110,139,131,177,54,180,255,240,37,107,161,14,142,65,102,55,91,208,225,139,183,39,110,145,158,156,192,114,28,51,180,26,159,252,113,24,220,102,242,6,250,145,237,48,159,173,245,205,149,110,233,24,26,238,53,184,174,146,23,141,121,249,143,199,28,197,46,112,227,17,135,33,70,98,162,252,245,0,119,46,0,168,221,131,34,108,37,195,38,67,67,171,151,217,168,136,204,128,180,47,204,20,195,4,86,192,170,243,39,125,222,240,51,230,181,97,20,249,241,32,128,120,65,83,246,247,47,128,241,215,153,130,171,104,8,9,251,89,106,240,12,15,92,125,99,136,248,91,147,60,221,16,235,140,146,217,115,132,245,159,55,188,236,140,134,158,214,62,2,192,2,79,162,171,224,70,163,174,151,85,126,128,84,177,201,59,76,44,227,75,251,227,194,46,0,43,155,14,50,163,252,228,66,81,155,79,67,202,194,76,35,175,163,144,33,202,238,210,162,60,182,108,211,14,201,203,77,152,200,145,185,167,242,138,30,220,82,71,246,121,38,195,5,62,176,53,74,125,91,49,93,159,175,219,79,32,71,108,160,166,243,35,145,176,122,232,90,163,237,162,175,190,57,136,96,37,87,170,138,182,73,200,147,81,145,114,218,23,106,204,192,166,240,240,52,113,97,167,130,117,129,117,12,185,151,155,230,128,180,179,16,213,214,54,1,224,224,93,74,176,191,245,167,136,177,190,138,66,70,169,142,216,42,26,11,21,27,29,167,35,207,221,248,118,208,205,29,47,186,160,194,19,214,33,106,251,45,23,168,159,43,152,98,161,36,69,54,231,145,70,85,99,85,83,237,233,204,210,125,232,206,168,97,77,81,133,208,45,234,3,216,144,255,55,151,65,71,106,88,131,7,196,15,134,25,141,132,58,20,219,200,67,140,252,117,151,251,113,151,131,241,188,198,113,25,197,221,198,127,108,32,55,228,215,71,190,193,112,148,33,240,201,218,20,4,234,139,141,33,199,161,221,232,188,237,250,101,252,174,241,186,112,186,23,23,251,44,149,196,100,25,79,116,142,247,170,83,73,139,236,49,127,57,42,135,26,165,151,33,155,118,133,254,36,96,165,223,175,184,232,76,116,100,221,90,239,9,106,131,214,105,201,67,5,157,199,56,247,247,133,67,126,212,249,46,16,15,174,175,62,164,234,188,25,156,14,44,101,19,156,56,174,156,100,53,199,211,224,237,81,192,160,63,201,58,26,58,246,199,206,191,20,27,79,169,231,216,65,195,218,110,41,114,209,148,115,216,56,131,45,40,87,254,47,8,242,139,141,71,18,190,72,66,249,103,187,113,162,165,169,101,232,120,17,114,96,92,182,13,10,209,41,29,192,171,145,219,73,222,226,151,209,217,208,5,173,157,247,108,126,156,75,195,80,181,170,45,174,13,233,127,188,73,148,172,162,108,226,209,177,217,167,151,171,20,233,197,142,115,193,75,156,30,61,107,243,9,61,157,67,90,63,247,74,90,233,210,158,192,169,131,119,186,116,59,250,244,155,141,104,67,55,87,241,201,60,181,123,74,118,87,136,186,253,249,45,89,15,87,83,164,131,3,180,133,76,91,190,29,54,139,135,63,248,21,249,112,54,155,118,220,193,74,227,8,169,222,142,6,87,156,246,101,254,64,116,226,242,16,124,13,26,161,180,110,184,159,241,228,19,129,237,186,147,158,66,249,61,185,117,8,237,155,240,27,78,15,136,238,185,201,84,166,182,48,45,30,44,175,227,112,155,51,124,1,39,8,241,147,82,92,32,99,93,186,125,41,105,86,20,67,170,53,87,42,187,93,122,36,218,177,111,19,217,208,148,84,197,54,172,48,41,158,210,171,151,146,78,52,187,91,148,95,210,88,243,38,166,189,63,112,178,128,231,91,56,215,73,79,17,246,62,253,79,124,61,169,139,37,184,217,211,85,190,44,101,123,147,236,193,92,204,130,132,156,92,234,150,244,27,36,113,172,8,91,20,67,69,184,143,75,224,239,182,23,243,78,137,188,146,39,27,201,102,12,58,24,37,63,192,110,235,209,227,173,31,23,109,236,48,61,187,93,228,105,183,6,147,58,23,251,240,191,25,106,84,187,113,107,149,35,92,146,133,67,110,88,104,231,86,120,39,186,112,119,70,227,23,91,182,34,185,62,58,191,184,97,233,116,68,3,86,198,236,94,176,206,32,139,123,158,197,146,240,31,151,105,41,173,108,97,112,158,246,168,137,153,143,254,177,84,108,210,201,190,204,13,10,74,208,69,161,87,141,44,70,137,67,174,4,93,216,212,140,90,223,176,146,151,175,88,210,37,89,191,166,236,26,74,221,212,91,224,234,44,179,85,165,31,9,28,243,160,28,237,127,4,52,153,189,128,21,16,112,178,20,131,206,112,110,252,90,178,41,85,84,250,236,255,56,53,101,220,178,165,150,182,96,241,197,34,207,109,55,231,20,76,82,76,247,200,73,252,28,35,218,106,93,181,28,146,217,200,65,199,133,26,148,239,124,140,104,141,252,187,3,6,114,45,98,8,81,15,195,29,216,16,176,213,51,76,245,139,37,73,0,205,117,53,49,125,90,51,209,150,247,196,27,154,108,43,216,87,177,246,135,134,77,166,87,127,7,44,160,153,152,11,43,28,180,238,82,106,46,174,36,102,198,64,203,73,12,39,176,189,180,69,3,165,217,181,233,239,246,147,23,210,62,236,71,189,2,37,123,96,168,67,170,106,29,48,53,211,186,96,73,163,185,168,40,90,44,68,220,54,194,54,39,47,18,237,115,75,3,68,237,62,89,231,105,12,249,237,175,208,211,224,82,6,48,144,94,91,137,70,69,222,175,114,41,165,78,72,107,89,134,208,169,110,246,214,156,20,59,27,119,228,31,139,46,49,236,242,53,89,53,4,15,172,182,6,163,141,20,110,107,107,76,154,219,96,88,65,179,242,172,112,94,207,239,198,43,18,209,34,21,140,114,60,105,52,187,68,226,7,134,85,218,245,123,249,188,249,82,142,211,162,135,176,195,101,82,64,67,20,48,71,240,163,29,5,97,233,120,225,250,56,151,180,90,97,8,123,222,161,193,239,150,93,211,26,42,248,17,98,97,156,248,47,81,155,225,50,84,53,42,76,236,13,10,191,48,253,146,11,46,33,136,208,212,12,59,237,107,22,44,193,60,116,185,14,42,235,68,179,37,5,88,16,143,62,92,166,0,193,55,73,246,58,240,150,169,211,15,242,143,186,203,208,102,9,138,240,22,78,140,224,49,89,90,81,105,215,183,253,200,11,248,196,16,175,85,156,26,198,134,44,134,37,250,140,169,131,241,42,251,17,48,11,146,70,50,161,87,3,69,217,38,161,205,179,182,102,163,130,160,41,213,195,90,168,165,131,131,13,153,109,220,116,169,23,123,151,189,140,206,59,82,99,167,20,140,121,157,194,25,184,161,149,140,174,225,89,142,32,74,229,13,133,135,42,174,9,48,185,101,19,117,80,68,221,88,205,154,141,133,56,204,228,164,207,170,76,202,213,67,5,22,219,143,231,240,60,75,113,44,112,148,48,102,59,87,212,249,173,62,105,22,103,172,18,2,87,210,94,77,17,45,132,178,112,148,158,0,79,24,85,28,149,12,136,116,169,206,235,97,212,110,74,127,46,200,117,201,5,245,221,198,244,89,106,23,72,95,171,221,181,97,209,68,25,65,199,93,119,164,180,207,75,228,196,120,217,98,229,111,165,224,179,14,135,54,29,174,208,202,178,96,131,203,174,185,56,242,3,16,134,234,145,78,237,28,56,210,232,101,24,6,246,21,213,122,156,89,99,29,70,54,178,104,123,64,177,114,153,23,38,122,9,99,137,176,168,1,206,48,229,238,3,54,140,22,245,65,134,158,58,233,204,123,96,9,59,24,102,182,203,113,164,31,8,165,27,36,15,253,152,179,217,165,126,129,185,45,161,106,203,123,14,113,252,132,6,26,45,104,11,7,188,52,135,200,140,102,239,16,2,4,49,215,45,189,54,104,194,133,177,108,220,109,133,53,200,159,222,221,255,120,2,255,187,48,130,84,114,203,112,156,120,107,13,239,63,191,120,251,40,119,99,110,69,210,36,179,133,3,170,95,23,233,238,199,89,79,57,202,193,50,14,226,218,137,230,211,176,49,200,236,251,90,214,84,40,109,92,44,45,142,243,131,11,36,58,181,183,19,180,146,106,85,150,5,214,224,164,103,94,233,203,66,154,14,114,168,198,126,192,154,209,159,43,147,82,174,118,160,232,129,218,193,73,140,186,166,66,209,182,199,80,168,109,55,44,192,232,75,202,134,39,25,145,79,189,139,79,140,103,91,178,180,251,134,215,183,200,141,16,174,70,184,9,26,89,14,126,13,70,251,21,14,177,237,41,149,239,189,192,179,84,60,216,177,217,70,253,231,44,104,104,164,86,214,248,105,136,170,36,209,211,170,168,134,168,7,74,214,146,12,145,46,175,27,30,52,185,47,60,52,11,87,193,157,146,158,154,185,107,33,254,66,150,137,236,48,161,255,231,166,219,174,19,38,237,71,109,3,15,72,173,202,179,227,226,219,200,31,123,182,100,27,99,20,120,168,32,224,150,233,135,245,30,123,146,201,244,168,205,62,15,59,97,128,167,231,233,165,27,7,122,54,212,94,234,200,185,182,235,226,134,252,157,138,21,125,211,57,161,242,171,106,252,66,183,210,22,52,120,32,81,110,7,0,37,84,31,104,146,184,212,2,167,245,61,163,188,132,164,176,160,123,232,176,148,207,226,174,154,254,19,120,81,240,42,45,85,73,221,220,246,35,187,229,7,210,21,33,96,75,224,25,165,31,15,91,53,63,97,53,21,104,150,99,204,64,64,189,165,22,182,96,48,12,109,182,240,189,114,246,39,254,177,94,104,241,176,75,220,64,181,76,76,38,196,6,26,137,251,147,71,19,132,121,179,138,89,145,138,229,98,238,50,217,49,144,42,194,160,181,174,175,107,244,178,176,175,225,181,19,163,90,110,159,162,68,137,93,179,218,120,152,241,30,62,149,49,254,156,187,180,176,230,101,237,196,198,181,103,252,234,40,165,239,20,9,162,72,153,4,83,47,80,201,27,205,111,231,4,44,71,250,32,50,242,83,246,116,152,247,215,110,100,18,93,193,175,7,209,34,174,107,130,120,225,70,139,63,134,6,115,37,177,182,251,100,209,185,75,236,150,16,126,100,246,236,58,99,175,115,79,57,214,77,126,178,196,21,201,254,49,100,115,110,107,179,213,178,210,70,95,75,121,76,160,133,199,98,127,136,45,135,17,164,30,209,72,253,213,55,33,184,16,81,38,254,88,4,35,87,187,73,145,253,243,51,38,223,59,27,36,128,224,142,83,33,93,235,81,54,206,13,10,171,198,64,170,42,103,105,172,55,137,140,0,135,86,174,33,123,89,198,232,251,13,10,220,108,220,249,13,184,4,229,30,132,254,172,145,235,167,75,62,225,190,236,13,10,63,164,79,24,163,3,64,187,198,23,105,246,98,236,240,177,107,28,188,244,5,159,56,254,147,62,234,189,217,39,112,244,222,253,252,216,68,31,127,89,109,29,192,149,249,39,89,93,112,184,157,163,233,117,148,179,58,51,104,159,72,141,124,251,122,108,115,190,196,98,53,104,221,23,207,163,152,69,97,235,40,85,81,175,222,53,56,26,235,14,130,86,189,59,165,141,15,108,211,164,169,200,7,61,65,75,218,91,121,38,40,254,90,12,137,77,51,235,121,118,8,23,194,175,234,3,106,186,21,5,155,203,129,76,242,238,157,169,234,20,51,144,118,79,149,206,35,93,236,73,40,229,96,245,41,181,160,34,97,233,90,4,8,196,244,40,197,241,200,99,122,106,135,143,226,77,42,108,187,34,170,7,141,200,170,176,1,70,175,51,137,190,63,251,93,108,217,6,152,67,143,91,90,247,218,8,153,191,59,123,13,79,160,79,226,99,233,215,40,30,116,174,33,13,138,74,231,178,144,222,23,234,238,54,207,53,137,155,21,117,221,98,115,220,80,157,140,21,6,119,150,130,60,172,130,215,111,51,89,248,2,207,28,105,220,36,255,118,5,69,57,56,166,172,139,188,42,221,242,143,39,201,186,250,42,250,1,171,67,153,122,129,147,51,246,164,150,98,134,231,152,65,127,47,191,188,20,196,56,14,233,101,237,33,58,165,202,100,220,158,97,212,81,209,7,67,176,82,195,159,3,62,205,238,253,38,143,66,189,211,126,227,194,159,138,35,213,244,184,247,223,25,109,53,162,250,251,210,136,229,85,36,114,22,73,67,3,76,116,16,243,74,66,38,103,234,244,82,182,43,218,96,233,192,142,154,114,57,27,18,93,124,74,105,253,42,213,184,11,102,176,72,155,13,10,121,141,98,177,49,254,190,118,65,135,116,212,170,61,188,71,180,190,154,161,216,244,198,35,180,76,254,216,102,48,5,113,77,182,95,31,94,227,131,251,88,144,223,34,32,66,60,136,62,247,110,221,96,197,9,79,202,198,18,192,176,28,78,77,116,12,102,141,18,122,242,116,205,205,26,86,207,79,234,167,168,114,215,201,119,161,68,0,44,125,45,173,241,6,77,120,235,53,231,115,141,153,124,5,83,255,116,219,48,241,148,62,33,230,228,120,23,114,1,52,75,213,217,181,13,114,188,223,1,98,143,119,248,158,229,247,84,153,117,234,114,57,178,86,162,243,236,142,174,2,168,180,210,8,221,89,237,69,8,99,67,235,167,254,238,21,19,208,214,71,13,132,79,195,244,98,90,207,219,2,173,111,28,189,58,55,123,195,180,12,175,26,240,136,113,171,59,92,164,232,56,95,251,49,118,169,12,126,206,210,131,145,2,58,212,197,21,112,229,112,17,162,205,142,9,94,77,176,176,137,153,118,234,36,17,5,204,92,231,63,150,168,205,211,197,16,189,154,185,116,223,238,28,248,141,132,40,154,177,233,5,247,44,209,65,122,184,99,194,97,95,255,232,213,245,83,118,64,4,246,65,91,89,228,13,183,17,16,61,11,221,117,185,184,24,120,172,173,200,171,225,18,34,101,58,244,220,100,197,209,5,181,3,205,133,69,41,213,13,92,180,54,3,57,149,228,6,76,212,220,89,3,129,34,16,70,68,187,86,53,17,225,91,41,211,145,147,45,121,116,16,140,169,11,126,236,42,227,228,113,163,38,76,243,208,233,38,158,165,126,90,14,56,122,174,133,173,12,92,186,253,131,132,67,134,149,61,141,121,31,176,172,243,135,152,27,160,168,145,11,23,100,8,247,100,23,200,159,188,69,178,113,42,197,222,248,99,243,200,107,208,78,63,213,134,56,188,239,131,45,129,22,24,4,140,48,201,223,200,48,115,194,56,155,109,40,41,165,46,146,121,190,152,102,168,214,35,120,208,0,179,8,124,224,156,233,44,191,208,164,96,146,191,4,203,171,254,210,215,72,170,169,250,32,77,68,142,182,206,99,171,127,70,107,216,157,255,80,206,119,157,118,14,36,127,127,24,49,43,228,27,51,110,126,193,84,243,244,252,214,190,225,65,186,176,93,183,113,33,160,3,161,96,127,230,179,42,0,128,188,149,184,104,107,83,37,184,225,170,65,248,22,167,127,22,226,38,110,172,217,181,145,14,36,170,6,221,123,150,144,59,151,223,41,224,151,220,43,220,71,64,101,141,96,242,184,218,205,78,57,8,32,177,79,185,97,38,235,151,145,228,102,75,36,4,206,228,234,20,13,235,197,255,170,95,56,183,111,53,78,73,151,170,66,13,10,128,53,49,69,70,12,201,74,42,92,11,199,114,21,84,242,58,199,218,207,0,139,18,72,193,74,133,39,173,216,54,105,45,60,2,240,136,146,199,158,99,204,32,236,162,155,152,195,87,55,76,255,202,32,118,251,5,51,151,109,124,3,11,142,7,236,75,24,14,36,44,96,179,214,18,192,141,102,68,220,48,127,239,154,170,40,192,129,73,154,60,191,65,155,74,213,160,166,15,104,169,214,19,17,119,25,218,13,10,71,208,66,68,93,195,73,14,154,29,120,21,144,237,218,212,61,212,97,44,164,15,212,113,229,60,65,174,131,55,75,67,241,193,61,182,84,35,251,255,186,9,47,43,122,166,15,46,170,94,179,242,189,58,169,149,193,124,89,217,32,37,236,252,172,43,158,169,209,163,33,70,184,114,152,231,105,158,244,249,23,191,25,34,202,233,80,99,28,112,108,115,25,55,130,223,148,35,85,162,212,81,122,162,114,95,41,166,104,138,129,29,71,30,122,119,84,152,214,20,221,92,184,30,137,165,41,227,102,157,110,235,116,218,105,227,98,77,15,115,50,9,190,190,197,26,182,143,77,67,251,19,154,114,150,247,26,212,247,2,63,35,221,187,85,150,243,84,207,253,202,58,150,252,230,40,182,84,254,192,8,57,154,83,84,4,226,166,4,44,121,71,189,200,12,105,34,64,37,220,221,37,71,112,90,110,249,231,170,19,161,159,236,71,153,166,105,104,161,194,69,88,153,142,2,187,248,53,46,22,162,51,154,168,189,201,165,1,180,102,212,202,157,242,150,61,101,54,22,155,18,107,69,153,127,146,143,83,173,217,229,164,204,24,43,180,116,255,116,144,180,115,201,94,117,245,167,155,220,160,0,232,215,65,108,247,251,163,128,144,241,238,79,95,222,155,204,233,164,13,213,72,153,213,226,2,130,104,190,72,107,68,21,166,113,99,235,255,179,246,115,167,51,186,18,254,128,187,131,61,214,211,210,171,212,74,34,96,52,160,148,36,166,192,30,145,220,215,113,171,164,42,29,142,65,92,149,65,33,21,216,135,57,247,159,25,77,187,195,160,13,206,200,64,192,110,193,153,215,158,5,178,245,97,244,117,253,113,100,119,242,127,129,229,164,64,103,95,81,131,48,124,114,33,206,22,230,95,14,108,187,86,188,102,115,28,34,196,194,50,171,64,52,103,134,156,141,169,25,47,190,27,176,139,71,154,61,116,130,47,222,165,148,46,33,124,178,20,193,217,47,162,156,202,54,106,107,130,144,21,104,15,42,72,18,197,30,206,141,1,212,224,173,216,101,76,153,194,68,166,194,138,176,158,221,130,124,190,247,237,105,237,25,247,160,225,41,114,93,11,91,168,135,226,206,156,212,31,1,250,144,235,146,238,251,65,157,110,102,242,204,145,53,109,95,152,235,153,187,167,160,181,95,235,130,140,36,250,55,208,185,206,118,93,13,10,78,229,143,52,81,7,64,213,211,249,95,85,63,11,30,124,245,72,81,159,148,6,164,64,64,191,131,92,128,172,93,33,51,109,129,191,45,42,42,219,58,147,220,173,80,74,190,122,218,184,54,156,253,211,117,232,220,44,57,69,26,181,139,101,140,47,6,38,203,61,51,79,83,134,31,248,152,19,67,68,244,15,150,130,215,227,30,174,232,223,75,233,186,124,176,30,210,200,51,7,251,132,46,67,183,80,189,91,53,154,138,112,5,67,162,127,217,217,41,104,99,244,98,121,216,214,107,91,61,31,88,85,25,215,26,30,36,124,79,31,253,18,143,98,5,49,238,95,217,71,131,193,145,114,214,127,14,114,104,77,11,64,76,104,123,147,208,246,186,178,67,206,202,196,251,133,239,93,37,160,159,65,196,61,6,218,240,112,30,5,150,99,30,146,165,240,163,28,238,204,114,238,136,56,143,229,54,34,206,130,186,246,218,91,23,95,209,60,21,150,6,132,0,110,53,49,248,202,221,144,114,7,88,180,47,235,144,237,242,89,224,154,86,45,41,76,172,20,221,89,231,192,201,232,193,28,146,59,182,115,249,243,79,101,52,176,109,215,117,57,124,132,70,248,38,74,147,159,60,250,60,170,211,99,17,53,156,38,102,44,221,172,56,135,121,246,130,120,41,160,51,3,69,242,29,107,107,213,49,59,88,149,16,253,94,67,26,219,98,136,32,37,32,105,249,155,86,145,221,101,108,84,141,191,21,223,129,105,225,195,99,46,95,154,185,64,129,36,179,25,154,40,90,47,26,60,234,39,131,0,190,132,204,58,150,190,220,124,96,106,106,9,45,244,46,236,132,148,26,241,241,192,53,237,3,67,76,111,156,170,106,42,18,25,97,84,87,150,101,27,241,249,242,66,218,75,159,114,145,3,241,16,158,100,172,171,108,203,217,97,209,205,31,151,177,142,232,121,229,68,68,44,255,253,208,40,100,176,254,28,236,192,29,195,149,109,58,38,38,42,30,24,38,4,37,151,108,18,200,14,77,13,95,156,227,103,255,122,113,17,216,113,214,151,106,141,48,7,199,107,163,218,61,95,80,182,182,252,40,239,119,157,232,250,78,106,108,49,70,32,85,140,172,70,191,28,75,97,30,177,67,178,183,25,208,189,13,10,107,70,158,199,196,194,146,225,161,217,165,249,163,169,222,228,229,235,157,239,146,131,155,241,191,30,97,201,162,149,150,117,86,27,6,197,231,166,13,241,110,92,82,197,53,61,19,215,248,70,155,118,154,244,197,241,231,187,243,161,25,135,168,103,191,247,232,228,232,40,88,6,155,162,150,24,53,135,126,126,49,133,249,198,158,121,44,200,21,97,32,93,176,209,108,120,31,18,182,150,69,25,100,178,86,90,108,208,122,1,217,208,180,76,217,207,251,252,78,164,71,107,48,111,251,93,6,71,14,124,210,177,81,33,215,15,195,93,91,136,71,86,246,199,15,69,7,216,100,86,108,166,14,116,100,81,167,159,64,65,186,242,66,49,174,113,237,113,96,140,209,50,30,220,31,243,23,162,105,77,204,188,205,211,175,75,13,188,157,89,165,89,19,4,32,183,108,242,168,85,11,134,47,1,163,144,211,176,142,222,57,247,31,246,236,251,67,173,124,235,170,30,138,57,193,179,141,75,177,61,41,166,48,191,134,130,90,224,181,232,185,227,76,129,40,137,88,23,227,78,83,217,47,230,227,241,106,206,125,128,179,215,74,60,34,193,124,56,130,133,149,100,234,134,7,228,199,123,251,48,25,217,29,195,77,36,13,10,140,211,13,83,171,43,240,89,241,231,235,226,169,108,238,167,140,230,125,33,242,213,163,183,39,247,51,199,235,6,170,94,244,87,224,153,201,8,32,88,92,222,47,117,35,122,223,35,169,174,68,201,135,96,227,35,249,36,29,103,92,157,111,196,112,201,85,252,126,211,112,47,41,68,230,66,34,250,61,3,75,123,171,122,171,170,229,84,12,110,221,30,228,116,54,127,187,124,67,253,241,36,239,229,199,253,66,219,197,101,224,86,167,139,49,49,145,250,17,172,83,155,124,61,127,214,212,13,10,242,100,215,96,73,44,15,211,77,176,142,223,17,31,133,48,70,46,233,184,96,80,247,224,21,53,35,183,32,145,122,3,54,27,103,44,175,6,100,0,253,241,192,13,10,226,234,85,205,190,188,53,22,114,217,42,65,184,144,58,93,192,75,59,51,52,189,224,29,130,43,140,17,115,49,232,103,158,149,146,4,33,73,92,60,119,84,65,122,51,63,165,77,153,246,145,253,171,65,125,82,213,79,47,242,148,125,167,198,229,191,86,78,190,74,249,184,153,221,169,205,213,55,144,80,4,165,79,137,73,212,236,180,245,120,132,236,224,112,20,77,125,166,123,243,121,228,59,121,182,252,27,204,97,181,210,138,56,50,122,227,39,223,192,121,247,251,17,42,101,21,189,217,122,176,217,151,57,252,165,192,50,168,239,76,155,150,162,18,160,165,179,48,28,169,183,149,98,111,255,123,218,156,0,36,193,199,54,146,113,138,161,131,209,227,55,99,255,218,207,206,105,155,70,181,187,102,15,70,131,52,234,239,107,165,55,35,209,159,209,112,42,142,133,103,98,159,145,249,70,104,33,112,91,167,197,47,158,103,181,24,85,211,213,187,200,130,194,152,241,2,203,139,177,2,27,216,251,235,152,180,47,184,16,127,88,73,124,0,140,104,92,93,104,200,254,225,39,23,174,125,214,35,29,113,0,62,164,78,12,190,12,64,174,226,181,198,117,219,117,60,185,34,38,56,54,29,251,24,86,121,79,12,56,59,76,82,138,128,232,24,156,177,137,188,73,103,254,107,30,132,53,25,20,234,207,120,178,36,229,141,8,190,231,80,110,108,80,177,35,193,130,81,87,81,31,131,17,139,112,133,254,243,61,49,28,147,225,165,30,118,50,89,252,182,58,228,37,143,73,237,161,237,9,115,54,52,48,5,13,46,69,82,182,85,227,142,230,21,21,68,151,68,68,218,154,4,66,63,233,182,68,160,39,116,124,124,21,2,158,4,21,88,92,59,200,187,145,203,172,51,80,37,30,75,102,66,26,18,118,43,55,199,196,232,202,148,57,144,51,90,102,13,10,94,187,202,92,123,43,70,58,38,3,176,135,59,125,202,121,79,162,154,1,42,125,70,74,137,188,136,139,150,155,113,28,218,171,146,172,73,183,27,105,246,174,190,231,184,128,232,242,28,71,48,122,229,89,198,149,220,175,17,95,187,27,92,163,106,123,169,43,159,48,254,214,107,217,41,145,50,235,232,36,122,83,215,192,113,211,229,49,99,64,16,131,225,228,74,119,237,71,175,123,149,52,226,210,80,131,55,164,226,55,62,107,132,234,52,153,88,32,189,49,207,153,222,71,204,52,62,231,172,93,121,86,134,255,109,57,70,246,167,24,162,180,225,56,142,106,54,97,59,208,11,233,140,1,7,175,86,144,67,79,176,248,214,65,220,88,244,117,163,130,178,79,225,132,185,6,176,1,20,98,216,218,88,117,210,146,132,121,153,156,192,27,202,251,12,21,235,213,175,196,18,203,244,17,209,28,210,243,120,121,161,119,209,235,30,25,81,107,12,135,78,170,165,165,63,180,12,227,55,83,226,233,147,97,135,228,222,81,72,104,114,71,11,21,191,84,198,116,91,67,134,213,104,91,129,15,167,31,166,143,37,8,251,91,162,206,155,41,117,139,109,165,35,184,149,214,124,1,211,28,152,223,77,238,105,41,100,56,231,32,190,56,116,38,199,214,86,210,118,46,90,203,194,169,132,109,46,250,142,73,64,116,161,129,71,115,188,202,175,252,178,12,130,215,247,40,169,205,238,185,196,199,49,231,116,79,148,87,245,181,117,235,139,25,32,210,89,192,9,91,54,92,170,53,73,8,13,10,81,91,180,162,225,237,181,218,8,14,18,178,214,5,65,167,18,95,54,66,55,86,14,202,244,163,182,212,181,82,94,161,20,76,124,29,102,155,219,20,98,85,63,154,1,181,209,224,55,214,18,218,217,5,154,61,127,112,109,141,228,155,35,78,11,172,99,219,246,237,215,138,125,226,0,220,104,254,211,222,185,28,178,117,134,224,70,183,235,28,41,59,192,75,102,140,19,92,23,100,188,190,254,4,156,253,253,72,105,214,36,187,136,69,170,184,170,218,217,177,130,94,131,25,21,198,191,39,150,213,155,125,9,3,32,167,213,64,127,124,58,92,222,226,171,116,141,84,225,24,87,246,65,155,123,1,105,251,209,85,107,254,112,31,82,181,74,43,130,234,1,240,200,161,161,97,180,154,228,203,113,17,171,62,252,144,247,190,53,153,89,77,218,107,199,13,54,69,57,250,111,250,4,45,115,116,220,36,189,134,186,249,190,174,91,17,16,165,164,174,77,238,50,252,102,7,72,82,111,115,38,44,231,41,55,216,60,108,100,189,45,92,225,34,78,84,17,159,82,158,90,30,244,253,29,213,11,220,30,131,76,148,23,215,48,199,221,232,238,213,122,148,17,182,232,140,24,207,118,177,35,13,10,87,36,146,210,18,133,253,30,159,118,65,134,119,248,71,109,116,74,99,102,68,201,221,177,154,221,173,22,68,241,54,124,15,32,222,174,228,146,228,202,45,239,249,71,97,106,24,33,137,104,49,52,66,89,246,140,207,36,90,206,167,112,207,39,231,234,28,118,0,48,21,16,186,64,157,242,139,190,91,67,126,147,221,203,212,125,225,173,13,44,108,186,247,62,219,13,10,52,170,145,178,48,116,95,74,103,145,30,78,128,176,72,100,142,205,138,142,64,185,11,234,235,114,175,32,67,66,47,102,227,165,145,150,42,116,155,149,71,224,149,22,31,119,66,49,133,238,84,78,115,209,84,148,24,209,144,177,197,129,149,31,243,98,1,235,129,116,37,167,115,35,216,4,22,2,73,219,206,137,141,227,149,245,206,255,23,63,36,137,100,13,10,96,229,41,2,171,128,91,147,97,72,164,238,203,103,235,243,155,147,120,188,248,129,162,45,233,96,132,215,24,162,208,68,123,126,85,193,11,142,109,157,170,101,77,150,206,17,19,246,189,208,69,228,13,216,133,52,61,109,239,83,87,241,175,133,133,207,205,30,109,35,217,253,32,88,130,84,154,97,11,121,14,97,128,172,132,46,58,54,218,140,181,229,144,249,16,94,67,216,149,64,113,223,6,143,13,186,172,31,163,150,35,44,89,224,8,216,200,134,155,216,17,114,65,177,7,36,84,86,201,246,247,68,103,40,161,172,33,212,168,56,223,133,150,224,13,10,152,20,173,200,136,2,122,144,84,207,200,97,126,175,29,47,235,102,188,49,208,42,147,173,164,204,88,40,204,214,234,5,85,26,60,49,87,15,248,199,36,204,111,99,151,50,143,183,140,246,16,182,63,209,238,130,59,156,117,240,50,224,24,89,60,202,119,25,117,255,15,231,193,97,101,54,244,91,154,94,41,133,57,227,67,54,252,157,167,178,4,2,177,211,246,40,93,236,245,4,85,0,42,121,184,130,78,43,123,160,6,159,243,155,61,65,240,83,62,169,215,234,215,32,20,101,110,13,10,98,80,97,232,40,35,95,17,45,99,99,42,25,221,128,140,38,145,24,4,219,161,199,81,179,120,249,211,40,232,65,211,148,40,9,228,217,33,5,242,44,244,21,85,107,155,13,93,106,244,62,44,98,29,230,186,52,245,176,64,38,137,97,190,86,237,137,19,16,216,188,231,120,155,228,13,60,159,33,70,251,217,140,109,106,135,206,97,246,80,124,141,180,111,31,244,80,71,109,22,168,20,174,100,83,136,78,27,6,21,238,71,2,205,133,102,179,234,85,203,19,173,114,37,13,161,158,150,107,191,194,61,159,167,61,212,53,126,61,83,249,39,99,35,169,57,8,201,103,178,176,204,179,196,129,90,232,18,61,200,224,40,7,188,6,194,253,67,41,141,42,191,113,90,170,80,112,211,74,148,88,183,197,250,49,55,239,17,228,129,156,197,190,23,205,42,23,97,93,100,198,253,190,198,220,97,245,214,227,129,169,102,240,254,153,236,98,19,85,97,35,5,131,244,5,124,252,202,186,58,101,210,251,48,146,19,194,141,209,209,111,233,142,116,89,52,12,134,218,86,236,131,246,111,89,163,126,173,213,35,37,181,65,225,185,93,145,165,145,23,224,56,210,13,184,47,3,106,173,25,246,204,202,3,35,102,158,101,17,80,180,60,145,96,115,245,60,14,254,233,220,93,200,134,38,36,183,61,91,195,49,53,203,114,143,21,86,106,126,100,248,222,195,237,182,22,241,46,35,242,90,141,175,108,59,9,120,215,165,26,51,188,241,253,158,79,237,11,5,184,238,149,60,55,168,35,140,230,255,67,217,183,224,240,164,164,30,16,100,27,165,242,254,141,14,189,67,251,111,214,252,202,65,149,214,249,179,86,246,183,93,203,184,234,106,32,255,80,229,118,223,166,219,28,205,215,100,116,201,178,59,234,165,208,254,113,99,5,173,109,97,27,45,129,23,84,38,166,93,30,243,94,191,182,22,0,219,24,81,22,175,211,22,167,175,39,202,60,31,170,220,5,28,70,190,70,1,24,117,126,161,89,216,64,101,83,120,166,40,145,62,143,139,158,32,6,75,118,215,47,118,62,140,243,29,14,132,245,129,207,101,216,169,23,239,173,116,239,3,202,14,252,194,96,82,21,52,36,87,69,30,253,203,252,29,166,31,13,10,129,213,139,201,60,127,18,57,151,2,22,31,50,89,250,214,142,152,86,162,235,100,146,91,94,255,204,186,1,201,220,17,53,11,65,202,103,116,0,31,116,135,108,13,10,5,78,97,96,84,191,242,61,115,254,4,235,134,121,179,178,210,251,209,170,209,171,176,224,90,132,99,13,10,173,28,100,191,255,76,185,179,29,138,39,21,39,117,235,210,211,72,98,200,79,44,142,62,17,164,21,97,31,146,145,8,117,185,205,134,21,131,178,131,204,252,158,128,113,70,179,155,13,10,66,154,128,194,198,79,223,112,81,2,110,126,119,58,225,15,245,79,72,198,125,105,183,5,234,96,152,174,216,143,251,131,151,122,198,162,32,234,33,41,125,178,2,206,145,73,208,7,154,238,41,13,10,224,140,99,250,26,187,233,193,238,0,198,241,36,123,247,196,187,224,197,46,2,48,234,115,99,164,118,150,163,49,138,111,216,227,47,27,35,218,115,26,44,12,193,121,4,200,45,249,231,16,98,25,216,96,14,190,76,75,172,52,253,88,9,101,150,156,33,254,99,239,109,98,115,115,189,149,39,147,13,10,222,226,102,223,54,75,154,139,3,243,244,198,30,133,249,75,63,23,194,18,195,161,230,123,92,46,234,218,187,247,32,233,221,185,177,175,164,161,61,159,192,65,44,21,23,43,21,229,154,187,103,81,77,45,24,32,48,171,71,125,28,40,61,225,208,103,125,198,147,60,60,245,42,17,136,25,150,122,229,236,22,210,144,46,180,159,32,89,42,51,151,176,182,173,103,210,108,46,182,142,244,71,18,228,76,22,200,191,60,236,250,54,83,164,3,181,255,199,125,107,205,128,234,165,196,128,108,103,238,6,207,105,98,53,130,205,126,180,62,73,64,84,154,116,127,38,190,221,214,13,10,109,26,219,87,64,37,41,169,186,100,112,135,165,111,150,90,147,81,107,207,46,39,171,35,126,43,159,97,204,137,213,198,203,0,111,6,103,209,66,190,232,154,248,0,154,86,255,77,194,105,101,123,17,240,191,87,241,253,123,234,194,122,243,251,232,91,243,255,241,85,102,172,41,78,24,35,245,96,66,87,8,75,183,173,56,56,238,230,204,13,10,160,193,221,207,113,122,146,20,97,164,237,86,165,186,121,175,40,54,211,194,42,71,113,179,240,133,20,131,44,221,176,150,84,13,166,62,185,80,51,208,127,246,160,70,226,92,152,121,223,127,247,98,7,210,28,255,99,151,31,248,117,2,249,19,166,41,131,132,84,59,19,117,18,91,74,220,61,221,185,49,221,136,26,162,129,200,183,75,153,148,33,99,200,217,60,26,22,97,66,196,49,86,246,164,232,21,226,173,59,210,145,52,155,171,83,154,168,252,60,240,43,2,24,157,21,184,247,43,30,199,203,149,58,191,39,206,1,113,202,99,104,67,78,213,195,159,90,77,251,39,178,168,80,98,6,185,32,49,191,178,220,187,37,234,106,80,146,36,20,207,35,162,141,140,92,19,239,1,139,186,244,172,149,72,224,67,66,97,13,158,159,55,210,133,133,182,213,145,99,237,94,63,106,191,3,41,226,32,139,149,47,45,42,26,140,17,117,43,5,120,172,136,40,70,98,37,122,94,33,131,128,211,93,53,102,108,29,233,44,55,202,55,193,218,103,118,128,190,99,4,246,15,121,15,30,238,77,4,241,85,0,206,190,108,221,201,179,231,182,115,72,139,203,4,146,42,215,25,241,36,45,217,79,151,145,66,109,102,162,186,8,65,197,99,201,158,87,101,71,205,37,226,141,11,144,197,171,236,34,24,155,67,54,133,219,116,26,150,106,179,14,21,184,45,207,73,168,217,21,133,200,142,12,49,192,39,111,127,185,24,158,95,179,73,31,21,190,37,156,213,2,233,180,91,71,222,16,188,135,140,14,124,91,76,136,235,224,144,113,237,255,46,36,16,233,20,27,221,5,90,180,73,224,13,232,1,69,146,79,23,22,212,1,84,246,103,147,19,107,50,80,129,231,49,91,135,148,79,114,242,86,102,224,39,16,203,150,89,153,138,181,141,144,132,136,182,37,43,213,239,93,195,8,97,151,203,9,191,136,254,83,62,250,8,208,168,61,116,35,185,8,138,37,157,53,170,8,71,183,233,19,165,67,194,173,93,2,17,199,161,192,224,59,113,221,202,197,23,91,150,118,32,17,255,47,212,22,220,142,249,187,110,92,68,143,132,166,94,242,82,143,140,211,76,171,191,223,104,143,20,176,221,233,79,239,58,73,4,79,242,226,204,177,200,45,57,105,167,202,242,143,238,95,101,16,0,53,42,69,29,3,91,104,41,41,42,192,170,100,86,145,176,165,166,93,25,240,124,157,136,66,38,138,16,241,30,205,225,38,88,215,161,217,151,86,235,245,120,143,3,85,255,31,228,34,93,173,62,25,119,90,252,247,234,146,191,205,55,4,131,194,15,95,101,133,29,20,65,174,148,210,95,94,120,191,23,83,182,211,11,193,213,64,229,69,169,165,228,152,73,250,24,94,174,163,32,31,18,241,249,90,76,77,152,68,57,149,182,255,132,215,116,134,101,64,195,1,100,114,248,222,28,98,174,74,88,163,154,58,203,66,197,6,134,57,39,235,88,40,231,95,14,86,180,162,135,246,58,153,136,74,97,109,119,224,95,75,208,23,234,5,127,213,246,145,166,39,119,227,186,75,40,64,134,26,187,206,234,222,131,57,22,51,228,9,161,52,35,195,96,158,134,2,17,198,130,202,237,252,110,231,129,42,77,151,241,44,19,108,14,253,137,169,56,108,241,166,125,8,192,109,95,148,131,220,68,11,119,114,141,118,6,157,174,222,142,20,240,137,94,144,151,182,185,32,38,96,153,162,16,167,21,146,55,26,143,48,177,179,157,169,65,67,47,153,18,249,154,196,81,167,101,115,16,56,145,38,224,47,26,69,100,85,38,231,24,173,56,117,252,15,117,93,189,233,220,185,139,231,198,3,78,103,117,194,241,51,234,103,61,140,79,0,122,98,33,239,240,216,145,207,147,148,4,139,249,95,136,5,223,49,81,176,224,73,76,244,33,100,174,94,243,230,129,53,179,39,224,226,167,252,142,245,126,186,49,21,181,116,62,235,232,169,224,223,82,85,78,226,45,73,228,9,185,107,83,91,250,14,177,210,119,68,190,232,201,119,47,24,185,152,145,208,198,146,157,34,254,31,89,183,146,198,149,224,130,223,22,87,141,248,104,139,212,245,144,100,120,88,173,67,68,239,208,186,98,244,56,224,35,80,22,70,212,240,34,177,219,171,103,71,143,242,251,101,39,96,165,224,139,244,2,30,91,44,119,46,169,161,94,118,116,113,25,24,238,194,213,27,251,50,59,208,121,89,187,165,219,166,27,187,34,240,122,59,209,114,46,48,246,134,39,128,246,234,105,99,237,66,75,245,16,80,31,195,179,202,182,16,52,236,164,85,5,156,71,37,145,195,201,213,78,196,70,46,28,110,143,185,2,36,96,74,93,26,37,18,230,252,204,94,104,158,6,249,207,120,234,178,157,97,101,186,43,219,233,185,194,33,79,3,23,119,227,81,117,55,156,35,115,175,152,46,21,8,65,89,255,141,47,230,85,111,195,101,197,127,96,202,225,14,241,141,163,75,91,190,13,10,129,72,122,13,28,154,107,107,70,143,216,126,16,228,127,205,254,113,16,72,239,21,0,117,12,253,90,71,124,196,28,227,9,30,107,9,210,105,221,237,102,106,69,91,211,40,169,109,139,62,164,56,20,80,62,233,28,124,109,176,35,182,245,182,214,163,187,16,102,136,54,217,243,95,111,93,52,9,115,33,164,205,90,47,6,249,66,24,189,82,135,211,183,5,101,113,189,217,192,79,255,190,227,234,107,2,239,39,225,23,182,235,86,97,226,250,69,34,212,73,13,210,4,29,157,105,238,229,219,26,125,113,133,202,50,242,8,81,132,221,174,198,140,17,169,233,232,193,241,54,217,56,219,46,15,143,232,229,255,114,225,254,182,108,181,174,113,67,16,21,235,166,0,65,146,188,38,219,158,69,101,236,26,31,118,161,134,168,172,239,115,119,173,109,146,121,252,145,148,226,132,102,206,102,14,124,56,103,1,236,87,100,247,237,220,85,236,166,138,193,140,197,49,90,112,185,23,142,113,207,39,81,28,28,152,244,14,219,26,29,98,23,118,235,189,27,46,55,216,107,13,10,198,106,197,165,126,14,198,9,247,18,128,93,174,165,132,44,45,128,199,50,193,18,238,142,56,217,89,242,199,119,161,137,36,20,174,130,58,240,228,186,138,4,99,221,71,175,213,123,54,15,2,221,66,134,34,239,36,242,26,121,205,105,180,244,225,204,4,31,136,231,61,138,253,19,18,231,100,254,200,65,24,70,206,146,83,223,79,137,233,162,125,230,72,175,96,53,67,26,70,168,84,90,136,51,124,137,141,218,141,42,44,191,216,50,147,7,152,13,225,160,136,53,43,230,24,99,206,215,197,42,154,47,204,213,231,196,253,58,63,248,25,30,191,220,221,150,103,188,137,115,160,46,246,203,233,120,172,155,28,212,203,148,178,51,54,56,224,98,89,253,191,121,81,233,237,185,51,0,62,80,81,201,178,101,167,156,120,48,11,239,66,238,66,243,190,95,180,173,136,179,162,182,114,251,43,211,225,223,184,235,199,23,14,26,163,210,180,89,163,187,84,173,76,85,180,163,194,253,178,152,116,99,96,235,126,157,242,173,92,153,123,121,6,20,184,155,24,217,68,161,233,16,201,1,67,231,54,95,136,119,66,77,192,40,223,168,145,130,248,155,47,30,230,58,65,88,91,230,224,153,68,136,81,129,185,1,189,78,3,28,110,37,35,231,36,187,8,77,112,59,198,204,220,9,67,207,201,76,178,17,85,129,83,118,169,81,100,95,138,216,22,150,45,30,81,90,143,207,157,103,208,17,54,205,133,212,255,42,221,150,188,82,252,89,74,171,111,91,16,50,140,19,13,10,227,97,134,173,113,162,13,194,69,96,246,118,164,217,87,16,23,61,136,130,188,16,91,198,203,246,218,70,135,32,181,5,41,108,47,185,83,41,114,210,146,45,28,150,71,206,212,125,163,35,9,193,21,70,28,24,207,84,76,164,138,57,34,35,247,95,169,14,144,63,133,198,86,99,82,119,184,63,251,48,196,156,9,139,243,100,239,92,116,231,60,103,50,246,115,233,88,242,228,143,238,161,232,244,237,186,242,104,118,143,129,223,222,44,126,245,179,114,9,135,140,53,63,103,57,176,17,129,93,30,38,114,120,219,126,125,249,76,163,23,48,145,100,58,75,246,156,95,224,7,132,85,166,185,230,223,19,210,242,152,154,106,231,65,92,59,183,74,200,93,54,171,6,29,67,125,168,54,22,125,230,192,223,121,212,194,141,31,207,204,165,155,87,20,56,101,15,227,190,0,222,92,196,92,178,77,239,82,180,156,124,20,238,61,239,13,10,214,139,238,81,220,66,72,7,82,255,46,16,224,72,15,111,215,148,53,16,251,123,42,8,191,104,126,122,128,95,19,207,14,46,5,1,162,57,17,21,219,225,113,222,163,185,161,6,232,114,230,65,108,131,115,190,141,175,165,124,98,123,36,24,47,189,204,238,143,185,206,212,234,221,58,96,18,41,28,33,23,67,213,193,30,13,139,12,120,191,97,246,130,17,105,37,191,46,82,95,202,207,35,43,197,50,236,103,161,176,125,114,197,89,245,113,171,76,42,101,200,224,226,13,10,12,32,85,197,122,135,48,81,185,40,11,238,84,173,158,141,186,6,170,28,19,91,110,250,213,14,146,227,52,112,138,169,190,132,215,165,184,41,58,82,1,220,56,230,220,169,221,111,236,126,157,218,186,128,63,150,35,203,99,31,70,168,198,172,84,220,1,248,44,195,201,190,165,225,224,243,212,122,181,192,85,210,169,186,230,187,201,183,231,120,233,72,169,171,156,129,11,200,6,12,218,202,184,246,15,73,97,97,126,62,237,220,67,157,230,133,222,158,110,150,167,167,67,232,169,143,48,95,132,117,151,165,176,197,67,120,149,217,115,169,192,140,43,231,82,187,17,13,5,39,238,158,148,94,235,5,34,174,52,68,166,240,6,48,180,234,71,100,76,83,108,167,102,78,190,3,240,104,14,13,10,166,247,143,119,94,115,32,7,23,192,150,218,187,43,213,190,202,24,163,93,107,128,213,242,40,237,172,30,241,54,23,112,197,68,250,138,74,123,131,32,33,6,158,211,224,169,238,190,47,0,178,62,179,11,114,97,254,14,106,26,64,45,159,47,127,31,183,29,155,237,35,3,113,239,31,126,47,100,240,81,52,111,114,134,5,107,201,143,201,229,127,202,80,132,155,65,125,98,38,130,14,175,15,169,122,194,231,185,78,50,247,229,1,254,227,83,35,239,205,157,33,3,13,41,254,246,253,106,239,83,65,101,211,251,230,4,171,42,220,141,155,31,31,80,173,134,251,128,15,9,59,198,209,50,80,164,101,111,188,143,124,72,129,28,244,82,217,100,241,215,110,107,32,144,9,39,120,214,222,86,168,227,137,239,187,4,199,171,144,162,66,90,206,43,110,192,66,21,191,254,86,89,200,2,81,8,4,29,6,111,154,48,220,165,223,32,229,197,196,226,49,193,170,26,161,103,150,244,137,186,189,69,183,136,211,120,48,155,142,39,135,34,21,90,243,77,40,117,212,230,232,62,218,126,196,104,133,94,175,29,99,59,172,61,202,112,232,107,71,226,38,37,254,200,243,42,59,165,185,220,227,185,2,225,37,212,149,102,119,147,151,78,104,199,134,136,60,97,17,243,63,186,2,57,49,213,153,188,77,91,94,152,90,150,234,5,32,84,217,121,133,50,123,84,234,3,193,75,157,149,216,248,45,11,178,194,119,242,146,220,208,137,190,92,242,218,147,24,242,218,106,59,236,119,194,219,216,114,174,235,110,199,144,236,3,64,35,25,87,160,17,71,228,161,85,95,219,76,31,16,18,42,241,105,173,84,22,61,72,210,184,90,122,203,92,48,169,231,158,133,22,230,145,244,72,190,82,3,211,231,86,90,9,29,231,136,174,22,32,111,69,217,210,185,91,90,86,236,246,104,25,254,236,96,5,154,153,158,247,70,230,17,251,240,159,129,53,129,209,190,43,40,244,78,73,136,164,66,147,20,219,238,232,182,57,75,139,217,54,66,152,254,79,179,46,184,38,248,222,184,198,220,14,130,58,216,217,99,165,221,253,163,172,91,36,62,55,109,15,148,82,154,87,57,50,236,115,104,85,199,120,235,190,118,197,85,237,123,32,222,115,225,211,127,212,27,97,175,27,66,219,183,33,228,255,41,83,79,125,38,184,241,148,52,205,153,126,205,190,227,89,4,5,4,156,9,132,12,145,241,127,183,190,178,222,31,88,125,101,76,147,184,184,83,52,179,122,27,182,102,244,70,96,110,178,78,56,103,47,141,225,47,160,210,233,56,62,2,163,222,64,247,94,187,24,87,108,216,41,220,254,197,190,30,185,54,113,216,238,22,105,13,10,212,69,35,170,77,149,16,114,226,131,18,127,240,117,161,143,85,149,213,188,150,33,250,24,75,129,143,38,159,88,44,106,14,208,157,134,243,135,17,196,83,185,18,61,160,218,17,67,202,51,175,197,187,85,230,71,166,18,126,25,205,178,240,79,201,103,70,163,63,195,82,251,237,65,175,202,141,32,174,180,231,30,205,237,215,150,37,67,3,162,65,154,55,164,33,184,194,139,108,35,117,98,184,107,115,90,167,162,168,225,94,181,128,184,200,57,81,181,80,180,25,79,149,33,197,102,30,119,253,103,91,155,252,80,25,22,148,219,234,66,204,56,247,135,61,41,204,221,227,250,125,183,97,126,70,151,228,188,54,222,175,7,215,44,236,28,130,100,156,234,16,7,79,210,253,243,82,177,21,40,44,227,90,207,194,74,63,230,19,33,134,172,130,206,139,254,171,155,80,96,136,219,156,216,215,40,184,206,42,122,41,60,176,25,2,44,3,201,230,166,107,238,31,238,109,14,128,100,236,96,24,69,102,57,212,29,156,91,55,101,65,237,167,7,172,201,32,63,121,159,66,18,51,13,10,83,147,72,175,164,214,41,126,1,219,180,226,127,44,132,2,92,29,103,139,14,38,7,162,167,218,41,156,89,160,148,159,56,79,36,122,43,91,25,242,105,22,136,183,103,192,193,255,142,7,226,47,149,175,102,187,3,55,123,157,219,48,249,126,107,65,189,173,8,144,225,122,63,218,121,159,64,245,65,97,241,183,71,185,69,26,128,117,37,255,94,75,223,29,249,163,72,124,202,58,75,81,178,133,180,207,20,127,221,136,116,125,188,81,161,212,27,183,164,217,241,118,1,129,193,145,70,106,100,13,199,13,10,116,189,51,233,16,185,38,228,200,64,189,252,205,11,178,171,1,217,164,140,247,133,193,219,58,252,73,86,90,173,24,145,95,157,172,34,139,155,115,86,40,206,97,79,80,34,183,188,29,142,155,144,253,127,244,165,86,103,3,218,158,68,6,145,157,203,190,49,123,78,49,5,2,208,222,91,236,135,149,112,170,245,148,33,45,212,9,123,235,193,149,89,104,44,167,213,186,102,39,121,85,175,61,210,94,88,46,35,114,152,123,109,191,201,22,141,248,106,18,53,2,162,255,167,168,142,233,135,251,76,93,209,192,242,181,211,183,53,124,109,227,31,189,240,161,181,158,97,77,102,76,26,41,221,183,207,197,144,24,213,92,54,100,111,226,27,192,45,142,213,51,220,14,141,133,249,218,93,37,243,4,186,31,173,34,116,1,29,201,113,115,150,104,213,154,22,30,104,128,178,199,87,119,177,238,13,10,134,52,117,64,169,115,196,189,164,48,106,108,116,104,190,130,65,5,27,128,213,29,56,182,6,115,25,0,235,172,139,64,98,197,111,62,119,75,236,230,125,223,173,41,126,195,20,254,5,15,175,8,229,128,186,26,41,191,212,7,181,200,237,94,125,59,135,33,196,211,142,134,11,69,87,16,228,113,227,205,130,191,187,209,7,144,61,146,101,213,253,29,69,62,216,247,93,77,224,67,50,18,111,113,9,124,248,84,194,214,254,115,98,7,33,96,45,132,149,124,75,214,190,238,125,219,6,151,84,129,133,18,247,173,147,32,151,175,150,59,62,192,37,54,113,65,183,64,19,213,238,51,99,61,124,54,160,170,109,114,104,55,244,62,172,3,103,21,236,24,253,111,172,174,51,97,245,76,208,55,191,130,255,9,213,244,224,3,146,204,76,203,144,112,122,96,80,119,204,40,174,160,98,91,52,232,234,93,42,12,30,224,241,95,161,113,204,205,234,58,84,133,135,194,169,124,59,239,122,61,242,239,144,60,164,117,189,192,201,68,184,77,186,198,154,96,136,199,209,218,197,241,247,21,78,239,15,31,133,47,123,168,173,85,184,104,224,128,71,234,61,221,160,208,176,236,186,7,56,15,147,46,97,31,199,54,216,167,53,213,192,243,160,100,200,114,14,15,105,142,26,230,140,127,3,98,68,3,188,111,132,47,253,148,64,164,160,96,23,129,90,76,49,200,160,161,117,208,239,91,191,239,35,121,246,73,201,45,156,175,148,163,167,106,223,128,148,99,46,29,129,238,99,20,193,144,116,178,254,85,61,131,203,34,177,232,94,194,240,148,171,6,212,136,194,123,144,39,200,231,180,8,99,227,206,159,102,138,211,126,140,162,4,21,125,156,230,242,146,9,0,137,238,193,182,49,116,98,91,170,215,218,115,236,235,110,128,125,98,101,123,179,116,237,194,254,21,84,108,55,253,53,155,104,222,70,37,169,106,194,183,11,148,58,66,161,159,186,221,169,106,32,130,158,128,195,253,7,115,176,245,33,63,75,15,193,253,78,161,211,166,35,99,67,186,121,24,229,216,243,21,8,21,233,159,114,159,224,221,150,189,16,210,161,160,215,40,209,81,79,33,138,112,71,84,31,112,144,121,43,222,243,253,70,247,57,167,104,118,134,31,13,10,153,221,233,51,119,249,133,43,67,200,175,71,68,71,69,146,113,236,164,42,18,163,114,226,201,41,75,116,184,168,176,81,226,131,11,63,1,159,155,240,233,179,16,147,96,77,65,29,145,218,13,158,242,167,134,211,102,100,151,155,123,144,131,137,156,8,26,51,141,91,255,3,97,103,165,76,48,195,177,34,75,37,111,220,105,75,45,217,159,20,116,153,96,240,86,255,41,68,2,56,109,152,22,167,140,236,225,247,40,112,79,245,210,8,103,212,198,19,221,104,238,87,242,201,227,219,129,30,206,239,149,142,6,59,106,120,165,118,30,236,98,116,102,164,165,60,236,116,233,13,75,230,137,156,97,26,138,59,186,111,203,3,157,16,202,228,137,139,147,58,164,193,65,13,10,254,77,190,126,68,213,13,10,12,132,141,51,118,206,33,36,170,72,19,74,230,210,229,70,140,49,72,205,90,154,235,167,136,90,175,50,230,92,167,193,98,194,91,184,230,195,129,163,151,0,44,30,20,109,180,24,186,3,168,141,39,86,80,30,254,40,77,243,235,49,188,248,79,204,71,71,168,71,109,231,176,160,34,12,198,62,142,11,147,25,166,177,143,135,0,55,220,23,69,176,251,52,71,140,64,120,253,229,64,186,166,114,196,135,51,112,5,195,12,182,203,161,19,250,148,159,33,46,113,236,195,158,113,121,8,31,100,13,10,24,240,216,212,187,116,145,144,2,83,187,19,88,12,173,160,166,55,149,196,198,174,23,29,128,190,8,239,0,80,118,217,177,45,237,238,24,83,36,114,121,17,234,109,117,91,1,20,182,71,4,106,43,0,109,123,206,210,177,36,48,75,236,66,205,111,98,97,232,5,152,143,25,251,225,232,170,225,127,200,252,203,100,252,199,245,124,224,34,203,220,230,142,39,24,63,124,174,97,97,165,17,31,64,91,83,178,173,130,55,33,237,208,186,148,181,211,0,41,213,75,143,199,176,92,247,251,239,104,165,88,160,33,118,65,85,188,78,237,3,241,128,157,9,120,235,213,139,7,56,30,149,233,93,14,102,241,135,3,93,67,252,72,29,71,254,134,214,133,191,146,160,107,49,219,110,184,192,147,223,120,136,64,23,160,227,166,203,109,222,160,81,222,87,8,108,94,88,123,178,39,55,243,13,179,166,21,176,162,105,33,164,158,114,195,251,128,113,58,2,158,150,110,60,169,49,96,147,100,180,145,240,194,250,213,214,211,214,147,12,237,110,98,221,17,183,73,137,22,37,13,169,57,70,207,168,89,133,140,112,40,193,210,181,233,90,201,18,238,227,22,81,37,234,3,52,66,106,8,190,160,255,220,248,169,161,137,132,168,89,240,83,227,124,78,79,13,10,47,194,57,49,216,173,166,218,198,4,110,226,152,41,138,0,32,136,23,92,19,184,192,123,161,60,228,103,114,238,74,180,137,152,180,55,52,96,194,182,58,140,33,144,63,1,54,229,179,61,219,141,39,117,102,151,136,20,193,107,191,62,142,120,74,39,49,224,252,0,105,91,152,168,48,214,49,233,168,211,122,173,56,90,39,66,59,113,18,7,202,73,112,4,32,92,68,218,207,13,10,8,116,77,189,207,60,214,20,13,10,34,189,254,207,25,138,165,194,141,9,255,236,164,30,142,35,21,120,156,13,224,254,233,221,83,62,166,183,2,123,230,17,48,167,240,148,96,148,237,113,187,171,122,250,174,124,162,198,202,223,105,88,52,212,157,204,211,175,117,28,148,216,79,1,223,117,78,213,8,190,91,247,210,144,224,65,249,199,122,148,88,156,147,197,196,119,171,160,109,137,152,182,47,96,146,139,186,85,119,145,177,239,11,12,88,176,143,101,249,218,38,126,131,68,71,167,206,69,175,201,91,198,188,226,78,46,162,80,121,222,245,204,241,192,241,206,54,44,201,167,1,245,136,92,80,33,60,223,15,166,223,206,128,189,94,18,91,93,168,235,140,253,217,27,21,142,90,138,30,240,50,141,180,44,78,25,247,180,132,16,225,190,213,146,84,157,153,31,15,162,127,83,50,113,117,237,142,1,44,19,214,208,217,138,191,129,168,192,204,168,132,220,18,99,236,119,111,21,154,99,67,97,154,250,125,18,59,80,14,80,177,22,103,186,207,94,7,211,113,144,77,188,64,73,50,223,126,53,93,26,122,194,62,35,122,106,133,205,15,122,96,21,200,227,179,181,98,7,49,227,108,64,117,74,147,156,169,18,42,252,198,242,22,201,151,47,78,230,49,123,169,104,207,31,37,18,169,32,245,147,30,60,219,96,208,92,194,117,2,62,34,195,49,47,70,169,98,204,6,187,175,6,133,254,81,57,255,141,155,9,241,137,173,25,192,39,186,97,99,41,0,41,229,77,176,177,50,175,3,36,205,212,107,62,244,75,44,233,22,145,95,100,173,150,61,1,235,73,169,96,191,101,249,44,84,204,46,134,189,19,153,140,103,111,86,51,212,231,148,100,251,204,137,149,225,78,236,109,90,22,128,146,226,2,19,51,219,142,121,138,60,99,76,94,145,19,170,241,51,82,204,199,181,175,2,105,125,30,72,184,249,19,14,43,209,117,251,135,139,214,198,76,158,211,56,182,107,150,118,27,15,247,55,201,164,159,213,168,204,179,145,236,254,162,2,125,229,156,105,111,199,45,96,64,89,149,96,145,228,1,57,38,154,139,21,24,112,245,140,233,114,111,31,204,235,84,24,114,234,113,140,33,236,53,222,105,88,67,85,214,246,47,198,188,233,255,113,240,175,53,237,33,146,163,158,5,238,158,144,193,59,141,91,71,131,175,176,183,255,9,124,94,23,242,2,143,37,12,9,24,192,126,219,165,218,66,109,52,105,64,210,115,108,21,30,35,144,101,227,43,23,174,30,76,174,66,79,35,78,56,166,158,14,131,170,187,6,197,29,194,197,250,194,153,54,244,49,199,127,136,165,18,46,104,148,85,75,164,176,246,129,245,32,32,197,13,208,126,40,202,21,189,154,83,113,47,18,185,181,134,26,13,10,130,142,242,33,252,87,121,143,231,238,129,118,141,236,179,30,6,89,78,22,61,129,91,223,239,33,219,2,101,37,223,138,189,248,8,100,56,6,57,56,67,32,95,108,122,31,29,12,34,153,94,137,254,91,70,137,162,57,232,81,135,141,91,164,217,178,106,109,13,10,137,162,114,247,240,77,148,40,236,99,128,11,210,19,144,61,165,64,29,241,83,205,172,232,175,156,74,100,22,218,7,36,193,247,9,230,247,145,58,203,188,197,134,13,228,53,164,17,99,141,221,123,240,145,58,148,187,232,102,238,180,211,249,32,229,95,242,168,230,95,226,39,205,34,196,144,46,117,95,101,58,67,198,17,30,45,118,249,194,199,203,248,87,135,45,11,49,141,61,151,22,102,237,143,151,170,73,231,127,63,72,245,71,61,198,79,180,251,244,70,238,163,218,197,16,252,46,9,94,79,98,162,116,217,42,13,19,21,37,0,144,220,226,178,138,230,231,150,234,23,234,78,113,99,72,26,33,6,137,90,199,50,2,237,238,104,93,99,145,241,186,234,222,230,143,52,209,133,197,26,230,76,196,76,197,136,23,197,226,198,145,116,57,92,99,180,176,151,55,84,102,75,232,43,98,147,181,172,71,56,124,103,163,62,7,66,68,97,171,173,166,245,200,79,50,39,149,18,158,114,55,74,156,159,154,151,249,145,13,10,31,197,236,6,12,136,50,146,156,184,97,169,109,120,182,84,65,126,220,86,217,178,136,14,164,63,122,19,9,151,129,21,208,131,211,91,198,89,177,176,212,174,5,25,29,193,163,179,239,30,179,112,158,214,70,113,108,23,242,246,88,237,74,20,59,194,56,77,190,248,74,143,252,225,211,45,90,113,121,208,37,152,29,127,159,136,87,84,178,197,115,128,92,98,20,15,79,44,80,91,176,125,233,128,82,11,146,109,110,66,7,48,3,99,43,251,17,22,151,47,86,1,95,121,127,137,112,102,149,116,59,145,248,51,106,133,91,210,240,162,248,4,21,70,45,13,18,228,197,7,131,36,254,89,217,87,61,209,161,249,178,70,165,7,125,240,197,2,143,77,170,32,39,181,59,105,186,91,200,137,91,171,167,25,95,46,99,68,246,24,28,92,83,94,201,9,242,25,170,111,113,131,73,88,185,251,224,204,114,185,170,191,62,199,32,27,223,190,110,19,233,175,49,79,159,54,250,46,53,215,62,235,252,48,116,79,16,164,93,72,84,144,124,99,21,97,52,170,73,165,206,169,228,48,234,173,99,56,236,204,44,215,134,83,46,134,113,122,160,180,179,175,173,70,106,67,18,198,60,230,41,96,53,239,133,205,156,3,76,66,103,88,86,112,44,158,174,214,206,226,77,15,195,122,243,70,110,101,248,180,255,55,60,184,155,69,37,203,77,82,69,30,35,23,160,143,150,113,52,251,102,239,129,232,232,74,68,152,125,46,234,105,38,87,54,143,72,141,34,37,7,135,64,236,216,177,11,153,7,196,200,239,237,107,156,16,143,195,76,118,225,192,210,224,241,130,122,214,141,101,228,198,108,206,201,179,29,72,70,191,55,164,159,121,195,168,81,227,204,39,180,13,103,147,96,181,51,89,116,211,132,204,152,111,205,98,85,83,174,219,190,92,19,163,221,231,239,85,83,108,129,70,173,32,144,75,107,177,193,96,9,13,10,85,18,63,155,253,165,157,146,114,119,5,206,85,192,109,227,48,166,241,121,158,162,164,71,40,249,190,42,111,247,51,69,28,48,151,113,69,207,90,53,235,136,92,224,126,177,23,64,5,237,70,125,143,150,81,46,132,54,237,159,178,86,217,180,187,220,98,59,221,166,52,28,55,65,33,67,237,231,36,251,106,1,225,72,141,190,233,94,245,36,89,77,42,200,196,158,26,163,197,130,130,91,190,218,101,42,91,98,234,122,218,63,3,47,131,70,38,46,154,205,140,218,126,158,212,81,121,5,221,78,127,90,0,161,66,77,200,59,161,216,203,196,17,104,155,184,36,125,217,51,101,202,77,222,240,62,229,241,105,90,15,46,99,98,137,84,191,118,87,248,202,105,249,88,132,175,204,192,227,70,145,123,64,229,20,162,233,50,189,2,217,102,205,18,222,133,125,233,61,85,199,233,167,192,58,114,94,240,22,135,161,237,180,6,120,5,69,12,251,117,42,196,104,241,56,193,53,35,8,59,156,90,3,234,144,111,106,196,2,83,24,184,177,210,205,51,155,35,204,65,45,15,96,167,251,222,8,14,102,47,77,67,165,253,45,238,249,38,231,134,154,120,188,97,50,2,223,180,11,80,60,240,133,249,174,133,112,12,91,207,234,161,74,184,160,208,190,180,40,168,157,0,193,13,10,93,70,147,181,46,80,190,84,254,205,71,147,91,49,121,188,2,248,53,72,109,88,98,29,217,134,106,73,67,68,126,28,113,221,196,51,70,183,69,248,104,222,218,122,134,229,245,70,93,131,235,209,101,130,87,124,46,176,190,26,98,32,108,41,200,148,64,13,10,255,85,54,216,189,2,115,128,100,31,213,36,45,32,211,187,47,89,201,202,44,242,43,176,104,129,215,162,87,178,1,76,18,245,136,63,163,125,105,106,88,195,218,52,241,178,5,150,0,201,92,44,159,152,128,184,6,158,43,14,136,244,115,27,228,149,179,160,134,70,253,62,58,109,191,180,253,87,154,111,147,72,139,172,139,108,111,7,92,122,0,251,129,228,48,45,179,237,230,169,100,48,224,88,54,166,209,158,236,47,40,74,149,128,12,177,175,240,174,118,118,247,172,119,84,216,228,71,180,29,230,106,26,253,123,24,143,64,11,117,66,220,77,248,144,147,144,20,22,22,126,161,53,233,134,130,74,123,166,248,247,119,179,129,117,176,19,231,130,247,164,71,186,175,15,114,32,129,182,254,14,233,204,182,224,4,25,200,198,49,235,97,174,229,80,72,122,225,81,118,30,7,121,117,163,24,21,39,146,37,213,92,164,1,215,60,75,179,255,117,211,180,56,9,191,56,183,78,121,225,30,36,56,8,251,23,138,15,161,252,83,45,34,97,172,127,180,167,121,37,59,252,78,184,229,95,69,60,107,35,104,65,63,184,179,70,61,185,165,22,149,250,189,249,20,166,17,218,227,103,231,13,10,221,163,84,82,202,189,2,173,65,38,67,157,40,48,62,184,147,18,3,57,6,57,47,13,12,216,232,115,227,243,146,247,85,80,18,132,94,72,3,145,35,192,111,31,234,155,176,50,59,96,136,43,13,244,61,55,163,36,227,198,116,183,228,77,58,177,246,221,50,207,158,143,113,87,102,182,13,10,72,90,156,101,169,201,159,221,90,46,179,108,128,93,213,182,206,72,188,0,119,138,190,11,70,143,113,141,249,187,162,252,206,163,19,207,252,119,62,53,40,136,31,52,133,63,130,120,254,117,61,48,8,47,252,192,185,173,247,176,99,168,112,96,165,248,155,251,136,124,235,207,133,131,231,162,80,100,24,203,209,223,208,131,115,157,76,170,192,241,124,65,174,167,167,47,142,8,13,10,38,112,199,227,26,232,72,204,209,165,43,81,69,20,219,129,165,157,198,116,26,72,119,244,149,117,106,68,11,129,116,22,62,112,55,205,80,64,48,112,61,229,7,52,49,39,115,221,196,6,117,151,21,4,78,204,246,71,104,156,106,250,69,69,220,98,58,218,186,92,248,85,29,116,176,28,97,30,140,22,109,162,70,78,115,164,165,7,93,47,140,215,250,176,4,65,229,45,60,227,151,96,18,81,137,124,67,48,127,40,52,185,113,75,182,86,52,207,160,235,54,39,66,61,253,15,130,78,137,235,185,143,109,211,189,175,113,113,164,213,207,170,191,190,94,143,89,162,51,215,238,65,158,252,197,33,172,100,208,125,54,54,72,163,94,80,216,39,25,204,61,177,92,34,53,94,78,253,222,15,123,187,63,174,54,131,8,72,106,90,61,166,56,17,126,181,88,227,186,23,72,97,74,212,28,51,147,206,137,213,248,47,13,128,175,4,199,249,19,87,143,164,106,203,213,62,38,196,240,15,246,28,162,71,229,239,212,90,85,162,226,17,221,16,140,164,28,200,154,17,138,217,126,99,202,191,161,133,210,229,51,119,168,238,214,243,182,249,212,46,77,61,74,164,109,199,95,138,48,27,199,53,158,238,161,119,66,206,93,3,93,189,70,107,157,1,113,220,63,3,119,2,39,187,61,70,38,62,150,136,227,249,197,254,24,45,28,192,42,106,106,180,54,196,55,95,252,218,40,234,60,157,147,184,28,3,194,92,105,99,206,39,163,124,162,129,202,73,106,40,167,215,40,218,167,104,223,62,198,178,227,139,246,17,193,81,186,76,86,80,120,60,93,169,41,18,210,33,7,24,213,112,189,206,109,54,80,98,151,137,199,131,216,250,195,6,154,182,175,241,74,199,52,4,113,54,83,30,139,178,207,98,48,2,164,93,2,159,28,126,42,70,194,161,16,23,53,249,63,8,149,224,7,142,30,227,196,193,109,145,195,215,176,137,65,13,88,4,203,19,215,244,76,61,253,15,83,98,238,88,76,241,250,207,15,116,40,71,21,254,1,101,224,207,253,148,162,225,71,134,254,215,52,79,206,173,172,150,39,14,34,146,123,134,233,111,228,230,147,121,46,71,183,203,201,160,155,117,183,214,119,145,170,18,240,51,161,213,210,14,191,133,172,51,102,48,194,145,18,131,118,161,135,204,82,225,134,233,110,0,134,30,47,23,32,57,90,113,117,114,232,248,254,147,155,153,111,189,126,3,184,250,199,250,243,169,80,165,41,153,165,221,30,127,61,7,216,90,25,140,87,162,148,214,52,165,141,78,95,35,101,89,199,18,93,13,10,234,187,145,176,13,137,169,196,116,99,146,232,98,232,35,193,7,254,121,54,4,254,215,253,14,68,36,210,87,129,61,219,49,102,231,247,77,67,111,116,229,172,150,20,13,10,167,215,96,213,255,67,152,247,202,9,18,107,119,151,153,111,13,10,13,52,38,127,141,76,89,147,62,92,235,221,83,101,135,38,71,37,24,155,34,168,200,172,117,3,79,227,245,129,9,70,101,102,61,232,73,109,160,155,88,86,183,83,144,138,171,26,50,161,113,38,250,116,21,3,55,198,82,124,232,131,175,224,154,105,158,75,41,252,212,251,179,201,63,74,8,47,242,208,25,97,169,30,100,182,60,191,21,154,22,185,125,155,115,183,59,185,89,33,194,183,165,24,229,250,235,202,238,47,162,134,60,92,113,161,215,20,220,193,48,12,160,168,60,47,68,115,147,229,80,141,160,118,4,104,189,227,151,156,139,201,74,58,183,35,249,117,177,210,167,16,44,167,158,93,143,102,12,252,155,38,2,22,224,102,90,211,113,192,94,97,196,101,194,169,24,210,26,147,216,97,211,150,103,69,4,230,204,64,68,106,129,225,165,164,84,75,110,186,38,242,171,49,18,78,219,147,117,136,220,76,249,110,49,242,175,115,15,11,147,85,87,213,181,174,79,142,122,16,188,41,64,49,180,38,109,28,184,74,63,102,206,48,180,15,61,197,249,74,66,8,139,65,114,212,34,44,175,234,97,177,88,229,133,249,132,127,31,53,123,211,114,121,148,45,180,231,130,253,223,214,149,19,124,42,61,229,239,9,98,253,17,156,32,48,7,233,192,120,185,235,24,79,152,227,152,231,209,219,101,173,43,231,244,127,226,135,27,217,164,202,235,125,92,72,136,155,199,147,199,102,201,117,39,181,204,205,97,60,23,1,22,2,63,142,255,5,240,131,3,138,1,80,224,146,69,156,51,28,145,102,87,17,48,228,240,135,189,21,83,155,130,120,71,90,149,217,90,150,245,245,253,45,130,216,209,74,153,13,10,140,217,194,34,132,170,80,188,185,90,154,242,67,80,27,20,13,10,249,177,255,102,91,39,185,215,104,145,249,6,203,205,5,212,128,37,143,51,210,206,179,71,36,189,93,126,191,173,73,54,213,34,235,54,244,184,137,114,126,127,85,185,163,189,49,86,15,97,220,192,232,163,22,28,92,124,121,241,226,92,2,133,23,206,145,107,77,8,159,90,168,190,122,68,165,178,239,217,171,240,147,50,118,88,84,37,53,97,87,232,62,216,23,212,2,70,214,36,76,129,133,233,142,149,119,222,146,40,239,7,89,210,68,164,247,205,23,21,22,100,55,3,141,120,147,15,73,45,118,11,108,20,59,160,51,12,255,75,56,104,122,82,58,208,39,85,17,105,231,173,151,246,145,175,88,242,157,9,135,136,104,28,194,130,167,167,207,248,201,1,159,1,92,168,172,2,196,203,135,242,250,240,110,63,41,158,189,255,193,159,189,47,73,163,128,156,207,99,60,130,31,223,0,157,57,132,118,200,151,42,255,255,20,27,64,201,58,2,185,138,136,169,108,74,52,250,50,68,134,67,77,212,82,170,180,58,197,189,11,17,206,92,35,150,235,103,32,113,235,5,136,123,158,178,149,7,109,39,80,137,180,223,153,224,248,55,80,179,25,250,239,86,229,228,228,35,228,223,216,246,112,230,59,130,170,109,196,135,127,149,165,7,176,233,237,169,83,182,46,125,247,143,188,90,152,64,90,62,141,1,30,163,197,4,177,247,87,146,110,18,27,239,87,235,165,169,188,119,171,78,77,131,242,64,186,28,18,181,224,149,61,233,224,126,32,250,199,23,96,141,71,196,207,33,213,169,34,61,86,116,63,35,55,98,172,81,189,8,118,63,56,13,179,37,87,140,190,20,250,89,226,15,206,229,215,80,236,116,160,224,123,179,13,164,131,179,11,185,217,200,63,252,86,200,70,227,214,136,247,101,21,75,34,77,253,153,18,114,20,220,50,87,71,6,214,75,254,33,104,40,221,183,203,140,5,197,1,71,148,28,201,0,95,48,63,111,77,132,231,87,210,32,241,253,30,163,179,194,206,143,159,111,187,44,225,24,158,30,217,118,220,171,235,201,121,26,221,46,183,102,31,36,56,151,209,64,54,86,232,208,200,84,191,36,12,33,195,87,169,223,211,116,159,63,38,26,170,232,125,151,184,146,216,58,207,158,140,120,226,154,178,3,54,87,70,236,210,115,118,148,93,102,89,78,193,200,67,239,134,126,236,239,209,94,214,184,207,224,59,13,220,220,136,98,201,250,4,135,34,143,114,62,75,61,135,129,179,223,178,122,100,236,199,192,135,112,72,133,86,46,208,65,207,199,210,123,157,22,106,8,140,174,249,187,118,14,240,173,131,164,105,80,202,52,181,100,37,192,17,129,65,56,248,216,81,67,242,81,22,93,236,6,223,152,53,158,235,200,144,13,10,48,194,165,8,19,20,115,144,133,54,94,35,223,200,171,149,198,197,28,114,210,108,111,131,95,207,177,254,113,198,20,49,13,10,251,173,213,200,141,23,143,100,42,137,141,153,253,216,122,91,61,186,7,204,106,53,238,167,98,17,138,142,126,3,189,56,22,215,52,243,102,170,152,22,139,21,115,37,57,163,140,99,72,155,181,253,37,18,169,42,1,154,171,88,251,120,169,31,9,231,236,199,255,91,146,69,219,44,18,184,188,37,180,31,93,110,211,183,214,168,135,8,190,60,139,198,192,62,109,74,120,49,91,87,212,210,124,145,194,183,173,8,72,189,45,38,189,95,120,162,241,58,51,214,11,122,37,179,94,197,96,46,129,20,215,182,86,157,123,68,21,76,226,153,12,233,155,153,223,20,142,74,13,10,253,70,186,58,103,207,49,73,176,36,215,87,235,228,105,94,229,103,42,33,60,83,66,126,98,22,88,195,83,215,69,3,120,206,168,127,142,91,149,123,239,26,223,40,88,49,12,111,80,128,241,227,7,13,189,64,117,123,29,28,110,167,103,238,95,205,226,165,254,106,76,105,243,156,115,98,24,203,226,245,207,171,87,167,137,85,196,104,216,70,248,238,12,135,83,157,150,191,137,179,52,89,62,81,191,38,30,239,249,22,81,42,181,47,101,96,29,88,114,38,55,212,255,103,160,66,119,238,126,242,208,201,158,206,164,30,99,85,105,149,167,180,144,144,172,36,52,8,5,119,243,236,66,85,108,105,205,93,245,77,94,127,74,253,195,146,194,177,19,229,240,124,139,11,33,140,57,42,248,83,254,179,150,75,185,142,165,15,7,51,171,50,100,181,162,123,93,3,223,247,124,41,38,153,167,23,83,141,103,111,185,47,220,174,225,102,79,204,55,22,127,36,225,22,105,176,180,63,4,238,143,143,137,58,167,59,94,248,69,156,140,219,255,205,181,199,213,136,79,71,114,216,164,180,107,133,50,98,253,13,60,203,179,228,218,64,208,29,2,143,202,110,59,25,218,92,30,145,140,5,56,151,171,165,187,121,172,161,198,245,103,232,153,93,70,107,242,29,97,97,129,219,250,251,254,11,151,167,194,179,102,202,81,67,139,240,255,119,165,188,49,40,20,61,223,231,210,236,74,60,31,176,223,79,79,91,241,200,39,68,211,117,132,11,200,42,6,100,190,0,128,125,246,91,229,151,142,39,233,33,143,228,202,86,156,19,216,73,48,82,118,205,154,1,233,18,245,75,9,221,74,213,237,176,255,159,132,228,189,127,42,133,236,8,134,9,81,116,187,18,83,156,53,108,234,176,254,255,125,201,99,244,75,204,14,22,18,247,222,155,216,192,151,124,179,93,135,185,167,95,51,250,246,14,248,42,116,147,192,146,71,80,239,154,91,107,152,249,189,206,140,64,208,229,166,16,98,156,57,55,173,0,123,179,178,118,20,75,179,231,126,100,132,83,81,20,113,49,50,197,86,125,214,46,220,36,16,46,81,233,160,38,69,131,108,95,148,176,255,157,217,102,163,104,25,19,168,18,159,107,21,22,72,83,75,245,54,238,41,147,93,105,242,142,13,45,255,23,40,98,187,136,137,226,70,112,123,35,93,62,119,163,8,252,49,161,95,132,159,196,176,20,86,168,235,38,97,42,153,116,79,130,193,68,134,36,111,143,228,226,16,236,189,193,46,36,200,85,38,252,61,33,163,243,5,94,55,192,151,134,90,116,199,53,226,239,178,95,44,136,230,84,105,191,102,168,76,128,3,92,13,10,204,63,129,210,204,125,225,133,229,84,136,192,20,78,214,141,243,238,250,23,26,52,129,127,248,114,147,202,45,228,248,62,92,128,26,251,220,67,154,206,67,196,96,233,160,118,106,198,95,112,190,15,25,40,118,215,136,116,85,134,53,225,72,36,188,235,69,61,46,135,57,217,189,87,164,214,133,13,109,213,207,56,222,206,193,9,129,57,130,161,43,227,34,7,254,1,180,38,139,128,197,196,116,182,4,192,18,30,112,198,52,67,181,81,60,225,161,28,208,207,9,55,73,205,202,21,15,120,207,26,133,247,5,216,232,13,175,61,250,11,195,42,195,137,213,245,199,214,58,172,7,193,36,8,199,155,61,106,5,8,247,201,54,18,183,153,164,199,151,9,129,95,233,193,7,164,219,109,140,217,17,203,118,116,243,78,118,12,13,10,137,23,1,25,73,170,240,199,64,241,57,41,206,27,45,54,67,131,119,123,227,183,184,52,125,217,55,69,86,130,27,146,55,8,61,96,116,16,80,43,31,18,141,135,76,29,251,111,193,207,166,213,188,1,204,118,126,52,17,225,168,125,164,233,33,224,100,234,88,252,173,3,94,84,112,243,146,195,182,199,183,6,247,90,87,38,229,22,226,188,7,107,207,179,6,119,133,54,226,124,147,169,220,208,111,222,31,136,3,197,15,247,207,116,238,137,233,211,4,230,156,114,195,227,13,222,113,4,178,35,216,18,4,243,246,175,100,102,189,61,236,251,7,252,160,101,6,201,209,200,33,192,209,182,186,142,53,0,26,56,58,144,235,70,165,195,142,129,243,197,64,49,222,111,5,48,79,181,209,54,185,248,100,217,44,20,70,35,234,198,7,48,20,216,6,225,238,181,72,48,165,224,206,227,211,28,205,169,51,233,184,163,116,26,128,60,55,14,249,225,56,22,60,138,142,237,88,21,151,134,229,29,13,10,159,94,178,95,85,220,74,65,243,88,24,157,82,91,47,48,76,18,226,185,166,85,137,167,9,74,102,249,98,94,35,8,112,206,101,91,75,245,63,99,164,140,149,36,97,1,15,148,227,230,150,1,131,20,152,100,21,3,168,191,39,138,60,81,193,15,135,99,133,89,7,255,155,170,56,76,193,161,247,157,40,3,53,185,106,140,79,249,185,50,79,116,123,160,42,158,231,32,104,82,62,15,165,236,9,186,157,103,251,99,32,141,174,41,190,13,3,92,111,43,130,208,103,111,17,209,252,27,90,49,246,227,189,60,195,244,224,43,124,251,50,175,103,50,49,22,42,76,85,199,239,126,6,179,128,145,100,51,11,196,162,186,170,179,236,8,69,229,79,217,61,198,0,174,174,229,143,243,14,191,160,111,240,13,10,122,187,85,148,99,145,211,244,7,150,33,224,20,182,11,230,157,59,100,18,220,139,140,34,211,100,53,51,99,118,101,241,23,55,129,149,107,21,107,182,188,30,7,60,102,117,166,93,145,247,230,104,116,64,59,170,83,242,141,92,58,162,26,236,52,6,99,64,174,21,48,13,17,225,166,221,232,241,146,131,18,15,57,66,185,59,235,108,52,190,233,230,223,236,174,69,195,72,99,42,112,13,10,69,150,225,171,82,222,148,254,106,59,121,240,172,130,197,165,1,2,102,134,44,243,159,187,108,246,135,39,194,244,72,45,48,242,84,12,55,67,113,77,195,93,96,72,5,57,24,153,131,241,24,11,44,84,174,91,58,35,157,4,43,188,95,78,71,210,213,253,85,20,229,189,211,103,189,75,189,82,14,21,120,108,206,103,239,21,149,65,82,95,98,108,213,172,95,77,25,71,193,146,36,89,202,12,254,190,49,159,33,182,172,124,171,238,246,91,242,208,141,122,171,164,55,87,47,29,46,109,197,199,4,76,130,167,110,226,182,106,2,177,193,156,217,203,158,184,64,89,56,63,245,167,67,1,174,33,54,168,115,135,95,123,52,209,182,22,20,106,140,101,248,73,224,42,182,33,229,33,67,226,175,15,115,77,203,205,184,179,4,226,121,179,30,101,196,2,66,242,230,70,151,180,142,253,119,198,174,98,253,116,46,177,202,66,40,34,187,251,236,66,72,214,182,228,91,242,252,140,48,154,105,62,91,191,5,103,31,253,190,235,2,0,163,139,210,71,96,207,131,113,128,168,88,233,45,184,181,31,44,132,118,82,117,177,96,24,139,243,220,181,227,132,223,130,140,205,154,86,1,218,236,198,106,193,178,146,56,21,127,240,243,75,237,215,24,236,138,44,37,182,47,66,239,127,68,68,204,118,141,35,180,16,135,201,201,27,89,67,37,48,1,66,38,75,213,196,56,105,180,227,30,183,38,198,21,165,159,111,86,77,149,25,4,102,16,42,125,102,74,157,28,119,13,108,15,162,221,197,185,170,44,135,241,208,176,78,138,57,140,91,218,171,150,144,237,178,80,105,100,68,135,183,134,166,22,164,84,62,77,144,252,204,58,135,193,40,38,247,58,220,52,46,190,94,92,72,25,95,111,107,165,16,104,33,200,196,142,218,208,164,205,244,185,204,187,223,182,202,104,192,86,108,70,55,196,57,143,199,170,78,183,44,99,191,180,27,118,232,46,57,168,19,252,72,145,180,158,139,250,113,194,86,207,75,79,46,165,79,147,50,78,94,87,86,9,212,37,104,43,20,121,241,219,77,144,159,91,156,13,40,201,98,64,48,227,253,79,17,53,103,249,100,220,170,184,11,137,25,140,111,127,97,149,229,62,60,201,206,72,139,99,215,146,41,156,23,201,234,96,68,215,247,81,81,57,139,20,166,82,161,148,200,129,159,209,212,195,125,246,68,113,219,19,242,76,51,227,143,212,26,150,93,234,124,86,245,108,124,145,84,194,63,144,56,22,210,25,18,6,162,127,4,194,24,33,159,81,133,163,131,50,150,194,84,212,227,195,44,30,236,30,189,28,159,181,129,209,206,30,8,221,123,112,110,183,183,1,237,158,179,26,235,92,69,29,44,66,81,227,180,73,211,193,34,172,22,184,35,76,62,235,29,19,182,167,219,84,86,103,184,186,61,22,70,20,107,125,196,84,153,42,226,94,195,196,153,191,13,241,254,93,174,3,232,31,248,235,106,228,49,14,29,46,14,211,48,171,140,121,227,32,177,65,234,161,106,22,196,171,148,193,27,40,121,112,36,113,153,134,162,157,60,43,18,149,242,56,195,185,121,63,150,245,202,42,32,201,20,141,121,36,81,95,17,150,126,225,165,152,101,145,67,212,34,249,57,101,252,118,172,241,196,4,189,135,82,2,95,19,96,47,250,189,231,83,28,221,186,217,165,175,94,146,26,17,233,78,148,164,80,224,33,27,45,44,15,58,55,194,221,67,65,80,84,73,69,116,4,145,33,40,110,19,254,170,86,8,46,212,141,194,45,69,128,121,26,254,146,105,133,2,189,87,165,152,57,224,195,22,71,107,50,131,140,205,27,214,133,98,174,231,165,71,165,194,146,136,198,40,94,244,164,150,183,168,38,126,200,246,93,77,122,55,1,205,183,36,152,233,224,6,11,79,23,227,107,113,164,200,207,186,244,146,20,138,159,98,8,113,185,58,100,0,100,35,185,105,111,23,142,45,44,81,248,240,211,167,96,169,77,24,131,164,56,59,41,192,65,251,192,144,205,103,83,17,117,38,73,106,44,201,253,47,114,180,253,2,232,63,93,168,44,84,92,83,110,239,8,239,136,243,96,127,93,50,133,53,187,17,131,41,31,34,5,222,210,136,111,83,146,229,74,243,235,36,178,54,109,150,11,27,84,109,127,13,10,123,125,105,85,132,14,175,200,194,72,29,198,15,64,69,230,250,118,40,235,143,59,151,212,41,245,175,165,73,44,176,156,202,239,240,19,230,140,152,166,84,32,120,250,223,67,159,254,247,195,206,37,161,83,247,59,154,227,209,75,86,146,242,46,119,100,5,13,10,15,90,120,82,234,0,55,80,147,212,151,254,244,157,48,226,109,109,71,247,57,174,46,117,237,194,194,119,97,23,50,200,20,68,249,67,78,216,151,67,163,180,17,107,67,109,216,60,71,109,72,122,218,222,227,216,184,202,195,36,194,114,89,98,34,52,201,31,192,179,116,61,83,103,163,92,208,214,171,125,54,229,207,92,122,46,131,149,174,189,4,127,21,91,194,89,85,176,133,177,70,156,210,254,13,71,173,142,120,73,197,41,169,131,69,187,214,13,10,161,221,240,253,133,20,113,17,41,217,223,19,240,254,179,116,50,164,22,119,112,142,243,114,229,155,207,242,21,152,199,202,16,98,184,245,194,129,240,124,62,210,66,34,69,47,237,46,129,142,62,87,13,162,199,123,240,245,223,47,24,205,60,103,80,91,129,140,141,241,49,123,196,122,79,164,27,188,227,71,178,13,23,13,10,238,194,146,122,44,191,191,153,200,198,100,213,169,117,133,147,74,132,98,79,39,150,139,103,238,190,85,181,49,173,165,19,236,91,27,238,212,87,124,103,97,200,88,113,95,243,18,27,245,103,203,49,255,119,249,252,217,88,3,210,13,51,115,209,234,249,251,159,115,161,109,230,70,11,121,233,99,203,235,80,149,186,180,196,28,92,225,7,61,84,155,17,17,54,190,34,122,172,84,20,11,129,189,238,9,33,171,90,213,26,212,244,153,195,104,7,41,25,147,153,192,181,119,207,137,48,183,235,155,103,82,252,234,232,42,123,244,132,65,48,86,150,164,221,125,74,133,96,250,80,228,221,244,173,28,155,94,248,60,200,185,54,9,134,147,230,185,5,36,13,150,226,245,158,92,249,110,93,7,222,116,199,249,100,112,149,108,52,198,75,136,56,243,255,252,234,232,96,74,11,33,100,219,161,128,27,54,19,234,246,223,78,33,117,242,96,41,231,150,187,168,124,228,128,245,59,217,84,42,180,169,198,127,66,53,145,162,191,29,13,10,254,174,133,187,84,173,1,90,169,46,187,114,25,6,150,43,244,222,203,16,28,67,243,190,189,190,0,137,30,234,1,4,102,250,223,87,245,46,75,19,168,16,49,124,102,28,255,165,124,13,10,251,188,14,130,4,97,41,2,128,187,203,134,165,79,225,202,137,228,160,55,42,240,31,196,96,141,168,71,163,251,41,21,169,161,139,224,173,87,112,103,13,10,61,212,51,67,211,138,81,237,251,87,144,16,65,151,161,36,123,244,12,138,13,10,153,73,39,20,160,56,117,237,208,198,144,170,37,156,99,8,125,19,53,173,203,171,198,247,86,104,107,120,17,30,16,159,245,226,127,126,49,170,125,77,210,253,220,206,141,166,57,12,162,143,105,107,249,145,41,27,27,54,143,13,10,48,195,55,126,183,69,13,10,162,188,198,56,21,53,141,59,162,181,252,227,110,246,207,6,224,232,139,18,81,219,146,245,46,11,200,241,235,14,98,233,202,50,195,88,76,170,84,72,224,78,40,203,225,110,14,239,109,196,78,228,247,91,165,167,133,34,150,136,43,13,233,69,65,200,4,166,172,19,115,80,62,107,123,104,179,79,213,193,247,228,171,201,106,198,129,27,125,89,12,3,161,175,188,50,142,123,109,173,127,61,238,103,26,177,207,33,49,83,85,122,34,245,228,123,123,1,177,144,159,37,25,137,159,79,191,40,54,20,19,1,253,216,156,147,236,53,174,81,123,93,22,200,144,254,11,103,3,89,93,122,157,193,163,98,240,169,20,228,190,43,9,105,219,46,116,37,23,12,114,84,100,63,152,238,201,81,216,28,118,83,203,31,127,77,234,234,177,125,157,97,90,234,240,168,15,131,47,41,246,252,234,249,87,35,6,147,244,109,214,54,2,171,208,176,210,207,244,177,82,105,55,227,163,200,84,146,250,101,238,17,168,161,110,148,28,215,78,157,80,201,234,71,141,23,183,149,13,10,48,179,70,127,47,5,6,29,237,187,113,200,83,217,195,61,8,13,10,107,26,133,109,66,145,181,209,60,224,21,216,76,37,93,31,67,41,254,146,200,20,82,244,92,157,191,102,94,188,103,211,201,210,188,110,79,228,39,99,85,79,55,25,152,120,126,5,71,122,172,101,42,53,39,95,158,170,35,240,249,95,179,113,231,88,172,115,210,214,7,193,172,140,70,198,206,96,90,102,87,254,145,2,68,168,220,138,61,252,186,252,39,91,169,8,132,132,84,213,210,26,58,100,39,214,167,227,144,22,235,89,188,215,22,202,174,138,100,2,188,215,176,75,175,86,254,255,7,27,216,206,232,2,173,138,15,6,126,208,28,169,69,56,58,200,151,128,22,240,46,2,119,23,135,18,233,80,19,176,192,244,148,152,139,77,41,24,135,90,214,42,86,134,180,75,60,223,50,146,74,109,234,91,69,53,51,24,61,213,152,236,55,250,139,99,56,93,136,152,103,74,229,108,44,82,138,62,99,13,70,252,148,82,132,227,47,55,177,155,141,146,172,199,187,131,95,157,203,111,41,230,183,148,3,14,85,106,128,66,21,253,95,41,100,8,246,128,119,35,76,19,30,5,152,104,152,38,171,85,38,39,170,127,223,21,126,84,235,145,32,169,19,239,24,92,204,223,148,211,210,136,86,168,253,108,234,195,81,149,111,86,128,155,3,53,182,216,139,95,119,153,6,202,230,190,123,60,137,24,75,75,106,166,182,130,152,224,54,4,173,43,61,25,45,149,29,215,119,33,109,156,61,89,93,248,37,245,26,0,24,35,111,103,188,16,54,190,87,46,8,131,215,47,212,126,64,58,89,205,21,241,115,90,145,65,191,36,148,205,123,46,168,62,88,247,7,40,146,13,10,156,194,111,195,90,39,22,80,36,137,154,4,206,253,176,240,137,112,184,151,135,249,220,218,204,168,4,246,223,215,92,204,229,198,52,22,170,55,114,248,46,170,140,248,21,51,14,70,43,228,167,63,228,9,64,8,32,65,182,170,220,205,120,183,167,122,215,227,118,159,245,0,100,20,8,9,168,153,79,151,14,131,74,118,66,78,95,76,244,101,184,13,21,74,128,13,127,35,141,3,86,210,60,225,204,25,221,72,91,126,204,83,142,84,21,221,87,143,141,232,21,66,101,58,30,234,74,192,9,94,31,189,53,114,126,70,174,103,240,163,43,70,109,184,103,32,123,43,163,147,156,108,126,146,135,95,15,128,205,237,230,71,187,13,10,158,20,124,231,1,54,70,139,2,188,243,206,125,156,9,45,250,72,59,128,171,79,195,122,19,40,79,3,246,240,9,217,138,188,63,120,211,147,177,243,164,87,172,211,172,76,237,59,188,224,231,254,133,89,218,203,157,220,176,153,195,230,190,217,163,82,174,146,58,186,96,67,26,110,2,9,73,159,72,46,33,229,229,213,238,148,192,164,106,54,135,87,219,108,83,154,100,147,221,20,114,209,106,168,158,54,38,197,66,244,64,232,89,154,74,250,235,151,123,68,234,234,64,164,141,60,119,133,208,12,121,113,77,111,132,238,127,11,199,99,52,93,132,222,231,21,63,198,155,246,60,29,110,127,114,200,149,33,43,238,236,142,179,127,107,6,42,64,223,74,55,188,83,74,231,235,177,43,51,231,217,2,59,59,140,6,155,181,187,112,52,13,65,86,68,152,240,83,153,184,102,176,173,161,213,59,190,198,69,90,253,220,155,113,248,19,70,153,4,35,92,28,119,43,148,25,252,225,184,166,60,115,110,66,150,30,48,252,60,92,189,181,130,137,72,166,15,7,230,123,140,151,59,26,241,12,49,209,77,109,201,140,202,45,4,9,85,211,203,157,8,112,158,187,45,60,215,68,177,0,216,95,117,191,95,50,179,172,30,38,98,235,83,169,241,14,154,197,154,203,71,110,62,239,31,209,26,13,10,135,85,205,82,189,132,116,115,182,80,198,116,231,188,212,1,53,171,188,83,50,171,234,161,216,97,160,54,127,115,75,180,125,124,13,176,5,84,254,132,226,79,222,42,43,196,152,210,116,173,193,217,122,253,120,28,150,2,129,120,152,50,223,90,229,225,129,253,216,55,229,19,183,211,4,183,248,240,229,200,151,178,63,199,178,218,255,158,221,213,91,126,255,107,49,30,58,4,192,172,138,205,186,221,119,20,35,120,106,240,131,228,69,194,47,202,211,127,196,152,173,125,116,189,91,126,65,179,183,60,193,167,33,9,9,231,102,24,27,204,85,136,250,28,60,214,191,205,164,73,197,71,184,165,207,82,217,215,80,155,101,181,175,43,220,115,100,194,254,16,241,119,14,177,12,20,152,208,130,9,187,44,182,251,106,253,139,98,132,41,211,205,68,134,151,237,104,179,58,108,62,192,26,251,204,181,60,231,53,78,173,182,58,38,187,75,160,27,187,239,188,13,81,51,101,246,52,168,150,46,240,219,97,142,238,223,86,20,223,229,133,25,223,116,204,107,190,15,222,173,117,222,59,204,81,18,63,9,57,146,201,195,218,217,77,148,39,253,19,220,22,30,251,72,20,127,36,190,185,204,42,56,123,210,35,158,219,241,175,155,176,110,183,132,14,20,62,184,240,170,112,183,36,194,110,230,179,98,249,249,161,106,70,155,191,75,117,46,16,84,185,160,74,103,199,141,121,211,12,123,58,220,171,96,173,13,10,154,137,13,176,61,148,6,116,235,120,187,69,38,181,122,74,106,214,189,39,87,150,220,130,161,151,76,115,1,205,51,241,226,43,9,13,10,114,168,17,70,200,56,70,211,212,19,19,226,6,249,50,183,64,148,197,122,95,134,122,24,35,79,194,11,241,45,246,63,1,165,213,222,56,24,228,115,224,124,205,112,30,190,13,10,254,88,128,64,235,157,139,204,207,8,172,5,110,87,190,198,130,150,220,142,208,155,68,22,125,169,239,226,17,255,164,136,69,192,167,255,183,84,13,211,218,117,234,129,247,87,219,67,227,201,177,161,71,147,222,169,213,170,147,239,42,117,41,140,189,200,82,77,137,195,155,16,238,36,190,131,194,12,105,197,210,187,245,214,246,178,157,75,77,70,126,1,180,235,179,198,43,38,7,111,228,176,196,198,100,150,64,186,62,65,143,127,34,123,136,59,236,33,36,153,118,104,68,94,180,53,119,57,181,145,241,33,68,252,56,220,107,138,176,127,127,133,114,104,135,38,191,117,14,145,237,85,147,209,87,157,18,180,104,167,238,82,99,226,190,180,102,247,100,161,166,174,80,95,187,68,95,24,127,57,44,240,85,156,54,154,6,190,226,176,136,111,147,251,12,77,159,132,139,127,17,193,218,195,104,46,160,55,185,32,202,194,151,123,96,229,150,251,202,223,91,140,205,144,192,137,213,134,205,200,59,0,196,13,10,236,243,47,241,38,189,79,216,129,66,237,244,45,210,78,250,43,149,106,43,73,37,85,33,96,216,178,53,21,222,228,174,68,51,231,40,117,208,56,104,191,135,99,215,196,232,159,126,192,115,122,202,62,133,237,185,207,14,34,25,105,37,117,67,2,213,252,60,215,71,119,159,209,201,197,76,88,207,127,202,221,253,147,137,248,249,116,117,45,111,102,181,62,106,195,140,170,83,137,25,30,118,165,5,95,111,120,13,42,167,245,253,112,184,250,245,100,230,175,56,38,32,73,4,217,183,27,236,17,87,251,14,29,24,227,218,104,40,18,186,179,55,168,193,69,214,148,162,201,58,158,120,110,232,250,248,197,125,42,200,249,156,127,225,8,53,70,82,166,208,166,155,195,68,214,96,206,253,112,103,23,171,138,165,1,129,224,139,197,133,47,115,9,157,79,91,204,12,70,168,225,221,208,19,236,98,162,167,176,131,157,77,230,92,85,131,228,227,238,193,221,66,110,56,143,173,137,33,152,143,156,90,219,222,94,61,48,82,128,53,199,71,39,103,154,38,13,10,108,3,144,172,104,168,240,166,138,187,161,149,182,63,190,109,61,219,248,252,39,83,167,19,9,187,127,24,38,76,243,220,71,231,254,175,32,214,131,162,107,189,98,237,43,158,211,165,182,138,74,163,64,13,209,6,105,178,26,27,191,105,178,137,144,3,179,188,123,225,84,103,220,230,14,43,165,127,81,92,66,116,152,14,199,170,64,242,210,85,6,160,2,1,153,241,78,64,12,237,185,88,53,24,224,207,247,242,179,172,11,119,202,80,167,76,32,210,141,255,217,134,0,199,34,239,122,102,92,75,94,80,139,166,90,72,155,254,191,193,5,195,192,113,85,84,50,207,189,102,90,104,173,94,218,177,62,73,182,235,46,39,185,137,137,100,176,92,194,144,100,151,170,215,137,202,142,224,184,180,119,54,210,152,62,126,50,108,235,239,42,110,163,39,211,171,213,205,45,126,154,98,162,1,41,174,62,75,160,199,207,13,10,146,66,176,46,149,87,182,126,169,71,237,119,81,45,102,216,139,130,236,230,39,40,114,32,219,50,130,230,17,56,109,142,148,253,95,178,132,241,207,81,214,254,123,165,52,36,120,8,171,117,14,65,183,121,151,187,245,76,19,180,121,239,82,254,215,30,225,206,228,168,137,18,121,180,5,14,143,129,47,75,32,7,32,124,103,124,189,205,28,193,208,55,232,64,56,125,238,217,127,33,4,31,199,138,82,207,112,34,111,144,236,194,143,72,238,165,73,151,119,134,160,2,225,76,235,59,114,94,169,56,214,62,117,170,247,7,50,80,252,116,179,41,16,123,254,52,171,204,150,36,174,183,130,77,91,13,10,107,91,94,154,25,55,68,99,199,125,156,187,175,185,12,75,216,17,29,102,30,179,173,172,204,235,249,149,164,13,10,150,166,31,14,189,254,212,87,135,254,30,106,4,84,149,240,110,66,22,127,87,30,187,220,83,164,39,241,214,197,165,151,96,253,20,74,20,111,120,79,189,135,238,147,34,184,150,163,236,46,125,65,87,156,44,234,80,125,85,72,59,47,34,138,47,103,115,44,243,60,58,27,49,218,156,205,143,122,248,132,92,247,141,159,148,221,184,74,65,81,238,161,173,23,59,113,55,21,23,59,241,107,140,108,231,30,198,239,51,236,185,84,68,84,39,45,98,114,191,65,218,193,179,186,91,193,52,130,125,4,225,219,13,10,188,83,106,252,124,250,103,1,89,6,56,168,0,103,187,85,234,103,155,135,25,227,48,132,148,83,109,157,75,9,68,126,116,15,71,70,231,198,230,178,0,155,58,38,221,148,148,209,201,11,75,162,112,142,86,12,214,47,129,117,45,2,45,242,188,138,84,228,2,73,255,114,198,207,136,145,209,4,248,131,119,122,209,100,134,69,196,251,172,51,69,178,13,10,185,196,76,58,254,222,230,167,182,197,154,141,248,202,169,163,156,187,230,202,224,50,229,175,136,154,209,96,206,189,124,140,192,7,1,217,243,50,69,81,37,69,56,118,91,2,176,188,192,81,29,217,103,134,23,107,32,197,234,63,90,95,200,177,197,77,217,56,86,197,145,63,251,210,168,156,156,199,88,76,187,147,25,212,56,43,155,226,197,176,210,1,2,132,39,236,116,233,224,30,75,4,166,187,143,228,57,33,151,38,202,231,42,157,65,164,11,50,213,173,166,35,228,122,68,88,122,6,82,101,170,135,213,68,131,251,14,150,212,165,210,189,7,124,76,114,255,115,232,214,96,88,72,81,7,74,78,42,100,30,228,79,205,78,251,88,235,106,214,224,7,14,193,99,205,178,240,175,90,240,190,75,218,105,188,120,124,59,63,26,33,241,108,19,179,97,98,31,111,16,193,158,144,154,67,174,177,188,219,103,124,239,107,199,69,53,151,161,242,13,115,84,196,49,56,236,2,202,251,195,221,216,37,133,193,72,46,199,46,94,5,37,47,161,168,35,175,129,30,39,88,21,58,17,39,246,107,76,93,55,213,140,83,245,21,41,20,236,149,129,49,3,69,169,99,67,229,199,107,227,203,74,4,19,61,16,18,130,212,49,158,243,182,139,2,150,125,249,253,113,31,97,151,166,174,39,130,57,202,42,248,64,76,208,38,202,133,205,206,215,160,213,193,143,241,105,218,204,137,225,209,188,9,240,188,48,228,12,59,185,162,101,243,54,205,101,168,111,108,51,5,161,105,34,129,248,56,112,249,46,237,46,239,50,203,21,191,194,210,189,157,7,166,47,170,111,68,103,92,221,224,16,93,201,23,67,198,223,134,104,160,64,28,84,86,7,27,62,49,172,185,96,178,151,78,152,248,40,171,122,249,124,147,134,3,143,118,134,234,208,14,15,157,108,198,60,92,204,64,64,118,61,214,170,211,203,125,92,52,12,54,34,94,83,36,162,167,223,130,193,112,157,150,205,194,36,109,4,111,131,52,123,67,255,206,122,73,141,95,4,180,12,98,135,200,71,118,38,250,53,245,97,203,80,80,94,230,145,68,174,54,112,129,154,184,201,78,26,191,149,211,59,131,105,199,166,191,73,100,167,250,26,157,182,242,36,159,187,165,240,242,33,192,193,200,128,152,15,161,180,176,224,116,242,168,80,227,194,223,109,24,29,20,87,237,54,169,193,88,120,99,39,11,187,22,21,174,239,55,149,198,157,229,119,68,170,109,97,145,223,197,3,38,215,174,228,16,81,45,208,60,14,124,38,104,2,4,128,53,86,150,178,245,251,187,120,67,106,93,108,70,42,161,150,167,220,51,34,213,119,132,7,218,68,247,197,148,163,245,134,83,173,131,97,63,191,113,6,27,51,232,47,170,45,153,43,202,29,63,46,38,187,228,219,3,234,146,85,116,58,130,93,234,54,123,122,166,117,245,54,186,194,203,224,49,82,99,86,0,125,201,185,237,79,150,119,155,59,202,113,115,192,115,255,93,20,161,53,170,84,251,53,229,76,254,121,7,117,247,78,131,160,132,134,231,121,161,47,192,52,12,108,91,205,128,253,20,165,181,36,173,251,112,183,59,5,105,181,232,33,79,88,135,112,109,217,46,212,0,142,109,5,42,129,48,25,76,26,232,1,221,17,45,47,67,239,201,17,189,156,115,101,15,55,5,49,117,238,98,42,133,155,188,76,173,244,238,163,65,106,240,96,111,254,201,82,28,168,143,130,2,103,166,81,143,132,4,54,34,71,19,46,97,153,89,91,100,144,60,5,169,110,167,61,98,41,20,110,248,242,143,154,91,29,120,86,247,175,43,219,19,88,50,46,243,170,139,207,57,217,152,56,200,128,0,190,152,48,133,33,9,132,205,114,160,113,190,211,7,47,178,217,3,79,249,65,57,213,238,135,181,226,78,12,7,6,148,125,11,36,174,74,120,148,15,28,77,253,116,177,7,119,36,86,13,10,90,241,45,104,207,80,236,37,130,241,110,188,207,16,182,13,248,152,103,190,173,230,58,240,94,57,216,227,114,112,18,169,152,62,198,34,7,82,203,191,166,82,33,90,166,131,142,142,34,60,87,137,13,24,197,209,139,244,183,166,170,95,178,50,197,241,53,163,166,227,184,19,248,133,130,71,251,166,214,147,143,109,207,26,213,69,242,144,236,122,80,101,42,31,61,192,31,151,106,200,190,246,3,83,243,45,88,75,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen021023l=45669; +} +#endif //_PDF_READER_RESOURCE_FONT_n021023l_H diff --git a/PdfReader/Resources/Fontn021024l.h b/PdfReader/Resources/Fontn021024l.h new file mode 100644 index 0000000000..646f2d9bc3 --- /dev/null +++ b/PdfReader/Resources/Fontn021024l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n021024l_H +#define _PDF_READER_RESOURCE_FONT_n021024l_H +namespace PdfReader +{ +static const unsigned char c_arrn021024l[]={128,1,121,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,82,111,109,78,111,57,76,45,77,101,100,105,73,116,97,108,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,32,77,101,100,105,117,109,32,73,116,97,108,105,99,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,82,111,109,97,110,32,78,111,57,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,53,46,51,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,82,111,109,78,111,57,76,45,77,101,100,105,73,116,97,108,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,50,48,48,32,45,51,50,52,32,57,57,54,32,57,54,52,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,51,57,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,207,165,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,109,187,80,136,186,224,170,104,171,161,201,138,158,80,163,41,99,214,74,245,246,197,38,47,175,169,246,223,70,70,185,90,31,206,228,185,24,13,62,111,94,141,217,65,235,138,57,190,118,132,19,88,244,32,102,57,38,55,71,188,126,50,145,122,5,160,21,159,13,60,170,201,110,254,160,49,254,215,210,161,7,203,161,142,16,88,90,255,220,40,175,191,32,224,97,25,147,213,18,223,36,170,58,3,12,21,243,59,58,60,115,104,87,9,40,254,152,81,160,67,140,162,90,165,70,172,25,141,115,236,194,227,126,202,253,133,32,145,124,124,69,184,94,198,124,212,194,30,143,245,16,157,106,183,123,11,120,137,234,203,135,35,252,37,2,175,230,132,233,158,24,63,170,20,237,104,204,166,208,46,235,78,72,163,16,222,111,136,239,180,88,22,139,186,227,237,47,4,201,124,174,178,192,50,203,43,242,155,233,31,132,242,191,170,248,155,123,86,81,146,69,92,63,161,117,89,101,118,201,236,53,154,185,23,220,91,222,182,85,219,185,43,51,64,54,196,67,121,125,218,124,65,25,35,37,115,242,217,69,41,178,14,204,100,88,107,223,219,199,91,180,81,176,230,231,98,65,99,211,61,185,228,78,70,99,153,239,198,181,5,215,210,118,239,123,213,175,37,165,200,127,17,109,58,45,213,107,73,188,243,207,110,140,37,34,185,99,54,53,148,229,170,22,235,166,0,46,81,205,175,254,76,235,32,44,171,226,0,217,157,92,98,98,30,175,129,207,234,51,173,205,72,36,38,249,235,93,132,146,101,177,179,91,0,42,185,176,72,219,66,243,32,202,118,185,5,31,29,51,73,57,157,47,24,67,228,67,184,62,51,68,233,0,221,216,188,212,175,145,210,6,238,195,175,73,192,47,208,220,67,106,175,219,222,51,185,110,242,79,122,170,231,217,45,27,138,71,57,107,176,225,48,69,253,83,96,219,217,188,149,34,109,42,9,38,37,190,1,123,180,8,200,127,177,99,50,110,52,24,20,162,122,121,129,104,167,190,62,4,56,117,41,23,69,34,43,21,173,25,251,45,193,203,238,118,158,168,210,47,232,6,204,6,23,79,164,130,53,58,228,83,231,154,97,210,222,150,162,230,243,105,30,115,38,27,70,211,48,208,186,120,72,18,158,142,162,248,194,201,226,210,253,166,3,216,32,68,146,11,230,245,39,105,248,197,243,64,99,204,119,221,138,83,152,226,128,7,122,195,154,182,53,24,144,65,107,56,254,185,80,123,142,38,125,53,64,241,206,233,180,149,251,251,217,71,186,175,143,147,0,5,221,210,84,63,150,84,24,91,159,78,59,243,197,125,129,120,99,139,196,61,247,7,87,215,27,195,14,130,158,206,108,15,149,66,114,232,2,103,251,9,220,133,43,76,25,192,54,227,179,224,153,121,40,145,163,214,133,223,75,71,103,40,226,164,157,87,211,199,54,41,218,153,3,30,224,213,19,121,234,99,146,36,48,96,18,144,198,148,184,100,6,49,185,232,125,96,125,7,199,120,190,37,129,15,225,37,181,71,107,150,176,29,219,48,222,141,183,78,144,61,210,52,121,163,88,27,193,185,48,219,154,106,57,219,101,229,232,143,53,116,101,222,12,60,153,94,123,79,150,191,153,186,153,162,12,63,31,94,209,135,126,249,117,70,151,30,190,130,124,74,35,44,194,11,38,34,232,85,54,153,3,6,26,199,250,111,7,246,61,129,242,169,66,179,28,253,205,81,19,71,31,6,156,234,64,191,37,247,49,157,45,73,128,71,6,110,240,175,178,32,254,27,20,248,244,135,97,242,148,53,199,66,91,118,132,212,80,213,165,140,95,98,204,41,68,87,232,128,84,155,5,126,162,149,66,239,81,77,250,243,109,109,82,12,1,38,105,97,14,153,97,133,188,17,242,55,129,96,201,195,253,165,79,114,112,183,11,127,105,68,130,188,13,10,85,17,118,139,74,46,247,201,47,132,3,152,11,107,163,109,19,221,170,192,33,48,146,185,251,241,217,64,62,204,7,44,24,18,242,132,221,27,36,5,150,36,107,81,75,14,42,219,153,242,160,205,195,17,17,159,214,80,170,253,129,25,73,216,114,50,192,186,206,155,165,133,74,52,196,103,9,91,123,216,129,27,243,97,22,232,71,161,207,139,249,207,249,102,210,127,127,128,176,158,158,106,25,253,247,25,178,236,63,183,100,239,65,66,229,203,185,33,111,79,58,15,11,158,73,211,215,12,216,60,116,230,43,185,172,151,240,246,136,207,217,33,25,210,81,216,181,104,78,177,237,57,65,214,96,112,92,117,115,205,129,240,33,49,58,242,67,120,54,90,114,45,39,71,202,39,161,250,143,144,20,234,51,8,249,96,143,70,174,155,194,148,209,100,125,95,211,142,95,15,237,108,82,131,27,27,223,220,107,208,250,226,152,87,164,16,212,189,221,160,58,24,98,24,199,205,149,51,219,3,221,255,141,170,203,200,36,129,88,32,166,162,201,200,140,235,116,167,233,30,231,83,108,41,221,135,161,199,72,31,237,20,65,49,93,118,4,46,233,11,104,8,226,65,191,28,101,21,111,101,94,36,207,186,60,56,36,76,137,171,173,150,114,161,78,80,214,170,196,97,172,27,90,113,197,85,1,45,208,26,246,71,8,154,206,89,135,112,79,62,243,143,13,63,17,171,31,236,76,178,1,63,109,214,154,179,238,248,231,237,195,118,206,177,87,118,91,175,50,78,12,33,161,11,175,207,81,18,99,179,167,106,238,188,213,73,106,17,119,162,38,154,226,11,249,231,50,159,230,181,65,245,14,196,59,236,40,111,99,156,151,156,6,37,224,13,50,33,199,133,55,103,186,15,226,77,65,217,65,102,173,103,79,223,97,238,139,245,35,213,145,27,169,152,239,79,72,148,246,191,237,8,160,170,210,139,206,63,131,97,30,6,15,3,26,82,73,229,82,68,159,41,82,232,126,216,85,29,169,187,148,114,108,144,58,65,73,169,135,1,249,26,188,152,163,80,106,16,172,42,88,47,13,10,233,168,129,255,14,198,110,18,230,89,241,158,191,112,87,63,73,2,91,52,208,104,156,188,237,104,72,46,82,56,219,137,41,242,227,137,18,74,176,56,206,211,171,226,98,126,254,44,155,8,78,13,10,40,245,22,244,15,168,125,45,36,37,191,24,122,146,0,201,218,68,15,143,77,240,54,17,94,144,105,242,222,243,63,148,105,144,96,92,67,65,255,222,97,132,242,167,71,203,190,77,90,140,22,51,119,20,180,243,225,177,21,143,210,88,139,190,20,180,233,49,156,248,188,167,85,139,195,149,195,189,156,14,205,62,199,83,38,24,142,45,61,140,68,104,9,94,237,84,73,198,49,159,221,13,10,43,231,160,239,93,179,22,132,131,111,182,198,250,69,249,193,133,227,115,179,38,178,91,20,166,150,49,73,159,176,91,179,112,1,102,6,176,180,112,100,46,63,87,95,76,209,197,198,67,205,68,202,200,134,31,96,135,69,235,193,57,194,149,236,77,17,84,66,111,116,178,208,91,230,117,177,210,47,104,112,102,23,15,94,255,50,106,22,99,97,49,61,196,70,251,227,13,10,30,16,160,194,45,74,174,179,177,255,147,177,180,205,13,10,6,32,80,209,148,121,184,43,40,120,57,181,186,225,19,102,2,34,180,55,218,47,73,119,149,163,141,185,33,42,83,191,69,105,171,46,173,241,212,146,127,219,69,85,209,77,246,126,67,84,227,241,215,45,110,134,32,148,207,32,80,113,164,56,44,61,206,76,165,21,123,161,34,201,138,211,51,12,243,151,142,83,163,120,244,221,170,180,156,61,13,10,234,200,71,70,120,88,137,138,213,112,38,34,76,69,13,10,206,159,209,16,5,239,178,207,74,176,188,196,60,166,135,184,159,49,191,105,128,99,173,135,165,235,91,160,67,28,145,138,135,24,76,212,130,163,197,125,47,72,198,87,184,123,70,45,0,121,38,71,201,219,142,72,2,200,230,169,47,228,227,205,188,153,32,74,166,173,19,155,57,111,115,164,72,255,75,143,127,42,240,76,101,30,204,110,18,19,159,227,13,10,144,69,103,255,64,139,127,59,21,5,38,160,138,229,198,102,246,224,196,226,171,200,185,147,122,172,251,212,112,5,81,244,148,137,8,61,17,20,17,134,21,112,66,135,70,168,114,52,137,51,26,214,134,36,79,51,24,224,21,170,104,89,12,50,152,100,207,212,156,116,252,81,69,246,175,228,141,16,209,144,212,30,238,210,152,24,153,221,61,131,238,68,232,83,43,44,212,18,233,102,141,143,187,111,183,76,235,207,253,3,90,97,156,18,179,83,110,206,95,223,29,117,11,28,65,80,174,206,27,99,152,246,234,155,36,81,219,68,188,99,197,229,12,228,75,192,169,28,63,230,60,98,214,167,50,122,178,79,161,201,237,145,132,164,44,59,255,229,206,149,89,137,238,64,9,235,162,241,217,240,19,131,61,195,77,138,123,19,32,52,135,44,134,45,232,85,151,176,5,109,70,99,186,3,88,158,191,6,113,225,118,68,131,33,55,220,3,65,77,133,51,3,181,98,215,166,150,244,144,82,24,153,250,75,204,158,135,140,212,198,136,165,197,49,14,7,252,218,28,52,224,61,62,208,186,36,24,245,219,154,174,84,25,224,180,63,195,9,88,73,13,59,81,34,73,77,120,88,225,51,166,245,34,6,241,241,32,230,175,151,186,153,146,80,124,3,113,209,214,114,235,59,4,185,80,104,75,78,135,78,225,129,43,63,21,62,0,168,191,252,216,181,147,52,155,79,180,187,32,149,84,70,180,180,17,40,166,125,81,3,44,5,231,212,37,20,201,223,41,116,249,254,69,76,72,220,171,53,184,185,158,72,122,119,222,170,115,193,52,13,10,191,27,121,101,31,77,167,187,146,238,132,31,90,146,234,206,180,181,186,37,132,98,178,250,234,232,237,46,39,103,34,216,165,141,221,171,141,233,99,222,118,24,110,118,92,157,130,166,32,30,86,12,129,130,76,139,202,28,201,217,6,45,185,88,57,60,59,220,123,20,160,101,147,89,36,174,226,92,133,67,237,130,145,133,208,31,173,97,113,13,10,69,145,118,104,178,253,138,127,142,3,48,225,238,250,141,78,231,178,119,51,153,192,241,101,110,135,39,15,231,247,16,15,136,201,79,106,137,184,148,151,139,224,225,133,235,233,193,13,10,153,185,135,52,135,15,186,107,46,56,27,36,187,113,163,248,193,241,53,178,237,7,23,155,118,195,217,188,218,193,184,88,78,66,56,9,173,124,17,25,6,140,187,125,252,141,242,109,168,253,38,217,191,61,65,184,20,184,221,232,13,70,46,241,197,207,95,175,177,241,40,142,227,179,89,237,133,121,178,80,220,122,207,205,70,13,10,161,87,119,191,231,156,218,102,129,0,110,159,143,104,164,62,137,19,31,142,160,30,97,230,125,112,78,211,241,38,61,129,172,29,136,70,179,234,109,232,113,160,42,168,185,64,87,58,1,215,191,78,204,158,90,49,43,181,151,118,8,184,184,135,181,254,110,98,140,68,197,13,0,237,136,129,202,38,87,168,15,28,251,40,142,85,64,117,246,73,27,233,89,241,65,143,84,240,67,89,223,160,215,60,25,182,120,218,49,122,163,8,41,104,190,82,242,50,41,163,161,161,20,145,162,193,103,155,221,231,248,236,44,124,46,116,175,2,41,143,214,250,171,152,90,110,176,210,30,46,200,135,186,199,162,131,55,34,15,226,119,3,96,47,132,76,77,200,14,153,147,7,234,217,19,207,181,71,156,22,238,62,202,119,234,65,145,189,52,206,247,114,196,118,167,142,193,168,18,132,232,122,24,149,210,93,29,211,39,81,103,206,209,227,128,147,121,250,211,24,153,83,151,150,210,51,222,70,86,228,204,193,94,4,68,210,232,103,163,249,239,149,170,82,213,190,147,156,32,246,168,168,18,193,204,2,124,135,232,116,126,204,149,191,115,234,191,157,64,41,73,239,203,80,211,24,14,117,108,109,66,198,239,141,101,232,95,23,153,188,239,252,184,184,204,249,80,76,46,195,179,93,210,222,217,252,21,141,109,151,80,7,191,110,252,59,224,47,146,111,119,185,26,135,11,171,98,175,61,168,152,49,240,1,27,79,20,176,166,229,15,222,100,8,58,167,61,186,179,95,218,114,238,84,238,121,83,183,246,255,139,101,44,184,107,51,208,98,18,106,41,241,110,49,42,4,187,213,151,58,80,227,108,99,32,64,6,149,19,110,5,163,102,107,146,27,66,205,235,186,27,164,62,13,10,33,58,145,21,134,212,13,25,80,73,188,218,112,150,89,114,60,254,195,177,254,90,49,76,89,39,191,92,161,194,27,179,236,132,205,90,215,159,106,194,227,35,18,150,246,123,141,147,147,108,223,180,243,95,125,100,151,119,75,80,74,154,161,125,169,58,13,10,158,253,105,188,92,216,42,3,116,216,217,28,27,105,36,49,162,210,210,36,64,164,215,218,52,90,239,145,96,242,221,233,224,93,153,202,104,234,70,229,159,107,164,188,76,250,62,249,45,141,35,15,9,45,246,244,87,196,45,7,165,249,254,34,155,236,116,251,42,59,5,169,127,226,196,148,52,64,35,119,52,49,5,33,113,249,135,250,122,191,124,236,131,107,235,166,89,235,71,80,47,79,192,238,56,210,168,187,8,70,14,28,180,51,244,217,62,247,174,101,118,108,220,195,226,52,63,24,65,164,215,223,189,91,153,151,133,21,189,43,58,172,198,212,33,36,228,18,100,48,125,155,52,20,148,189,236,11,230,222,31,248,104,185,190,119,98,222,156,222,209,94,159,47,138,58,13,89,111,78,29,147,224,112,233,171,44,60,246,1,185,69,47,211,100,17,207,40,99,177,75,238,246,154,110,153,16,111,21,119,169,62,18,192,97,123,207,129,245,63,140,246,242,103,179,87,21,30,206,134,4,159,128,112,63,134,217,90,192,200,210,85,136,241,104,146,36,222,53,31,72,9,232,17,224,202,46,82,160,235,43,60,59,230,135,99,95,32,209,187,186,255,65,206,141,6,98,35,176,85,145,143,232,118,236,151,202,6,36,202,217,29,94,184,139,172,112,215,5,196,211,245,49,208,116,103,115,109,246,30,43,126,214,11,193,91,80,81,74,42,175,54,6,103,126,157,59,245,115,67,29,2,9,185,38,56,148,212,121,175,12,7,165,14,92,229,33,77,207,168,116,221,136,7,40,64,114,67,30,50,211,36,121,140,133,230,199,70,4,196,80,179,221,106,226,141,235,51,63,111,55,155,58,32,225,12,39,255,197,78,17,170,37,72,198,33,28,215,127,250,242,117,207,177,251,127,215,255,5,152,20,193,35,202,98,71,247,26,47,188,148,188,175,142,81,182,191,144,180,42,110,218,156,111,231,28,246,209,233,66,191,159,113,68,126,244,143,250,116,242,84,78,228,5,92,172,123,130,244,161,188,38,195,90,249,3,210,195,202,153,92,183,54,204,50,71,106,52,220,42,101,151,11,2,190,57,120,89,215,233,224,39,135,221,227,20,154,24,249,157,155,103,198,96,37,126,70,143,205,230,40,208,28,91,14,143,245,246,200,186,180,229,162,226,230,179,161,227,38,158,216,4,131,52,33,181,211,231,151,73,63,101,231,110,68,117,89,158,50,141,4,219,84,74,235,89,179,56,100,195,78,6,218,117,175,245,114,70,30,153,95,103,205,89,197,150,189,222,240,209,176,65,108,102,178,34,173,164,2,188,11,81,89,104,59,184,57,161,94,108,125,95,88,134,48,117,172,136,217,216,145,95,188,162,237,180,181,251,16,41,193,111,232,212,147,67,106,177,160,47,81,76,34,38,3,200,240,254,81,249,121,221,242,20,0,250,88,239,108,227,45,34,122,149,50,160,82,78,73,164,214,198,147,235,52,245,115,47,138,143,127,162,211,1,177,173,149,198,58,236,78,154,59,169,66,197,129,182,247,75,79,0,112,169,180,242,59,32,48,88,116,212,174,201,103,4,189,70,125,119,82,104,85,250,116,151,93,28,213,231,13,1,133,166,17,159,17,24,149,148,60,108,229,78,190,91,83,41,154,179,204,181,178,158,19,69,216,82,182,121,142,20,204,26,42,241,94,59,245,39,229,76,77,83,48,21,87,30,55,206,123,150,239,169,110,22,87,4,90,97,179,174,123,120,161,226,129,253,172,55,130,218,142,183,39,177,250,104,153,72,15,127,125,121,50,37,107,254,65,251,218,17,181,90,118,249,158,142,135,234,239,34,209,230,245,6,238,230,15,102,61,93,61,49,124,220,116,22,84,112,74,64,53,172,128,93,170,248,11,228,217,85,120,180,197,169,186,224,229,55,101,59,218,177,107,160,57,226,66,67,115,21,127,50,80,154,57,193,32,120,50,183,7,162,54,199,164,225,207,207,196,103,77,197,140,166,172,225,122,104,129,185,67,60,28,31,223,61,164,59,27,176,240,194,169,155,205,212,130,44,58,47,196,233,126,214,200,213,186,230,180,133,8,57,186,134,248,118,251,233,9,205,187,131,74,53,189,216,173,80,4,65,217,203,251,123,234,239,179,204,34,14,39,175,20,62,233,245,150,198,6,83,112,31,5,240,141,18,218,196,199,218,76,133,0,201,169,5,113,173,5,254,14,46,166,226,253,114,236,235,192,126,87,181,214,152,53,49,97,178,209,47,207,71,243,43,85,243,204,63,26,34,90,86,143,138,118,108,80,183,247,194,202,7,125,128,66,193,87,50,108,186,104,240,105,26,208,188,182,176,0,92,69,158,154,199,106,142,161,36,17,101,139,136,164,59,92,244,170,60,244,40,163,60,249,102,240,82,241,79,170,231,49,130,91,107,94,130,154,96,113,40,152,222,146,76,163,214,82,20,183,194,235,209,239,148,2,44,108,224,177,129,230,124,13,220,175,6,3,90,77,76,94,26,146,202,120,24,166,7,245,129,85,25,101,128,237,120,20,94,248,214,188,75,4,139,135,67,23,186,184,233,67,137,186,56,246,117,148,199,23,238,82,47,167,43,174,91,59,174,245,224,206,29,215,79,28,96,1,94,174,100,74,153,43,139,233,175,68,217,137,188,174,204,184,163,67,190,240,96,185,105,212,67,138,152,222,224,169,246,66,102,16,107,203,118,60,242,114,49,13,10,202,157,156,125,123,161,65,34,15,22,250,207,43,53,120,203,103,0,198,238,50,37,53,84,52,243,39,188,49,29,104,47,154,30,24,93,238,122,255,105,160,193,208,36,105,218,108,235,208,23,121,182,48,187,109,53,31,224,182,29,229,67,132,163,215,70,18,160,191,44,61,171,11,240,105,169,13,115,30,93,203,184,102,243,20,138,226,42,49,131,169,42,177,173,34,57,117,189,91,5,97,81,13,98,248,129,182,40,239,126,218,19,190,234,2,100,211,158,61,3,137,37,3,137,105,38,252,129,205,136,135,138,24,173,224,105,206,213,105,58,120,131,102,122,46,27,72,22,172,134,205,106,198,79,96,255,235,59,235,147,183,201,4,32,255,75,138,208,161,128,240,88,79,191,13,69,28,172,197,148,237,15,149,224,177,208,79,49,22,194,152,54,249,62,219,153,66,182,209,194,155,188,59,166,168,9,152,86,6,175,203,219,172,122,195,250,61,73,177,104,207,205,13,10,240,12,255,201,108,153,149,86,118,49,16,207,203,77,206,179,9,3,70,15,184,51,116,107,227,249,42,126,98,5,252,224,206,209,115,201,48,143,29,245,229,160,239,5,202,253,125,169,103,222,49,149,122,31,92,78,191,75,132,252,246,27,29,129,117,186,228,157,102,79,82,13,10,126,43,113,78,58,203,190,3,166,2,160,34,173,150,239,112,40,107,121,229,211,99,238,123,198,233,220,82,87,204,7,76,76,173,138,26,33,12,39,45,38,194,109,76,17,254,45,167,77,124,112,57,89,216,187,130,203,111,62,224,227,40,64,233,149,203,29,197,161,81,239,143,146,129,90,107,175,237,195,153,200,179,6,252,22,58,67,19,197,141,159,41,181,181,22,4,190,192,139,133,197,106,39,75,13,10,69,12,137,73,106,126,141,7,211,235,170,153,134,102,144,200,141,40,130,238,244,182,152,187,23,221,206,95,194,130,37,179,105,13,10,191,161,26,206,104,93,125,21,61,9,96,109,107,251,13,10,99,195,72,180,69,177,59,15,108,138,13,150,119,32,148,242,58,30,128,151,108,227,211,195,175,173,8,105,0,58,198,46,252,229,59,104,86,114,229,181,221,3,67,154,244,197,183,220,89,215,165,117,255,175,84,111,19,240,20,234,105,1,53,107,163,172,181,81,76,92,28,4,215,104,102,246,48,153,44,64,111,160,23,8,209,31,41,49,153,151,117,255,103,85,168,120,75,129,26,198,197,111,108,150,185,80,218,131,200,202,51,51,98,174,176,208,64,22,52,93,122,23,56,251,105,153,150,57,243,243,147,228,51,18,8,101,172,195,132,70,139,44,174,241,178,16,9,151,79,252,97,70,5,49,141,187,66,124,92,150,231,173,34,52,234,90,155,180,16,82,0,187,170,54,149,174,220,11,100,230,71,57,231,77,30,229,93,245,187,216,214,176,253,233,238,242,83,159,117,29,199,195,45,20,87,49,117,112,47,78,170,126,9,0,149,179,142,18,170,222,248,243,227,218,37,11,139,2,131,94,116,133,151,205,82,151,156,211,109,118,36,24,145,43,185,248,77,220,179,138,7,119,89,140,125,214,36,19,148,159,163,31,132,101,7,207,245,213,253,235,38,172,227,29,199,8,98,141,252,34,247,204,39,153,7,227,155,104,170,97,111,74,144,85,42,171,218,85,206,85,17,168,64,77,161,205,233,196,141,252,60,169,185,83,202,55,102,155,62,182,116,89,193,153,176,206,240,217,121,44,89,125,253,72,206,246,24,159,17,129,25,44,196,219,50,111,193,144,12,16,81,81,111,63,3,28,155,186,91,214,97,131,6,132,222,90,210,208,114,169,64,170,249,38,228,67,73,210,95,70,177,82,46,218,125,115,80,20,83,109,131,153,182,236,152,202,175,183,153,59,167,121,93,52,207,197,40,166,227,161,79,139,90,116,64,14,23,92,126,195,236,61,231,192,186,134,101,24,100,138,165,234,170,167,142,98,186,70,118,134,13,15,223,199,86,181,120,94,28,142,78,174,0,19,3,192,168,172,23,36,27,37,157,25,147,70,178,211,70,14,101,104,198,231,49,156,71,242,69,209,157,114,21,68,138,125,47,34,2,172,104,96,92,189,153,152,36,13,246,207,24,73,230,185,150,219,43,186,239,151,89,147,109,52,236,207,20,238,47,240,68,59,4,101,195,139,136,52,153,66,39,253,123,193,253,59,55,128,214,155,74,223,49,107,153,47,167,60,251,143,88,213,179,145,165,210,223,7,124,82,123,97,93,119,180,227,20,152,202,200,187,97,145,4,64,70,252,206,34,228,149,121,156,225,206,50,229,198,192,67,196,124,235,97,14,156,251,228,138,209,132,2,45,75,8,1,47,175,233,96,210,248,137,1,138,164,201,19,83,87,101,1,89,22,191,237,47,184,44,60,53,50,189,92,172,225,14,143,174,138,41,103,73,13,142,218,115,250,48,226,241,157,220,1,103,255,228,224,18,199,177,159,27,27,229,84,211,81,9,174,233,109,61,195,45,229,247,122,190,53,178,214,117,72,59,198,138,177,30,198,121,13,169,166,69,106,37,44,74,104,56,0,106,60,17,106,24,77,63,189,5,175,209,141,245,111,49,180,55,159,61,139,65,118,138,168,21,57,108,49,170,71,248,77,174,126,74,201,196,1,21,80,168,110,13,10,250,1,175,176,33,144,65,25,178,189,76,169,222,89,240,131,62,145,208,248,207,137,244,82,207,23,211,49,36,49,119,87,202,33,8,147,212,234,126,147,162,81,211,13,175,120,119,249,178,116,12,38,158,132,79,255,133,242,19,26,135,197,155,164,126,92,120,95,1,30,141,32,28,107,83,243,24,158,137,171,33,110,55,86,80,147,70,18,142,186,175,8,147,146,188,190,185,130,155,52,24,139,89,204,42,178,31,32,71,120,34,109,112,108,84,171,97,71,152,188,252,212,238,187,240,114,192,11,162,250,125,58,33,38,38,65,41,64,56,54,59,192,26,143,104,150,149,158,219,154,173,216,70,225,58,251,245,43,141,49,177,206,55,245,13,10,116,26,88,194,227,120,28,6,192,20,242,210,217,163,158,89,191,42,101,163,84,192,220,20,36,39,239,4,53,254,187,14,179,128,177,118,96,12,148,254,207,64,80,20,151,37,238,232,59,13,161,223,232,124,207,95,160,201,72,185,2,59,234,208,76,242,13,10,244,145,206,16,197,101,63,87,18,102,60,236,103,23,154,151,40,165,199,174,25,195,209,9,9,194,30,133,96,13,203,123,227,24,56,241,171,248,131,34,42,133,150,181,178,149,17,207,219,72,4,222,139,200,219,1,133,147,159,192,212,212,101,91,187,33,202,234,68,234,136,40,251,125,202,21,32,20,114,147,221,97,31,60,230,155,202,40,248,75,7,225,189,130,252,13,10,18,54,222,125,96,55,234,220,223,125,181,79,103,11,132,5,46,159,148,137,131,31,5,111,130,57,149,40,18,239,118,245,43,40,162,4,16,145,72,246,210,254,39,231,82,19,227,185,108,226,136,197,178,72,109,97,190,211,92,42,149,182,77,12,32,186,89,67,46,0,161,247,69,99,250,248,49,177,80,233,110,235,171,130,192,251,78,240,7,235,184,104,218,244,235,178,129,142,44,12,137,130,207,136,165,23,254,111,156,84,153,216,101,39,149,225,230,132,205,156,127,115,118,255,71,60,84,135,220,176,80,245,196,204,94,205,4,19,249,165,251,200,43,5,149,56,193,249,8,126,111,198,30,223,233,210,81,111,84,249,177,205,120,242,74,183,111,254,142,52,182,14,82,221,28,133,23,78,68,89,163,123,199,188,66,72,34,2,111,130,159,7,36,219,106,17,167,155,227,229,248,231,215,15,189,63,156,249,31,157,31,108,176,12,157,75,219,157,214,241,12,73,112,110,69,156,216,251,110,88,66,170,218,221,182,9,121,149,160,80,245,6,122,196,53,162,28,133,234,163,153,185,88,49,220,197,127,117,95,114,223,120,60,83,50,104,90,196,55,227,234,98,111,164,60,70,85,231,161,13,217,195,25,90,73,50,253,102,92,12,161,149,79,90,36,198,162,42,17,83,98,165,157,83,91,84,59,199,216,130,167,217,219,174,64,192,201,14,217,114,39,215,147,125,118,116,34,168,93,156,123,36,17,131,118,207,150,155,230,141,174,177,83,203,122,133,21,213,208,157,209,7,246,130,217,220,89,211,66,171,32,9,240,107,103,142,225,13,10,9,227,155,37,208,195,68,32,153,31,59,31,144,13,10,179,56,193,217,253,98,83,4,219,122,1,248,208,86,61,120,192,232,111,244,140,221,164,155,80,207,225,209,35,215,177,63,160,102,40,195,152,98,93,80,179,219,208,145,199,212,27,13,123,26,76,249,244,150,170,72,28,142,36,32,100,55,133,16,49,193,13,224,145,186,188,211,229,230,171,40,74,29,171,59,184,90,115,28,57,78,187,28,133,143,250,108,127,70,176,83,12,70,152,24,167,204,194,167,51,53,40,192,133,8,76,189,113,146,217,241,167,113,211,119,128,12,68,211,135,203,152,96,34,134,174,223,185,54,87,41,190,188,225,78,235,142,117,103,83,17,179,188,144,239,249,134,133,94,188,35,153,131,43,46,178,23,208,61,148,2,230,83,170,212,208,128,79,84,56,72,28,124,13,10,1,0,241,151,142,4,219,248,62,21,42,113,5,249,66,220,28,209,170,163,45,245,115,96,47,182,174,25,175,189,60,71,31,0,220,214,199,26,81,1,165,215,201,168,221,144,132,167,54,230,243,236,103,158,28,99,232,36,56,247,32,165,9,16,29,1,99,220,19,8,107,152,21,177,130,107,38,107,166,56,248,198,140,74,240,171,56,82,145,154,25,75,18,232,45,220,11,198,38,103,233,42,39,183,243,143,164,91,136,9,180,221,157,172,34,168,69,221,150,78,234,6,178,50,123,93,201,202,155,159,227,184,132,191,128,173,220,7,84,69,19,139,121,140,184,147,149,231,232,135,80,190,19,230,118,105,27,14,44,23,243,62,234,254,190,216,39,141,162,12,139,197,223,13,76,178,181,74,78,197,236,254,189,95,252,141,157,149,251,180,106,27,75,181,115,128,29,120,101,4,101,57,25,201,39,195,18,178,102,255,224,172,106,51,112,236,243,144,58,209,212,16,246,180,87,201,101,50,207,172,174,187,148,112,241,176,175,121,58,245,166,190,145,23,125,166,32,163,177,69,142,169,13,104,66,162,20,125,163,213,127,187,21,63,101,56,4,39,132,160,53,203,193,122,14,7,109,175,152,227,212,252,20,67,168,251,1,84,90,192,181,77,166,32,50,73,155,111,113,198,47,16,201,218,159,56,111,207,206,173,230,105,208,184,209,175,2,224,221,86,183,114,77,202,123,177,160,92,99,216,123,61,3,25,196,205,166,120,214,36,228,4,209,93,198,158,96,80,203,25,218,143,223,234,187,61,150,66,178,22,135,138,83,147,118,197,70,246,41,96,138,56,185,128,102,212,130,249,21,58,28,249,240,159,217,33,196,93,190,70,7,119,8,206,177,203,210,200,93,8,52,143,106,58,44,135,104,204,58,249,160,193,214,189,107,38,125,191,25,176,38,117,12,251,138,209,150,171,211,159,242,149,186,110,8,71,176,38,146,28,134,9,139,29,186,113,225,205,108,242,91,222,158,68,229,158,160,58,182,147,78,154,78,97,16,46,255,192,28,115,194,141,112,78,50,107,114,84,186,15,59,54,29,8,21,18,235,191,137,109,141,20,155,192,171,136,212,0,169,167,205,30,123,121,158,198,59,143,217,79,245,80,127,147,92,239,225,222,100,181,135,1,243,220,52,83,38,179,102,193,39,47,189,234,242,124,70,248,122,190,160,110,23,82,208,157,14,186,67,67,241,140,226,228,132,42,33,58,191,63,209,68,195,133,95,3,251,144,34,148,95,43,9,144,42,254,19,81,212,191,95,127,19,228,144,6,32,254,214,44,254,55,162,223,28,94,237,6,6,127,1,162,32,114,48,128,89,119,49,148,206,32,124,13,94,80,99,74,75,247,29,14,179,217,28,210,233,203,23,97,77,13,10,26,233,25,186,189,91,88,53,192,168,224,165,26,191,125,108,237,184,181,211,64,80,192,201,148,210,250,143,78,200,14,186,96,181,60,174,206,20,165,203,34,200,102,91,164,101,108,135,186,193,45,29,156,146,162,117,142,61,131,106,244,21,205,21,22,125,34,110,192,193,227,146,105,236,7,22,138,72,70,156,21,201,110,228,128,11,192,212,198,52,214,184,249,7,9,68,12,224,53,122,222,229,152,140,239,87,201,185,60,87,92,54,63,174,37,76,115,168,6,49,143,225,19,194,254,224,190,19,112,161,241,160,250,157,86,196,53,23,225,51,32,141,112,125,55,96,240,59,35,37,103,167,180,247,176,22,79,175,3,172,205,20,127,249,208,33,239,223,183,28,3,100,232,99,127,156,197,194,162,124,51,159,61,4,131,116,205,173,108,60,147,94,86,192,113,115,146,195,142,113,74,83,137,215,68,154,86,204,124,220,67,199,86,162,56,36,235,223,26,123,100,23,6,15,100,57,233,204,166,18,180,222,46,48,135,69,87,206,234,142,242,12,39,32,162,107,182,113,172,109,146,94,93,4,12,85,91,11,223,54,91,89,166,113,95,173,69,221,0,246,177,129,109,101,253,103,41,59,197,233,251,52,228,131,196,111,202,183,12,97,253,163,216,200,81,93,95,170,46,91,80,172,114,122,138,138,132,123,109,134,246,101,27,249,73,157,105,241,190,72,218,171,239,57,132,156,61,69,124,243,247,77,16,122,115,63,69,38,146,13,10,13,19,152,214,197,51,74,221,84,146,48,3,33,26,15,57,118,114,38,254,187,111,110,189,77,50,130,246,47,228,208,230,79,209,101,32,227,228,103,197,160,46,104,143,71,121,40,95,164,68,241,182,161,26,43,153,92,255,11,60,233,74,239,132,5,127,172,80,194,82,180,133,209,147,144,59,180,53,144,41,228,235,168,228,103,13,10,205,156,66,144,135,33,46,112,240,87,100,56,203,90,55,110,85,94,145,23,124,213,13,10,45,104,1,245,239,166,81,148,104,122,22,226,0,146,120,37,23,224,249,203,181,107,120,92,35,35,207,181,40,207,21,184,183,239,156,208,100,237,114,77,188,16,105,201,195,41,49,231,44,214,170,66,135,189,62,141,69,6,201,131,53,171,61,46,227,177,217,22,233,235,246,246,104,0,62,49,150,161,176,31,104,251,15,45,166,23,100,207,94,19,28,230,147,143,68,87,42,220,233,105,88,91,121,11,211,120,255,33,229,115,89,173,114,165,183,131,93,90,88,41,56,95,229,177,223,254,127,84,175,163,248,104,56,20,130,60,179,91,76,163,40,98,53,12,188,81,91,98,114,125,0,153,193,102,209,242,59,225,194,168,143,97,125,180,97,193,162,70,152,36,223,249,127,69,118,216,209,220,22,227,18,158,193,189,19,126,58,135,39,83,204,219,60,46,254,39,233,64,146,15,126,178,78,200,3,201,156,12,177,218,127,24,67,24,107,222,128,50,61,229,228,86,84,200,39,44,148,15,68,48,49,119,28,171,132,19,209,38,97,186,107,159,207,201,150,202,160,190,208,23,217,109,170,135,128,101,129,34,154,55,70,138,243,105,0,133,217,134,0,136,226,207,161,247,99,77,126,214,241,26,230,133,241,147,145,113,104,194,99,228,151,170,88,236,240,215,164,86,194,56,62,122,24,21,171,79,67,151,47,249,87,70,102,179,1,254,236,28,46,93,75,44,186,253,67,237,187,117,173,118,63,3,249,120,73,224,11,82,251,212,241,92,163,56,2,79,248,30,149,207,154,232,47,99,101,16,170,19,247,83,209,14,29,93,17,189,90,49,223,17,217,11,185,104,19,233,6,59,35,140,214,73,121,63,21,170,109,117,183,90,208,45,195,181,6,196,243,154,39,204,131,82,90,223,57,56,90,34,78,30,115,99,51,117,156,74,57,105,208,252,158,65,61,255,237,62,225,231,33,109,152,223,28,110,103,192,66,32,153,64,248,183,134,254,9,169,34,118,217,206,20,210,198,92,62,57,167,253,183,24,49,155,17,31,5,19,168,96,238,142,52,3,247,81,22,53,147,192,95,63,139,13,196,238,127,164,254,107,39,241,133,237,101,86,68,255,162,170,145,180,54,167,70,124,50,209,99,43,11,43,13,10,177,90,135,47,104,25,163,248,157,121,45,168,170,84,44,247,89,144,97,200,179,214,154,109,218,32,225,4,176,128,12,24,177,210,114,36,158,88,132,21,65,111,3,215,139,82,91,37,98,145,201,11,238,40,224,109,6,59,101,178,106,149,195,3,248,100,231,41,156,31,81,186,132,235,74,175,209,40,228,135,122,84,74,20,106,222,164,162,48,67,71,206,156,144,239,108,146,123,101,101,127,172,202,223,120,177,72,211,39,13,214,100,143,224,16,34,166,138,177,113,129,90,141,240,207,213,67,65,59,118,113,7,79,120,229,154,100,215,153,81,114,9,179,76,156,20,29,216,81,49,241,100,169,79,132,107,77,70,19,198,31,13,227,31,40,189,219,118,132,249,42,75,116,38,45,119,41,209,102,201,153,242,160,199,108,77,252,67,52,99,43,105,41,208,111,8,89,91,251,69,254,96,117,31,143,197,222,227,243,49,120,83,97,71,59,46,0,80,151,230,29,121,38,3,217,94,124,183,213,102,237,137,36,158,253,203,203,183,33,28,154,54,185,135,153,201,42,17,157,225,150,139,103,185,190,184,109,130,27,78,22,42,214,183,129,210,193,14,93,74,62,224,203,252,90,195,126,166,20,201,183,156,14,159,233,130,70,238,79,135,153,211,93,83,89,18,191,146,86,11,251,196,120,51,214,8,95,64,124,19,163,8,192,197,188,86,116,171,121,25,194,122,189,244,92,155,70,75,157,161,217,145,147,28,217,149,234,148,143,180,149,11,102,190,92,71,225,155,83,95,126,196,25,241,74,37,80,18,24,148,185,210,128,196,241,255,178,251,26,202,108,195,145,57,178,3,14,143,72,194,46,40,245,62,4,171,179,28,13,10,58,114,116,141,121,140,90,142,198,172,241,6,17,122,11,238,154,76,225,133,205,48,11,68,225,155,194,92,55,150,235,204,131,86,78,102,229,87,163,191,172,77,217,170,215,37,223,235,99,37,87,139,59,26,133,124,112,152,111,212,226,112,44,195,67,78,105,129,211,204,21,207,24,137,17,78,251,206,43,186,6,33,199,172,116,120,153,30,134,136,30,14,131,79,224,169,81,85,28,123,89,222,110,207,20,1,110,73,104,68,24,73,60,62,2,122,13,10,2,201,52,112,156,100,182,38,66,53,241,246,179,141,195,242,47,91,162,185,202,127,147,208,245,164,211,33,245,159,123,25,207,45,13,38,167,222,218,111,224,51,233,5,250,121,153,181,215,86,166,14,98,115,112,133,37,54,14,201,18,185,223,29,204,250,44,69,178,16,156,71,161,187,168,47,13,10,37,244,42,185,235,138,6,245,133,227,253,18,111,142,226,165,95,54,27,255,94,109,164,221,131,96,48,246,15,226,67,206,99,120,162,12,233,218,226,222,45,99,102,236,125,189,65,39,2,238,225,29,148,5,60,138,25,118,69,15,218,225,49,175,184,24,207,110,182,113,159,194,215,200,210,85,136,241,104,146,33,179,170,193,206,61,125,158,196,183,101,189,140,189,77,232,102,236,125,146,93,60,92,225,58,255,158,20,82,107,25,228,236,21,84,34,130,19,251,224,172,20,209,197,202,31,238,207,234,194,50,87,190,171,155,34,43,249,107,163,152,103,43,217,156,145,64,95,135,232,214,9,116,190,245,200,116,51,81,220,102,152,187,236,217,206,81,178,199,154,41,245,121,200,0,89,132,229,152,201,195,78,116,221,247,166,167,40,15,102,136,218,147,229,118,161,87,121,213,224,32,121,5,52,214,176,32,120,145,140,102,86,115,193,206,17,79,208,79,0,17,203,146,88,60,47,176,19,69,39,66,105,151,214,61,238,247,150,149,165,206,189,238,248,113,97,222,73,210,205,82,151,188,127,54,144,112,91,250,210,220,40,15,252,189,25,144,31,21,151,36,222,243,31,213,56,116,6,175,91,4,66,56,95,245,155,64,132,197,33,141,232,26,51,92,234,91,25,193,152,205,67,167,118,94,149,11,236,22,110,91,220,136,151,29,202,192,124,143,46,156,134,207,58,220,134,189,29,115,35,201,133,212,76,208,59,223,157,59,203,94,46,61,247,183,151,46,14,128,253,25,97,174,142,234,73,147,5,114,94,82,95,83,82,233,25,86,106,39,36,182,199,156,89,194,241,143,243,45,229,211,177,195,148,145,93,104,183,198,101,7,229,160,124,96,57,105,128,12,195,116,53,32,105,201,178,248,47,200,129,53,18,160,77,74,174,204,76,64,126,29,172,227,235,9,172,169,76,178,167,251,154,25,155,227,16,2,17,20,135,150,46,106,64,7,135,202,148,59,103,38,92,199,145,189,148,201,87,223,235,26,135,167,254,50,247,253,203,57,251,61,163,234,242,15,208,132,83,7,204,241,220,109,76,163,65,51,68,60,1,84,42,83,80,88,54,35,38,57,143,232,157,130,48,247,70,150,30,9,174,103,105,103,207,199,58,242,196,84,239,228,43,89,6,95,134,221,89,107,181,56,213,248,49,211,139,119,129,111,51,182,11,149,81,62,107,24,78,18,147,245,226,182,14,215,151,114,23,243,108,33,53,87,94,88,45,178,126,108,26,85,138,32,161,112,98,170,37,42,96,59,62,149,235,133,154,215,80,103,220,217,113,41,98,124,220,187,27,62,42,191,30,69,241,151,211,237,171,22,237,122,1,234,76,183,39,243,167,221,148,48,105,185,214,246,66,13,127,218,15,12,7,77,112,131,83,50,31,21,70,223,94,249,200,67,133,236,112,78,183,228,125,153,174,206,118,139,74,130,70,165,161,141,230,80,52,208,204,183,97,221,172,95,70,125,54,160,1,67,216,182,51,181,217,168,5,187,135,122,12,220,124,173,30,29,55,175,152,116,138,6,98,180,154,190,14,63,124,159,74,57,149,206,97,55,43,99,156,8,132,145,68,238,236,100,57,215,173,8,224,236,170,35,248,243,139,96,158,11,48,104,122,34,157,170,192,169,149,16,66,20,184,110,159,63,71,198,93,86,188,6,40,96,57,231,80,66,213,16,7,15,165,225,57,147,213,20,30,101,118,166,209,14,118,56,238,1,112,241,133,216,18,86,153,64,40,85,115,5,170,243,64,27,170,186,169,61,143,104,63,55,232,38,67,19,116,203,144,108,124,71,188,64,206,81,24,226,109,148,139,9,186,8,224,71,191,1,75,190,175,76,186,81,120,31,100,33,106,192,152,93,35,73,133,130,223,210,0,56,78,198,35,15,110,100,97,20,119,205,204,171,151,81,251,43,169,14,170,9,48,7,120,234,53,74,244,195,74,195,103,3,104,41,154,23,50,217,181,87,244,136,24,221,118,163,242,14,244,206,98,62,214,177,30,205,38,160,97,3,180,170,229,243,214,116,173,172,159,110,177,255,86,63,244,122,235,85,224,116,224,46,121,214,240,13,10,62,52,176,172,26,181,146,198,59,32,90,87,67,143,70,146,154,23,9,200,173,163,61,151,26,208,155,179,64,218,218,176,119,114,79,32,179,169,66,164,92,23,148,30,189,219,162,175,136,152,76,20,47,37,17,104,105,252,186,126,64,82,89,230,129,175,96,214,7,14,213,75,119,82,49,155,156,141,170,133,232,169,177,102,4,229,111,38,118,106,188,43,175,231,123,226,109,78,58,93,155,21,140,40,217,26,80,111,215,167,149,134,155,185,9,30,242,112,159,198,89,225,113,176,188,14,28,98,248,19,234,34,170,17,164,137,184,122,181,173,99,220,57,244,229,196,148,247,128,238,75,139,17,6,217,228,46,27,211,152,132,182,39,140,172,58,147,25,197,97,47,61,191,132,116,61,134,113,162,13,10,0,60,70,167,197,193,182,154,172,34,148,160,169,242,182,43,105,35,213,113,239,149,133,39,204,29,127,230,205,229,145,176,107,3,243,23,22,224,166,14,76,107,17,238,119,158,185,210,120,0,28,149,244,55,182,31,98,74,203,48,138,174,226,66,83,211,108,96,203,190,61,147,90,154,144,219,68,31,206,172,109,192,195,159,192,217,57,181,34,73,22,95,43,110,119,65,211,128,26,96,221,63,225,62,194,3,227,84,252,43,20,55,5,236,50,38,139,19,76,211,237,102,131,185,90,47,119,236,62,4,157,39,231,127,181,150,168,13,110,170,216,97,107,197,151,20,26,218,204,118,150,249,202,125,67,147,95,33,206,240,145,126,28,192,21,0,212,36,195,56,25,118,66,80,43,216,97,254,167,118,54,144,152,114,251,36,211,174,50,79,170,148,242,196,28,245,124,179,86,168,108,236,210,116,114,206,83,78,13,185,81,81,117,154,189,117,133,23,219,71,123,17,151,70,251,20,96,148,152,46,231,81,218,53,200,136,40,241,141,222,61,219,76,138,114,22,195,127,162,125,60,174,15,118,226,25,63,200,121,113,230,45,232,125,161,79,150,128,176,122,184,33,89,195,242,189,250,67,211,179,188,217,54,50,143,237,181,199,200,147,151,44,77,161,176,152,26,254,96,195,42,99,204,8,44,67,170,39,93,190,179,187,135,106,14,144,1,0,127,250,133,20,48,203,183,14,47,40,161,226,150,65,197,58,148,196,81,116,4,203,168,139,245,122,76,150,210,18,183,13,10,216,169,7,223,232,164,71,132,62,15,38,235,237,141,111,200,13,10,5,226,202,214,212,69,197,15,53,111,241,212,49,171,140,37,72,143,183,7,37,111,181,207,112,131,128,223,118,133,230,63,113,74,84,60,216,255,141,164,1,135,133,204,77,176,20,199,20,107,74,129,207,221,63,85,174,69,54,120,105,194,250,239,249,180,254,235,89,202,253,180,93,107,196,68,23,232,203,142,215,44,77,70,143,104,203,253,127,179,247,123,129,43,5,62,232,197,139,241,119,93,97,17,88,215,203,22,219,67,48,126,118,193,62,211,118,85,244,88,154,48,205,54,69,51,94,166,238,14,135,2,96,74,224,93,172,227,200,37,57,15,7,215,111,173,120,40,229,226,3,243,163,168,79,35,162,71,130,18,164,50,174,16,228,157,25,39,7,177,186,106,47,45,2,95,153,219,41,25,146,55,185,141,164,2,196,2,146,201,94,33,76,71,117,88,236,72,55,14,171,78,24,74,18,58,32,41,166,196,219,247,247,16,152,8,31,51,119,22,169,218,123,107,145,53,14,54,213,16,32,219,188,199,98,242,188,147,15,149,43,213,103,213,105,41,165,81,184,128,121,21,234,122,241,94,146,170,64,66,88,18,197,197,117,208,156,226,211,169,112,107,167,243,66,173,168,80,27,136,254,156,112,77,143,92,90,9,6,167,112,248,37,224,105,189,117,3,61,123,190,205,190,212,8,45,29,130,158,43,78,167,75,85,89,244,241,85,102,172,41,78,24,35,45,206,27,83,52,222,62,122,81,144,190,163,147,76,165,84,163,157,44,93,80,202,86,185,106,146,177,4,210,182,83,185,58,247,104,102,104,162,214,17,159,39,24,86,187,2,249,72,29,175,193,80,42,25,224,189,17,58,255,3,171,160,79,190,93,181,242,189,102,114,106,84,191,5,173,55,207,115,179,167,200,92,93,20,131,52,138,170,175,82,103,57,54,9,239,29,193,0,156,30,157,40,68,170,242,124,213,114,108,150,140,51,119,41,187,145,168,101,167,52,177,18,48,85,18,226,164,96,98,11,142,208,55,167,191,183,205,36,0,100,92,208,173,248,154,153,66,127,186,27,170,161,154,141,194,229,162,165,7,175,174,164,150,128,17,126,72,86,219,120,54,209,213,130,232,128,99,119,176,23,209,187,35,76,117,119,8,12,79,131,32,159,31,205,225,189,185,0,11,120,104,70,78,240,75,156,24,20,28,127,100,151,197,95,86,18,76,182,158,217,239,249,50,73,89,180,102,97,250,137,24,132,162,63,94,25,6,162,147,11,67,78,69,210,89,95,170,158,199,127,200,196,152,193,205,220,65,174,253,68,154,148,120,199,193,161,209,91,82,55,28,197,51,1,97,106,137,119,65,84,49,55,157,173,96,206,247,72,231,192,240,89,91,7,32,57,66,134,17,156,227,172,193,192,163,251,139,59,180,37,178,125,38,40,230,125,238,3,94,247,82,43,74,214,129,228,180,54,189,36,66,226,67,127,123,79,232,197,40,173,236,8,222,20,36,210,66,9,16,44,126,167,13,10,155,90,100,116,129,211,132,2,116,104,154,156,110,69,177,54,121,163,58,3,38,215,175,171,49,216,1,233,22,141,73,182,12,164,162,113,22,8,104,147,217,131,183,129,0,22,19,132,87,167,44,38,167,124,4,154,130,169,181,44,171,61,91,202,79,90,104,75,111,119,134,132,53,248,173,9,221,36,246,249,16,37,81,73,138,141,77,68,56,234,80,252,56,89,192,204,215,4,67,226,45,190,236,12,93,220,191,50,18,48,18,194,18,60,96,29,87,247,82,124,251,21,249,6,177,88,96,130,141,96,204,140,12,23,146,60,76,214,48,92,96,199,235,112,61,66,180,193,6,77,222,86,199,107,170,137,137,89,105,192,115,124,66,51,147,31,18,79,101,188,92,47,113,39,35,223,243,79,149,36,129,39,168,16,63,220,208,121,219,104,202,141,104,122,198,254,36,98,137,135,50,165,0,203,95,124,180,152,42,133,234,156,235,83,99,229,254,178,55,79,248,170,205,109,62,18,230,231,134,105,206,50,168,12,240,180,235,146,67,63,58,200,35,81,58,218,175,104,72,238,172,210,182,234,155,249,19,114,29,25,159,47,182,253,133,194,13,211,162,245,237,120,54,61,61,0,4,5,123,249,220,60,253,43,248,130,229,156,223,110,215,244,130,246,115,112,191,2,51,2,78,24,22,170,57,214,3,93,134,24,227,67,154,23,120,74,178,242,180,188,134,132,194,45,87,235,199,251,79,60,159,252,128,35,172,246,79,46,206,144,232,86,49,33,239,70,146,201,46,55,4,73,66,228,141,119,106,31,86,157,191,5,164,62,93,70,140,74,218,124,166,236,236,190,14,104,81,217,7,209,80,85,83,241,26,183,141,23,139,63,232,170,125,124,92,253,242,135,114,0,9,111,240,33,64,174,169,63,207,26,104,178,224,160,47,98,204,177,83,140,93,6,102,19,136,9,1,198,96,134,96,173,177,88,93,117,186,206,2,119,89,220,114,105,47,8,240,110,9,154,184,59,173,178,221,85,71,246,229,110,114,134,80,58,24,5,184,212,84,134,252,248,2,135,169,132,175,227,204,213,126,225,165,30,200,45,45,70,48,19,232,153,85,190,58,71,205,110,8,138,72,146,46,18,26,146,148,180,111,216,223,213,198,102,140,96,228,126,216,132,0,20,124,209,11,198,83,108,142,127,73,112,177,98,237,25,33,64,125,51,92,68,28,36,93,207,195,175,183,106,154,99,74,135,66,151,34,96,217,169,239,42,149,183,217,196,43,22,53,86,8,96,202,255,231,101,204,195,158,122,67,42,189,178,25,1,34,160,49,240,44,45,126,204,251,49,204,77,148,234,156,255,109,171,179,99,188,141,207,200,106,86,197,108,0,144,123,181,195,141,15,245,33,149,70,147,144,25,215,231,62,69,32,251,167,246,237,237,226,30,139,249,104,3,155,43,17,157,168,159,204,30,198,235,86,156,61,244,64,102,22,148,196,129,240,143,58,181,131,111,196,168,140,71,52,173,95,83,200,90,108,156,80,228,172,60,153,7,187,123,104,48,74,50,86,119,196,201,108,92,7,89,82,100,238,182,99,93,127,20,60,130,244,226,94,218,85,109,194,22,140,25,5,6,198,41,80,105,72,45,85,96,168,94,254,159,241,116,60,53,122,74,32,42,52,49,232,77,97,173,61,250,169,117,119,116,76,83,184,218,96,127,178,223,16,222,14,65,133,77,204,196,15,77,53,241,120,109,238,229,24,108,148,188,55,1,158,34,32,76,6,149,207,154,213,77,54,126,95,38,217,255,248,74,190,69,133,222,169,65,14,84,171,100,9,96,46,251,162,185,104,122,233,155,130,186,237,60,90,106,120,152,144,79,5,42,80,239,132,146,116,228,75,23,200,202,32,74,152,177,48,75,46,120,71,252,59,54,165,237,13,176,123,45,68,182,99,241,189,235,25,152,11,90,178,129,144,105,162,114,245,48,128,97,163,116,122,253,246,86,249,55,97,2,116,32,33,219,52,69,68,170,67,116,36,225,179,35,208,246,166,163,138,59,15,30,64,107,114,158,31,163,107,66,242,8,197,212,59,242,49,200,68,109,185,168,39,7,251,148,228,202,47,210,166,111,81,7,184,3,36,113,201,237,40,108,103,229,216,180,54,179,160,72,101,87,115,235,220,13,10,34,211,155,73,216,83,241,154,226,245,53,212,40,5,19,66,144,87,22,242,142,45,80,135,80,178,219,34,60,17,129,129,35,127,39,40,188,142,224,203,247,74,197,90,230,143,248,125,133,208,61,24,133,208,31,159,109,81,85,232,166,128,63,40,90,7,135,59,123,34,94,53,196,165,20,157,127,206,70,36,122,245,231,179,224,153,162,156,232,0,167,164,91,251,153,238,229,246,222,185,25,56,114,4,161,229,119,108,26,101,206,22,27,119,250,136,100,191,229,213,87,106,28,20,91,231,101,81,208,64,45,90,205,122,13,10,36,107,90,55,6,224,9,217,233,184,32,98,115,0,60,131,109,93,244,102,162,115,203,68,2,50,46,30,230,201,198,85,113,93,96,217,109,224,202,41,166,186,249,126,109,123,47,132,213,74,241,72,50,55,103,60,172,106,175,113,147,23,240,142,4,5,210,227,45,100,132,99,153,218,95,195,173,6,17,190,144,91,213,151,137,150,223,250,228,18,173,94,227,158,241,118,227,215,183,128,219,81,167,191,13,10,175,179,242,177,79,70,198,166,47,143,232,94,101,167,199,231,6,5,164,53,203,124,25,223,41,245,20,146,253,111,141,38,209,69,165,251,169,243,49,162,68,1,173,131,154,55,249,172,44,244,148,3,200,150,177,7,46,187,147,194,176,2,36,182,163,224,47,105,2,121,249,91,247,134,4,88,230,117,177,210,47,104,112,102,23,201,28,39,240,244,190,184,179,180,214,142,14,84,34,153,123,25,157,251,116,109,188,54,13,146,98,80,255,114,81,162,162,46,160,247,58,35,153,246,202,80,38,4,187,170,113,223,57,210,72,79,124,89,53,60,196,22,221,254,59,201,198,147,139,54,144,232,179,6,221,110,127,123,68,41,176,49,161,46,254,84,210,148,118,141,224,90,120,74,201,57,90,37,71,242,47,73,77,113,229,103,139,125,62,52,237,75,163,244,181,74,139,193,132,31,126,160,194,245,211,81,35,100,210,76,9,200,181,177,208,42,141,191,234,183,123,97,112,118,71,80,152,253,137,157,244,52,33,238,158,113,118,230,119,86,117,90,169,115,34,29,40,200,172,82,43,59,213,223,29,126,191,111,69,78,74,233,18,19,232,153,100,96,4,207,14,20,147,136,116,46,169,242,142,76,125,82,252,164,193,245,37,240,4,11,80,33,117,218,254,124,191,11,211,243,54,139,248,57,196,246,79,213,104,87,254,5,12,125,13,136,61,65,221,189,166,140,145,0,250,95,240,147,174,236,164,247,28,147,73,125,194,226,251,45,115,78,162,82,124,159,5,216,73,52,50,170,154,224,69,105,211,254,200,70,53,116,25,255,29,31,30,52,51,203,50,118,252,183,207,96,222,198,190,98,189,203,168,78,241,231,28,167,66,77,151,46,149,178,28,249,234,55,213,229,177,129,13,112,33,136,243,20,14,149,82,136,114,140,199,64,187,143,67,114,237,129,135,221,19,139,228,167,29,154,221,47,104,167,95,242,170,22,242,139,244,166,64,81,0,220,185,104,12,252,52,48,173,35,8,61,38,95,41,48,76,226,170,72,198,173,35,143,151,96,57,203,140,125,83,136,23,148,104,103,18,195,31,119,192,114,147,156,240,245,34,79,199,162,204,22,181,170,161,175,243,191,55,8,144,235,42,29,177,102,167,156,169,27,205,62,216,234,0,138,170,145,3,118,146,25,205,170,25,181,162,52,234,66,151,124,221,34,14,232,16,232,216,89,233,146,230,225,206,73,31,71,95,224,21,56,156,157,22,127,25,209,67,32,196,35,227,253,114,142,51,77,213,74,26,156,76,70,133,99,46,234,204,186,31,27,153,249,39,131,37,215,206,53,155,111,184,109,92,100,243,129,21,90,202,184,134,98,122,80,5,111,213,205,13,170,27,202,218,226,125,169,213,92,33,70,113,73,151,115,176,120,99,216,13,10,24,252,65,0,159,134,109,129,217,181,139,210,36,243,31,219,127,16,166,106,244,82,216,184,104,155,13,180,139,247,233,89,233,201,223,62,48,106,101,14,117,11,250,239,67,180,212,102,102,204,250,229,140,224,133,22,19,19,72,211,215,142,222,173,191,60,99,124,178,168,96,255,140,169,105,117,224,176,216,67,55,254,254,43,191,66,41,206,120,165,220,127,113,138,181,128,208,118,206,158,56,224,236,183,54,100,88,27,193,68,103,85,228,213,18,194,222,234,193,140,2,64,148,251,150,112,162,26,78,55,70,211,107,113,184,65,225,146,108,92,23,174,70,59,58,185,165,234,41,167,106,98,95,18,120,13,10,183,107,240,246,55,121,4,97,207,113,4,112,20,170,168,103,15,17,73,237,70,176,201,217,114,65,201,169,12,185,234,77,217,8,27,28,218,152,176,152,188,71,214,165,139,171,14,88,7,96,45,0,231,156,66,70,179,217,122,12,51,169,243,212,217,52,30,152,11,152,37,59,69,4,255,66,138,73,34,145,127,239,245,93,131,249,177,80,186,24,229,202,13,110,122,59,135,79,107,238,201,84,82,225,43,34,116,116,37,56,117,71,132,220,225,242,229,95,215,229,8,26,133,164,29,105,183,120,119,137,105,65,242,156,41,44,32,98,166,96,226,36,12,35,97,206,109,132,145,51,178,15,32,227,165,121,41,226,30,134,13,135,247,23,182,40,48,88,57,212,23,160,57,12,135,180,16,23,136,213,31,79,38,23,236,4,133,155,80,212,126,151,175,201,157,1,216,128,102,130,226,192,192,247,229,254,229,69,255,14,117,239,177,55,142,31,22,31,181,17,38,84,169,246,31,1,235,173,110,161,24,94,191,84,104,52,39,139,201,102,238,2,69,235,218,220,219,51,3,44,31,230,195,244,230,159,156,55,154,61,39,190,166,7,3,89,70,191,140,182,235,71,75,7,65,153,201,223,50,235,224,236,178,105,82,247,132,198,73,246,92,166,14,187,90,78,116,204,245,91,198,170,113,59,5,82,120,11,106,145,199,190,132,248,170,229,91,88,76,129,4,13,10,215,54,86,176,126,90,23,77,201,24,176,234,236,125,90,186,7,80,242,161,218,79,72,243,133,246,122,67,191,82,169,165,209,165,36,201,49,192,127,161,186,143,184,183,91,253,151,72,209,159,79,196,83,113,162,234,190,153,111,94,118,159,132,149,166,56,202,37,3,45,140,100,244,184,77,75,227,235,151,248,40,80,198,222,244,173,81,192,215,169,32,23,135,169,26,176,152,130,165,88,196,144,28,13,192,215,82,20,163,61,103,187,58,135,190,71,70,121,130,130,137,74,115,198,161,106,71,23,36,116,230,24,0,191,86,185,208,205,27,239,234,226,109,100,29,73,204,249,137,199,215,212,172,247,229,108,155,59,165,164,84,118,164,136,255,228,94,163,226,5,91,99,104,84,151,203,94,125,181,245,232,30,166,202,234,231,93,119,189,165,187,213,181,109,50,185,14,2,208,241,114,94,1,138,169,116,115,195,84,1,66,166,53,181,57,98,229,143,117,194,174,179,76,81,186,113,203,149,123,212,174,125,43,11,223,234,31,201,150,81,238,23,248,252,57,101,59,95,67,115,255,23,179,255,154,3,92,239,59,21,134,151,191,36,229,180,240,24,252,211,166,56,41,90,139,187,65,235,41,101,93,140,145,207,8,235,91,191,34,161,160,168,2,204,66,207,175,183,40,63,100,55,14,184,170,145,124,38,44,146,23,151,155,3,141,244,32,235,110,116,169,54,163,93,122,207,144,134,98,180,255,251,142,186,5,161,9,7,37,190,222,234,253,1,20,167,171,54,115,76,252,64,78,86,54,6,167,53,161,15,124,123,115,69,86,12,88,173,142,228,114,179,11,214,77,166,193,4,109,97,243,205,190,11,226,44,239,67,101,255,112,189,162,176,198,182,243,85,251,15,12,102,174,59,32,101,118,245,0,46,61,107,233,110,170,158,29,164,169,16,195,225,41,109,79,109,58,193,132,189,21,226,90,99,229,67,56,166,1,68,91,55,3,72,13,10,154,255,133,72,23,60,215,110,17,80,170,15,18,230,180,58,126,218,17,230,42,157,142,103,41,219,170,232,218,17,251,103,76,235,68,162,203,33,108,19,13,10,196,143,108,96,113,200,84,134,167,153,239,168,200,230,150,151,209,230,237,169,30,207,236,14,207,11,54,110,251,61,12,89,167,8,180,36,108,252,167,104,224,67,41,238,171,111,139,234,175,25,46,225,12,34,57,219,162,144,246,4,210,100,101,163,183,196,80,160,48,39,55,208,124,220,64,33,203,14,38,56,84,64,172,126,81,144,70,33,127,38,177,194,140,98,161,65,67,209,18,31,210,216,76,229,130,237,52,7,225,162,126,8,164,242,198,255,71,114,232,151,165,0,11,248,208,153,3,134,20,233,32,37,78,82,204,201,151,175,163,155,237,160,69,110,54,233,18,116,25,242,116,239,245,253,241,75,154,4,41,191,207,91,7,27,154,206,113,40,69,47,124,236,29,131,207,36,105,195,165,229,188,60,202,235,200,236,45,230,29,26,15,59,39,42,203,5,52,145,143,228,206,138,252,247,144,80,19,209,170,217,45,117,164,122,122,215,94,217,172,98,189,46,233,130,46,185,127,188,54,70,94,242,246,2,149,45,104,42,208,119,255,168,185,233,68,206,141,39,158,147,49,190,195,120,157,68,38,168,154,230,38,146,52,83,116,14,39,60,158,204,221,37,224,89,58,217,210,49,65,143,238,208,34,237,202,239,38,92,28,81,40,226,248,251,109,73,223,221,108,242,216,6,65,191,97,51,4,186,204,66,150,223,25,145,46,73,6,202,34,75,138,36,137,168,86,152,11,126,54,146,59,242,81,176,223,124,108,212,243,180,86,173,131,217,80,71,221,91,112,255,234,227,2,76,151,60,244,44,26,177,197,55,225,22,103,36,197,136,14,235,119,241,233,191,107,160,216,213,134,90,162,81,239,237,185,35,208,113,232,132,79,204,173,59,87,141,144,14,137,12,77,105,101,31,248,180,78,253,40,155,3,93,254,188,252,176,88,254,181,97,34,187,224,38,13,10,215,75,241,160,112,101,180,161,71,121,91,182,46,109,221,179,35,95,88,129,64,40,164,165,43,86,179,75,158,84,207,143,13,83,239,209,203,70,160,47,158,193,231,193,204,91,196,152,243,171,19,49,222,21,61,172,30,119,159,101,171,210,163,124,128,171,51,54,35,126,12,247,122,189,179,145,227,139,253,75,97,109,239,216,220,61,59,122,102,98,12,37,44,90,6,26,35,37,111,78,96,125,202,81,86,141,176,88,225,127,214,204,206,15,3,199,26,229,90,84,121,175,127,248,239,64,130,0,207,83,17,8,59,137,200,168,205,249,201,227,67,16,250,86,127,178,208,71,144,241,195,146,52,153,17,57,142,12,211,199,213,31,231,128,184,244,194,67,96,243,84,102,56,71,141,35,228,138,116,242,199,234,209,231,0,221,221,20,193,175,20,128,76,55,219,7,157,149,130,2,21,9,239,99,23,75,209,185,94,30,6,17,53,239,16,115,188,144,40,23,172,46,190,134,118,47,95,71,22,48,101,178,220,108,3,114,74,46,221,95,192,140,249,91,124,56,224,135,156,232,93,129,145,147,1,221,91,2,106,111,50,0,163,21,163,214,18,37,138,84,11,108,224,25,2,129,186,76,46,147,97,231,42,37,1,30,131,55,51,108,4,104,157,84,33,188,79,57,183,236,245,144,169,114,23,140,157,9,104,71,60,1,159,155,240,233,179,16,147,112,56,129,102,115,66,198,148,142,165,160,28,140,119,167,165,142,15,37,151,26,5,102,252,18,236,235,254,190,24,204,219,119,238,71,156,110,101,122,77,136,116,150,37,27,6,165,252,55,113,153,30,24,243,5,226,255,187,216,17,234,47,238,194,221,166,176,108,172,44,118,220,222,112,101,69,102,191,52,6,210,175,109,229,76,213,230,142,168,17,185,116,103,22,221,199,30,26,230,13,66,213,87,60,100,117,25,69,127,111,123,127,193,202,14,84,251,147,129,149,252,16,180,199,30,36,188,254,217,229,78,180,32,163,81,154,204,82,205,151,126,156,83,11,66,3,102,254,71,168,103,224,232,68,210,195,91,39,11,67,210,117,191,169,120,36,60,82,212,224,46,130,231,233,207,54,13,161,249,77,223,174,244,215,82,249,125,243,13,10,76,141,232,8,36,216,159,134,105,242,178,223,105,191,182,27,74,166,144,113,195,90,123,136,121,213,108,140,226,170,51,178,86,24,103,169,233,103,19,26,25,151,19,30,125,211,158,247,56,80,160,128,162,13,178,168,20,196,214,35,185,179,32,77,149,222,19,149,95,78,92,13,10,34,66,37,153,114,204,243,50,100,136,221,108,14,116,43,139,242,255,34,19,222,164,43,129,190,120,136,209,51,126,138,25,163,14,104,96,121,66,144,92,58,159,25,137,14,187,70,30,137,169,189,38,147,208,64,63,222,49,188,105,70,40,194,115,174,254,37,167,237,239,46,244,137,29,66,226,120,74,65,12,157,170,128,36,233,91,47,223,123,40,102,153,181,61,19,119,98,85,17,237,31,150,114,213,52,49,222,68,30,13,20,173,182,120,74,40,160,156,130,14,225,245,27,203,183,224,12,82,74,242,79,148,222,78,174,157,35,104,75,15,232,240,243,76,17,198,126,31,247,248,59,97,34,51,22,132,86,31,151,66,56,14,232,191,84,72,87,97,22,56,50,172,137,108,26,147,168,163,94,44,127,100,124,115,35,130,187,171,161,220,4,124,108,34,245,114,181,167,9,197,226,168,117,87,77,4,186,106,219,40,69,230,238,13,10,18,176,188,249,108,219,96,243,215,159,189,8,245,75,7,155,231,6,110,140,195,206,227,94,197,94,174,168,168,69,32,103,158,70,127,133,6,73,249,215,127,44,225,174,181,177,11,21,30,43,248,73,47,245,204,151,192,94,35,105,174,220,114,252,0,79,26,240,204,91,153,92,127,48,115,30,26,166,104,248,66,17,94,199,160,147,216,142,210,84,76,43,250,97,136,118,237,202,163,90,27,208,29,152,171,85,62,226,95,145,60,7,78,234,235,227,144,105,14,99,150,0,103,151,174,243,197,200,85,27,232,176,139,86,201,17,87,162,174,51,111,123,211,154,40,124,13,204,126,233,179,52,150,140,5,28,43,9,29,190,2,156,236,185,52,57,101,240,16,246,136,35,237,255,57,117,129,63,129,54,16,246,73,25,103,79,116,180,17,110,128,83,134,205,204,103,155,225,144,7,215,66,216,27,88,150,17,220,13,10,132,71,80,137,166,57,42,208,141,166,231,240,156,20,13,81,69,164,216,63,243,95,123,234,197,105,66,240,35,76,113,48,233,147,182,234,58,6,138,44,222,197,101,61,156,38,206,255,106,149,86,100,187,225,196,38,8,246,158,99,29,186,66,95,130,201,210,17,38,107,76,213,74,74,198,189,178,118,197,234,137,127,88,73,78,229,25,246,153,2,64,170,157,46,27,208,86,55,241,87,250,164,187,200,24,195,168,122,236,108,225,214,64,116,143,28,59,205,159,113,183,141,87,147,105,199,160,11,231,54,105,18,237,238,121,165,252,224,136,184,106,46,135,193,7,122,113,229,201,82,40,186,226,122,180,156,225,9,51,243,146,213,8,242,254,102,218,89,138,201,232,109,82,1,96,103,253,16,183,40,226,152,218,35,122,69,152,38,217,204,215,99,245,186,118,50,250,21,136,157,73,48,79,136,79,138,90,24,49,200,49,214,198,69,151,229,19,69,237,13,144,119,23,197,122,27,230,218,127,129,194,246,149,43,56,166,58,220,68,134,156,181,17,152,207,216,178,52,93,121,194,74,250,210,104,187,118,50,37,134,174,151,1,154,24,227,244,190,230,96,177,15,190,18,240,213,159,153,221,58,103,196,27,191,203,113,88,235,176,120,91,205,185,175,68,9,108,54,239,147,150,250,48,32,111,210,107,239,92,162,15,62,50,226,138,173,239,72,118,137,5,62,226,57,124,90,114,155,242,125,164,204,32,247,222,52,189,94,202,83,163,180,90,235,125,18,151,164,49,227,159,142,73,138,168,124,213,63,227,156,85,126,137,9,5,221,199,104,207,20,236,68,190,109,234,198,132,215,102,172,8,204,216,215,139,22,111,84,129,101,215,87,41,123,248,242,69,45,248,107,101,233,28,121,158,27,69,32,104,120,23,198,209,206,227,96,116,87,106,5,216,75,6,243,148,165,162,18,120,151,65,143,196,117,181,107,146,235,30,75,73,183,169,217,129,120,145,117,35,42,240,255,106,126,198,122,136,188,161,37,236,38,161,251,133,119,208,160,198,149,95,2,236,132,191,154,76,56,166,103,253,144,52,50,163,169,165,74,12,75,85,80,22,110,5,220,63,66,147,111,99,179,34,25,102,185,237,236,119,91,46,41,236,115,206,190,50,216,58,159,205,8,234,25,203,55,119,198,234,235,32,124,170,28,44,129,237,255,191,79,201,38,27,143,11,204,215,88,41,193,115,149,192,213,2,65,241,114,81,54,42,129,24,169,241,252,142,31,246,230,22,12,194,177,19,245,201,137,211,191,96,44,170,1,240,213,19,154,72,200,177,245,26,110,252,200,172,13,10,119,89,165,106,72,195,233,200,206,152,73,207,234,61,104,35,168,142,140,34,137,86,121,6,254,28,152,189,129,5,26,108,8,141,172,173,236,159,30,182,178,207,143,39,175,179,68,29,58,248,154,57,45,90,83,87,3,151,147,226,206,172,71,66,139,24,72,36,237,210,42,161,71,80,135,97,249,109,34,115,253,28,171,12,92,155,145,149,22,185,206,224,55,230,204,80,244,215,190,17,15,11,22,57,166,130,111,86,4,178,91,52,51,219,105,33,170,247,199,2,202,132,74,68,20,108,11,200,255,119,196,125,254,219,128,20,21,235,63,234,13,89,241,80,203,156,19,114,214,36,157,200,251,2,84,195,150,88,75,183,153,123,105,58,254,178,196,7,252,160,138,79,23,78,38,209,41,181,61,170,0,19,199,236,25,109,126,133,205,174,105,1,191,62,236,115,7,185,210,77,33,136,104,130,146,131,15,24,167,94,94,49,195,74,99,175,66,251,153,122,175,48,96,103,29,189,59,219,122,52,212,7,171,25,131,6,19,134,71,49,193,97,227,78,156,153,22,49,158,242,105,154,43,40,160,143,68,181,94,75,65,132,48,145,188,74,219,42,68,116,228,173,231,220,103,16,120,118,160,231,217,240,123,13,50,143,191,243,205,158,249,215,143,241,225,23,5,155,57,148,166,236,152,159,158,28,233,194,87,176,55,249,22,164,227,187,130,187,73,156,133,62,7,28,215,252,25,192,64,133,99,243,140,199,159,94,61,222,100,20,166,153,28,214,173,50,49,235,97,138,90,79,243,77,134,152,130,179,113,192,145,184,222,74,240,7,126,44,87,143,207,198,76,108,168,81,62,62,80,126,210,1,49,42,69,213,188,33,72,145,65,135,145,143,175,230,136,148,174,47,249,147,251,138,66,129,78,120,94,174,185,64,111,45,26,240,32,69,144,219,41,157,186,148,236,58,151,20,124,214,99,123,93,150,24,241,200,197,68,125,17,39,42,69,241,179,216,60,21,60,22,150,0,122,156,54,32,49,220,208,42,164,142,64,17,141,129,241,253,222,47,2,250,196,175,219,144,250,183,254,225,111,92,93,97,16,218,118,162,190,50,65,179,98,105,206,120,101,238,151,192,82,48,132,158,143,237,117,196,176,196,230,208,130,49,147,82,109,108,97,206,179,169,30,225,50,134,231,78,117,214,16,54,2,13,10,237,207,235,106,108,239,86,23,162,251,183,255,215,93,86,137,72,247,24,13,17,253,182,147,147,16,11,251,113,94,111,254,174,175,251,49,85,43,132,80,77,59,106,92,210,160,163,236,244,142,204,157,188,139,90,163,170,245,194,50,173,56,153,157,105,27,66,11,42,247,27,234,102,177,71,59,37,201,35,90,212,242,107,55,198,252,218,159,196,226,150,134,69,108,255,221,22,124,135,15,175,208,183,66,216,49,187,194,8,47,142,167,212,61,217,70,45,62,136,21,8,217,162,34,153,11,77,116,187,233,154,168,44,7,203,117,232,142,225,36,37,107,52,9,14,63,154,58,107,191,82,122,88,36,149,60,35,66,242,31,163,60,4,51,117,187,38,116,143,25,188,41,45,239,90,74,243,196,40,212,202,12,132,104,71,129,202,150,36,200,127,232,24,115,181,239,133,130,152,80,202,254,24,48,96,206,250,201,88,220,222,89,152,229,216,81,28,84,236,107,115,38,250,165,113,137,196,145,15,190,72,209,187,115,179,151,102,114,129,52,183,213,3,67,145,32,46,94,58,168,230,13,10,248,154,42,150,124,140,16,63,105,114,78,91,155,19,139,209,119,199,190,174,184,142,12,57,231,146,203,117,180,4,6,181,73,186,191,210,183,8,196,104,233,231,253,148,109,78,115,101,42,74,210,31,43,220,96,39,158,155,132,220,137,69,116,150,137,239,43,201,185,165,131,191,3,32,173,37,167,116,156,4,213,171,248,36,62,253,59,195,249,40,31,222,62,3,91,155,58,149,16,208,8,184,223,100,195,218,5,142,128,140,129,180,180,31,255,244,113,216,115,135,55,43,247,4,242,163,92,128,115,42,142,74,207,137,145,248,247,45,142,78,30,28,234,238,226,71,79,229,119,25,142,8,146,33,188,209,0,224,194,61,100,7,199,31,175,95,47,168,148,105,247,153,13,249,159,168,22,201,2,181,54,19,130,148,245,229,17,247,236,42,74,176,218,207,19,112,91,135,244,207,159,26,171,139,71,125,26,54,71,129,85,3,58,30,166,213,18,122,184,54,107,213,160,99,73,140,133,84,96,250,142,179,66,121,126,15,12,64,193,89,9,33,159,20,126,163,251,76,106,116,173,18,200,61,202,105,115,11,32,239,48,113,112,122,240,55,207,129,184,136,181,41,194,21,54,207,15,67,209,110,13,120,13,168,37,55,225,252,33,28,94,220,33,240,115,164,21,158,211,230,247,171,72,157,114,45,221,170,0,116,155,109,66,133,55,247,61,147,222,131,98,225,51,62,52,216,108,55,239,75,244,148,66,191,76,24,187,131,161,231,249,160,50,13,10,255,251,217,195,31,24,75,9,29,20,55,30,186,87,121,165,38,31,72,157,148,66,17,226,133,233,153,163,59,61,238,227,203,191,40,82,103,198,230,202,46,110,15,80,133,94,115,102,107,175,183,200,48,110,231,124,16,193,174,14,176,55,253,105,134,48,8,73,65,240,144,123,190,135,187,16,187,109,52,157,6,230,116,165,75,92,92,40,196,57,245,217,96,24,4,49,5,201,210,215,136,53,116,250,91,46,36,144,227,39,235,130,150,15,155,81,207,6,176,119,106,177,41,103,22,252,226,196,214,102,70,38,91,216,70,95,197,62,80,241,153,167,96,17,247,3,111,175,41,176,190,25,232,15,54,45,209,151,38,66,133,203,71,190,159,156,82,145,80,4,14,66,89,251,140,115,135,146,67,5,211,83,226,13,10,88,53,158,159,207,144,143,205,83,47,151,206,82,122,212,244,75,56,241,173,43,108,33,33,247,251,170,114,243,219,148,211,40,168,190,114,101,45,168,85,77,62,77,227,72,200,158,86,188,79,65,133,140,228,113,205,232,89,179,185,49,247,105,3,206,186,235,41,173,111,58,190,132,0,2,69,40,194,24,195,227,26,222,110,128,255,128,188,224,32,232,223,52,95,119,187,101,232,157,53,77,169,42,250,243,187,78,171,221,98,46,12,13,148,93,30,9,21,65,89,7,143,139,28,196,198,143,212,240,97,235,220,22,19,166,163,252,67,35,234,27,49,76,64,60,212,14,95,134,184,43,44,77,43,197,8,245,193,91,140,113,253,47,177,139,223,252,162,41,43,38,249,228,96,76,149,128,145,15,103,66,42,125,157,116,77,75,127,206,9,113,97,54,67,48,167,168,154,93,85,228,148,56,135,93,146,60,31,177,217,100,59,245,88,103,94,234,248,79,51,85,107,47,159,110,219,98,208,95,172,63,147,35,106,239,1,144,188,93,169,182,125,22,65,229,109,81,29,72,245,246,32,240,21,248,255,105,244,244,170,211,36,36,240,187,80,150,135,176,68,219,62,98,185,165,199,175,215,19,238,144,57,102,66,234,82,41,129,203,191,105,227,28,151,170,125,56,140,235,198,178,125,35,33,59,198,246,182,18,36,207,99,80,40,80,215,208,102,252,149,169,235,146,237,94,105,77,69,23,87,210,200,3,11,109,44,136,179,93,216,221,48,15,69,109,26,243,252,68,153,42,111,235,206,163,228,57,77,164,18,87,28,58,235,60,114,101,250,238,243,22,230,198,215,105,59,111,71,192,13,236,39,120,210,16,195,162,76,139,245,18,133,215,222,234,227,184,39,15,193,59,61,8,118,122,152,71,4,142,244,208,213,22,4,226,100,218,159,161,208,255,129,146,248,59,173,169,56,68,110,245,187,207,21,135,86,189,59,165,141,15,108,211,87,67,219,101,225,102,101,97,100,227,32,147,35,119,61,3,218,177,161,92,171,13,0,215,33,224,157,229,105,162,89,92,210,220,87,136,12,32,253,85,35,80,76,116,109,128,28,107,224,194,79,148,132,176,249,51,28,196,51,59,64,67,248,133,46,93,26,22,161,137,244,171,111,226,33,109,111,77,130,43,201,205,222,242,142,139,29,244,94,160,159,34,197,169,139,107,46,122,3,242,15,5,18,202,180,60,151,230,237,13,10,41,52,52,242,241,129,79,57,238,87,151,133,61,44,211,27,196,159,63,109,54,165,119,237,103,44,213,121,73,76,207,219,249,109,239,103,44,217,254,125,186,103,167,25,150,203,213,25,203,229,165,71,84,115,90,247,173,49,101,140,29,57,225,82,255,240,95,126,186,72,251,32,180,28,0,249,194,209,149,39,223,105,100,173,249,120,50,28,153,189,85,127,190,245,64,110,12,219,184,230,81,128,205,53,202,226,172,151,202,145,175,29,101,178,184,42,16,176,49,126,33,29,13,56,249,129,126,105,110,108,119,180,99,209,188,82,125,146,199,13,10,168,2,124,47,179,243,87,81,74,29,79,95,35,45,130,29,126,214,13,149,79,68,171,197,65,117,37,240,132,238,72,249,196,121,214,183,201,6,199,14,133,210,74,177,123,128,163,45,6,150,16,210,139,139,125,109,78,155,105,200,13,10,80,132,175,168,169,117,219,48,164,199,82,157,199,186,98,159,36,53,11,34,199,71,133,172,150,94,197,65,40,240,4,21,246,213,232,160,175,75,79,169,144,49,62,112,89,78,181,195,215,194,17,25,106,114,102,3,92,167,245,137,48,21,227,149,224,206,28,24,91,20,81,79,93,24,195,17,208,181,9,38,215,192,135,199,7,209,71,53,213,84,197,38,43,112,23,131,86,148,50,85,214,47,12,132,254,9,56,138,197,162,133,209,116,88,38,172,249,104,169,149,88,198,19,160,213,211,139,197,139,145,191,247,56,128,222,214,72,213,60,141,216,113,13,10,205,179,120,23,52,234,177,108,109,138,225,183,55,33,222,234,238,74,201,254,150,215,62,116,136,50,133,238,170,64,89,81,224,79,168,25,218,193,64,62,169,76,155,150,204,34,127,11,35,104,66,146,227,75,137,169,172,149,82,100,157,28,101,191,33,67,110,153,124,86,66,123,151,188,68,38,19,241,114,151,249,76,187,85,252,167,97,127,84,179,3,158,53,48,133,170,213,146,85,85,149,217,177,238,15,112,227,54,13,10,195,194,57,248,27,222,144,186,210,177,144,20,176,184,206,131,70,6,148,137,207,19,224,32,201,222,207,113,199,203,33,207,19,238,188,29,197,235,97,97,44,15,17,139,50,231,13,10,102,239,132,184,151,168,201,31,234,248,99,7,90,132,25,123,35,132,202,132,202,181,84,19,177,142,193,11,127,22,132,228,77,87,59,244,32,132,34,172,194,37,252,28,168,233,163,202,157,230,250,251,183,195,191,67,127,9,172,1,188,54,0,142,64,97,182,145,117,26,97,33,74,253,157,209,17,116,103,61,30,198,187,26,41,198,1,155,235,25,105,20,67,53,216,219,165,123,91,0,190,51,91,92,143,222,38,160,69,213,189,101,225,77,111,13,10,245,15,31,191,230,23,111,132,147,65,19,123,5,46,123,206,72,120,23,94,58,219,52,38,19,45,109,3,254,21,106,181,177,242,196,189,46,85,245,186,146,7,240,170,191,96,183,95,145,204,56,74,147,242,123,44,125,238,232,28,126,28,229,64,201,103,221,100,63,240,168,184,186,210,79,19,183,19,208,112,76,92,35,5,199,218,115,145,247,121,238,26,183,7,211,195,115,9,70,115,240,160,108,58,181,171,144,59,35,3,99,48,8,84,95,231,235,104,19,185,110,196,162,58,180,122,5,11,76,65,12,246,250,49,253,27,78,5,137,54,209,215,90,69,174,124,41,105,4,207,190,53,53,5,112,162,141,93,84,49,4,150,100,153,172,244,49,192,194,220,224,27,119,190,156,177,147,146,49,209,155,191,139,61,26,150,80,192,142,224,183,40,142,247,92,149,49,58,245,153,145,94,125,106,195,216,77,115,200,176,9,35,31,234,191,59,20,80,6,90,7,37,36,98,117,138,207,76,62,166,32,53,86,43,240,17,63,21,136,180,17,114,22,222,223,213,122,102,37,246,239,124,40,148,222,234,80,179,162,91,33,202,88,57,40,113,79,63,163,65,221,132,2,35,23,227,54,233,3,133,118,162,65,238,117,125,92,40,242,67,225,237,95,148,240,70,172,27,161,98,216,167,53,31,12,195,206,93,134,33,168,178,159,157,14,163,93,75,226,99,223,216,255,236,244,196,158,120,53,132,151,222,238,246,29,184,71,88,168,121,239,218,163,110,123,43,184,5,148,80,51,146,226,211,247,195,105,171,139,37,104,218,80,81,240,44,30,199,31,45,161,139,89,59,175,16,235,31,217,249,2,97,35,245,97,86,13,224,46,204,247,239,36,15,85,116,212,203,96,62,115,159,7,56,90,111,214,48,191,159,164,150,127,60,140,9,154,109,206,40,95,158,183,100,20,226,224,72,104,108,86,209,177,76,157,133,27,75,208,190,252,68,143,74,235,11,166,4,160,207,51,197,148,213,165,34,56,145,88,27,57,153,6,83,225,84,47,30,199,135,75,78,135,36,124,234,126,111,57,5,172,238,14,197,205,199,146,221,126,160,253,189,71,234,187,47,21,140,82,134,247,170,92,20,247,79,31,247,87,182,202,102,101,96,66,182,252,0,181,154,144,241,101,44,125,184,67,138,63,24,255,13,83,114,35,57,228,51,107,246,26,243,130,240,26,123,207,128,236,11,26,31,136,111,43,43,189,206,176,134,228,239,172,141,6,188,255,123,78,223,180,233,53,201,207,133,72,242,108,123,38,112,121,213,61,39,14,215,177,229,191,107,167,211,130,67,154,241,114,244,208,62,188,114,12,160,253,101,200,172,204,51,20,151,222,80,104,67,150,120,171,77,200,193,212,192,61,124,4,75,156,17,53,191,181,226,155,106,91,246,182,103,247,33,104,218,200,202,164,234,34,250,207,73,219,126,155,108,223,58,234,19,60,166,78,177,219,185,96,207,144,82,159,91,22,123,203,127,226,16,86,71,42,173,166,143,106,13,220,27,248,105,244,255,47,100,187,182,15,18,186,178,131,32,84,197,220,246,59,95,211,36,153,129,202,134,76,245,231,35,166,59,138,63,214,9,38,31,13,128,1,38,252,20,93,247,141,223,81,32,119,39,105,92,11,248,41,224,242,109,117,175,14,124,130,118,204,31,145,203,54,254,190,218,13,210,139,241,218,99,121,146,27,252,96,153,24,60,30,192,93,221,101,247,120,92,121,165,140,171,227,80,143,98,238,104,238,1,231,50,164,103,147,68,81,57,201,43,73,172,194,29,216,222,116,252,170,162,88,241,128,198,101,27,22,179,198,147,107,79,83,239,31,164,179,182,42,179,250,241,4,169,192,228,50,56,237,133,35,136,199,152,138,14,120,120,238,193,251,48,105,140,218,73,131,176,200,91,109,155,227,98,93,36,6,105,168,73,133,75,13,190,138,88,172,97,117,86,219,115,248,188,6,20,37,89,239,152,69,115,67,20,252,129,57,13,10,152,32,91,73,112,40,253,13,10,48,111,98,222,229,154,180,52,104,192,82,150,0,191,161,130,52,13,10,207,217,65,126,168,214,149,194,82,148,133,203,204,23,145,148,167,216,129,251,175,240,128,170,155,25,151,18,1,93,183,242,177,220,85,228,127,21,22,100,82,50,28,170,0,62,112,250,191,119,244,146,166,110,200,127,226,33,221,210,72,101,76,47,0,135,50,118,217,28,214,118,140,34,13,10,132,137,51,241,2,189,177,115,195,26,31,79,106,181,126,194,209,175,120,37,208,41,195,248,39,130,156,37,234,22,42,104,157,200,228,83,125,207,206,224,116,198,189,68,184,54,106,92,45,248,51,78,255,99,114,56,171,237,57,227,154,49,80,182,108,19,189,247,158,40,63,69,164,246,221,57,242,16,113,29,35,149,216,141,226,104,50,18,113,223,92,212,175,13,10,141,68,156,219,69,60,149,64,74,115,198,44,209,72,85,223,67,56,151,78,131,154,14,173,98,38,28,2,137,15,89,125,61,158,52,113,107,91,169,249,111,145,71,21,108,36,229,97,208,173,201,162,95,197,111,1,95,55,88,33,161,13,10,129,154,149,161,123,123,99,69,133,243,82,95,144,141,13,10,25,22,243,69,183,103,254,39,160,109,224,242,251,189,92,254,214,48,35,186,246,226,66,230,132,12,147,31,67,166,98,126,66,65,185,232,12,90,227,128,176,120,17,85,94,58,33,75,86,101,50,191,178,100,238,134,173,143,108,171,191,91,120,245,77,77,50,196,131,102,216,138,165,148,78,114,48,46,127,120,221,216,212,236,82,129,131,92,176,170,97,60,155,116,81,2,162,211,87,151,168,85,198,152,130,201,44,7,58,117,170,154,124,215,118,236,180,250,216,22,135,182,31,16,19,204,97,43,153,20,221,33,166,66,21,92,138,25,136,197,29,36,162,32,190,63,252,62,30,64,65,222,109,112,122,205,66,166,143,48,219,40,210,243,163,201,194,199,36,60,101,93,104,184,123,33,134,182,171,221,134,126,20,175,84,59,57,226,39,209,118,174,32,180,62,120,141,151,8,90,67,94,63,21,226,125,125,193,92,160,172,109,83,88,250,88,48,179,143,57,135,8,65,253,217,157,186,133,216,94,193,209,229,233,63,164,204,89,81,58,184,180,72,136,124,150,51,167,1,227,130,89,12,66,68,33,190,191,198,176,158,205,175,27,106,255,110,92,103,91,83,79,58,45,231,111,251,104,151,253,250,15,66,71,251,129,57,151,49,201,254,26,149,66,92,231,137,48,61,207,51,59,92,172,1,164,226,88,98,65,52,230,246,244,35,3,170,136,201,194,157,67,22,219,239,137,118,224,51,84,52,206,220,27,61,221,109,131,32,33,104,39,165,124,211,108,140,146,131,13,48,216,164,183,66,61,212,122,28,156,252,173,115,189,39,85,148,95,157,34,133,153,39,222,31,58,80,121,176,100,177,60,70,60,7,88,202,134,105,191,146,122,171,99,33,4,205,191,185,196,232,107,155,133,85,128,236,142,211,61,204,158,176,109,22,150,60,49,190,27,5,67,218,247,241,136,25,7,241,61,40,94,1,223,30,39,118,24,56,190,6,66,45,28,7,93,132,196,199,249,238,45,189,51,91,225,83,128,176,35,231,157,24,190,30,251,206,176,173,212,212,244,37,132,171,69,106,61,200,140,71,167,247,228,11,12,255,126,172,160,189,255,141,16,22,24,137,242,51,71,213,182,45,162,95,191,162,122,141,62,137,19,112,50,232,91,41,169,231,247,148,51,63,28,123,36,67,169,61,179,217,225,211,104,4,2,228,150,190,166,77,177,168,102,239,235,17,89,74,96,155,146,235,151,186,205,68,239,141,5,242,19,53,12,129,213,191,33,210,80,205,2,92,190,228,205,0,238,166,88,47,224,70,61,132,4,84,55,244,90,123,131,43,5,165,159,23,65,67,147,64,38,102,14,108,105,33,38,152,131,115,51,64,136,230,101,187,29,171,146,105,125,117,148,237,225,159,246,153,222,113,156,221,99,36,101,85,87,255,0,191,136,140,152,23,5,163,217,119,94,201,220,61,190,214,101,235,87,144,134,26,151,162,79,23,87,102,225,231,204,114,103,244,234,171,59,96,1,98,90,152,12,73,3,49,34,180,103,121,17,23,41,17,149,116,24,123,109,169,188,228,66,113,59,122,255,98,209,166,7,110,7,1,106,211,52,27,189,88,180,82,137,234,170,11,72,92,112,87,249,196,125,90,36,143,72,47,113,22,47,146,136,113,176,33,123,48,137,19,156,78,185,210,58,181,4,3,197,157,83,29,231,240,44,13,10,82,127,180,53,151,184,229,173,167,58,74,223,123,6,37,218,80,226,130,42,255,157,106,159,56,175,80,49,66,1,129,95,121,238,246,38,161,38,128,49,8,43,31,177,152,12,181,11,247,93,57,78,33,168,186,225,99,6,112,69,191,208,165,206,229,189,109,176,74,204,209,91,226,210,205,200,44,146,118,184,198,126,3,66,209,176,213,252,236,152,160,86,83,126,101,136,231,77,87,33,78,186,209,201,146,22,113,155,53,34,39,56,132,6,17,103,144,196,59,86,189,106,91,229,244,184,15,166,146,72,45,184,192,28,195,209,116,129,55,215,163,13,10,172,96,154,13,10,234,156,123,22,246,253,70,181,139,168,192,134,33,181,44,40,79,213,170,179,38,164,133,199,36,20,223,99,95,1,140,80,165,9,172,252,81,63,125,36,208,65,74,183,154,13,183,13,127,133,2,123,40,98,22,23,249,208,92,6,5,46,77,66,109,160,202,185,62,105,39,233,174,233,27,220,202,89,123,179,39,124,44,213,148,102,210,146,235,156,107,14,128,157,146,80,225,70,252,237,45,186,206,101,34,167,54,234,29,92,79,229,242,218,99,142,93,64,136,40,48,79,178,143,119,27,145,14,233,199,158,33,144,95,188,205,72,18,99,54,93,181,96,251,177,71,182,31,66,24,122,163,29,196,159,246,115,103,8,15,198,83,55,63,16,46,57,82,206,199,77,148,159,101,6,64,72,57,190,172,89,223,130,41,195,171,129,58,224,44,33,3,98,211,218,13,10,248,70,202,65,23,120,67,206,215,34,190,217,55,250,3,206,40,106,73,193,24,13,133,103,48,233,171,154,68,157,94,165,76,19,116,42,141,84,206,114,163,103,57,4,18,153,186,115,147,42,218,70,3,235,125,40,150,225,213,173,231,92,231,186,197,215,229,21,234,216,49,239,117,33,74,219,55,201,23,65,12,126,84,242,178,184,221,125,133,44,64,132,68,251,79,71,35,165,206,111,227,232,5,4,102,11,231,138,156,93,49,3,130,230,44,140,18,201,228,123,203,52,243,179,65,230,28,86,26,30,107,207,18,95,83,12,249,198,92,141,31,30,236,101,242,63,93,180,132,127,76,61,172,172,138,188,98,100,30,85,162,97,200,153,128,60,252,75,138,158,55,185,134,14,92,177,115,180,160,62,60,42,13,10,12,77,131,113,186,118,105,215,95,78,239,212,201,208,148,7,161,226,231,69,133,82,23,151,18,156,216,110,163,20,112,152,107,194,218,238,130,26,202,71,69,28,200,145,157,255,158,152,69,8,89,40,3,136,151,216,114,174,226,136,73,39,163,68,72,244,222,202,193,19,93,42,91,182,218,165,68,16,70,132,237,149,180,197,130,218,3,38,172,239,126,153,107,254,8,161,27,0,81,169,174,12,74,221,29,151,68,0,168,194,28,169,173,113,15,92,83,184,22,131,22,13,25,31,159,25,216,27,185,223,71,100,168,93,132,141,114,237,220,189,153,140,247,45,54,6,172,36,217,101,237,223,68,89,80,68,21,224,97,28,41,156,55,165,147,6,54,41,74,70,152,114,93,185,135,213,94,252,42,224,254,43,234,202,144,52,47,31,245,254,51,162,138,217,120,131,243,205,95,141,100,149,102,233,55,45,191,227,204,92,149,253,72,204,131,191,174,7,163,99,122,74,75,168,65,7,106,130,201,165,74,254,152,38,29,13,10,121,92,121,50,245,109,33,234,6,248,251,7,100,86,105,145,49,213,30,107,50,15,0,231,153,211,53,79,103,0,202,104,127,17,192,213,78,28,243,203,180,214,185,255,149,108,243,72,122,13,210,249,141,38,22,68,77,193,127,85,116,1,229,9,161,47,61,211,239,249,13,10,156,50,97,63,164,111,187,20,3,171,108,67,177,20,241,225,221,255,22,241,120,23,133,33,61,68,44,164,38,224,175,135,186,203,178,34,93,242,47,123,100,244,4,239,11,25,95,61,233,34,180,53,180,215,217,30,177,41,27,36,181,222,64,111,213,213,217,77,232,61,158,139,202,213,8,110,39,78,216,164,4,184,180,91,45,175,99,23,220,5,244,135,8,205,69,215,250,191,120,214,203,74,101,202,151,52,32,189,12,189,13,218,63,63,112,97,193,84,21,50,177,49,74,233,24,115,250,159,79,226,153,228,30,151,30,204,89,177,65,170,65,249,160,13,178,253,168,86,44,236,247,42,124,231,144,226,171,70,48,26,45,187,103,30,251,38,246,173,99,180,1,187,162,234,125,131,239,71,6,46,165,77,163,195,80,72,243,62,149,232,137,30,226,212,128,166,52,230,62,133,75,246,178,242,146,194,1,103,65,245,221,96,83,220,163,245,69,216,65,219,73,71,105,245,117,50,134,160,210,35,238,246,59,60,214,70,185,150,102,106,110,74,225,21,126,19,96,206,130,163,27,125,172,217,127,9,154,51,104,28,103,71,74,145,69,64,164,173,253,181,193,164,30,65,127,79,183,149,236,77,8,87,1,115,32,152,223,149,229,163,168,74,77,39,225,98,165,241,59,251,104,94,179,139,11,82,5,249,228,77,67,219,198,161,42,127,47,9,193,69,202,55,242,170,250,241,27,90,217,215,246,212,20,109,15,97,90,131,131,166,96,216,254,170,183,103,9,134,118,105,109,2,200,197,149,133,138,22,68,190,159,166,95,238,228,59,153,194,222,3,225,21,196,31,14,217,238,157,62,159,119,151,180,77,176,182,185,155,38,78,39,26,0,167,200,44,14,211,169,150,72,214,255,180,216,132,157,191,72,174,162,224,59,184,20,100,251,254,200,97,84,15,210,115,236,198,75,56,148,129,231,124,86,83,235,225,16,36,32,2,71,195,119,172,194,4,112,243,98,153,178,61,144,220,102,13,10,199,82,9,111,250,27,17,142,172,41,250,35,13,79,246,146,106,204,73,239,58,36,159,28,97,151,82,51,63,132,248,211,147,89,24,189,109,89,137,13,29,36,148,52,147,102,125,83,123,222,93,57,6,1,124,166,64,255,28,167,112,104,226,141,74,161,14,111,147,208,191,18,162,88,225,251,88,223,79,27,214,181,43,15,93,157,201,208,169,27,197,92,27,112,72,160,98,79,84,133,228,102,198,168,95,86,113,97,17,82,131,148,244,54,13,200,195,20,171,45,164,119,153,111,182,254,27,201,24,171,95,129,102,234,16,187,118,65,255,46,100,151,171,51,251,241,13,144,49,228,17,127,204,179,215,6,236,220,73,168,222,83,191,17,166,123,157,104,89,158,241,199,67,21,168,177,148,44,117,186,71,232,48,71,71,85,31,55,208,183,68,127,176,197,217,179,233,241,29,184,8,130,128,225,250,112,237,143,219,99,16,102,177,72,34,137,24,29,137,207,116,132,151,168,92,8,175,13,10,154,168,209,39,77,47,161,168,206,71,79,25,202,71,220,179,139,75,86,160,91,207,77,112,44,27,51,13,231,37,135,19,76,202,252,140,219,82,26,231,67,71,205,204,4,167,254,202,193,25,30,238,83,86,7,11,108,106,60,158,212,45,105,34,233,110,105,96,67,99,213,142,248,192,53,228,236,183,179,172,217,149,247,251,33,86,21,3,175,121,92,60,192,149,119,67,248,148,150,141,197,38,103,244,63,28,137,22,138,147,95,105,23,131,99,72,190,94,205,78,211,39,180,109,223,229,135,144,156,172,43,185,88,33,75,117,227,245,98,28,214,108,73,242,174,51,85,38,238,196,194,171,187,132,171,101,182,34,52,102,255,101,158,191,77,171,251,130,192,198,29,191,121,133,3,210,152,173,33,197,54,208,54,199,237,162,85,180,224,177,248,117,189,239,13,10,185,149,184,59,47,191,145,238,167,14,175,128,149,82,215,31,146,62,188,118,116,230,134,32,1,238,228,42,22,31,106,108,140,211,93,179,41,249,55,71,235,213,220,97,79,234,200,75,250,4,68,51,52,242,0,138,242,141,92,148,27,163,30,17,237,207,156,240,165,42,119,8,89,155,203,43,46,73,95,58,1,87,229,76,81,72,90,27,214,59,195,224,229,145,185,141,119,127,121,97,111,99,168,119,29,156,32,210,165,205,237,104,129,67,6,18,97,59,208,2,119,125,154,62,60,54,187,149,70,54,139,234,12,209,108,103,31,97,184,140,40,243,154,60,175,13,10,112,12,80,37,75,177,252,63,114,95,43,207,57,88,30,141,159,98,129,223,79,34,189,251,172,122,215,202,171,67,74,39,37,25,123,239,202,127,29,43,22,247,163,120,217,224,88,191,120,226,227,9,95,86,176,176,132,15,168,6,16,101,236,203,16,154,51,211,198,174,223,57,25,37,73,60,40,173,209,27,225,133,58,11,156,20,51,57,73,203,109,43,27,137,58,238,228,128,73,13,10,206,199,50,151,99,127,167,22,241,244,224,204,5,171,86,66,95,167,230,200,113,201,134,3,129,90,36,234,182,177,242,38,220,157,94,181,207,212,134,172,143,119,17,5,240,132,222,62,224,65,50,189,20,202,8,90,182,226,185,206,19,193,60,102,100,65,77,195,207,58,251,231,6,15,136,227,240,89,87,78,11,194,91,200,79,251,183,192,64,191,251,255,202,11,58,83,24,86,109,201,105,228,73,177,124,192,87,69,162,44,199,94,76,94,222,127,139,62,4,206,198,146,83,181,51,143,210,117,29,72,66,57,148,155,216,198,218,198,227,248,232,195,154,86,35,225,24,243,87,205,234,46,165,129,130,70,208,66,19,173,45,179,178,133,203,35,80,39,223,3,187,152,38,6,159,202,186,245,54,54,19,226,61,190,101,216,15,21,139,172,116,254,195,228,175,110,211,185,48,0,1,95,137,17,194,153,26,6,113,223,194,255,23,168,249,210,205,222,217,37,115,155,96,103,238,129,169,231,186,205,132,158,207,106,140,13,204,164,195,193,226,231,92,63,83,1,30,238,148,159,55,246,92,130,201,161,253,1,60,238,165,79,37,213,199,22,53,108,9,183,163,83,188,221,151,206,64,65,227,227,142,15,91,135,218,225,186,35,196,151,79,160,148,146,98,162,1,41,174,62,75,160,235,225,44,193,255,114,6,176,26,211,183,30,16,24,202,41,73,137,255,6,2,206,161,95,195,203,177,230,20,24,167,172,22,205,103,146,84,151,89,84,72,108,39,208,173,91,27,60,201,93,113,61,133,110,128,84,119,198,15,42,141,251,199,13,10,208,148,32,169,234,146,232,249,62,136,87,242,154,85,117,56,229,183,210,13,10,166,231,34,90,235,141,64,18,200,95,94,33,60,225,208,67,38,7,126,144,208,167,228,140,85,229,70,183,44,72,57,92,217,38,35,123,184,202,225,13,10,2,120,51,241,102,18,103,202,105,194,58,196,251,16,242,150,13,10,72,244,182,144,79,247,238,11,171,124,113,198,207,53,166,79,108,221,169,164,87,154,198,182,241,221,79,129,85,182,240,191,35,116,43,149,71,125,224,217,237,168,188,150,242,127,22,205,190,165,98,132,32,15,20,243,29,177,220,92,64,251,138,183,104,42,163,124,106,155,97,145,54,63,136,176,60,59,157,150,220,100,18,3,92,58,87,117,66,251,90,79,90,249,164,179,13,10,229,4,200,14,87,135,52,196,62,88,23,68,127,145,4,47,95,118,196,38,177,2,54,235,18,89,208,7,71,235,141,93,82,189,104,42,0,66,72,132,97,115,39,108,79,192,48,186,32,180,124,182,56,191,77,12,128,83,9,142,59,235,158,217,6,199,229,238,51,124,241,196,108,6,145,209,9,204,151,144,97,61,121,172,164,244,93,192,27,76,238,18,37,77,214,236,104,166,196,218,133,22,87,99,106,71,117,207,146,248,188,81,14,230,160,115,108,74,246,229,249,243,231,113,236,75,116,91,91,120,247,68,0,62,216,138,51,252,160,158,205,202,221,97,75,230,21,153,214,24,245,121,68,236,23,184,159,35,133,188,248,228,15,33,204,48,253,61,28,196,99,37,104,13,21,210,227,187,204,196,229,68,248,176,161,124,203,196,30,13,129,236,4,70,11,147,132,20,190,35,125,176,168,84,173,40,109,238,190,4,192,122,21,217,114,100,0,73,120,85,48,106,184,17,137,76,69,102,21,159,86,255,37,25,161,44,45,101,252,160,126,200,193,103,217,211,62,152,46,193,132,24,123,84,42,24,173,61,91,99,164,223,72,184,1,120,159,196,155,134,97,73,14,254,207,193,227,159,33,187,192,12,219,232,195,154,250,177,176,200,50,89,148,43,70,13,10,113,20,225,63,34,88,213,12,75,220,12,232,197,114,227,233,135,139,204,65,189,70,63,186,167,199,153,125,175,9,11,245,79,212,231,59,168,225,92,40,33,162,99,86,142,205,111,50,194,13,10,143,24,0,138,186,192,48,235,206,44,26,100,225,207,173,156,36,43,159,15,77,83,134,104,202,140,248,161,142,204,200,87,230,201,113,63,187,120,51,42,8,142,102,234,137,58,74,106,108,195,245,185,62,238,69,48,251,236,93,173,209,70,164,71,13,10,44,68,154,70,170,225,103,175,32,135,218,205,205,6,253,129,206,51,247,42,67,37,73,189,108,154,106,12,230,86,232,241,55,133,127,163,47,155,127,118,189,218,254,249,122,91,13,10,113,223,114,212,45,124,89,132,199,121,126,79,5,142,246,90,231,190,234,45,34,36,223,215,47,66,93,139,253,6,142,68,64,92,100,135,46,62,239,0,26,216,171,184,135,211,255,82,15,221,82,0,71,234,87,154,228,93,51,204,104,126,211,195,3,177,79,104,95,125,24,227,53,0,116,252,134,8,223,216,23,222,235,163,117,15,186,74,191,11,139,81,100,234,9,233,232,201,177,105,140,138,97,134,233,208,252,32,140,182,167,253,230,144,235,173,233,2,172,40,187,44,216,6,19,108,16,122,146,35,38,233,71,90,62,244,166,170,136,7,250,238,79,36,171,94,25,128,244,90,231,117,88,149,227,81,174,44,76,7,152,158,101,251,91,105,201,229,249,118,193,60,123,65,244,90,108,13,89,32,34,92,50,235,173,240,211,119,252,0,168,91,175,164,151,201,17,112,1,135,201,117,16,14,82,40,102,47,0,101,47,248,163,144,72,92,210,148,54,15,197,13,10,118,96,116,234,240,44,131,77,190,37,8,57,99,111,22,155,245,170,13,10,31,16,249,149,32,226,44,84,71,141,169,87,251,98,93,72,246,135,91,242,135,193,27,57,152,32,211,244,136,172,150,182,7,109,72,224,116,121,101,154,242,231,51,104,43,86,220,7,69,189,82,243,33,88,229,0,37,34,157,236,103,177,91,226,66,212,234,9,64,78,197,218,195,71,115,102,36,156,101,37,195,85,139,100,55,21,252,166,40,33,195,163,195,22,194,126,147,25,74,111,79,21,43,255,9,80,85,99,125,154,115,104,76,119,9,169,243,125,229,143,192,9,28,8,237,208,91,154,158,20,191,66,59,130,176,33,80,14,35,189,164,59,65,156,98,207,165,161,37,89,11,24,21,115,214,223,129,213,189,155,60,175,148,189,26,135,60,49,209,38,109,135,43,44,30,137,155,103,157,118,57,21,49,150,122,144,154,181,159,235,71,114,134,235,121,20,183,191,231,110,58,234,156,26,209,104,192,60,0,60,229,216,138,97,73,184,240,97,0,241,215,8,106,141,51,151,74,52,126,210,115,151,63,75,178,19,39,136,28,128,211,50,137,80,16,150,136,213,242,201,210,144,227,242,43,96,214,169,158,199,38,61,149,118,206,172,93,199,137,164,167,131,249,27,137,206,253,35,88,169,239,125,0,50,86,198,3,122,175,231,215,0,143,228,251,220,30,92,125,199,229,124,253,133,30,90,19,106,111,130,238,178,245,144,30,24,215,8,9,33,65,194,150,129,189,58,45,13,10,101,89,143,189,125,171,22,107,103,126,123,57,216,225,181,69,200,129,87,141,167,75,229,127,135,43,195,30,19,135,56,84,201,92,195,183,116,198,50,59,129,150,70,140,194,192,241,66,15,75,72,213,193,24,23,63,231,170,35,155,22,247,173,66,70,31,98,39,126,75,217,58,167,89,14,6,231,104,32,51,180,55,101,117,51,143,213,101,147,49,136,52,83,2,56,183,3,95,206,126,89,39,157,227,101,138,237,13,144,104,162,159,146,119,167,217,34,229,227,173,245,12,44,36,20,6,182,12,122,91,144,70,183,239,135,101,128,203,221,11,236,120,177,92,202,15,47,222,220,109,102,187,67,133,199,9,189,117,32,133,248,210,161,122,32,241,239,219,58,8,117,136,122,189,86,140,150,192,52,50,147,43,221,216,27,87,53,221,71,27,255,20,186,136,233,67,14,105,88,56,3,172,149,246,28,150,165,253,40,169,77,7,242,174,101,72,207,149,134,39,175,117,28,93,38,116,7,238,189,38,93,255,84,101,241,157,131,72,251,248,77,190,177,107,104,154,136,65,101,73,20,161,209,49,97,233,42,126,77,157,44,98,52,178,83,163,109,130,135,51,250,29,226,144,185,255,245,227,17,43,46,108,175,129,152,238,234,240,204,81,246,48,60,13,10,96,183,73,249,102,84,99,193,77,65,42,213,162,107,129,72,94,41,113,232,254,253,130,208,43,225,108,177,173,42,150,160,22,194,106,243,224,30,197,77,13,10,219,198,28,187,7,179,219,5,112,216,202,72,36,225,6,167,83,98,235,172,29,77,195,110,75,146,181,131,97,249,13,200,219,215,35,26,61,126,227,171,1,116,104,141,133,161,194,26,231,187,150,226,22,109,254,182,100,130,227,150,242,191,12,158,75,225,222,236,56,194,165,155,95,102,134,157,149,3,17,15,97,218,202,64,25,40,122,39,110,75,108,12,251,42,203,22,143,246,229,83,230,155,0,102,203,160,46,93,139,203,29,167,100,219,98,61,30,13,10,39,202,108,14,253,206,116,39,53,245,94,188,78,31,13,10,232,76,129,54,211,83,183,208,208,162,98,40,227,37,116,133,126,36,242,21,94,59,67,204,129,240,169,134,215,110,151,165,239,209,192,120,106,147,139,100,194,216,203,109,225,100,56,57,43,75,136,86,89,205,17,13,226,23,41,122,15,82,213,95,162,143,216,83,148,158,144,30,216,173,13,220,87,104,218,207,172,232,143,44,64,230,109,169,173,100,81,13,75,208,122,216,83,77,150,222,54,253,111,29,192,202,106,74,104,97,107,246,190,231,185,133,135,122,25,155,141,207,252,19,26,251,24,139,142,193,32,44,5,193,154,238,106,180,168,160,119,81,51,99,43,179,114,117,55,227,86,133,143,217,136,154,95,4,72,247,69,22,179,203,252,149,85,147,119,115,151,177,44,59,76,78,91,125,35,103,118,34,80,208,249,142,89,44,133,91,14,16,146,242,247,219,149,47,9,110,153,248,2,3,124,66,37,120,100,11,110,69,189,17,51,163,248,207,252,201,171,186,71,158,203,88,63,56,12,161,31,202,242,248,121,151,174,187,231,64,178,191,53,192,118,84,200,25,33,150,102,75,176,212,163,106,197,79,240,132,224,27,175,186,191,197,36,94,209,149,209,195,230,214,109,67,63,244,35,107,217,253,171,204,44,252,159,26,41,247,183,195,245,234,118,201,246,160,24,102,200,21,7,93,199,6,104,65,78,42,161,34,201,49,85,199,126,138,201,149,58,53,120,60,143,115,52,30,224,30,6,24,83,41,238,68,107,64,5,115,36,61,57,86,150,59,33,219,198,144,74,238,75,1,169,241,114,216,103,120,66,96,90,172,238,64,226,93,56,123,27,3,89,47,186,18,250,222,176,42,113,229,20,233,153,193,67,144,184,94,92,66,25,136,119,172,65,117,11,129,74,134,154,217,149,144,102,166,184,214,80,187,240,216,137,9,186,110,194,192,70,73,144,11,161,90,211,160,58,224,116,56,253,196,68,233,86,6,20,65,33,25,4,228,197,51,252,70,151,157,231,149,252,107,99,145,70,61,42,62,145,202,5,240,231,201,207,59,238,179,28,60,215,245,19,27,36,136,14,255,22,112,254,105,103,249,128,245,117,24,72,138,116,129,197,77,196,224,100,184,120,209,46,77,169,225,157,255,27,226,59,97,64,167,118,35,133,236,97,89,112,81,219,84,166,142,3,125,245,185,66,38,81,66,160,179,49,56,136,53,112,233,210,134,228,37,0,49,242,244,145,174,16,139,237,158,61,126,236,159,167,179,186,159,161,64,15,129,24,9,12,150,45,135,40,42,132,245,199,107,88,24,201,242,185,88,37,101,69,162,176,35,222,225,25,191,149,117,161,57,25,131,81,157,13,162,57,42,41,79,121,61,14,113,77,134,179,187,181,90,200,105,119,221,102,213,13,8,243,238,96,236,221,62,65,250,9,150,193,48,254,180,220,94,121,22,57,234,12,241,112,163,132,201,148,43,175,22,241,45,245,8,179,165,72,4,250,184,56,208,66,162,57,81,194,105,193,216,188,233,57,219,217,29,226,8,67,249,126,224,79,144,77,154,98,206,1,80,118,71,157,105,2,227,16,166,33,4,118,149,132,29,8,183,155,155,88,103,57,176,146,117,17,171,115,66,98,232,146,23,175,165,240,197,247,211,28,250,49,37,189,146,26,122,148,152,60,12,148,44,209,47,217,121,4,100,43,212,32,16,245,141,36,83,32,5,210,113,45,143,69,120,208,151,70,30,196,219,88,85,14,137,255,98,118,83,34,83,90,41,12,102,110,230,15,197,38,1,31,233,44,28,190,216,162,198,138,77,82,62,218,172,31,40,188,150,178,202,49,41,164,149,210,187,87,30,52,92,179,107,44,32,67,84,106,213,119,215,46,202,129,252,88,224,128,37,140,77,197,250,159,160,119,201,223,46,133,142,174,82,227,18,84,139,64,67,166,124,249,182,19,65,88,6,204,203,189,74,180,52,168,227,93,176,96,24,250,211,100,250,222,215,116,242,18,192,233,166,138,80,232,231,76,182,182,131,103,254,46,156,206,183,130,124,95,111,253,168,171,123,216,107,38,21,239,53,26,64,187,69,84,206,19,181,93,217,136,181,233,231,71,254,180,84,142,39,167,99,212,102,75,63,224,248,108,50,11,101,26,100,93,108,17,94,15,9,69,52,176,233,231,124,1,176,43,132,254,75,250,16,159,1,207,86,203,197,215,55,135,96,135,228,215,4,166,85,107,174,226,48,243,83,60,54,87,44,226,96,249,2,45,54,194,70,170,110,240,204,73,84,173,144,105,121,119,23,74,168,33,125,40,52,15,74,27,106,245,213,63,244,25,163,245,138,35,183,5,97,48,194,215,168,145,208,13,10,109,119,143,228,111,44,109,139,109,184,167,50,189,70,44,186,112,193,57,195,207,71,101,242,215,197,164,194,205,161,51,106,16,48,221,120,42,86,61,193,136,94,229,203,132,57,16,164,231,29,142,17,28,203,43,251,21,4,169,15,234,234,45,162,31,57,206,211,166,11,198,252,166,176,151,232,64,254,0,114,98,48,64,210,55,113,49,64,241,59,41,80,219,73,27,228,119,91,96,159,158,229,176,12,220,26,119,8,30,50,232,137,174,14,42,223,2,52,179,228,33,242,168,164,120,212,229,34,31,114,204,77,104,56,66,7,229,27,55,134,203,87,178,86,218,62,249,182,131,100,252,16,206,217,218,105,160,251,118,170,207,127,164,203,252,150,168,73,181,246,16,38,197,109,221,209,196,51,231,188,33,80,184,149,121,68,77,195,164,7,92,134,161,37,241,183,92,122,33,225,142,204,115,49,62,235,78,57,17,94,83,161,224,121,191,20,220,196,18,79,124,195,223,72,230,35,169,159,132,221,86,173,243,184,193,114,174,40,236,222,192,21,132,221,225,106,86,78,152,112,151,244,71,168,144,161,163,183,38,165,145,134,220,168,144,235,35,9,36,186,54,149,183,11,111,223,69,189,195,215,191,234,178,226,135,198,138,96,132,0,17,105,206,32,8,112,179,108,155,213,223,227,26,213,127,101,60,183,81,11,64,25,227,56,13,10,204,47,229,164,9,240,87,0,15,20,91,167,106,135,203,181,156,69,48,57,206,42,111,115,236,198,196,116,57,108,196,81,54,46,187,157,103,12,235,92,223,202,239,2,60,26,229,13,10,239,89,206,153,118,124,43,3,202,15,5,184,159,103,168,71,90,131,6,83,253,140,93,187,178,173,220,231,123,220,147,23,210,22,171,23,213,38,107,13,10,237,172,163,209,195,84,26,175,24,37,128,107,142,224,193,227,139,185,204,12,245,75,30,14,188,163,22,135,106,184,124,80,193,24,203,41,142,158,59,135,83,67,74,8,130,196,194,107,194,142,192,182,46,65,32,22,212,84,148,97,172,152,52,139,123,90,194,30,229,73,72,125,12,95,191,103,231,223,126,108,222,196,149,227,76,86,241,143,75,135,223,43,151,171,14,184,166,67,2,189,239,155,58,98,242,43,253,23,33,163,136,246,5,55,214,131,19,80,96,96,239,29,74,229,146,231,132,131,212,2,14,251,243,187,77,178,2,188,253,78,2,157,132,134,175,219,24,87,182,137,196,101,97,105,209,102,87,173,106,33,61,73,215,156,147,57,50,154,232,228,59,187,96,32,249,59,253,107,148,177,165,76,68,23,72,111,89,8,42,163,104,116,36,150,16,47,58,40,173,217,231,142,84,210,102,122,222,227,236,17,162,4,133,235,190,79,245,84,127,202,204,18,246,197,195,229,224,15,189,109,4,97,155,129,87,140,14,163,51,133,253,85,255,209,123,67,87,130,204,144,233,70,223,129,26,186,65,233,12,42,116,234,194,86,160,144,29,175,78,54,164,27,105,232,186,113,38,120,168,95,143,8,11,141,37,192,0,30,233,180,230,243,122,156,13,10,129,68,174,11,255,151,191,41,51,149,31,136,59,52,211,3,60,94,235,58,94,8,236,107,119,184,130,250,95,95,30,120,139,44,119,165,248,180,159,201,131,85,217,40,77,22,167,104,104,174,137,18,132,45,153,202,255,180,40,251,174,33,252,193,25,175,247,156,109,15,182,145,103,109,115,13,10,79,87,35,62,29,238,148,233,42,213,1,174,217,217,211,166,146,33,118,67,196,61,57,179,238,193,200,166,253,225,9,149,195,102,175,211,42,90,227,24,94,32,88,208,252,143,22,100,100,226,250,116,126,233,168,145,230,216,190,51,73,126,226,2,220,56,229,238,25,82,222,113,253,152,101,114,159,28,209,173,169,247,174,56,200,251,23,218,107,102,120,94,145,249,108,182,63,159,36,64,7,133,88,20,82,145,54,186,158,209,26,178,32,22,221,149,199,162,187,206,157,104,161,187,226,76,141,160,9,160,59,174,71,176,59,218,64,72,179,27,84,164,24,129,246,232,79,114,76,71,155,112,228,143,222,103,116,189,189,1,200,248,194,62,39,25,133,222,190,225,57,199,122,57,77,74,177,228,252,187,185,224,222,95,126,7,200,159,135,210,142,181,141,64,212,41,72,150,143,249,182,190,154,207,89,204,244,101,213,147,141,33,237,109,160,47,69,136,245,61,226,166,169,93,118,8,155,140,109,140,76,75,143,140,213,132,105,163,185,92,126,46,49,202,87,130,120,243,196,13,10,201,243,101,130,221,92,68,250,57,147,211,206,239,233,175,95,167,122,105,133,248,166,127,147,67,152,114,62,198,163,217,248,78,34,89,147,207,67,176,32,115,197,26,46,27,110,234,121,44,22,43,227,115,145,197,223,99,132,123,145,62,38,64,194,45,98,153,21,155,241,236,17,231,134,75,18,150,223,142,234,170,232,146,204,35,148,200,89,110,103,39,143,206,175,212,65,227,39,55,53,199,227,111,90,149,136,48,126,135,6,162,62,51,197,83,179,132,124,124,28,150,182,27,77,67,63,102,102,63,47,72,160,156,91,140,198,76,36,76,33,143,247,161,177,123,217,43,215,227,229,171,102,75,120,162,109,232,101,68,186,13,10,125,64,208,129,199,34,203,18,112,243,161,7,245,208,123,0,156,20,51,163,158,97,230,137,44,215,190,34,130,0,86,12,56,252,85,143,126,132,190,177,244,0,255,75,188,43,130,210,47,196,104,123,74,45,250,65,173,153,132,229,71,234,133,233,177,186,94,64,20,252,145,139,1,192,81,164,4,253,86,243,204,226,97,27,230,87,12,50,12,222,185,148,84,163,70,57,199,12,115,189,210,123,142,243,34,240,82,243,229,35,5,67,20,193,205,19,119,113,24,117,36,114,87,22,43,141,235,68,253,153,6,86,33,20,1,30,147,202,29,152,142,82,186,109,212,119,164,16,12,79,171,138,172,29,200,49,186,123,247,139,52,86,142,249,174,70,22,97,84,147,57,181,149,146,149,114,145,73,145,86,52,149,55,45,74,81,101,236,129,234,231,159,141,25,120,175,115,140,241,26,165,43,164,195,119,36,68,47,18,93,25,103,122,156,0,230,27,33,133,234,57,12,209,172,49,49,235,139,163,139,170,254,151,99,215,82,173,171,47,136,141,61,196,245,227,249,232,55,104,182,36,36,111,66,133,36,98,171,112,243,5,82,147,217,236,124,146,152,107,11,51,131,117,252,82,106,168,171,63,13,10,230,1,188,121,187,159,182,4,107,165,244,87,16,206,148,248,18,223,76,172,36,94,186,141,30,236,133,202,20,48,209,91,150,119,142,131,35,91,174,176,43,237,54,195,66,33,168,13,10,97,145,101,140,70,87,143,2,97,70,229,167,97,45,83,39,35,255,2,195,255,98,2,99,162,49,9,71,202,120,219,180,44,72,152,149,13,10,70,60,224,127,177,33,238,206,222,243,241,165,65,227,49,93,85,43,242,57,116,255,20,162,227,73,228,92,234,176,243,255,250,113,228,189,44,181,207,159,160,241,187,62,103,232,98,246,223,156,236,122,42,137,140,108,52,14,117,159,80,36,32,155,50,98,144,8,253,4,224,2,193,107,171,163,80,72,72,25,35,23,19,157,108,234,185,187,77,74,221,158,190,123,138,35,96,178,1,51,86,163,24,146,117,166,185,246,196,91,223,30,205,88,153,8,36,80,78,67,162,209,227,178,99,194,245,29,36,240,245,73,44,105,0,107,6,2,209,18,103,7,189,6,208,23,144,126,178,118,16,92,230,55,138,46,217,19,215,225,237,169,201,167,181,19,5,46,8,208,221,220,55,101,57,101,54,170,64,59,180,172,139,143,194,81,21,194,181,155,125,254,226,175,164,16,173,164,187,22,106,62,110,224,99,168,142,143,133,63,157,218,192,198,99,12,253,56,11,232,218,69,167,112,179,251,21,235,101,139,220,79,236,242,12,243,130,88,191,12,95,194,187,7,119,207,185,201,165,79,44,54,47,33,23,30,108,70,12,72,236,127,181,60,44,186,143,73,21,181,19,59,85,209,79,227,183,15,149,19,143,1,62,122,20,202,146,144,142,35,176,214,219,87,251,237,62,151,56,8,156,7,29,153,158,144,207,221,179,244,238,77,229,240,46,83,253,42,228,161,49,245,202,145,173,136,164,149,113,179,195,132,6,208,93,235,2,56,8,4,68,145,131,13,141,91,128,195,63,31,110,138,76,164,32,119,247,193,178,40,89,138,188,232,35,227,106,230,44,156,231,56,229,178,38,91,153,47,104,100,45,185,233,231,160,129,118,81,100,12,39,229,83,199,26,76,50,133,224,215,128,250,3,81,220,191,104,183,52,78,65,204,19,60,39,152,175,61,178,101,159,123,183,187,64,158,175,215,39,215,146,119,244,210,209,46,143,252,35,97,35,129,117,96,154,161,165,37,20,7,235,186,182,240,160,240,13,162,252,133,9,205,141,121,24,15,160,139,97,73,173,74,126,59,210,202,48,187,177,181,63,53,120,254,6,238,153,246,78,2,86,98,210,240,86,220,43,196,242,228,213,202,80,42,201,63,122,188,43,48,96,51,4,149,244,132,212,142,247,67,13,10,123,226,1,9,253,8,163,38,144,110,206,243,13,10,76,164,222,169,227,185,180,15,142,244,144,185,85,207,133,56,168,13,10,141,175,171,170,45,199,195,135,88,239,30,173,112,157,111,231,196,140,128,15,32,191,92,165,174,229,71,86,50,90,137,47,245,242,172,87,209,152,73,146,122,160,183,168,31,211,164,208,74,122,36,186,123,65,32,141,112,152,106,6,93,215,125,137,62,54,197,33,8,113,66,51,59,52,247,65,254,232,178,221,186,141,187,37,155,98,71,1,20,178,6,149,193,204,253,121,189,201,82,217,64,72,81,100,140,148,119,218,159,179,68,95,146,50,154,146,41,126,226,180,48,5,77,41,161,196,43,108,40,147,131,140,154,149,74,171,101,138,224,72,188,220,91,83,19,190,145,90,213,159,234,179,234,111,247,182,217,216,55,252,188,58,61,247,91,123,182,24,180,87,215,16,194,184,95,168,243,62,227,202,29,5,31,109,243,126,32,60,236,86,182,55,197,158,8,192,204,220,95,200,7,18,29,35,138,93,199,218,171,83,135,229,149,126,166,64,175,253,229,196,46,64,97,83,126,40,54,212,216,24,106,161,55,191,22,111,163,32,162,187,143,6,234,71,94,13,10,46,73,5,67,77,204,42,50,145,189,144,163,252,189,232,172,210,70,74,31,110,160,239,149,14,23,18,213,159,117,230,14,80,214,42,218,250,8,111,191,195,173,0,255,141,206,124,7,67,163,43,7,233,56,211,178,206,192,96,117,86,134,4,174,18,84,102,119,21,6,69,178,218,128,16,221,159,201,210,63,202,146,75,76,229,160,51,96,225,52,201,167,156,171,133,75,235,232,60,180,58,96,5,145,244,128,17,4,161,36,159,49,117,230,89,100,248,55,23,216,98,32,48,158,87,81,130,161,188,51,151,135,145,156,70,118,97,91,213,84,233,229,175,215,1,210,121,220,146,120,138,0,142,73,246,140,245,6,187,149,182,168,73,150,38,49,244,222,226,78,97,13,13,184,80,151,190,183,96,216,164,8,112,121,187,181,60,236,85,115,131,47,72,33,114,13,49,82,169,104,183,201,125,134,16,152,192,36,189,118,202,19,38,220,99,78,221,13,10,78,127,226,172,32,192,37,249,79,169,32,180,183,119,119,228,118,102,89,220,53,240,143,119,162,206,4,255,96,126,86,78,96,142,37,200,103,45,72,69,27,212,188,170,210,226,176,64,204,187,127,163,50,70,88,17,67,9,95,112,16,166,102,39,71,212,176,85,219,231,159,106,237,40,222,232,183,192,162,109,121,7,143,76,114,42,2,16,159,79,233,63,205,99,156,179,6,1,95,225,122,92,32,111,99,243,3,112,173,73,86,187,231,91,113,75,22,202,86,159,59,110,185,146,216,90,103,213,125,98,213,9,40,225,132,195,109,226,49,60,61,2,214,169,143,22,239,54,23,12,25,208,7,16,56,214,201,209,146,180,220,30,240,204,234,222,49,19,72,254,114,106,80,45,255,45,83,45,27,220,54,196,144,216,23,55,151,96,249,236,190,120,126,122,104,48,227,32,61,110,146,234,142,38,139,74,130,203,121,18,128,48,38,166,79,218,226,160,162,180,92,247,195,84,147,17,179,84,206,222,71,115,168,122,64,111,87,164,110,17,65,54,104,91,99,23,201,243,193,38,190,167,56,212,115,187,51,109,112,237,48,222,22,93,196,26,153,171,156,252,225,11,98,169,125,44,19,41,70,255,77,248,244,91,118,80,231,17,205,190,154,74,195,70,214,187,108,68,165,232,33,75,118,200,191,169,151,93,107,8,116,136,34,165,134,168,124,176,168,180,55,157,119,133,135,148,201,41,1,249,220,20,97,215,240,34,180,100,27,168,213,70,192,79,81,51,243,90,190,211,241,108,213,55,64,39,66,3,80,3,56,139,233,30,245,200,215,61,207,215,27,66,79,178,199,193,158,38,245,69,17,179,138,19,13,10,116,137,225,158,116,55,42,29,181,3,124,161,92,61,195,108,250,102,27,204,180,63,216,217,86,157,191,185,109,65,211,183,255,87,185,110,124,188,230,16,177,183,177,25,130,59,3,2,53,47,46,22,162,222,200,74,175,189,146,0,35,142,120,231,25,174,184,9,187,229,240,96,242,110,50,212,121,158,72,242,101,64,91,71,99,61,189,84,114,54,4,166,83,191,229,104,23,200,250,189,184,52,71,198,12,150,195,140,145,180,192,130,116,12,182,172,102,40,242,132,119,82,97,128,49,206,209,158,48,98,90,217,30,136,35,92,156,8,131,37,190,167,102,162,172,223,215,197,19,172,151,39,61,87,84,4,178,104,60,224,166,58,227,6,133,109,130,128,154,64,96,176,98,147,24,1,110,178,210,204,159,131,94,41,157,99,198,103,210,58,176,123,84,252,201,68,224,216,120,62,213,199,53,54,71,186,43,56,89,19,94,162,132,69,181,119,83,144,90,181,177,78,80,125,144,78,209,26,12,239,165,175,201,229,18,243,237,93,11,68,229,227,244,144,135,83,97,56,143,122,241,167,248,221,60,47,157,117,26,59,169,14,210,180,253,22,87,196,31,199,65,123,2,52,82,47,237,226,166,103,122,88,52,35,60,51,169,166,146,228,92,242,157,19,126,189,220,8,69,224,46,205,232,86,212,136,144,91,229,169,16,92,49,100,180,15,216,154,95,184,148,43,38,210,125,20,28,166,157,192,91,165,90,5,218,142,223,99,151,62,68,240,33,39,128,100,124,150,179,136,133,154,216,181,151,221,123,12,51,32,18,130,42,106,60,188,234,235,241,29,55,64,172,189,1,135,9,244,143,193,116,197,176,44,59,92,20,250,236,61,163,224,206,143,192,252,238,181,199,53,244,197,163,226,9,6,127,9,114,160,39,1,184,34,133,16,29,236,223,22,247,13,240,172,152,191,215,114,200,182,19,101,64,200,96,14,164,238,37,128,84,141,152,35,183,125,253,66,192,125,109,233,139,198,153,84,122,228,236,198,227,67,43,187,141,121,113,93,54,91,80,73,197,79,58,201,37,120,63,202,64,146,62,186,223,200,184,178,251,223,209,58,212,91,5,97,200,77,143,161,253,5,136,174,21,75,128,182,84,132,68,106,52,230,222,32,48,95,164,238,151,33,164,16,39,179,214,197,59,251,103,11,169,19,89,189,239,4,78,212,200,27,117,141,77,239,156,68,178,27,9,62,135,156,181,163,132,97,179,76,140,155,71,109,112,248,222,60,105,75,235,233,44,92,13,68,19,97,248,254,64,149,180,251,181,58,17,116,241,110,0,121,149,129,115,174,142,35,158,172,247,56,86,47,225,73,150,24,8,26,247,133,97,36,41,155,78,64,196,176,137,27,69,48,204,80,128,159,100,13,10,179,94,188,89,186,123,156,88,120,62,2,230,222,239,93,31,236,176,124,252,1,93,94,3,36,215,27,110,215,61,38,247,117,253,156,152,95,112,34,166,166,188,178,138,27,72,211,241,165,149,239,111,206,125,166,37,241,61,156,80,197,182,225,27,97,231,47,164,205,59,74,241,21,254,16,124,139,33,87,32,106,194,221,91,143,70,172,144,42,208,162,22,191,123,40,155,105,248,110,50,185,177,227,99,234,53,91,118,129,82,82,51,109,171,68,49,188,231,71,198,102,219,248,82,182,70,207,1,58,35,167,239,215,107,40,215,96,135,50,13,174,181,58,240,216,174,248,89,200,108,157,79,226,105,172,8,149,13,10,70,95,48,239,240,7,49,158,97,215,109,81,131,39,249,80,204,63,2,104,242,76,181,91,118,142,160,93,164,203,115,220,105,227,217,191,33,155,62,89,190,69,73,90,16,164,49,81,152,167,70,132,63,2,223,19,6,233,99,19,72,212,112,215,52,52,39,129,90,34,43,232,17,180,184,80,122,76,161,55,183,19,83,64,28,60,87,82,186,0,134,179,246,51,81,93,223,82,45,80,240,165,78,21,216,60,69,43,18,249,191,78,56,214,227,5,132,64,82,252,229,59,174,100,27,199,89,150,166,224,18,16,159,173,63,174,66,24,231,21,99,48,75,145,63,183,160,158,233,177,228,44,71,143,241,13,105,43,207,112,129,82,204,47,70,208,146,115,188,216,15,112,68,207,74,105,252,84,235,33,68,67,246,143,20,127,76,125,238,218,173,99,164,207,244,224,81,55,119,87,113,162,192,62,160,103,34,166,149,218,224,70,205,38,37,141,187,109,52,201,24,166,1,73,167,51,129,97,86,20,168,47,235,26,0,64,13,85,184,6,252,187,26,168,48,55,241,217,61,84,73,5,215,153,60,78,100,64,204,238,99,117,131,64,92,135,85,56,168,172,208,240,247,22,164,137,140,213,233,212,144,241,3,30,112,250,13,109,116,22,207,75,74,0,232,131,119,4,124,76,231,29,190,80,207,122,140,238,43,157,114,238,169,81,37,241,123,234,143,67,166,44,46,75,24,58,239,158,51,225,216,31,199,55,148,162,228,78,25,180,222,145,179,218,249,139,220,200,8,244,215,190,161,54,42,124,88,3,181,111,64,88,161,228,231,95,145,185,125,76,55,235,168,1,251,71,12,28,140,200,227,43,232,58,55,141,138,209,243,150,179,173,174,63,140,129,79,188,253,46,153,244,153,14,79,8,107,192,171,144,247,69,152,132,135,247,236,93,149,47,103,247,155,247,178,88,205,2,83,31,215,11,144,138,172,130,178,83,232,93,2,74,105,41,111,207,154,182,245,231,34,61,77,93,231,71,245,113,191,32,39,142,4,80,60,20,19,73,28,121,160,26,125,146,221,209,148,28,236,50,211,33,59,138,48,172,44,33,61,233,251,201,168,138,202,245,41,105,214,27,36,1,208,234,203,24,191,250,157,230,22,165,13,101,188,21,150,176,164,12,42,44,147,234,15,142,210,195,14,181,44,89,55,164,35,102,197,239,198,172,94,194,19,103,58,228,197,67,166,243,187,52,240,144,184,72,148,133,228,185,208,188,252,234,7,116,47,184,79,133,203,165,61,137,224,228,40,243,163,27,89,73,97,219,149,141,191,46,221,52,218,100,86,225,50,122,204,83,235,168,214,68,127,180,45,172,209,189,139,36,161,18,184,2,236,117,159,85,172,204,94,237,44,37,36,95,87,62,97,79,40,249,217,194,119,94,13,10,28,70,210,70,236,60,14,92,112,239,152,36,27,72,128,130,165,83,102,194,2,129,202,111,90,213,187,136,222,205,237,164,146,109,78,23,9,119,223,145,81,26,143,97,203,58,158,99,223,253,165,57,122,173,111,211,181,145,12,71,19,74,76,51,124,4,212,116,19,65,47,254,130,202,132,237,200,83,27,161,31,234,111,247,182,208,0,180,152,193,92,229,85,165,17,195,140,94,132,79,83,115,195,206,11,111,136,35,116,82,114,189,70,48,81,115,85,246,41,253,66,71,105,178,136,65,242,153,250,101,27,57,228,120,13,10,197,12,158,238,246,171,20,33,0,126,161,247,197,123,142,254,167,169,174,216,89,120,211,117,74,120,54,36,242,169,39,193,0,142,211,33,214,115,190,29,5,34,160,61,226,175,3,126,50,51,144,20,50,87,84,250,170,11,97,181,20,113,222,39,129,203,3,1,96,133,162,77,90,33,182,50,55,34,62,108,154,74,95,117,46,154,124,233,34,32,255,163,234,108,154,90,55,127,107,32,244,93,19,40,224,111,84,105,69,220,31,196,243,200,90,98,85,226,22,225,147,215,57,33,144,192,206,119,95,134,8,4,19,19,171,15,224,5,236,74,208,120,37,67,60,132,95,187,106,97,125,98,205,59,37,95,114,130,178,104,112,193,165,73,189,178,229,207,45,19,154,187,203,240,234,160,13,98,27,61,176,215,191,89,85,249,75,40,52,19,187,137,48,114,39,68,61,150,237,190,45,154,152,215,86,68,80,124,169,191,172,205,171,132,103,95,37,237,244,218,14,186,203,67,218,32,155,12,18,76,183,162,35,198,58,137,95,230,110,20,208,2,215,21,173,76,252,236,159,3,126,104,100,73,132,215,12,93,227,225,175,78,71,164,148,219,198,187,222,183,193,29,240,144,188,230,28,57,55,118,244,161,94,91,74,26,137,213,231,188,219,93,11,104,197,18,145,140,100,2,122,217,176,11,51,209,215,7,154,151,248,82,55,222,105,237,79,0,208,164,14,157,66,204,71,161,166,142,27,236,157,77,166,141,33,194,153,169,217,138,121,155,145,46,4,84,160,24,197,235,14,199,159,75,79,51,158,188,136,156,185,26,235,191,18,116,204,24,168,40,183,143,11,185,185,136,171,149,3,111,224,78,172,254,3,162,179,32,220,178,206,138,136,177,135,101,13,44,157,83,126,212,63,3,133,176,217,233,60,26,7,119,248,62,20,166,8,79,39,119,227,34,156,254,123,110,115,148,16,213,18,245,119,150,28,82,186,83,172,95,109,196,194,28,21,218,111,180,181,167,192,80,111,212,148,55,171,77,188,45,147,166,242,92,65,105,237,188,187,243,115,71,176,80,13,160,112,237,79,232,37,47,173,106,22,208,188,210,26,61,213,204,17,84,126,2,6,153,0,95,108,13,16,163,30,80,26,66,222,105,87,247,255,0,120,215,38,147,232,143,216,81,214,111,180,177,77,57,123,164,216,212,124,253,124,82,231,241,203,66,95,160,253,201,224,22,185,213,23,230,50,16,218,76,237,129,66,113,189,63,219,144,130,109,67,93,84,40,102,96,188,47,104,29,36,51,146,69,114,74,253,114,28,111,66,61,238,195,55,108,219,18,30,117,128,136,165,191,56,120,64,146,69,28,128,54,184,149,124,125,144,237,31,5,243,198,82,104,4,119,202,202,121,5,29,89,51,254,193,97,45,202,98,149,80,190,173,153,159,207,6,139,21,194,0,227,198,40,47,168,84,208,114,167,238,90,119,104,70,136,212,194,171,195,218,43,50,100,132,119,180,243,250,225,193,29,34,137,132,239,58,163,255,109,247,84,34,165,221,237,37,141,214,140,131,6,42,249,57,99,123,38,124,108,17,220,184,68,133,173,114,69,136,60,166,132,98,166,251,184,45,46,162,59,3,249,32,122,88,164,24,204,128,240,151,96,170,16,222,71,204,200,216,226,62,76,113,211,8,227,32,249,147,241,92,91,233,112,217,168,142,114,249,241,95,14,162,202,5,76,219,140,119,238,111,236,203,46,178,108,214,17,170,74,98,220,114,95,61,204,230,186,214,145,65,170,50,249,227,212,25,57,84,232,116,5,248,195,55,41,129,109,222,27,198,27,148,63,180,83,207,218,152,41,13,108,192,150,229,76,2,200,28,238,114,184,158,110,75,183,176,115,238,74,32,78,169,53,253,154,63,175,126,160,107,248,0,146,131,229,114,173,3,180,136,2,41,25,17,105,114,111,38,166,230,21,215,223,104,48,38,194,166,136,52,249,207,26,209,190,185,113,250,86,102,7,102,56,129,90,86,144,188,30,123,138,7,39,139,131,196,135,35,202,252,147,100,92,15,190,192,232,71,230,187,250,111,59,229,157,36,241,210,206,154,234,172,242,156,13,10,53,169,152,141,146,41,114,77,44,243,156,93,90,46,1,78,210,20,173,202,51,203,193,116,243,63,73,241,208,71,56,66,92,254,179,153,70,20,141,186,233,254,126,32,11,100,69,173,186,115,68,169,202,115,210,212,231,255,56,16,181,162,5,16,150,213,18,119,145,74,73,160,96,155,171,141,3,249,251,112,155,253,135,78,152,35,205,34,22,243,154,211,92,199,74,221,200,241,176,4,50,161,241,144,36,13,54,118,227,52,214,124,211,61,152,11,161,103,149,21,240,13,246,105,142,253,165,2,46,129,210,250,168,198,223,27,189,28,178,59,103,121,104,176,86,57,99,53,1,78,240,82,116,224,211,40,14,155,85,2,148,41,253,100,160,9,199,246,31,239,82,55,40,13,10,57,44,62,64,63,159,89,202,82,164,246,206,129,160,7,181,173,236,118,88,225,58,233,141,201,70,187,122,101,176,18,177,33,117,177,202,136,188,186,126,103,50,218,225,79,61,62,213,222,88,109,201,206,108,153,88,177,75,141,89,135,231,226,2,239,54,185,253,26,199,182,139,65,156,227,58,78,91,208,20,65,99,228,101,49,169,107,123,8,245,198,86,1,249,9,219,186,25,76,236,154,203,45,108,5,196,39,229,7,255,240,69,3,185,174,141,21,151,71,115,186,42,184,197,125,83,163,16,62,30,6,240,212,108,199,210,167,218,211,76,247,99,47,3,227,61,117,171,14,42,217,187,73,11,170,34,144,178,8,47,153,222,184,185,13,10,83,178,0,1,63,252,217,14,94,242,130,82,39,86,84,77,170,228,174,240,91,190,165,148,198,83,48,23,163,177,61,42,8,50,206,45,187,200,84,115,194,216,35,41,121,128,200,68,241,19,171,245,86,33,104,168,22,157,21,181,244,49,177,229,82,189,100,69,23,51,152,113,183,159,201,193,9,2,28,3,4,145,110,236,136,117,205,62,5,2,193,155,137,67,250,255,66,244,39,129,85,148,120,38,101,86,188,203,84,225,100,68,34,223,143,230,183,70,244,17,233,114,140,225,157,216,42,84,224,19,158,163,110,133,18,52,104,122,138,48,43,55,245,226,185,20,72,170,143,203,1,118,0,182,43,69,84,198,62,233,115,231,203,236,172,239,97,100,208,195,247,212,88,224,198,8,153,62,89,8,183,61,128,235,251,246,64,217,62,148,51,33,218,54,131,202,95,67,99,98,240,250,183,66,101,65,93,70,42,19,99,199,240,61,225,123,32,179,203,205,231,5,227,90,8,213,75,111,45,91,164,158,213,58,137,72,166,91,73,147,30,60,212,114,174,229,53,185,27,234,26,75,3,7,110,57,68,49,183,26,166,14,51,167,61,130,136,135,23,245,99,116,160,197,96,234,230,255,181,77,72,50,33,252,246,206,220,63,233,38,122,223,220,98,168,161,161,108,156,80,47,14,221,182,28,121,110,148,236,148,149,202,199,124,24,48,246,6,190,14,118,229,179,207,37,190,121,144,252,138,38,229,214,205,16,123,194,66,240,167,133,157,49,52,87,115,194,251,94,242,226,192,228,94,223,44,195,188,101,40,224,25,122,84,76,209,143,197,128,95,51,48,11,46,39,93,138,32,166,223,84,169,226,165,251,116,245,42,172,117,91,170,86,93,199,51,227,193,227,225,236,249,59,114,158,224,216,100,110,79,200,47,153,107,166,151,251,40,229,40,249,84,83,35,194,27,162,164,117,73,123,203,211,102,143,125,95,96,110,136,188,134,144,83,229,120,64,232,196,82,50,222,77,229,253,175,255,6,85,52,56,191,232,180,193,65,232,226,250,150,66,253,221,186,101,96,151,32,121,219,235,78,165,180,26,237,22,94,69,44,118,207,131,141,192,78,221,73,199,214,6,105,210,186,197,83,189,66,68,56,226,61,83,36,74,34,79,88,255,87,228,200,204,44,27,158,83,170,76,180,74,142,195,16,66,97,98,104,83,157,133,141,233,112,94,47,54,4,1,156,30,110,188,241,207,158,72,11,46,80,212,38,190,172,135,162,200,134,94,201,113,216,132,178,75,48,66,168,28,227,97,46,125,72,33,24,165,223,56,120,6,133,237,12,230,97,132,4,137,47,65,218,203,56,208,177,129,145,71,250,40,116,214,58,50,133,108,194,99,162,148,102,36,231,61,213,56,14,16,66,38,88,66,185,90,30,239,172,214,27,237,141,228,128,69,221,238,75,0,71,161,239,100,21,208,104,152,191,190,2,129,221,165,181,238,175,129,22,9,42,66,37,229,105,148,199,174,170,50,127,238,201,210,130,147,55,114,222,247,247,157,201,106,28,162,105,122,158,165,58,166,226,169,57,74,98,33,182,109,157,96,49,244,79,190,134,155,52,14,217,143,217,111,13,32,66,42,59,11,104,99,216,61,153,214,103,43,239,158,135,17,75,103,253,58,29,168,214,201,95,87,20,16,15,166,226,151,103,39,185,1,11,160,101,123,30,217,78,73,199,207,50,187,241,101,39,8,23,203,35,218,174,231,4,175,100,136,113,206,216,201,22,135,116,145,200,3,121,182,197,179,77,232,117,143,220,53,5,18,168,200,67,76,178,106,170,229,33,193,118,54,144,125,59,37,194,125,16,75,241,247,243,72,6,182,2,51,179,16,7,29,150,190,112,142,212,230,11,178,221,144,167,93,230,125,166,104,47,232,55,151,75,164,168,85,64,139,9,172,207,168,47,28,32,242,35,75,231,45,70,202,3,2,243,204,202,246,89,247,201,98,232,228,236,228,57,27,202,228,193,6,66,57,66,102,248,212,97,19,239,72,120,52,115,79,230,177,127,184,12,0,106,75,6,36,57,7,71,125,202,136,42,242,39,96,158,22,211,59,174,187,102,201,31,119,247,148,184,72,146,91,155,203,255,236,127,218,17,143,82,46,198,232,232,4,231,249,189,187,34,237,144,232,116,138,111,141,8,64,167,59,210,219,4,152,233,122,185,73,126,247,166,226,115,48,115,151,158,206,121,205,213,124,126,128,211,220,214,1,101,204,54,171,136,58,153,199,87,140,187,1,133,108,147,173,161,144,140,236,24,122,47,36,15,152,68,76,112,7,193,7,54,244,113,21,63,71,63,181,106,162,72,48,20,247,139,150,51,83,47,59,177,243,156,120,142,35,244,9,6,115,53,131,174,164,12,221,210,145,62,65,117,84,118,234,8,82,36,73,164,171,140,222,119,212,118,42,49,174,46,200,161,151,122,105,127,152,238,112,123,28,72,41,43,39,78,120,190,114,195,11,232,166,205,174,159,126,184,173,113,225,207,98,26,211,159,124,88,194,46,125,199,165,116,147,67,104,237,86,85,191,43,202,41,23,237,35,105,243,41,160,53,197,246,235,29,50,17,67,207,201,151,36,94,55,217,206,249,4,237,236,126,22,156,78,149,194,160,100,74,37,120,169,89,200,185,8,41,185,200,216,235,67,11,115,217,94,217,254,43,218,215,179,57,236,16,186,124,33,225,58,168,203,162,162,32,93,84,187,238,57,120,39,221,28,61,1,218,253,0,74,237,250,59,195,12,253,235,59,40,55,117,239,201,237,27,185,55,184,103,62,213,225,54,59,236,232,183,241,118,71,88,167,163,148,131,131,162,254,221,134,47,147,176,58,36,201,65,132,182,214,172,62,111,71,232,230,39,61,207,202,165,124,192,18,240,68,166,25,4,239,110,61,167,252,195,44,45,110,255,172,33,236,248,200,63,53,100,24,227,13,10,13,39,203,131,72,86,162,164,109,131,116,72,227,92,211,217,253,24,31,108,180,253,97,248,123,81,179,160,6,163,242,228,83,203,153,153,223,59,66,196,246,128,31,70,62,22,107,30,80,18,82,188,127,208,227,34,207,11,124,161,57,222,72,82,19,254,248,179,52,173,36,230,91,197,203,102,79,166,234,129,152,103,245,87,200,163,221,230,166,176,252,141,215,5,24,42,121,87,162,226,12,14,254,165,142,13,45,255,26,167,43,189,153,29,114,234,178,64,246,150,188,221,209,169,180,247,156,69,135,86,222,206,138,59,100,44,125,60,140,114,126,173,204,13,10,113,3,203,77,71,165,177,251,144,61,17,13,10,234,5,207,178,122,164,227,15,189,124,119,99,236,221,32,101,206,78,247,207,32,204,203,175,55,238,166,163,228,32,26,83,87,205,76,79,184,115,22,188,50,3,135,200,209,18,7,104,33,228,50,29,76,58,189,240,92,141,196,98,47,242,89,163,50,126,144,246,223,175,67,155,111,64,69,61,177,8,116,203,224,138,242,236,132,169,43,167,36,48,107,251,247,23,220,203,154,188,13,102,232,194,108,121,43,40,131,245,137,39,5,207,150,194,236,84,54,77,104,93,4,60,4,20,120,39,224,195,112,122,88,183,148,121,205,53,127,17,114,86,54,23,65,243,72,55,122,96,42,45,160,16,51,219,19,20,56,39,121,222,224,137,200,138,54,133,163,29,227,224,218,32,143,167,166,252,222,79,241,156,46,79,240,138,21,175,47,28,244,18,159,104,220,92,192,68,235,39,209,15,31,107,198,147,80,197,141,255,201,112,163,220,233,90,142,104,8,94,64,53,225,84,102,232,197,79,77,207,164,109,216,216,156,105,3,196,154,208,239,215,219,155,183,13,163,141,18,25,134,212,240,223,151,62,136,21,131,135,186,194,6,77,126,213,216,53,28,173,91,247,188,236,212,244,169,39,124,233,52,119,157,223,142,50,73,127,88,185,126,92,244,65,96,98,208,183,86,184,205,46,154,234,178,67,237,55,102,201,65,194,44,153,205,53,41,157,24,94,87,59,218,14,83,0,59,87,137,170,111,106,55,58,116,175,78,249,6,200,197,204,65,236,51,124,211,250,92,29,105,162,117,19,159,94,157,157,125,2,146,145,118,176,251,224,254,236,2,68,59,72,236,51,53,154,104,16,122,185,226,77,247,225,48,96,225,195,179,147,200,21,178,168,26,220,87,207,206,171,152,2,66,187,113,8,249,249,19,146,38,48,146,223,184,157,53,240,54,190,20,181,159,166,188,54,202,118,70,209,207,8,171,135,34,190,103,209,181,114,186,188,226,102,50,143,34,156,227,2,103,175,75,11,54,181,197,239,255,185,81,233,28,202,72,17,162,193,160,76,241,46,154,183,84,162,253,6,163,152,136,18,42,36,74,68,168,191,82,218,22,85,122,235,74,237,145,166,134,253,115,116,28,234,191,239,246,219,95,155,39,34,212,97,239,46,228,60,25,8,181,48,144,231,70,22,107,206,47,171,240,251,61,96,8,239,116,89,144,155,216,136,240,84,36,84,31,146,116,218,51,217,108,131,89,243,150,191,52,126,97,236,177,13,10,192,190,51,210,39,22,2,37,130,22,122,201,156,140,206,110,106,43,241,163,42,79,43,166,178,114,5,207,159,151,101,177,127,122,155,73,134,13,251,157,186,24,18,216,76,124,174,144,204,192,172,59,217,217,23,31,96,121,76,249,5,97,58,95,161,77,199,47,82,160,108,219,51,29,20,250,225,14,3,147,99,229,17,119,32,134,70,194,24,34,242,108,123,185,213,135,134,151,191,37,158,212,244,198,244,234,45,204,164,111,32,82,170,194,211,226,173,1,120,193,213,21,209,165,146,38,140,226,164,203,200,228,129,19,66,115,25,132,134,11,118,133,116,231,26,28,161,60,118,108,99,12,71,85,180,251,26,44,186,222,49,254,69,229,64,54,246,174,164,49,89,195,243,159,193,252,26,59,253,43,162,8,3,112,90,156,63,230,147,175,228,176,11,107,19,104,5,126,74,86,244,33,145,81,198,184,140,4,93,198,154,123,201,253,134,133,59,17,254,82,210,114,203,171,180,96,31,251,251,178,27,22,206,44,85,146,254,50,164,75,216,100,120,200,26,7,12,215,133,228,34,45,249,16,118,4,250,162,18,180,66,198,94,72,212,132,19,8,226,204,216,89,39,156,43,79,90,242,236,13,10,146,248,235,147,30,251,247,161,180,234,69,19,137,75,182,195,0,0,4,43,142,229,131,190,63,211,250,203,158,52,64,225,144,151,77,160,109,186,223,207,84,156,191,37,96,23,86,143,47,232,25,104,89,166,57,74,43,135,195,227,240,40,217,190,232,178,116,209,238,124,33,44,158,215,82,124,115,173,82,228,253,174,215,5,182,222,72,243,173,243,38,55,187,146,123,123,49,22,35,225,81,67,50,133,100,108,151,9,59,91,250,206,198,201,236,96,76,137,18,204,198,58,20,121,146,224,219,244,85,29,31,230,35,102,43,225,72,208,140,106,143,89,17,99,122,189,90,105,103,230,162,9,207,8,126,234,34,203,160,61,156,196,146,60,28,187,153,68,215,193,75,186,76,197,222,97,139,40,132,129,113,153,185,201,135,57,41,28,179,0,34,0,155,159,75,56,232,17,113,169,124,191,133,86,170,190,6,228,40,73,1,129,169,63,98,18,49,225,222,65,151,119,127,190,30,251,114,225,107,128,166,8,88,160,212,15,60,60,71,185,239,102,241,32,66,90,70,43,206,112,79,231,248,185,197,236,50,212,1,237,181,165,122,19,178,55,244,65,100,164,45,201,43,113,103,49,42,242,208,228,26,204,37,35,52,68,118,115,129,156,93,96,126,177,106,30,60,150,247,249,148,145,191,142,12,77,91,149,120,9,31,83,232,135,80,8,112,212,90,37,195,116,208,112,206,109,212,51,182,222,205,39,93,151,189,190,56,94,58,215,238,246,159,62,67,225,195,56,134,13,10,160,46,219,243,126,121,41,12,137,50,180,41,50,3,247,150,227,167,85,144,72,25,207,31,193,248,204,94,135,209,158,101,179,185,22,139,221,58,124,7,200,79,57,0,116,36,252,198,58,94,226,121,130,47,178,3,167,96,236,137,170,143,71,194,89,185,30,121,41,126,77,86,62,120,184,1,33,165,52,166,91,2,123,230,196,44,130,205,102,40,116,61,129,11,164,255,96,62,218,115,110,37,131,248,83,106,106,90,73,222,94,36,220,168,183,252,242,216,226,178,117,157,66,36,190,101,203,122,50,45,15,206,224,170,43,90,113,135,160,74,175,68,145,159,147,14,212,221,80,157,47,60,3,216,23,66,52,116,39,163,204,70,44,234,211,67,92,98,25,140,185,7,254,88,105,70,161,198,206,68,70,217,9,143,248,55,171,97,168,18,86,16,150,9,211,110,134,233,15,16,99,242,166,171,232,33,131,96,5,177,161,141,35,126,152,159,207,221,215,75,29,216,113,123,60,97,104,120,136,146,26,73,129,121,101,221,202,217,136,253,100,124,169,81,84,96,184,122,207,86,197,1,103,24,44,6,160,0,62,244,84,92,125,24,164,179,231,8,213,41,190,24,61,7,226,11,48,0,84,93,146,201,130,85,184,230,70,108,201,9,121,247,143,142,102,41,13,150,159,153,81,8,73,15,138,178,175,229,248,159,169,13,10,176,92,87,104,83,254,208,99,125,239,107,53,104,198,179,206,84,172,63,63,118,116,48,196,156,149,103,102,199,189,59,252,108,163,22,136,80,227,47,79,142,101,61,227,163,37,165,21,83,59,48,197,138,96,199,153,137,216,219,51,58,37,232,193,60,72,15,177,131,238,43,172,9,30,70,15,96,212,244,43,144,182,195,239,31,231,148,136,251,190,4,186,126,34,169,82,87,65,213,225,221,151,35,55,158,206,207,189,3,196,211,22,242,76,38,145,76,195,221,173,222,69,187,249,12,145,222,13,10,21,19,164,155,60,82,18,78,237,187,11,177,93,58,13,10,197,181,220,116,12,224,181,21,92,81,253,202,90,84,86,229,158,137,252,115,105,233,61,178,103,134,168,217,69,109,82,26,134,201,250,141,246,167,77,73,56,234,209,237,151,225,166,174,30,139,62,73,166,22,48,122,163,177,132,119,17,153,203,22,55,131,7,241,222,57,201,192,176,189,142,214,31,211,247,247,60,135,193,219,250,7,193,161,199,29,118,149,137,184,91,108,33,82,14,229,12,128,228,106,227,174,99,80,155,147,12,193,91,17,210,131,31,81,4,97,120,244,206,179,196,93,77,80,187,112,174,123,89,32,24,210,237,243,225,194,192,122,34,169,22,21,48,71,141,27,108,119,124,88,164,78,228,164,146,128,33,58,14,234,207,200,250,225,64,220,199,241,67,112,38,147,94,151,130,148,161,95,139,49,83,175,247,47,134,252,215,17,72,57,63,44,250,36,250,240,16,19,248,65,149,71,223,47,2,95,213,125,29,5,69,33,154,247,183,157,237,104,168,212,84,229,206,153,30,129,60,48,224,255,212,116,146,107,165,196,180,239,225,214,203,189,127,210,76,5,85,223,45,45,58,219,76,214,19,37,165,100,113,159,68,98,176,150,56,105,244,11,241,157,203,87,142,95,238,11,57,9,9,222,185,163,248,144,126,44,99,172,194,13,167,48,109,209,55,21,111,16,13,180,90,27,200,192,73,233,217,191,31,96,58,134,46,58,113,129,4,184,39,59,89,34,236,9,141,52,206,165,248,124,210,14,242,105,24,39,108,49,54,59,92,198,68,161,13,10,187,124,188,58,3,235,210,24,242,100,197,75,75,59,7,23,104,153,179,15,113,30,251,128,101,84,167,181,131,63,62,3,93,245,69,116,87,225,95,68,241,75,153,64,61,84,186,116,230,24,63,238,237,25,20,91,255,191,93,47,244,128,225,156,97,159,97,171,146,71,56,159,237,44,250,99,133,246,84,35,139,52,153,248,227,113,231,23,72,114,160,158,147,85,213,153,113,155,198,61,199,177,134,245,74,200,53,191,164,86,78,233,209,167,0,96,89,190,224,4,140,248,238,197,255,29,233,134,120,139,195,102,223,247,17,147,14,28,197,72,144,230,200,32,52,237,216,76,193,5,102,223,87,149,243,123,230,154,46,101,235,16,186,110,76,56,224,173,207,212,103,195,163,163,22,151,194,218,81,197,53,205,97,113,174,142,93,96,175,209,218,193,217,237,235,249,253,44,141,64,164,129,4,233,190,254,9,101,203,220,142,176,45,98,153,19,97,180,161,172,118,246,79,131,46,214,255,220,165,188,125,87,3,123,184,13,174,197,216,145,89,27,128,223,240,112,221,27,153,180,251,8,71,142,180,232,179,2,4,169,185,228,236,51,16,91,174,157,124,222,209,92,104,36,63,126,53,194,235,67,142,242,225,209,16,179,24,178,200,240,138,232,237,46,91,107,218,114,216,114,63,126,87,72,18,128,149,79,117,168,21,225,111,28,97,67,239,238,107,135,159,241,77,86,37,27,217,126,216,230,217,182,64,130,12,145,215,101,115,200,229,41,13,10,218,157,49,38,231,107,54,204,214,113,219,220,201,31,95,165,24,234,103,118,246,231,66,130,17,60,0,165,180,122,204,48,23,182,155,204,184,40,187,168,225,120,26,167,36,94,17,104,104,165,83,5,48,88,11,253,61,81,227,212,191,114,239,148,16,70,145,228,142,78,86,141,67,179,161,95,203,159,145,120,216,136,103,7,52,236,153,5,34,102,214,98,55,154,196,90,224,73,248,234,254,31,188,42,219,182,20,74,186,244,98,177,182,151,201,222,11,122,186,228,81,161,37,78,15,26,2,214,207,200,85,179,11,26,205,246,112,231,254,6,26,37,254,177,148,69,69,138,141,254,124,171,159,134,98,91,58,159,96,194,42,19,193,71,146,146,79,208,3,212,81,205,29,193,65,251,145,145,74,166,73,106,70,253,175,221,138,218,84,232,189,107,213,70,2,5,191,41,65,30,13,10,144,141,16,231,119,110,210,31,61,112,162,42,166,57,155,88,158,3,238,30,201,225,163,207,138,48,255,213,87,102,55,168,36,103,51,185,28,30,232,21,54,162,156,137,59,76,202,113,197,225,245,144,11,225,236,33,220,32,27,124,3,50,2,69,114,89,159,3,138,132,36,24,44,154,182,0,178,105,107,235,63,16,47,9,144,231,79,144,99,225,73,189,99,211,24,117,253,111,182,199,224,94,201,90,244,44,17,162,232,122,150,54,1,53,237,228,134,181,60,130,244,94,11,197,20,194,133,107,241,215,205,198,78,122,132,239,72,98,77,206,86,160,55,142,18,170,0,125,147,176,67,107,57,96,174,175,15,135,14,78,192,59,142,46,50,131,65,154,112,59,254,73,158,99,77,119,227,199,8,219,84,232,150,106,44,89,175,114,210,109,102,54,23,73,34,59,160,170,229,234,202,96,11,74,14,19,101,105,254,90,65,34,27,14,126,131,229,234,39,222,127,134,238,242,252,96,221,200,92,226,89,197,120,81,16,80,18,213,186,113,168,38,87,110,108,159,68,98,53,67,101,27,110,31,186,194,44,111,244,47,156,233,232,233,214,45,173,9,80,18,16,2,216,219,143,174,61,173,184,93,33,139,232,232,133,107,33,208,81,92,140,7,213,30,28,181,11,135,63,197,71,37,226,224,49,217,173,13,10,24,8,220,232,155,226,148,244,16,160,176,252,14,168,39,238,212,87,13,115,26,102,174,180,127,159,244,0,151,114,146,13,10,115,49,25,115,107,155,147,17,126,40,6,31,79,120,101,243,144,52,24,72,205,191,126,152,6,134,127,236,171,58,96,111,159,96,221,203,31,113,230,111,134,135,60,100,128,106,178,214,12,252,231,162,43,216,165,30,9,41,81,27,70,91,17,231,18,218,216,178,162,216,230,247,8,197,162,187,223,95,205,154,37,220,104,203,73,4,167,175,128,0,91,110,41,22,249,119,56,98,108,70,9,85,162,253,7,221,255,205,56,40,126,108,24,134,8,184,161,250,36,67,11,82,219,114,224,0,113,60,197,50,142,56,213,29,213,142,92,71,190,104,101,66,100,204,48,100,185,247,77,186,123,107,136,60,58,250,228,28,0,125,11,39,136,44,150,142,151,95,187,238,136,126,33,164,143,212,159,225,250,61,147,103,222,31,221,234,244,15,182,181,220,223,170,16,162,68,143,32,49,153,147,133,29,71,114,22,104,157,219,28,127,87,94,131,214,9,153,140,49,44,149,233,21,62,103,69,146,42,57,208,37,170,197,229,132,63,153,188,119,100,184,28,222,165,242,251,31,195,255,52,135,140,98,80,134,110,49,211,247,151,46,133,24,4,170,100,26,163,164,201,104,195,223,0,195,227,166,168,63,42,203,144,149,151,59,110,239,231,146,11,7,230,130,109,109,59,80,164,183,118,181,15,159,250,125,71,28,53,12,170,28,41,235,157,147,103,68,245,229,118,50,84,79,197,164,54,99,0,238,125,177,161,150,138,40,194,100,173,35,237,48,5,117,144,95,105,152,241,212,165,30,252,62,238,202,70,130,19,130,77,3,94,167,131,72,141,148,57,179,201,177,146,55,177,226,58,192,255,45,140,55,151,113,107,182,97,180,222,125,74,16,128,240,146,164,184,109,221,170,101,53,228,150,233,80,196,221,19,227,140,35,129,43,62,214,104,82,58,26,130,34,232,68,93,130,89,119,249,228,177,162,235,58,185,51,211,136,214,151,96,39,246,148,126,195,55,254,199,194,102,125,149,23,252,230,141,85,247,145,150,198,245,31,155,142,116,173,144,1,131,158,13,10,251,219,94,80,93,97,16,218,118,162,190,50,11,189,23,118,231,137,132,102,79,33,13,10,63,78,134,55,93,80,219,18,216,157,254,5,143,233,206,83,3,241,68,154,205,180,133,187,22,69,129,161,35,217,53,229,116,229,196,146,54,204,249,6,200,24,178,238,231,118,192,219,69,103,48,183,85,7,220,82,246,140,185,198,62,154,240,220,54,1,30,27,41,217,180,203,187,255,195,158,164,130,160,29,128,131,228,227,25,145,197,183,146,133,82,20,181,255,26,134,130,87,167,110,124,102,6,141,50,21,170,112,155,88,102,63,112,92,138,157,55,105,226,41,96,218,219,163,112,79,127,229,54,240,134,215,143,159,20,157,18,98,74,83,12,187,48,60,138,62,19,163,94,103,227,151,70,233,102,105,119,72,146,66,89,93,73,76,62,204,97,249,59,75,148,74,35,195,98,233,81,210,222,134,6,22,57,64,209,150,184,87,155,170,35,247,98,234,71,20,226,72,51,228,175,161,182,210,46,122,187,140,209,31,164,170,131,91,154,246,223,166,193,111,153,217,255,9,61,184,148,225,208,8,88,42,236,4,140,67,62,229,175,11,246,226,18,47,244,202,43,21,122,69,225,143,74,145,255,142,102,198,195,25,160,247,127,163,130,18,11,218,42,33,123,131,5,123,241,157,172,233,134,132,38,20,116,49,229,136,28,59,38,54,58,9,138,243,97,185,150,102,191,41,183,225,246,191,79,242,14,103,171,243,25,234,244,179,65,93,80,148,186,211,187,235,53,28,181,224,250,45,8,241,96,196,77,81,236,116,131,16,122,25,25,76,177,68,230,157,223,244,214,107,70,2,126,156,101,97,51,122,6,68,172,172,203,153,136,87,15,159,149,155,248,202,67,135,235,210,182,102,233,218,150,66,195,112,5,5,151,255,246,208,60,115,207,98,5,143,163,28,130,30,47,6,210,176,187,109,56,59,187,89,17,157,87,233,67,159,77,76,7,225,212,193,13,10,175,247,229,65,19,130,242,113,67,213,148,238,48,11,45,129,87,162,145,138,237,93,156,227,88,72,152,86,14,206,204,254,95,120,89,236,185,237,77,22,239,251,13,227,84,186,148,11,91,146,171,253,102,68,192,52,58,3,229,171,87,59,54,204,205,110,74,140,73,18,190,159,213,81,43,216,100,82,248,253,198,139,121,239,170,182,117,96,190,37,208,18,66,190,117,136,161,235,249,67,93,15,129,13,10,154,3,201,31,71,23,178,24,25,179,188,122,58,110,183,216,153,240,182,122,123,113,51,150,214,84,46,47,16,137,67,50,46,134,17,123,170,64,236,73,184,149,45,106,47,102,164,11,233,93,100,66,101,95,176,220,58,182,59,201,97,199,221,175,120,101,14,55,19,235,26,32,143,37,114,29,26,74,177,13,190,253,5,138,204,190,238,30,134,163,38,92,163,169,110,93,45,8,162,198,129,139,249,94,155,138,101,138,56,114,3,207,25,166,147,161,203,146,20,176,29,85,66,35,199,205,35,235,167,254,226,36,64,250,229,39,219,36,203,95,207,115,246,181,79,12,31,112,232,168,189,3,119,226,177,67,251,15,87,218,155,213,124,101,15,96,146,205,80,95,162,126,63,76,163,48,178,141,105,245,136,174,85,146,120,203,45,199,117,146,53,128,70,215,234,98,206,98,44,232,134,140,28,247,144,95,3,219,8,139,18,21,222,152,193,125,69,130,94,230,208,70,119,120,102,191,91,238,241,210,241,76,123,129,97,17,152,43,205,160,204,12,111,147,30,142,108,17,32,179,2,47,195,66,73,77,69,240,209,254,179,125,104,160,142,82,141,25,224,250,82,69,241,208,126,228,244,130,15,210,60,38,254,211,218,50,112,237,87,169,180,43,236,72,147,68,1,59,203,74,123,13,178,24,73,151,179,12,224,45,82,55,37,243,169,13,39,96,239,108,144,232,149,28,219,100,5,19,155,229,175,88,69,54,109,111,107,63,7,1,155,135,18,11,114,231,188,139,9,22,225,99,234,93,14,82,111,201,180,207,206,180,200,188,171,29,36,190,207,200,112,144,137,249,209,120,32,145,74,0,92,145,226,37,190,203,64,19,113,172,78,228,188,110,143,54,159,220,2,227,201,94,17,212,80,35,82,32,148,54,200,24,104,181,115,57,216,174,134,82,241,27,160,211,130,67,154,241,114,244,208,62,112,24,238,12,154,160,60,180,171,39,110,14,21,183,166,8,217,112,121,22,61,143,178,81,227,125,201,237,130,47,14,227,229,130,220,83,71,46,233,151,145,239,150,116,72,92,233,170,129,146,82,44,183,21,212,163,104,99,238,166,146,151,19,145,3,251,223,27,77,167,206,158,19,164,213,228,124,74,81,178,66,254,148,186,73,55,175,126,186,252,59,35,39,233,57,237,241,248,195,156,233,198,34,97,188,18,91,252,175,70,97,54,70,13,10,138,189,116,221,211,69,58,219,104,108,97,7,228,217,33,153,163,8,160,15,148,5,151,65,170,253,11,168,146,32,174,44,151,47,60,55,68,82,138,85,217,183,72,123,188,174,177,197,117,118,142,218,20,231,100,213,230,134,44,71,253,204,12,190,176,160,20,236,188,255,91,52,170,143,200,251,56,171,53,186,36,131,241,66,21,246,171,115,253,18,52,85,184,230,220,205,168,229,121,96,223,212,156,202,212,145,142,105,177,215,87,58,7,255,128,110,60,125,42,49,198,184,24,61,52,85,135,15,240,27,244,162,58,44,44,16,110,129,205,158,163,132,200,71,39,161,161,60,96,106,13,97,129,221,191,244,27,1,80,59,249,82,173,210,198,11,241,249,224,120,240,83,135,183,201,27,31,201,251,78,33,153,245,246,60,174,195,227,168,215,48,202,51,186,58,137,101,56,192,76,213,237,116,156,135,159,51,222,88,111,105,216,198,230,235,30,147,172,128,180,177,177,76,112,159,15,90,132,86,87,210,128,112,121,56,253,250,191,51,251,204,133,129,254,185,153,141,115,32,55,68,174,33,179,33,42,62,190,135,193,255,255,24,123,164,189,116,142,148,176,236,59,155,104,86,178,217,200,178,141,211,34,16,92,245,14,170,46,116,160,95,161,152,135,210,247,9,84,75,228,247,19,78,8,133,54,30,213,180,19,222,115,4,206,75,51,35,122,244,38,152,212,59,125,165,40,182,161,21,245,185,154,250,173,248,181,133,132,247,40,2,9,199,113,34,57,44,180,103,163,165,49,29,100,178,82,80,172,66,247,122,21,181,131,173,113,178,242,84,221,22,182,196,51,184,93,136,176,129,18,199,151,225,155,116,210,53,92,18,60,98,141,65,132,145,9,237,71,162,223,4,2,213,193,45,115,5,105,103,59,184,88,144,32,129,44,216,43,3,18,170,45,84,139,136,199,253,199,164,240,28,206,129,231,237,97,111,11,17,3,217,13,10,172,8,214,222,7,0,46,134,150,29,32,17,107,255,151,22,101,102,161,85,168,128,54,230,83,159,224,21,99,127,140,247,11,68,97,186,195,239,121,58,110,118,35,125,48,88,228,64,34,193,57,104,60,99,47,92,134,44,127,225,177,49,35,103,144,113,215,124,38,250,74,14,15,213,52,121,26,238,57,90,229,203,137,20,69,145,158,92,115,236,22,173,217,100,170,2,219,177,167,88,70,55,117,245,182,88,29,205,142,45,138,204,204,251,230,51,39,126,115,248,68,193,227,51,110,254,122,188,233,85,211,237,59,70,175,20,26,225,54,32,25,159,50,94,29,236,214,106,19,86,133,254,139,57,173,15,46,35,208,203,126,16,17,138,241,104,63,13,10,113,55,24,100,63,127,244,232,40,246,244,176,140,133,152,45,6,214,151,76,91,250,83,49,113,254,151,179,168,60,212,234,237,25,105,225,116,36,115,89,104,34,133,149,202,146,30,92,216,225,234,138,156,206,234,248,239,133,168,204,148,109,120,246,89,114,214,152,176,169,186,220,237,147,123,113,202,104,98,186,14,136,134,15,220,240,63,158,215,151,138,155,218,170,80,111,149,248,83,232,192,25,250,237,207,23,126,99,243,7,12,28,87,87,129,168,138,114,179,84,225,197,121,213,109,201,30,100,38,108,156,158,178,153,169,230,143,148,121,112,44,208,31,93,94,58,65,87,38,112,133,150,122,125,224,2,109,178,13,10,223,95,243,32,98,254,78,7,210,99,221,217,41,208,247,87,194,2,0,14,105,24,223,231,140,173,84,60,110,120,187,222,74,147,55,167,236,218,180,57,88,41,56,189,40,132,248,44,23,87,152,131,168,142,152,84,47,192,194,229,31,105,139,3,156,244,32,238,8,84,126,241,3,37,159,220,187,254,219,134,44,12,31,221,150,134,250,202,253,173,53,202,62,166,11,225,4,203,138,182,218,34,144,51,103,34,245,135,56,214,110,187,166,122,74,88,251,169,47,186,150,236,21,5,148,56,248,239,96,129,198,127,108,46,29,139,81,124,197,15,3,254,21,28,143,11,253,239,114,171,43,224,20,162,190,15,98,118,58,108,121,220,94,56,161,144,14,169,142,252,49,160,64,65,35,13,87,35,88,239,109,218,197,121,14,215,11,52,200,30,75,58,147,132,158,56,103,92,99,142,185,120,90,90,78,111,110,98,245,153,188,35,83,226,108,177,71,206,90,58,116,169,111,66,155,46,148,108,248,29,161,144,38,201,149,31,138,219,90,5,143,33,38,246,139,51,92,211,74,103,18,110,40,174,170,169,228,171,87,140,96,69,164,118,235,49,39,51,179,125,228,30,19,160,58,100,163,2,155,229,48,51,25,131,168,246,157,179,37,202,217,67,189,68,219,246,103,24,76,27,92,190,113,160,26,250,239,202,118,240,125,188,204,185,251,214,185,213,226,85,127,138,229,74,253,130,108,166,187,198,76,5,173,172,202,190,61,90,194,248,228,68,187,200,230,101,101,49,51,29,54,47,171,223,145,120,93,47,231,93,53,78,83,252,46,177,239,118,16,172,175,109,28,161,123,155,203,223,141,219,46,187,222,35,13,107,37,109,44,107,204,63,65,90,135,43,40,223,177,120,84,211,82,71,75,73,99,216,229,20,62,213,110,215,174,219,148,95,81,248,151,165,233,59,210,116,49,189,97,68,42,136,186,4,2,236,157,26,83,62,72,188,12,140,249,142,106,178,177,9,56,38,125,189,21,73,6,225,186,18,14,222,253,72,226,88,36,54,91,171,27,205,72,189,164,100,220,136,35,7,128,53,129,121,109,68,152,118,65,38,99,162,154,226,215,193,100,9,124,153,124,253,235,172,49,226,109,59,188,84,31,83,231,165,24,236,169,40,211,155,47,129,190,42,193,7,164,252,128,143,103,132,236,249,237,183,16,187,6,5,97,163,236,228,130,66,198,196,12,120,148,48,124,1,157,84,17,43,163,70,244,19,219,194,238,187,170,142,171,254,35,78,70,72,129,172,82,3,54,163,120,176,81,126,178,125,128,14,219,7,26,50,122,122,67,177,116,11,158,69,122,44,30,8,196,8,78,223,107,197,61,119,1,171,99,15,56,121,184,215,144,21,195,95,210,148,233,212,89,35,194,136,173,9,69,144,149,128,224,164,50,3,4,8,114,119,50,154,9,241,149,197,30,211,247,174,57,244,215,211,18,11,92,19,49,38,29,254,196,23,228,214,133,225,208,229,6,142,213,244,231,182,170,63,232,185,47,164,100,69,32,203,11,48,119,112,207,73,205,34,117,53,97,75,172,121,159,215,71,56,126,178,34,219,40,180,59,72,87,140,75,214,207,165,234,140,145,49,33,52,99,147,45,242,232,9,196,45,244,86,131,244,71,116,20,244,105,243,173,103,229,15,54,69,233,66,54,170,211,73,162,67,217,29,207,185,12,71,215,198,162,11,2,114,77,119,237,8,77,44,169,242,27,8,122,40,130,116,124,82,71,252,148,158,27,144,8,190,221,179,119,78,233,95,183,241,41,93,201,61,157,122,105,205,251,189,56,93,4,25,190,196,160,208,216,130,255,61,210,231,71,178,238,174,105,108,161,94,52,85,129,236,209,244,52,14,2,13,10,44,61,163,218,216,109,46,123,158,79,11,82,154,119,138,243,55,60,159,44,4,185,193,89,162,53,176,220,16,155,2,168,6,38,32,3,179,178,69,50,194,188,39,92,128,181,214,140,16,32,37,217,67,3,197,88,192,232,190,155,116,13,99,88,144,229,218,88,25,47,225,248,162,231,47,37,27,155,96,124,5,97,190,51,39,139,76,96,21,51,216,221,124,57,196,212,245,92,80,242,94,74,107,166,123,23,180,125,231,139,251,203,32,111,175,243,156,41,254,117,13,216,170,92,234,200,128,197,96,99,201,145,100,208,138,130,101,179,165,80,246,64,255,40,140,227,84,72,195,247,226,241,203,122,27,39,146,119,205,109,176,145,67,167,66,22,79,159,136,202,249,190,8,154,109,125,43,71,160,241,124,76,18,153,121,202,168,223,149,246,98,29,68,162,122,13,78,160,76,192,232,23,137,4,152,105,178,166,53,91,51,33,123,223,34,94,125,58,36,233,128,46,40,229,42,250,188,182,208,155,217,14,130,183,90,188,151,114,235,91,60,103,27,13,10,58,241,135,199,43,17,155,124,216,206,174,204,115,13,184,52,27,220,101,205,238,232,244,250,154,208,13,10,112,125,17,144,136,114,240,200,245,206,80,113,116,91,200,133,146,176,138,120,134,229,109,136,179,198,89,19,11,83,43,186,116,92,198,96,11,67,87,197,45,13,10,228,213,218,95,167,189,193,89,52,222,8,247,50,252,70,125,159,190,49,142,75,115,45,136,218,183,21,244,202,58,107,177,208,232,186,4,104,54,144,175,236,60,157,145,106,89,185,185,112,97,24,111,255,111,198,117,83,90,175,253,173,169,49,63,145,183,3,15,152,14,67,203,188,107,71,246,9,195,161,213,188,89,137,226,23,163,51,114,19,221,25,138,197,45,179,16,251,99,77,129,189,83,21,124,3,248,32,193,55,15,186,84,122,24,201,167,227,83,226,51,167,156,209,208,91,210,12,47,107,17,112,56,87,24,149,113,220,108,121,166,52,91,233,38,168,108,127,208,19,164,48,235,154,75,90,164,216,66,177,224,210,164,82,41,40,192,147,246,101,205,231,76,205,227,206,147,63,122,179,200,230,167,230,102,184,189,38,90,84,57,26,178,30,91,86,161,94,193,130,39,52,197,141,195,191,201,195,71,88,158,112,201,192,140,11,42,48,27,125,95,72,63,106,47,93,0,249,105,207,253,132,78,195,145,12,110,20,179,147,101,119,170,128,147,53,240,117,66,22,111,77,29,17,208,202,27,180,208,146,26,55,4,77,196,109,7,8,220,39,138,183,67,199,203,179,173,177,78,2,91,211,98,105,31,240,14,71,236,16,193,22,166,5,128,244,77,48,89,239,14,205,241,82,126,94,228,76,219,184,225,30,125,81,41,114,106,6,159,32,155,251,44,169,62,160,204,146,166,7,145,254,175,83,76,165,40,229,40,30,195,34,213,221,72,53,5,58,153,238,253,179,204,196,163,132,82,19,17,247,139,218,242,190,0,79,246,168,205,227,131,214,13,210,74,58,92,143,249,111,208,125,229,172,236,250,233,243,205,138,43,56,107,173,179,79,252,43,185,109,182,246,214,129,84,145,125,51,99,216,85,32,141,73,239,100,161,139,137,197,198,159,246,152,201,215,253,81,249,70,205,209,75,6,231,181,158,38,161,125,81,77,4,177,23,231,222,101,230,77,230,159,61,224,192,15,22,252,254,125,150,123,100,156,141,89,190,201,172,29,12,207,193,7,157,180,74,221,233,2,17,99,100,182,26,144,69,135,5,177,240,118,37,101,39,82,148,152,151,62,190,155,140,199,71,206,117,45,42,163,38,54,38,204,106,0,54,195,245,224,15,199,88,174,25,183,195,251,84,214,235,141,28,209,189,85,245,33,15,110,117,255,155,205,218,213,245,141,206,144,27,78,80,31,43,133,100,191,45,139,133,203,52,71,16,77,44,253,124,219,134,41,165,62,163,219,58,177,212,142,100,171,231,53,238,166,248,241,98,120,255,78,255,100,229,104,212,43,95,202,36,205,188,221,129,5,170,196,94,73,16,180,13,10,189,179,36,117,180,19,197,110,26,75,9,51,89,25,25,48,250,250,179,42,152,106,104,211,159,165,6,61,66,206,89,219,250,160,130,182,140,148,6,169,113,234,132,176,99,52,96,130,27,17,76,75,13,10,114,198,89,137,201,175,192,133,68,51,71,253,79,111,92,241,127,63,245,178,145,181,88,112,125,8,49,184,172,204,142,56,128,73,185,191,109,96,180,3,202,211,175,29,21,217,153,87,161,216,11,147,75,67,208,248,18,206,84,78,163,6,101,83,63,110,216,195,90,165,193,158,241,254,162,147,218,250,192,231,212,130,126,123,167,240,103,103,219,1,82,17,49,67,115,24,7,222,21,13,105,206,51,2,125,18,195,70,117,75,30,111,234,204,233,177,219,49,217,27,113,79,144,241,23,148,117,189,149,51,243,2,176,157,178,112,128,56,230,39,49,25,102,146,237,170,152,84,122,203,8,169,153,211,190,94,133,178,154,211,30,26,144,200,152,49,170,182,222,21,48,49,74,2,98,39,238,200,78,255,50,229,27,238,8,216,25,112,191,150,191,76,67,25,235,230,120,208,103,38,84,226,106,58,252,198,13,50,144,129,49,25,237,59,230,52,2,87,152,111,86,173,50,27,123,226,101,212,129,113,60,71,16,96,238,156,51,154,5,173,185,191,67,142,150,218,43,118,212,49,193,240,206,36,208,202,154,51,151,251,234,88,116,56,13,224,193,200,134,62,150,103,96,214,34,114,224,70,102,115,13,10,81,136,204,7,12,186,27,23,15,126,182,70,121,193,97,226,115,94,69,228,14,9,127,160,148,158,93,247,111,13,246,90,200,5,208,62,227,16,53,58,207,243,6,242,83,232,4,32,73,204,163,22,199,81,34,56,214,82,101,249,34,228,56,249,100,68,103,235,20,167,210,141,172,154,163,82,5,147,170,11,79,170,31,229,124,50,241,94,241,113,22,93,183,125,52,183,147,46,129,134,150,47,40,140,45,216,228,175,26,244,251,220,53,142,146,56,148,182,92,48,5,71,147,184,46,189,226,218,203,13,10,253,47,9,213,55,143,90,207,187,185,135,100,189,150,184,55,224,134,129,223,9,255,108,52,27,238,1,218,26,101,213,126,241,252,231,206,42,205,136,247,40,206,248,107,24,209,101,200,217,225,41,115,116,215,72,185,205,123,24,200,142,25,49,77,250,224,184,28,153,130,200,27,64,66,110,205,235,22,20,111,223,189,217,63,98,225,180,227,123,72,230,106,165,198,124,222,66,134,84,119,27,60,171,222,190,207,87,61,88,105,21,122,150,17,58,107,55,127,78,213,118,198,253,86,7,124,0,144,44,77,19,174,189,214,11,201,136,246,137,195,56,177,44,3,225,202,233,202,70,168,74,2,55,80,252,49,147,30,231,45,147,175,209,200,226,99,226,216,175,57,6,130,90,34,139,138,187,148,45,241,160,27,236,2,172,116,103,121,110,82,188,198,27,20,194,49,236,188,162,220,182,91,83,94,251,187,30,237,248,6,8,176,200,141,94,237,141,0,150,174,154,126,37,83,111,80,102,6,54,106,47,213,31,247,161,162,1,27,45,110,74,187,216,57,238,231,108,184,253,116,178,178,0,214,52,60,244,58,181,106,147,156,234,8,31,239,234,210,221,238,46,22,71,90,180,254,31,82,199,128,166,46,136,175,67,76,248,112,121,103,39,176,179,185,143,102,135,36,231,109,1,147,127,156,254,231,73,182,145,116,186,82,29,126,228,86,95,222,33,125,200,58,184,171,99,57,45,67,49,185,92,108,125,16,106,180,162,204,51,212,105,74,13,231,222,244,159,28,76,194,117,121,191,245,165,189,60,49,160,1,12,93,246,32,66,61,33,236,101,136,164,235,27,224,91,163,125,76,93,79,192,7,227,231,3,193,80,230,189,252,66,103,114,199,38,14,8,155,118,57,151,37,215,130,212,55,118,134,245,180,181,204,54,141,42,206,232,73,17,72,240,148,150,115,229,86,139,78,126,4,194,55,49,221,219,250,13,10,11,1,253,237,120,34,43,175,103,77,192,178,78,193,21,101,229,166,27,143,170,2,186,158,129,43,20,90,61,51,158,185,40,70,107,224,156,205,193,120,39,139,209,31,42,153,110,120,104,195,92,51,139,210,54,152,197,99,55,154,37,186,4,140,0,24,57,186,107,221,139,108,75,135,177,160,215,48,46,235,84,181,138,170,58,178,202,93,150,254,87,150,125,210,109,69,190,231,123,64,206,83,40,205,81,64,119,220,163,253,56,150,218,184,114,5,39,187,49,143,28,62,223,197,30,85,244,144,12,45,253,135,91,176,202,89,165,157,147,96,142,102,166,69,230,84,87,17,218,55,47,67,48,100,77,30,200,39,225,108,219,170,105,51,230,141,107,18,8,127,141,84,67,181,234,82,193,95,90,239,205,239,53,73,247,32,152,55,30,185,28,240,5,31,60,152,131,234,227,41,87,89,78,98,135,232,29,135,34,232,120,163,96,161,196,130,141,3,44,246,138,91,176,79,122,175,101,43,223,41,160,220,14,55,198,138,9,187,202,189,207,59,13,10,117,187,29,153,69,14,213,119,124,245,250,85,93,96,65,239,123,212,140,110,100,91,17,151,87,231,91,115,92,153,219,110,79,22,65,132,1,149,154,157,53,174,4,235,108,254,101,164,129,89,89,135,228,27,21,84,140,147,46,190,193,79,205,119,157,108,226,154,250,87,142,13,10,130,184,19,107,16,228,214,111,76,101,155,228,36,156,19,20,196,55,108,249,65,121,154,173,58,106,239,114,39,245,236,147,110,22,224,109,230,9,213,68,82,213,92,129,184,27,201,54,240,155,50,166,13,198,1,170,239,222,68,183,87,48,226,243,131,236,220,32,111,171,108,146,156,59,137,68,71,169,205,28,79,18,20,94,13,193,100,73,2,162,197,98,244,146,11,121,196,29,4,143,32,44,243,227,198,36,88,121,242,156,140,214,161,183,59,43,254,170,157,143,96,149,48,187,124,44,80,151,54,94,8,46,54,242,172,121,100,11,88,107,144,199,110,80,184,57,23,61,226,33,64,186,39,47,33,51,185,217,20,228,157,104,188,59,108,78,205,190,183,159,122,110,77,207,229,192,112,21,84,74,206,98,113,141,136,127,57,138,171,105,124,195,235,190,127,121,165,205,201,240,214,154,131,190,92,84,51,114,183,85,14,69,203,237,86,15,82,175,121,131,141,250,50,146,39,28,189,18,193,56,104,65,178,13,10,149,187,189,9,220,6,191,158,250,171,90,175,22,220,166,215,147,254,203,186,60,6,84,251,82,137,82,153,51,237,13,10,142,85,227,239,20,87,91,81,225,46,23,249,74,85,19,9,109,140,145,129,63,128,85,60,242,31,170,59,187,153,17,178,130,143,217,243,110,254,37,239,245,232,75,48,237,248,133,123,16,36,97,109,220,43,25,156,247,108,112,113,141,107,143,117,114,216,211,224,86,5,251,235,28,132,94,54,160,206,89,82,65,188,185,12,53,244,224,50,27,180,4,13,10,212,106,237,196,37,114,157,165,3,179,82,22,248,77,15,94,62,107,90,145,46,184,175,49,221,8,31,209,190,247,92,173,244,190,232,228,185,2,239,226,107,150,124,22,204,160,173,212,62,85,131,106,26,33,75,123,66,62,213,194,80,69,193,246,79,5,138,217,248,19,43,51,149,221,226,134,109,129,9,12,81,190,87,191,214,109,181,215,132,35,83,196,81,51,207,4,141,199,163,215,126,69,156,106,92,135,172,254,84,165,203,105,67,54,115,37,52,243,59,176,91,66,150,218,97,96,54,232,1,109,14,153,232,110,64,61,4,229,170,133,28,197,29,235,110,248,240,160,66,60,91,2,128,203,58,114,23,171,64,0,191,107,227,174,131,248,168,39,130,173,171,193,43,47,179,1,98,138,174,111,150,142,94,3,71,146,223,229,57,131,185,250,3,213,200,218,247,109,57,55,33,161,138,123,231,188,135,89,157,159,33,144,154,197,238,147,107,94,240,181,170,16,212,39,4,85,171,137,215,241,186,61,158,202,184,81,150,242,211,76,130,187,124,160,220,250,161,90,226,132,6,242,251,71,186,157,132,140,165,196,204,244,223,72,182,101,121,44,106,173,11,26,93,46,201,117,24,191,57,25,130,78,167,115,166,247,78,157,248,148,35,241,76,113,157,208,230,171,22,38,131,32,185,48,173,50,73,79,164,213,100,143,22,75,192,158,139,202,127,25,35,250,142,163,66,231,190,135,236,131,28,239,36,6,119,87,28,101,197,54,137,97,91,39,239,133,97,222,94,101,149,110,5,8,20,111,13,10,230,46,20,157,101,90,114,158,39,74,135,25,202,188,26,239,84,158,182,128,141,53,237,119,196,198,62,99,98,168,216,175,44,140,213,39,42,14,198,54,15,15,60,49,72,134,59,52,189,193,49,118,44,158,159,206,129,150,20,171,74,236,208,236,20,140,129,202,187,104,246,45,35,92,246,11,13,10,221,28,205,250,74,70,66,95,99,167,99,3,57,41,168,243,98,120,87,246,224,166,54,190,182,249,199,184,198,138,190,120,157,230,0,226,107,61,189,109,186,34,149,85,190,187,21,38,165,69,100,250,244,133,18,99,7,178,243,74,38,153,45,138,158,183,14,104,83,15,29,223,57,235,48,39,91,116,48,115,123,32,231,163,246,187,217,88,98,242,136,79,255,161,221,82,138,0,26,99,207,74,173,136,15,137,112,146,8,115,172,142,242,243,232,105,162,141,189,170,180,196,13,136,188,67,40,61,137,217,223,68,4,9,249,203,150,111,125,186,144,183,141,61,174,137,19,177,77,109,222,138,41,244,5,42,189,50,71,63,83,118,236,19,212,130,76,58,47,208,248,1,95,201,102,21,57,253,85,178,76,109,58,236,31,199,155,216,66,187,109,30,39,82,72,134,239,145,195,104,249,108,176,190,115,101,8,27,98,255,8,138,56,22,46,160,250,149,5,217,160,156,143,68,88,52,161,222,24,93,231,82,34,142,3,141,207,50,33,97,43,209,133,195,126,211,25,92,46,69,180,89,8,176,187,187,179,238,160,73,219,211,59,27,168,156,109,3,224,208,101,93,140,233,248,77,94,165,46,33,59,72,212,42,245,244,58,200,129,175,45,207,0,13,163,58,107,246,24,32,151,119,214,170,139,229,242,83,31,178,255,156,180,24,59,4,6,65,169,158,94,9,8,122,137,114,148,198,204,112,68,180,2,245,181,170,179,173,67,199,86,14,60,139,203,71,133,177,42,142,91,21,150,107,156,118,34,134,39,62,2,77,51,131,198,190,212,0,140,237,173,39,9,91,48,82,57,251,123,120,56,99,118,226,109,152,133,243,116,57,238,164,35,89,229,200,246,113,226,96,42,134,160,151,158,226,180,242,47,31,8,181,49,205,184,16,158,227,150,69,223,12,83,150,132,192,235,21,82,104,149,104,96,39,217,204,13,12,167,221,108,132,169,2,149,21,73,253,16,72,194,23,125,111,245,241,125,40,99,135,121,117,199,106,73,97,37,203,60,5,89,211,23,201,56,202,52,225,241,114,20,26,81,82,153,4,182,90,77,60,59,31,19,196,231,71,51,174,248,84,44,152,219,105,31,177,187,152,177,171,85,59,197,224,186,175,186,104,180,0,20,247,71,134,12,122,210,22,81,239,18,162,210,52,196,235,206,203,76,123,104,199,200,28,227,138,4,165,141,180,125,55,90,19,229,21,235,145,199,255,51,23,244,164,179,161,229,189,7,186,32,14,254,117,121,65,60,81,117,146,63,90,129,148,175,42,236,102,13,253,36,228,73,197,248,218,114,214,28,147,15,231,134,179,68,91,2,226,122,194,162,56,238,83,73,101,83,254,68,74,143,78,219,62,102,164,176,147,25,8,124,170,59,254,229,101,107,160,120,15,195,238,222,245,245,246,138,178,238,62,115,246,244,86,176,140,6,254,97,50,167,231,207,55,122,2,101,68,18,230,212,105,177,129,29,218,226,143,94,237,70,138,202,59,142,169,147,124,54,102,133,60,208,223,140,126,156,152,213,223,53,22,191,187,79,0,19,147,62,8,101,236,152,140,82,222,99,160,107,27,118,213,79,107,115,54,214,204,93,87,122,93,64,170,152,31,19,206,130,124,210,211,189,159,41,85,219,212,81,82,22,244,182,93,8,66,24,157,194,2,162,81,50,138,189,235,146,161,110,182,93,82,95,185,126,176,243,16,206,171,46,205,214,78,180,92,249,131,77,149,132,226,122,238,165,63,216,62,34,102,26,124,4,67,29,20,17,45,201,202,94,230,58,115,13,10,190,201,36,109,222,85,220,9,107,84,117,64,38,79,156,208,237,132,212,32,96,86,243,23,251,49,74,146,45,41,42,228,84,217,198,93,71,153,219,25,238,113,108,157,87,54,106,126,143,194,86,117,105,172,146,209,29,82,153,38,64,26,118,4,178,66,125,185,77,33,73,173,24,30,145,6,180,207,131,56,29,160,99,135,144,60,143,220,23,255,97,247,24,36,245,19,161,163,24,78,129,8,35,239,189,227,64,95,182,104,190,9,176,179,184,0,87,118,227,160,160,140,13,10,174,164,100,82,79,122,121,143,27,130,148,191,159,3,118,132,210,216,131,1,117,220,170,191,61,76,29,140,87,194,154,45,197,114,219,140,97,221,51,51,224,187,96,107,65,86,12,186,62,215,246,65,79,190,67,131,55,147,166,70,38,27,134,219,253,162,41,169,132,97,251,253,149,53,26,81,182,129,204,81,122,131,11,39,182,216,209,94,191,252,86,115,7,135,61,13,10,66,194,44,121,79,99,32,0,41,121,21,23,119,164,157,19,122,150,88,78,232,151,98,247,206,253,230,8,90,63,241,97,94,32,197,208,122,234,196,19,255,33,29,38,227,139,58,123,236,140,24,202,85,67,223,253,164,133,62,72,15,155,8,127,183,100,57,188,179,134,67,243,118,150,106,68,25,118,6,108,58,184,175,135,237,188,102,57,89,119,247,36,213,96,11,181,228,137,177,211,158,157,23,86,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen021024l=44854; +} +#endif //_PDF_READER_RESOURCE_FONT_n021024l_H diff --git a/PdfReader/Resources/Fontn022003l.h b/PdfReader/Resources/Fontn022003l.h new file mode 100644 index 0000000000..a0be73842d --- /dev/null +++ b/PdfReader/Resources/Fontn022003l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n022003l_H +#define _PDF_READER_RESOURCE_FONT_n022003l_H +namespace PdfReader +{ +static const unsigned char c_arrn022003l[]={128,1,91,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,77,111,110,76,45,82,101,103,117,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,32,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,77,111,110,76,45,82,101,103,117,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,50,32,45,50,51,55,32,54,53,48,32,56,49,49,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,52,53,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,59,170,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,106,34,97,198,60,118,157,47,75,96,250,44,67,138,215,209,153,216,228,95,126,124,154,96,92,140,161,78,33,252,216,28,154,81,95,184,219,111,153,96,69,52,208,110,169,216,127,224,250,168,82,137,156,157,5,149,199,169,126,108,85,247,159,172,69,205,56,232,123,16,210,16,206,117,1,232,140,143,205,52,68,53,67,101,251,137,58,18,245,150,174,44,30,112,213,129,158,224,208,135,209,11,248,218,150,243,218,189,84,5,210,140,66,40,198,195,27,164,5,36,100,133,150,64,147,63,238,253,128,113,192,200,76,221,130,154,155,29,11,160,31,37,164,213,14,226,234,43,69,22,12,166,51,59,45,40,0,48,110,210,190,253,254,21,94,157,159,147,66,235,141,91,13,10,219,242,70,12,204,152,100,63,177,40,124,205,40,171,167,181,202,185,46,195,158,226,233,24,153,3,114,177,111,132,135,235,163,14,174,136,112,139,108,243,59,108,1,93,128,150,199,207,226,241,57,245,32,82,227,146,92,13,80,253,100,206,104,35,109,89,203,131,239,86,191,197,132,21,14,195,128,101,5,159,51,8,173,111,154,153,248,62,244,230,203,19,133,92,129,117,227,20,23,209,144,208,54,179,135,211,149,35,68,169,80,244,216,199,120,27,48,122,9,77,241,236,174,228,210,194,253,116,123,198,247,249,198,189,14,144,193,146,148,249,108,140,92,254,136,251,52,196,119,87,74,27,22,48,184,204,89,21,41,229,155,32,121,77,163,46,97,222,205,168,171,189,26,233,86,207,116,1,42,160,29,66,238,1,232,97,176,170,104,151,200,100,120,138,229,157,239,67,196,147,36,111,219,26,202,85,76,18,89,75,199,179,54,87,169,236,201,227,209,71,46,248,38,7,63,99,43,229,64,195,95,246,251,64,86,103,115,243,187,34,4,211,165,121,160,140,203,200,68,193,75,24,195,80,240,3,185,218,35,165,112,195,98,214,0,56,147,202,50,248,111,89,184,41,199,142,227,24,139,110,63,127,168,29,127,98,40,37,198,57,99,141,251,120,183,175,31,80,15,91,69,15,165,77,191,165,203,162,119,199,148,236,233,50,117,163,222,11,69,47,220,141,220,41,147,186,164,47,40,166,54,0,140,220,176,62,191,113,189,202,243,80,25,119,137,147,68,63,136,65,42,210,173,13,113,85,163,148,70,6,70,50,102,50,45,188,2,68,176,125,161,233,194,122,39,181,150,100,232,86,109,122,84,204,3,233,149,170,208,8,176,161,126,44,62,246,31,114,12,231,247,120,133,153,196,228,76,112,156,213,195,27,17,16,127,22,173,112,177,123,154,254,46,140,217,34,167,66,141,172,23,20,39,255,175,81,6,115,7,250,176,173,181,48,231,1,253,34,218,34,196,205,48,100,6,123,212,246,8,156,75,44,135,147,125,212,38,228,233,210,246,14,96,130,136,186,201,5,101,84,208,73,71,230,146,0,97,227,121,207,94,129,191,211,47,211,126,250,193,246,28,235,238,85,27,8,81,81,100,113,167,71,44,96,223,137,218,169,235,29,197,166,126,71,151,69,62,105,185,226,43,175,78,60,202,65,146,214,3,41,91,1,140,74,182,157,24,222,82,223,223,21,233,107,85,127,41,13,10,75,140,91,30,122,108,172,168,31,35,81,185,122,223,195,105,149,171,164,56,3,166,229,172,4,163,201,52,149,246,211,129,6,184,177,68,68,156,7,209,53,130,16,249,23,110,21,101,114,54,60,251,222,87,107,253,249,159,163,41,221,19,70,232,63,121,224,108,246,130,80,202,87,166,137,49,188,127,52,42,210,149,208,203,161,122,169,91,184,238,181,62,166,232,230,96,184,20,233,248,87,206,203,20,244,74,67,40,139,105,169,231,144,141,85,191,25,232,68,53,152,121,210,140,174,241,195,138,54,66,1,133,210,13,251,50,194,224,2,32,40,0,232,239,61,103,197,213,14,145,150,87,202,149,139,83,141,83,125,80,52,68,134,83,49,215,155,252,64,49,32,104,215,35,100,80,59,208,204,132,181,243,13,10,116,216,181,182,162,106,242,219,118,69,100,251,101,166,186,143,144,81,174,43,78,164,88,212,106,69,105,243,12,110,119,220,9,115,86,119,3,98,230,207,63,22,97,7,71,120,235,180,79,247,209,227,182,79,247,94,119,225,31,229,37,187,18,28,101,70,207,209,51,0,202,31,2,213,113,184,42,88,37,230,34,109,20,253,207,39,240,109,135,69,42,139,108,93,202,101,133,53,206,226,167,149,229,129,55,212,142,86,107,105,213,58,12,59,118,110,132,197,30,170,34,28,70,153,156,200,6,90,219,47,18,157,91,99,15,171,24,20,192,195,59,90,234,14,251,182,233,148,216,9,65,181,48,121,175,150,217,13,10,11,146,79,155,14,49,155,237,152,54,184,249,5,63,134,131,99,211,202,85,76,187,24,24,99,48,31,140,185,64,135,46,213,250,123,209,140,227,146,24,181,173,138,197,125,15,117,45,148,16,118,177,198,77,153,190,13,184,109,122,109,150,81,13,119,46,178,76,88,127,17,119,155,210,28,254,91,222,31,41,193,239,144,34,178,184,188,215,249,17,83,200,69,144,103,34,71,120,41,196,1,17,216,16,72,15,60,246,45,232,219,167,253,134,205,35,110,101,102,24,202,246,252,70,130,127,188,72,152,234,118,114,248,201,151,26,254,67,224,224,30,200,183,125,74,244,140,191,18,16,233,140,29,177,92,22,209,73,191,245,138,176,39,12,240,21,177,7,163,165,15,93,200,243,127,251,146,238,200,203,103,120,221,183,206,74,171,196,100,196,175,246,84,34,48,6,165,80,235,82,72,90,35,210,180,170,113,152,211,205,84,65,129,2,241,233,164,251,222,55,184,65,229,111,92,44,83,150,109,185,182,107,0,14,69,136,40,46,63,184,12,44,81,147,57,240,0,45,47,131,201,121,237,197,130,122,59,60,142,248,129,13,10,15,157,172,182,185,153,142,154,246,85,31,86,49,61,196,1,25,4,203,151,154,162,211,43,17,168,17,188,36,129,65,228,185,115,77,159,183,152,42,86,113,0,45,130,121,202,185,58,190,5,116,116,98,141,239,201,93,67,137,13,177,237,52,207,168,162,11,220,61,135,78,118,121,163,150,21,142,82,46,208,171,150,154,78,62,199,228,71,78,25,37,144,80,77,84,222,183,178,96,183,147,92,78,86,84,138,125,18,26,193,247,65,248,205,242,89,234,27,88,19,23,90,119,161,210,211,11,162,111,101,235,118,90,4,192,158,213,31,105,244,21,81,173,243,153,230,170,47,192,151,136,19,123,234,73,19,241,123,142,184,56,195,143,178,114,31,220,181,95,214,86,151,255,11,133,14,125,61,28,226,102,191,144,247,236,6,169,160,135,107,223,231,103,211,169,24,176,146,252,120,199,117,249,69,207,31,150,232,89,192,61,191,99,13,154,148,9,57,101,76,53,73,216,247,146,28,185,78,226,61,90,5,53,222,157,243,30,160,249,55,248,96,180,242,32,169,154,221,252,52,61,124,247,191,160,184,3,193,44,38,64,63,13,207,252,142,167,134,208,216,168,217,195,103,65,156,168,174,65,25,12,233,58,128,134,88,58,30,108,157,112,182,18,200,77,135,210,238,170,113,236,45,193,47,76,222,106,130,19,3,213,246,169,187,219,126,237,205,40,158,128,250,59,117,244,127,72,27,80,113,157,207,74,20,32,105,57,53,147,185,175,156,206,234,236,86,163,91,135,135,25,61,124,136,17,62,158,30,34,29,21,30,9,59,1,158,248,159,97,24,190,196,115,81,3,204,128,3,204,90,209,182,114,123,50,38,205,68,196,151,218,112,82,221,104,22,149,219,236,51,151,249,89,140,145,119,112,28,115,191,5,148,206,147,242,61,80,236,91,238,47,185,218,31,201,102,223,20,139,39,178,142,227,200,149,38,221,102,37,226,136,127,159,160,118,124,18,124,96,158,227,21,98,107,193,77,39,79,190,165,101,40,220,6,162,123,45,71,109,70,233,231,145,101,144,177,86,165,223,4,166,203,21,227,98,69,215,112,33,118,123,110,91,223,204,103,150,112,38,63,216,145,68,108,51,113,177,27,182,225,223,96,249,96,170,180,20,157,119,83,230,165,195,56,16,196,44,139,255,78,147,80,3,56,133,6,248,39,139,215,203,103,47,19,46,6,90,230,132,220,160,185,6,77,1,221,98,14,127,253,254,4,241,66,119,239,232,230,1,89,186,15,202,63,226,242,139,144,45,74,194,117,209,159,13,10,198,151,30,190,130,124,74,35,45,135,101,13,38,136,52,91,202,120,248,121,7,113,20,240,70,60,95,5,129,7,182,105,86,111,129,113,228,226,132,210,120,64,85,128,240,75,255,201,144,39,132,33,110,12,154,23,170,155,41,53,230,110,24,167,131,247,35,190,4,67,137,183,233,214,42,163,104,24,255,46,164,6,195,193,169,210,243,67,111,62,231,219,139,232,106,250,141,170,106,75,27,132,97,19,80,216,210,118,5,80,150,18,181,21,225,106,168,67,22,77,93,8,5,227,106,43,158,247,76,95,106,11,157,89,160,75,85,105,113,35,39,244,177,179,14,149,135,205,16,51,55,99,153,103,203,220,101,90,164,110,128,210,207,210,75,235,80,129,91,83,56,229,34,179,167,175,232,54,42,180,240,93,139,197,43,186,156,80,137,173,168,200,149,41,176,39,90,244,34,235,84,13,49,169,56,184,116,8,96,117,99,37,185,102,179,104,23,17,82,19,250,175,146,222,99,246,186,225,224,6,75,251,197,88,128,152,182,30,184,60,113,241,194,8,36,54,211,125,175,26,203,225,134,254,220,75,231,193,35,59,111,24,190,197,249,144,2,210,28,183,134,78,72,17,247,171,60,3,0,62,30,68,144,173,26,199,147,189,40,252,213,239,14,108,195,14,243,154,8,197,47,113,147,155,12,239,98,13,198,158,49,227,157,109,185,105,4,144,49,176,201,46,242,219,101,61,151,243,112,20,20,86,165,41,133,7,107,38,134,82,250,38,72,199,146,120,11,173,99,124,77,117,129,251,45,98,1,29,87,226,147,113,148,135,207,45,31,1,60,250,165,50,225,194,211,145,120,213,18,114,166,175,4,20,64,188,161,116,181,204,144,43,215,57,12,125,54,149,5,108,180,189,119,145,249,251,109,136,231,167,13,239,44,151,134,159,93,188,91,216,35,197,23,199,183,195,157,98,77,246,39,220,150,83,234,83,71,191,218,128,183,35,240,95,109,187,76,158,165,1,216,98,172,224,91,157,189,242,27,112,86,251,205,140,109,75,133,135,61,206,230,22,108,139,90,220,3,22,202,18,217,99,159,54,27,21,164,47,0,225,214,46,219,202,17,17,151,47,160,244,87,88,190,203,49,219,56,49,111,60,223,225,180,23,72,201,62,213,139,103,233,181,122,187,237,89,36,166,213,62,153,251,201,169,148,166,72,154,139,223,19,235,104,85,72,180,220,109,98,218,116,38,194,34,39,212,212,59,111,252,123,94,169,28,137,103,48,37,62,137,65,175,238,88,131,89,194,190,207,111,252,65,91,158,182,211,28,203,15,108,127,133,133,62,100,73,250,109,98,122,151,163,206,131,3,241,72,57,58,220,204,223,162,254,8,92,105,8,190,92,60,5,175,0,166,240,40,64,32,108,50,83,165,89,172,92,4,155,221,253,17,173,155,17,132,3,184,77,161,13,10,227,196,112,203,154,154,45,29,123,115,47,89,245,254,20,109,237,166,13,10,231,80,245,81,170,201,52,98,27,68,112,225,188,50,76,67,99,3,226,95,129,208,220,49,136,190,13,111,236,84,20,194,14,76,177,137,82,225,44,182,66,61,247,18,70,39,172,222,20,85,0,215,122,151,168,191,217,203,80,209,250,160,8,226,206,43,37,5,164,116,159,30,187,176,146,195,71,2,55,20,5,90,155,99,53,58,249,231,254,224,91,181,76,152,67,105,129,1,247,152,136,169,21,49,119,56,48,194,201,103,181,136,211,172,210,25,40,131,213,206,57,98,213,16,132,252,101,62,174,44,95,178,218,65,218,206,251,92,118,129,45,46,219,91,16,150,119,40,156,209,153,141,69,127,177,2,58,25,172,103,41,91,188,26,154,32,164,38,176,106,54,141,243,197,221,8,60,177,24,13,40,127,85,0,242,198,53,237,225,87,238,252,238,197,80,52,71,56,45,21,199,72,193,227,95,104,117,57,146,229,201,15,144,13,229,77,24,248,225,179,85,209,7,106,223,177,243,89,1,53,250,209,163,111,2,142,68,244,138,187,20,155,128,202,154,84,97,77,70,127,141,113,203,49,11,188,122,199,16,2,97,9,45,184,197,191,211,158,13,10,198,188,44,157,108,188,58,140,5,255,138,116,203,33,96,142,196,164,207,228,203,170,45,5,109,186,20,32,97,6,4,77,236,245,159,149,126,248,169,202,222,76,155,25,216,211,13,212,253,230,169,84,142,80,219,81,172,167,51,48,20,33,83,252,54,182,156,28,141,91,38,208,198,137,183,4,14,129,172,44,134,79,215,192,151,201,155,229,149,56,67,225,114,201,122,181,104,79,53,251,3,167,37,168,157,191,55,31,8,221,244,13,10,21,49,252,27,103,109,176,225,84,58,236,110,151,211,210,228,170,61,88,49,216,179,201,82,171,191,161,18,53,40,20,251,111,171,97,160,214,128,230,100,15,106,236,132,38,32,12,246,18,134,247,66,44,178,247,140,97,235,170,54,212,126,193,109,127,175,139,74,243,29,9,12,223,162,85,217,215,198,29,70,207,178,42,125,110,23,88,231,30,213,103,224,12,189,142,143,70,141,223,180,119,240,145,162,249,21,98,127,34,255,71,184,118,84,75,193,240,59,107,187,152,56,95,0,156,32,187,26,162,167,167,134,116,105,43,142,172,46,60,128,105,183,158,103,147,56,218,87,247,41,118,129,15,132,91,235,107,154,221,50,185,93,120,229,230,15,22,221,22,104,156,5,253,130,211,106,49,21,190,142,212,148,167,77,210,17,213,138,44,223,152,63,203,156,220,41,191,127,14,41,152,143,162,53,96,237,245,20,188,29,24,63,59,42,34,192,159,177,121,180,126,5,173,239,72,223,2,243,28,41,135,93,25,21,3,123,25,64,119,100,164,41,47,228,78,116,22,81,168,227,190,181,240,217,114,182,50,112,144,246,100,65,124,132,248,79,251,240,175,255,139,29,133,200,34,217,7,48,171,65,64,196,42,81,170,139,29,190,67,152,78,168,86,96,64,235,139,52,28,206,35,253,63,105,221,35,90,8,11,165,198,154,236,185,188,115,43,194,215,212,6,23,221,166,183,159,182,238,64,195,85,108,125,249,178,61,173,137,233,64,84,177,52,93,184,64,42,230,121,252,70,85,164,167,118,192,21,4,99,248,219,43,252,6,8,234,31,18,78,34,29,218,230,2,107,94,93,0,122,126,74,13,107,59,12,243,162,102,158,103,197,228,240,21,81,150,106,123,196,143,47,75,106,135,231,64,216,9,94,99,247,124,122,2,127,38,181,47,34,153,222,91,138,47,98,9,188,243,211,28,176,35,95,153,143,120,30,92,200,30,49,220,66,78,0,141,70,236,9,32,41,81,229,104,72,4,160,89,46,164,125,108,120,138,32,72,123,234,46,200,242,230,193,215,243,120,182,45,180,60,164,60,75,54,111,139,67,25,99,28,254,152,84,240,225,3,33,207,163,176,28,135,53,132,134,59,190,252,35,199,44,5,230,149,181,110,138,82,232,154,162,218,181,67,131,77,52,220,172,95,237,8,220,81,130,92,82,87,174,89,133,13,16,29,132,244,202,161,210,159,201,50,249,224,239,251,247,169,167,243,104,95,97,240,73,12,211,204,137,136,45,181,42,117,122,106,244,196,230,123,64,123,210,49,107,28,15,254,125,197,78,67,200,123,135,79,87,228,144,51,52,226,20,11,1,20,132,134,60,220,172,163,49,23,95,44,243,215,46,0,66,133,89,131,170,248,133,61,48,21,232,112,255,8,7,1,76,49,213,80,96,223,63,225,252,225,87,50,68,129,39,68,171,81,50,36,68,99,47,154,253,166,112,110,50,15,254,130,184,203,226,66,161,157,240,12,231,62,228,142,37,255,73,213,135,27,211,230,6,82,41,143,227,232,212,0,96,158,35,46,13,220,121,76,5,121,172,239,137,232,65,178,237,202,80,213,17,81,246,94,140,28,195,176,30,241,135,5,88,240,191,87,67,113,140,62,6,134,23,232,27,254,18,12,108,161,110,9,36,191,194,84,17,119,213,54,113,202,163,171,100,28,65,85,125,205,174,26,52,97,71,181,233,153,196,84,27,8,180,175,203,193,135,175,214,83,213,181,248,56,109,246,173,143,230,158,33,189,5,103,223,73,79,115,108,106,24,79,164,222,72,220,159,52,119,135,202,150,226,224,13,10,41,108,45,160,92,42,217,188,66,62,156,164,40,215,241,250,18,220,147,83,163,2,251,140,82,154,248,104,140,187,84,59,69,178,113,126,191,143,108,73,121,53,244,243,191,253,40,94,4,2,171,117,68,179,202,70,67,174,90,139,82,80,237,152,122,149,252,31,39,91,151,7,172,208,100,27,208,238,42,233,117,132,148,248,216,165,29,206,64,138,56,172,32,234,240,133,45,114,216,77,12,107,233,115,50,103,147,174,185,85,234,198,254,13,10,40,19,163,85,220,210,47,111,44,229,101,136,209,192,85,205,223,169,136,120,188,235,106,1,141,178,41,34,210,182,0,162,15,129,132,46,102,93,244,16,19,202,9,71,196,35,124,43,214,13,10,117,226,253,26,63,184,200,250,25,72,87,48,184,116,97,173,70,106,203,2,223,140,162,64,145,79,176,144,179,210,180,30,182,184,255,5,225,165,157,159,214,104,175,112,186,91,183,39,120,149,59,165,95,197,249,246,38,4,52,80,225,208,155,200,61,134,5,9,138,190,248,132,99,154,55,128,154,50,86,92,190,251,63,243,158,229,61,108,24,197,140,39,43,185,40,228,65,14,54,30,89,165,15,36,45,105,116,122,3,38,23,197,45,235,191,98,54,74,181,169,110,250,246,66,217,216,43,166,121,177,215,15,172,16,164,235,98,250,92,252,48,142,134,54,138,170,215,231,89,72,244,53,152,205,28,84,74,13,64,145,55,77,126,136,212,82,44,190,144,35,145,100,19,39,232,136,231,116,143,168,137,220,230,122,222,97,105,158,125,119,118,54,129,202,238,155,28,168,131,123,47,126,249,193,140,188,197,56,196,101,200,226,221,52,97,105,83,204,182,3,13,10,34,44,114,139,131,73,17,193,161,121,226,199,112,40,148,7,171,40,179,3,231,36,217,127,116,125,97,52,180,37,33,106,100,198,224,182,15,99,62,43,133,48,0,71,228,201,3,57,206,3,13,10,15,174,49,232,48,200,171,165,171,51,134,163,182,146,103,53,26,123,253,214,99,86,174,94,87,251,41,148,69,41,147,233,13,231,196,226,96,171,171,147,195,120,49,133,106,101,13,86,228,65,114,254,202,1,214,199,195,128,242,80,184,36,115,150,13,42,42,95,182,180,218,102,143,70,230,36,172,247,250,15,212,73,15,72,93,100,13,10,58,223,201,248,101,46,122,56,206,87,153,247,112,195,96,109,180,184,185,71,249,57,103,247,121,227,163,192,87,47,19,165,161,135,211,29,123,209,42,92,123,226,60,182,237,97,146,8,98,65,183,108,91,166,152,61,185,201,62,75,32,141,112,125,55,96,240,60,214,39,46,243,164,206,137,184,229,46,106,197,135,26,61,3,235,151,87,89,171,75,226,57,229,236,120,66,203,179,51,230,146,204,96,124,114,46,24,93,60,57,22,77,211,32,198,148,86,41,199,15,246,106,82,55,192,169,82,13,10,31,173,110,185,129,96,105,53,26,176,241,53,217,12,192,152,43,20,125,34,148,174,74,56,165,39,238,64,190,156,222,37,18,170,235,181,144,225,52,56,139,177,113,208,149,106,124,69,102,214,90,154,4,27,230,196,248,131,107,62,195,210,237,27,72,181,102,167,131,41,43,21,182,18,121,32,210,71,212,148,240,112,187,32,190,255,96,100,11,17,178,118,221,238,228,151,6,232,178,178,27,180,11,127,0,170,252,89,76,73,44,37,220,167,116,224,184,13,130,233,39,68,141,226,231,74,157,13,199,172,146,96,9,110,175,24,123,108,214,174,170,109,29,196,32,91,68,17,18,39,81,165,178,38,136,64,78,167,197,134,23,48,55,31,250,193,15,90,253,71,39,160,228,2,171,94,167,87,96,107,117,235,134,160,94,143,119,77,110,67,13,10,26,63,226,163,126,187,6,112,4,116,35,159,177,207,160,94,228,75,145,184,34,68,197,117,181,46,127,175,147,75,4,238,176,217,51,254,181,126,190,50,109,117,130,28,139,35,234,168,91,88,58,237,67,32,183,240,75,159,45,197,145,9,18,22,253,229,46,6,75,170,169,194,201,217,113,75,149,164,85,140,33,243,206,190,98,75,84,3,179,21,8,241,120,88,26,246,134,48,131,237,118,47,30,46,52,164,92,253,215,22,96,214,38,255,134,72,245,214,197,229,128,212,118,90,103,251,97,89,236,128,119,169,240,168,128,56,200,211,215,199,127,240,146,110,33,35,190,135,79,123,202,241,41,213,90,91,89,96,248,36,189,23,40,171,207,204,81,210,57,54,222,154,37,196,8,215,134,228,76,58,43,175,164,66,49,119,173,6,13,33,211,142,21,226,62,182,255,192,180,18,14,129,70,149,212,35,238,252,39,68,161,252,129,180,223,137,215,111,13,10,104,3,216,177,78,117,83,140,170,208,58,114,81,123,134,81,79,105,82,246,253,97,157,158,145,13,152,15,0,150,77,179,37,49,140,4,91,223,121,100,127,69,61,74,92,244,230,29,213,53,151,130,130,114,41,49,4,5,251,207,97,7,195,173,157,222,249,169,163,57,213,213,166,235,46,120,56,160,164,50,33,189,98,203,223,115,45,176,166,56,165,32,22,251,53,186,119,97,174,200,70,160,35,211,191,45,27,177,131,84,62,129,235,124,172,30,89,112,205,198,240,104,197,234,17,140,122,174,82,141,19,150,230,220,147,145,18,218,68,96,200,144,234,213,192,27,220,67,143,91,183,52,33,139,166,39,13,10,221,13,193,119,143,216,171,22,131,29,106,48,43,129,74,26,68,176,126,220,101,149,108,158,108,244,135,93,245,33,243,206,91,66,47,113,8,27,109,105,189,39,15,115,144,149,201,232,28,3,119,147,74,139,198,57,12,66,12,78,76,221,156,247,227,37,68,198,141,136,78,21,172,163,188,192,127,200,193,50,216,251,157,117,44,21,215,92,82,194,136,87,226,234,70,26,111,202,217,12,86,132,53,19,247,68,97,241,141,113,100,188,89,122,40,174,75,167,200,110,225,112,53,53,169,185,237,80,18,38,39,113,252,18,241,2,232,0,224,225,175,123,180,102,129,189,43,20,182,20,206,169,27,123,42,170,53,35,93,231,108,14,17,60,146,104,143,142,200,18,119,213,140,52,6,119,142,30,193,204,21,241,205,154,19,124,143,253,170,185,154,206,59,252,120,41,22,241,168,119,23,5,137,169,45,201,33,230,116,13,10,34,184,77,198,186,205,171,204,118,230,76,121,227,165,136,216,15,143,77,55,110,27,66,111,21,117,28,247,57,17,2,16,47,13,10,250,253,139,34,223,222,181,72,174,181,243,11,22,115,2,61,34,5,74,19,57,26,14,192,141,230,231,182,133,160,208,49,170,191,32,183,198,33,135,192,40,72,146,213,234,173,241,33,186,40,38,62,184,99,213,227,110,169,192,106,119,204,252,14,23,245,147,150,21,145,248,77,130,175,130,62,254,65,4,76,141,96,111,239,131,204,199,176,233,97,231,153,77,248,163,204,54,178,9,217,83,226,80,173,171,141,34,215,242,180,226,201,202,57,239,162,217,62,86,25,92,21,96,227,13,10,81,144,204,91,23,250,239,207,37,13,247,159,107,98,74,75,145,126,17,195,50,34,47,204,254,196,246,164,123,217,231,93,169,133,79,195,247,174,85,78,145,237,222,20,77,122,239,56,160,227,237,181,229,165,98,99,116,219,148,240,34,200,207,84,144,147,4,29,224,13,114,105,183,206,84,78,116,132,57,186,40,112,113,140,8,229,143,180,167,125,147,235,192,75,121,87,210,114,174,22,1,212,27,248,90,43,173,170,13,247,59,13,56,65,212,131,156,133,103,127,178,225,95,29,108,229,146,102,159,244,187,201,198,157,186,51,77,195,119,6,242,246,190,131,213,134,62,140,214,163,12,8,100,13,10,172,76,35,54,132,230,107,79,230,182,45,74,139,233,213,49,228,123,239,86,64,217,181,194,125,153,0,146,190,21,151,246,153,92,138,119,190,156,24,170,230,193,207,19,7,117,221,172,65,211,68,56,252,122,216,224,66,203,86,203,242,148,73,50,235,167,208,83,233,55,111,243,152,54,116,80,227,90,25,69,254,35,224,92,146,16,150,161,84,84,114,31,253,15,66,154,62,6,220,62,211,111,28,23,11,231,156,102,153,110,248,51,122,255,133,185,12,93,58,74,148,69,90,233,250,50,226,17,122,99,229,144,1,240,82,213,246,34,49,37,191,175,164,9,1,233,137,96,173,247,187,136,103,41,220,168,47,195,184,204,82,179,127,242,81,114,153,225,215,105,5,127,129,84,251,149,88,47,2,203,11,236,200,115,169,199,23,150,173,189,62,145,50,79,170,148,242,196,28,245,124,48,181,137,125,3,28,2,210,86,201,9,224,128,231,11,253,31,50,230,158,246,112,49,19,140,45,220,209,168,228,182,94,72,92,35,195,228,80,171,221,152,21,81,45,111,52,168,75,157,183,21,219,44,122,147,191,180,36,49,110,26,164,67,151,116,156,176,16,136,66,143,20,154,59,67,36,115,126,217,149,127,211,136,36,132,98,172,27,38,16,215,43,245,192,115,236,165,103,231,56,92,201,89,227,124,172,126,5,71,1,96,255,165,169,246,59,142,155,8,41,55,233,17,88,110,161,101,55,73,56,244,146,237,242,140,230,2,9,83,165,181,204,236,119,55,249,217,204,133,56,196,51,149,103,170,237,55,148,171,163,185,244,234,230,84,102,232,227,38,246,195,153,179,99,85,147,95,189,203,153,114,241,11,19,73,77,194,80,151,252,236,90,99,152,242,117,200,193,81,85,142,116,197,23,95,123,175,65,85,227,107,115,63,117,207,157,92,89,121,176,118,79,20,216,48,110,6,186,36,191,121,17,65,228,4,198,159,63,143,204,217,27,156,88,194,198,113,170,231,212,249,229,214,65,78,70,237,99,58,95,120,170,91,240,78,101,34,70,160,102,234,217,229,130,177,129,204,25,110,162,211,207,170,56,59,93,14,76,172,147,54,225,25,192,140,198,172,85,203,251,174,20,124,98,59,64,4,83,187,244,71,233,109,224,54,252,2,86,36,56,67,89,238,215,199,213,247,133,141,192,82,19,119,207,100,122,21,127,195,241,136,222,94,239,9,77,186,18,85,16,253,227,76,87,13,123,231,106,181,223,13,10,40,191,69,221,170,219,234,126,238,219,147,99,50,223,233,48,129,224,175,211,253,212,107,237,8,214,145,75,46,252,253,196,22,98,163,59,144,176,61,118,211,79,72,211,15,198,187,187,96,14,144,230,172,114,67,253,240,38,118,42,68,180,214,228,236,190,244,140,157,123,105,106,242,158,238,6,62,85,125,143,207,15,9,224,19,111,69,209,126,96,141,163,110,89,242,174,207,132,147,248,214,37,54,17,155,95,126,21,84,223,227,246,232,215,201,162,198,245,87,209,139,74,249,44,159,110,5,9,117,195,181,197,79,155,95,78,57,214,0,182,250,44,214,222,32,58,23,64,40,203,178,162,1,175,18,109,16,19,194,41,187,130,207,208,19,237,25,157,1,229,30,226,120,15,232,150,224,28,99,198,85,8,122,62,97,167,241,2,159,165,233,126,161,135,47,27,69,242,34,130,221,195,23,225,121,38,115,104,203,82,218,148,68,246,5,90,60,101,54,89,202,210,161,216,113,43,194,177,179,44,29,198,144,109,149,127,184,133,36,238,6,97,86,237,107,222,184,216,50,249,51,143,153,18,226,154,37,13,10,140,70,116,230,103,193,194,120,182,119,174,201,151,43,232,60,186,63,183,121,137,63,203,143,129,163,35,172,145,71,75,162,162,51,74,7,187,86,40,233,5,197,24,230,52,246,118,26,50,137,5,111,131,213,221,123,56,144,152,126,238,28,24,251,45,55,156,193,144,95,26,235,59,61,42,213,120,240,214,200,69,210,212,12,75,206,227,247,28,144,230,142,84,23,187,140,221,216,120,216,59,168,13,10,216,72,95,64,103,229,195,202,191,40,171,86,203,178,25,192,170,184,255,198,199,225,146,190,200,203,202,20,89,174,68,80,175,204,129,185,84,143,64,206,38,34,229,167,194,129,247,77,204,2,218,213,126,253,146,208,114,49,141,223,5,191,66,241,234,129,99,7,30,35,148,155,1,121,207,125,230,70,119,202,153,178,60,185,38,179,226,148,25,78,193,51,151,234,29,201,165,225,205,205,130,129,86,205,113,248,27,100,22,125,79,176,30,96,2,113,59,216,172,111,130,178,12,211,105,156,108,164,112,77,197,198,90,45,102,235,21,91,122,241,201,187,70,70,148,22,251,73,193,199,225,122,48,165,240,69,39,29,125,243,255,242,244,44,107,71,7,1,195,129,227,69,106,80,12,107,179,208,228,123,77,145,197,243,75,73,187,98,114,241,248,105,139,48,125,137,237,163,161,86,93,173,28,8,100,98,117,96,207,146,45,207,91,52,198,120,96,53,35,144,178,130,249,83,148,170,44,222,14,151,206,62,211,149,70,166,175,28,82,191,207,129,162,155,232,44,71,201,158,128,80,228,136,158,69,117,183,95,57,230,98,242,219,116,32,103,55,151,226,237,61,103,205,167,174,44,21,208,160,167,148,213,125,22,142,190,19,33,78,137,224,32,154,178,192,235,119,132,233,73,26,239,163,192,45,13,243,174,83,101,160,252,74,224,35,202,181,40,22,44,122,27,23,54,100,157,250,221,172,168,218,95,161,139,125,100,137,228,34,158,158,36,211,138,98,4,100,167,68,165,198,15,111,157,51,75,144,135,6,183,56,174,209,134,105,138,139,39,131,65,250,77,101,160,168,134,128,186,72,70,148,146,21,18,247,222,147,51,127,193,192,43,190,110,100,175,45,173,7,96,50,121,216,115,41,29,31,77,57,193,221,109,137,201,15,101,36,15,72,8,246,241,17,92,165,91,136,226,66,86,94,89,243,187,241,241,14,199,184,136,114,233,174,97,212,76,174,24,84,99,237,250,247,223,99,222,77,34,7,211,7,175,182,21,1,137,41,101,23,13,41,69,132,111,207,89,115,161,212,88,96,127,80,193,94,6,229,190,199,21,224,193,86,37,154,170,108,115,85,147,229,86,79,101,244,67,183,140,199,81,46,195,90,86,241,38,223,157,48,151,74,64,135,46,66,101,225,174,95,212,131,207,203,187,162,109,238,66,108,220,71,33,241,156,63,218,134,237,122,212,250,17,32,246,54,105,190,254,112,2,177,40,206,175,216,198,62,138,192,153,67,182,203,223,179,210,71,106,2,108,0,168,255,129,177,246,81,185,127,49,12,130,171,165,243,136,204,29,181,175,207,245,153,109,82,82,166,164,47,164,217,114,228,30,229,96,136,247,140,185,102,249,5,17,113,196,114,199,116,135,154,236,255,240,139,253,156,234,64,215,194,152,146,42,206,100,242,140,20,224,184,31,77,202,222,129,215,29,227,152,61,135,217,5,25,46,241,60,238,113,178,211,255,26,136,174,198,113,236,49,137,23,223,152,163,201,5,78,55,45,34,163,206,200,47,204,33,127,71,49,154,64,144,3,18,246,227,43,83,107,158,122,127,160,131,126,198,92,205,181,251,13,65,67,113,23,89,108,179,157,147,130,38,45,230,230,83,121,211,169,112,155,44,251,171,245,252,93,91,53,36,37,240,111,136,205,49,1,42,42,65,71,177,18,240,193,192,172,204,128,140,214,37,224,34,142,239,102,102,31,112,175,150,211,220,254,205,64,39,0,228,246,82,42,201,168,86,218,70,109,85,200,79,101,190,40,16,161,86,81,99,135,45,98,235,129,51,58,105,142,215,182,131,82,202,204,162,215,173,56,171,85,193,158,79,85,130,247,88,24,48,47,95,218,223,29,206,208,157,148,135,47,45,72,251,99,108,142,56,199,86,60,114,199,113,160,140,107,31,4,31,53,50,189,179,144,6,200,154,51,192,155,225,227,230,3,98,45,137,31,152,1,11,241,222,83,85,245,87,161,224,148,72,212,134,173,239,86,87,5,39,123,49,184,191,43,134,118,30,50,99,30,52,53,182,136,183,157,86,111,23,71,186,69,109,219,67,205,35,159,180,127,247,180,37,234,164,198,87,200,238,194,110,224,26,237,7,207,145,110,119,213,54,52,193,55,174,234,0,156,107,81,91,99,66,197,75,226,199,185,89,85,177,169,218,39,122,13,10,188,218,35,70,232,128,24,199,38,244,129,247,29,96,17,170,66,248,133,47,46,87,73,81,143,227,179,171,102,130,19,254,26,5,193,13,10,28,83,149,61,117,49,38,49,214,187,186,1,212,24,25,157,254,255,140,245,72,97,9,176,153,254,142,47,96,97,101,254,48,245,50,192,53,103,120,93,83,98,170,135,60,157,62,236,235,32,241,148,93,85,244,155,12,202,200,73,103,89,252,199,41,46,70,147,137,67,194,98,215,143,50,18,211,249,208,247,177,3,21,127,66,61,113,177,237,84,178,166,3,244,194,105,2,153,24,242,56,236,104,40,255,206,198,96,9,219,156,158,89,83,78,171,177,131,243,29,122,212,197,123,27,223,11,210,206,90,66,24,130,188,16,204,27,206,106,151,14,43,88,107,178,33,86,124,202,72,57,137,221,11,141,236,66,76,29,31,240,66,220,183,131,68,35,207,36,78,218,40,210,217,105,177,116,64,202,234,240,36,166,17,157,176,16,206,54,104,33,175,164,36,209,184,41,150,9,192,65,72,39,90,230,229,37,122,122,203,60,118,108,116,124,233,156,186,45,112,60,241,155,124,243,1,182,52,216,182,19,221,196,175,228,99,58,77,119,191,248,224,12,251,94,40,158,187,202,201,13,10,36,48,126,121,65,236,22,133,203,174,64,12,173,216,118,252,239,127,101,87,238,225,103,210,3,90,5,18,2,147,82,119,0,220,81,11,3,138,73,107,225,213,203,174,242,78,211,159,116,33,26,147,170,223,34,33,78,214,6,168,5,130,72,90,254,53,142,58,70,208,103,17,72,153,138,59,59,226,9,70,112,9,180,52,0,135,3,89,212,24,154,140,235,77,88,102,171,82,209,109,156,235,30,171,113,192,126,108,170,52,183,14,48,150,191,118,4,194,44,64,213,251,254,234,97,109,163,186,189,89,220,219,151,216,131,252,135,66,184,38,122,22,169,155,121,83,34,95,113,68,86,141,86,110,100,84,44,146,229,56,172,20,12,133,30,93,41,85,40,235,124,187,73,144,155,28,175,100,9,201,188,206,179,37,70,143,160,181,247,203,41,135,56,38,22,180,119,204,254,79,74,199,158,74,111,113,101,54,53,67,240,77,229,182,246,225,194,233,16,205,195,205,214,196,201,39,55,25,143,137,35,55,220,182,100,123,210,38,200,32,172,153,198,93,142,119,114,187,183,79,230,93,202,168,162,44,51,188,22,139,244,142,64,168,39,0,163,167,102,140,90,154,113,227,151,172,223,238,125,85,108,92,25,70,123,122,166,156,38,11,114,116,7,172,131,123,219,125,103,222,192,85,193,244,93,139,172,97,4,140,69,188,159,179,206,254,117,73,234,162,153,45,46,220,18,111,247,160,94,174,88,97,51,50,162,188,20,101,178,188,4,41,22,43,144,125,101,247,147,210,54,237,221,141,53,64,88,102,215,27,37,246,45,196,167,224,109,77,238,130,132,13,10,204,170,188,7,116,248,166,62,156,15,127,201,128,179,88,62,122,139,1,196,101,144,227,188,4,235,165,101,194,234,148,240,87,217,100,167,138,144,234,159,82,171,253,112,248,78,68,228,52,189,16,164,46,152,199,148,6,87,36,52,31,144,126,53,211,203,37,113,97,224,28,112,132,227,160,22,109,21,206,214,93,167,186,135,219,178,234,51,211,155,217,154,251,147,211,84,131,88,208,131,48,232,7,248,85,44,236,246,60,132,248,5,32,84,145,186,58,26,98,46,112,194,50,250,223,59,242,220,253,111,5,57,21,141,51,6,80,111,21,11,5,24,55,25,18,162,94,185,97,99,215,62,158,238,212,46,220,132,214,136,188,127,119,8,217,220,163,72,250,180,223,98,229,128,155,208,148,132,45,13,10,49,219,183,196,180,31,148,217,70,129,12,94,193,11,105,170,188,44,145,165,149,0,178,229,211,127,71,85,221,251,122,228,171,247,87,244,197,188,247,124,127,149,230,166,22,100,100,86,254,143,24,64,112,128,188,171,191,165,119,4,40,122,210,98,34,223,145,171,38,19,149,30,45,103,148,114,248,173,240,110,162,162,2,5,236,25,151,34,153,167,139,172,82,17,67,52,71,12,95,88,144,194,248,70,180,198,4,45,115,148,81,39,242,227,145,14,202,28,76,215,161,110,254,75,75,227,138,21,170,167,16,104,44,56,54,168,202,131,253,56,73,112,19,157,139,70,251,13,10,235,176,2,221,34,65,153,103,47,250,2,37,15,188,250,78,100,158,51,84,40,252,113,245,15,69,228,152,65,158,219,14,151,15,70,137,74,72,246,85,128,136,28,156,66,80,252,239,101,201,178,134,153,64,142,24,178,111,230,219,127,28,189,183,103,86,78,115,203,89,84,198,214,57,206,51,34,12,137,79,54,231,15,113,201,249,170,63,226,174,13,10,160,227,242,227,4,236,90,188,102,22,117,205,226,231,5,25,228,34,13,10,226,111,186,203,208,29,81,105,235,132,71,80,117,62,108,237,83,227,103,143,220,208,138,185,62,16,6,126,156,100,243,139,64,183,109,153,182,205,146,189,244,21,90,30,165,204,130,73,152,181,154,173,6,224,158,95,21,235,178,40,141,102,234,113,178,150,97,103,52,254,242,121,111,7,255,13,139,4,112,116,161,17,29,104,185,156,43,112,252,86,231,74,81,176,98,244,153,138,204,133,177,148,60,148,119,228,54,229,205,122,177,141,188,137,141,33,187,147,71,90,98,59,221,167,29,123,137,91,162,212,193,15,75,144,191,51,81,38,244,253,87,215,58,250,80,23,15,107,60,54,73,34,229,81,212,14,53,218,117,250,137,23,98,250,35,64,29,57,38,15,46,146,199,128,124,116,111,19,187,53,206,249,219,242,231,110,102,167,47,239,240,149,218,72,42,77,232,164,32,145,112,101,115,108,244,222,144,79,181,46,100,154,50,37,94,32,48,167,179,27,104,99,83,73,47,49,192,100,163,196,176,68,140,75,253,68,184,225,83,132,253,128,155,135,97,238,38,167,223,161,117,141,87,206,79,11,195,118,235,43,56,51,83,75,21,168,52,54,186,85,57,85,172,181,167,166,103,150,172,91,146,219,83,136,188,83,239,162,117,8,176,142,130,130,30,92,246,105,188,229,43,184,96,120,15,116,155,79,56,172,223,95,241,39,38,191,62,194,116,63,1,1,76,222,150,254,107,76,64,160,52,233,234,252,162,163,92,204,119,108,38,105,230,173,19,128,112,164,15,72,237,121,19,109,127,245,126,153,62,9,184,28,84,63,186,221,53,15,245,181,247,164,111,6,15,136,227,15,226,216,35,56,50,209,139,108,50,62,224,23,235,193,223,92,131,131,33,205,200,168,76,171,202,178,11,96,161,163,170,2,143,54,234,110,135,200,80,175,138,247,205,80,170,99,89,3,139,250,136,24,130,29,2,206,232,245,29,171,140,5,247,174,151,151,129,77,151,243,219,140,205,222,69,178,29,187,21,206,226,146,250,165,52,165,243,23,179,87,244,9,31,61,163,87,50,91,139,159,94,219,69,134,84,21,151,60,20,62,94,91,170,72,63,191,45,6,205,212,36,102,117,236,88,184,76,106,230,92,167,67,17,127,240,15,34,146,67,119,37,97,49,167,242,186,38,169,17,90,253,150,193,130,22,207,223,65,183,34,14,208,203,63,204,38,195,99,128,0,123,56,42,2,174,174,66,136,135,220,139,229,253,214,48,172,87,238,61,193,86,199,184,178,158,104,127,36,68,46,53,206,16,186,64,135,41,90,100,31,113,57,200,49,247,204,218,108,206,181,218,254,83,124,193,169,124,90,51,125,60,72,166,174,148,127,88,163,13,192,140,199,181,141,187,180,115,122,213,39,131,197,115,252,30,148,8,245,84,149,168,14,127,218,97,240,185,196,240,144,21,143,26,65,98,73,235,186,147,108,39,190,253,239,25,209,191,184,57,235,112,87,106,1,7,6,216,185,86,87,178,24,156,42,224,76,17,239,158,87,254,9,136,2,115,118,31,180,48,44,56,139,214,8,250,12,127,0,240,51,201,192,15,78,61,92,226,217,3,224,218,82,230,156,119,69,238,159,167,94,42,217,61,198,203,92,207,205,55,130,166,153,184,7,175,195,106,209,246,43,5,133,109,93,253,111,136,131,27,144,235,61,205,82,53,130,164,151,50,227,253,114,83,18,109,57,232,175,184,69,139,95,122,215,249,74,141,172,19,54,95,67,60,133,122,244,164,44,13,10,8,196,219,152,135,196,149,114,89,237,34,209,60,253,245,153,93,169,87,234,90,15,98,11,2,20,251,254,8,171,109,85,45,191,4,141,98,206,246,239,241,47,21,53,17,236,167,131,62,14,62,149,248,94,106,192,249,84,56,172,76,18,110,31,30,207,51,110,211,28,202,126,178,22,210,121,135,113,35,253,159,205,143,181,229,43,88,124,255,196,66,132,86,221,202,129,104,25,168,164,162,17,216,241,98,158,93,66,186,76,92,53,110,88,12,138,34,198,29,152,117,82,250,169,120,147,129,109,167,61,66,54,134,228,235,212,67,117,194,87,240,49,49,136,101,162,15,34,17,94,114,191,30,185,249,58,170,22,156,20,13,10,51,160,108,53,189,69,38,163,139,231,156,244,13,10,209,239,161,4,17,232,243,48,13,10,138,139,151,171,20,14,230,115,78,27,238,108,142,228,67,214,152,211,65,89,151,100,156,111,16,242,13,10,205,128,35,100,34,226,21,225,70,215,68,162,98,218,63,200,141,192,216,111,246,101,18,244,157,63,149,125,60,92,255,235,66,72,35,80,159,51,241,85,5,122,76,111,55,181,47,70,103,118,123,169,79,107,139,98,133,107,85,63,48,126,93,35,12,68,203,253,201,169,122,69,177,57,255,178,242,86,94,176,226,32,38,151,47,173,15,183,185,87,111,182,243,104,182,25,121,148,58,57,135,115,96,14,126,225,223,239,191,38,212,93,64,189,166,110,187,150,165,110,233,202,224,178,66,12,93,216,62,36,219,169,255,136,91,184,68,191,61,43,249,59,7,50,93,255,96,192,203,95,220,202,13,10,200,251,90,46,17,157,90,242,110,83,171,142,59,66,132,129,194,135,29,218,38,239,11,98,28,216,87,43,60,102,75,199,170,192,26,29,5,185,143,121,26,112,128,210,148,190,129,9,155,218,121,130,67,47,61,255,71,117,196,77,35,244,241,178,224,22,43,97,168,178,203,94,232,86,75,249,142,46,212,3,34,25,8,95,230,25,76,25,218,201,138,66,24,38,202,237,127,26,177,71,122,179,39,80,96,16,33,114,131,137,66,53,215,219,252,17,83,213,236,196,138,167,41,63,25,89,43,77,126,149,254,85,21,24,137,188,209,215,250,125,194,55,13,45,254,17,215,228,234,52,181,199,168,231,59,211,163,72,253,56,158,244,91,97,103,251,144,186,68,194,62,145,47,154,79,47,192,66,126,208,112,89,47,113,16,24,59,253,178,196,0,57,59,167,86,144,88,34,121,38,53,31,7,254,212,243,54,51,186,3,167,42,162,220,107,89,142,73,185,96,33,221,134,141,173,15,53,46,87,34,251,113,79,102,124,21,198,141,73,192,61,130,45,130,103,126,223,232,111,233,102,142,83,125,162,132,6,140,155,13,10,237,131,7,76,146,165,185,57,41,109,80,91,131,126,106,157,218,177,174,171,116,85,160,138,17,76,34,34,179,57,40,70,116,183,75,244,202,158,224,192,32,191,42,20,139,67,156,113,198,190,81,169,76,182,79,190,74,126,178,149,90,69,80,71,207,92,179,72,176,98,237,79,100,113,203,195,233,173,217,190,155,150,135,154,199,188,113,188,224,47,208,47,23,198,6,57,133,165,232,152,61,32,90,161,72,157,161,60,64,137,144,171,161,197,79,47,80,26,161,114,245,48,72,13,120,156,132,129,24,192,167,78,249,141,95,96,122,6,123,175,246,3,13,136,122,198,166,73,127,154,11,56,249,112,95,50,138,173,75,251,182,52,247,57,56,97,119,176,127,34,213,119,18,130,68,78,94,225,115,53,180,208,236,134,17,124,105,126,121,165,244,246,95,220,8,228,144,77,174,218,178,0,103,234,226,68,143,212,48,24,73,228,86,208,133,243,146,221,19,22,122,223,117,204,253,183,35,226,144,74,156,12,151,109,107,132,221,239,157,146,176,225,95,178,70,195,236,194,208,191,49,76,251,149,119,87,179,163,232,229,128,31,82,6,68,228,96,29,41,29,160,247,80,124,6,243,185,187,54,252,28,112,234,164,68,225,78,86,192,207,240,108,127,133,61,243,109,169,216,182,175,37,68,184,83,223,255,83,90,126,92,111,193,69,37,12,221,162,41,149,96,25,101,157,13,37,58,25,167,181,26,78,83,139,220,1,247,77,119,4,153,73,194,201,124,126,198,57,44,46,97,204,192,153,43,102,218,241,171,8,85,16,99,229,49,128,210,166,125,228,150,113,108,203,170,69,70,45,159,145,182,106,34,84,89,98,221,171,18,5,17,255,8,98,113,49,185,94,93,238,184,180,221,150,67,231,178,175,101,192,253,206,17,245,241,232,221,70,141,161,141,65,200,196,240,14,167,56,54,244,247,14,197,15,195,236,109,53,140,6,88,164,38,28,109,21,165,130,162,199,201,148,231,136,46,102,24,85,179,82,1,69,118,133,138,38,95,251,196,37,22,6,105,206,21,157,7,237,172,4,208,96,180,78,88,0,167,170,232,227,57,194,155,146,154,168,29,47,81,92,70,34,157,32,128,213,145,122,178,13,10,182,179,79,220,168,228,175,100,237,102,13,10,49,115,120,111,177,161,208,5,213,117,194,165,24,125,63,124,253,201,76,204,68,163,140,92,213,35,233,218,114,109,142,250,109,167,182,19,29,255,52,53,254,232,56,178,199,214,185,121,52,41,95,6,32,45,48,127,247,141,144,102,153,203,156,91,187,16,209,212,222,165,253,165,191,176,148,231,4,96,112,131,182,70,211,127,93,161,252,122,210,27,129,63,68,216,193,175,234,182,102,85,170,161,151,3,190,162,231,125,243,191,53,14,23,199,75,52,71,164,82,35,89,25,69,43,81,117,87,13,10,0,108,118,128,172,5,232,149,13,10,98,225,29,126,58,202,53,163,151,209,225,150,48,208,148,168,104,7,89,60,151,244,196,132,228,224,107,207,247,8,182,220,169,114,227,160,0,158,28,172,14,164,20,21,48,245,193,184,174,245,225,185,51,243,127,221,188,75,226,43,116,254,52,109,26,63,95,236,8,24,248,230,23,101,86,138,42,192,71,19,232,40,249,140,68,157,154,28,206,82,209,13,97,221,139,253,8,76,141,9,154,117,216,157,234,100,213,167,204,104,189,91,5,147,217,121,83,218,218,151,99,131,245,1,89,21,97,138,236,86,215,29,29,205,85,184,151,54,57,92,96,155,49,90,63,30,18,85,67,47,219,211,127,56,204,67,195,84,251,75,124,68,241,167,49,139,11,126,153,195,192,140,51,185,83,114,123,106,99,40,5,23,131,160,163,62,60,217,228,152,52,106,60,166,167,123,81,112,150,237,213,42,228,67,184,118,67,166,70,195,167,187,151,247,66,136,141,51,249,179,18,126,97,148,47,65,3,193,219,220,216,234,200,249,226,89,119,48,102,115,108,166,83,206,87,232,130,38,81,38,29,132,124,19,19,33,187,157,102,38,161,172,80,208,71,192,186,71,180,17,223,42,153,85,69,189,104,236,2,135,204,155,49,213,221,202,135,85,235,235,16,172,203,57,3,171,15,213,120,142,152,66,32,68,59,132,89,231,192,120,218,66,137,241,53,9,5,136,26,214,223,222,196,115,2,176,172,176,212,175,140,174,208,43,75,112,223,60,248,254,193,24,240,252,45,61,222,62,73,76,209,96,230,118,227,0,188,70,75,212,64,13,181,14,228,59,49,78,5,23,3,123,249,113,172,215,205,50,124,178,19,72,147,184,160,65,14,104,221,197,24,245,222,201,102,199,136,76,245,253,254,116,114,49,119,242,13,237,192,57,216,121,5,108,170,180,191,4,80,98,211,144,79,97,92,92,254,16,154,199,163,85,153,201,64,36,180,16,25,185,175,212,4,168,13,10,202,164,131,121,41,245,201,49,118,128,161,61,21,122,3,181,154,85,136,223,121,210,225,19,245,245,16,33,214,246,249,14,139,187,162,194,82,253,16,101,27,232,11,175,213,156,83,163,54,123,163,194,141,182,235,157,171,241,234,153,244,123,80,63,98,126,21,220,243,253,100,95,197,44,93,93,15,47,7,219,76,37,192,209,225,192,1,70,225,196,217,115,230,19,204,219,211,249,69,12,192,245,52,61,121,240,94,148,146,232,106,27,184,137,173,244,5,3,189,127,62,117,67,67,104,89,24,74,91,32,189,138,23,47,53,13,132,107,117,112,128,57,144,173,170,72,212,185,21,90,43,76,75,251,239,30,26,6,92,8,224,57,40,85,151,53,189,212,66,255,30,131,225,250,32,165,218,87,216,189,178,255,84,39,192,52,207,1,40,175,17,30,110,115,9,158,4,110,12,36,14,128,167,61,123,231,43,135,131,78,69,137,141,71,85,33,202,51,6,112,118,49,245,198,19,97,153,243,84,99,45,26,8,95,18,161,199,196,115,134,139,98,229,52,209,95,84,132,50,62,99,208,87,65,150,161,158,241,117,33,78,179,90,144,135,62,252,251,146,214,207,104,118,29,69,227,126,170,97,225,161,151,154,130,0,149,7,202,25,62,68,179,106,128,100,134,102,92,237,188,243,135,5,58,206,171,151,155,211,93,48,151,143,199,101,154,187,232,68,244,236,171,51,3,49,142,206,128,119,122,95,165,169,221,145,179,208,104,4,196,180,233,180,239,207,7,235,137,134,109,13,216,202,57,12,253,21,152,101,20,23,17,77,120,119,107,26,29,54,180,186,23,116,109,107,231,252,18,61,71,62,241,239,237,28,59,193,213,85,249,20,83,104,105,253,91,12,53,249,200,63,101,176,230,191,122,98,123,146,2,215,135,215,44,96,13,219,107,204,230,19,216,132,146,225,60,160,170,171,25,110,138,73,146,140,98,206,164,255,226,208,32,142,218,51,74,207,71,242,11,215,147,18,77,44,85,70,192,63,74,54,67,105,167,106,4,37,38,47,157,145,24,175,84,227,125,50,227,58,178,93,213,51,164,157,245,251,241,186,244,206,172,45,157,55,140,220,209,59,0,253,164,50,217,4,47,98,61,164,26,251,128,105,155,85,56,162,84,3,176,179,234,190,201,232,239,207,66,254,243,234,159,145,118,105,2,205,32,107,7,135,193,135,213,55,11,96,173,109,205,0,45,226,222,141,205,192,180,113,154,121,124,94,38,186,166,118,101,1,109,160,217,103,250,19,70,249,88,138,237,161,116,202,0,27,49,33,54,23,254,25,234,33,142,194,53,151,121,217,121,226,102,49,102,72,156,6,153,50,48,176,208,121,115,161,23,196,227,244,164,201,60,248,66,130,72,221,83,137,65,77,103,156,105,100,65,66,103,199,254,161,126,53,176,206,228,86,102,122,155,24,117,200,27,35,2,189,222,162,129,141,96,25,252,22,34,168,32,81,246,5,132,171,201,4,205,145,134,118,48,93,192,63,251,204,100,253,218,200,216,170,156,226,234,0,214,201,123,198,60,138,97,125,237,252,14,64,119,86,73,67,142,159,97,175,209,121,94,59,32,86,11,1,190,94,9,131,241,54,207,72,171,32,105,84,228,29,238,13,157,221,149,61,253,1,202,235,86,145,81,214,188,13,254,242,157,112,250,227,225,152,231,237,216,146,44,14,11,203,139,204,241,192,22,20,44,26,139,51,122,250,122,5,169,215,83,75,24,75,243,191,130,127,55,30,155,209,154,113,36,78,202,27,167,61,72,76,210,250,213,77,178,240,238,251,213,75,83,110,188,181,9,78,107,194,245,178,170,228,31,5,180,179,17,17,88,118,237,66,195,79,142,100,59,83,55,46,63,99,80,219,138,56,68,88,34,234,154,51,226,127,176,204,66,206,220,209,254,47,223,114,63,196,124,153,110,227,86,196,2,17,47,36,208,175,137,155,45,0,190,161,207,212,39,153,139,210,43,42,9,4,109,103,55,129,68,72,172,251,16,211,135,84,125,112,9,251,56,74,240,86,44,133,105,76,7,21,132,35,109,15,31,61,63,205,12,251,56,183,124,129,136,144,97,230,104,186,122,179,122,166,15,88,163,150,125,226,111,147,155,121,203,241,13,10,157,204,66,133,37,97,216,214,117,79,27,102,13,33,106,171,30,19,63,186,163,33,197,110,37,132,190,92,155,174,32,204,240,14,141,190,109,156,47,206,190,186,217,69,195,192,65,1,210,56,115,81,241,50,98,135,134,246,217,212,202,184,52,25,40,141,49,249,188,96,13,150,100,18,230,170,69,124,230,202,210,106,76,6,113,9,123,152,194,56,76,129,221,139,154,50,34,212,244,187,218,112,23,137,92,62,220,38,102,39,121,174,231,64,217,215,226,65,133,251,130,25,112,176,163,169,64,65,166,158,72,5,236,136,238,30,229,33,152,21,54,242,132,79,184,245,239,100,95,103,212,44,229,20,142,45,222,67,173,90,239,32,14,219,58,44,120,102,201,132,88,169,38,102,229,249,224,112,23,139,204,57,246,90,137,49,2,161,5,100,175,78,140,170,165,7,93,47,140,215,250,176,64,28,3,175,41,158,163,81,92,201,48,102,116,78,181,175,124,240,237,6,103,91,240,73,166,227,194,17,168,158,22,222,91,240,68,90,124,202,110,232,235,3,71,69,73,80,72,93,136,70,6,101,30,88,135,254,139,36,50,62,42,161,109,226,47,193,252,140,79,6,168,42,31,222,87,88,151,96,36,6,129,151,225,244,80,110,77,61,138,22,212,4,97,164,88,99,56,179,116,165,146,220,96,51,68,2,247,99,136,173,106,69,125,195,245,78,97,105,207,122,227,149,150,118,233,102,164,86,9,98,16,85,236,58,248,14,24,38,51,48,13,10,68,24,227,74,102,221,250,107,86,158,90,19,201,17,91,95,211,236,28,235,229,15,186,36,127,96,128,58,168,57,118,240,1,23,83,99,66,220,61,152,144,196,155,42,199,1,211,112,228,58,149,81,24,150,120,39,118,15,112,145,70,156,84,6,240,143,24,215,227,84,129,72,207,14,49,43,29,199,29,246,122,94,122,22,86,207,47,71,243,175,243,221,80,255,194,252,218,183,23,114,133,178,156,23,202,67,1,159,98,172,111,186,82,209,73,62,215,196,39,82,100,112,172,200,56,155,174,130,119,89,73,88,144,143,81,123,40,99,184,50,146,235,90,179,245,127,255,176,131,147,202,97,15,177,254,144,93,136,160,161,106,195,149,226,162,166,221,3,61,106,13,104,153,47,131,11,46,27,149,254,53,123,246,114,113,110,136,255,185,47,252,61,98,148,93,30,173,34,188,104,197,30,224,225,13,10,67,1,29,185,76,68,104,90,92,69,118,246,239,68,203,251,69,242,164,191,17,13,10,1,101,125,181,31,212,153,118,126,120,5,129,153,179,29,253,96,129,63,26,52,79,134,40,159,147,120,35,29,91,21,28,146,56,94,54,80,180,254,177,220,145,1,142,171,132,116,203,246,159,220,20,150,164,208,120,210,195,81,200,25,100,81,36,122,157,207,129,23,229,182,55,55,29,142,34,226,72,198,77,153,144,21,195,253,35,17,233,149,11,142,224,146,47,189,211,215,191,247,102,191,233,231,206,11,225,47,49,143,242,167,181,169,198,208,13,10,84,64,22,9,48,78,210,197,95,92,30,172,61,75,56,53,91,189,133,214,109,97,99,111,166,227,12,46,130,130,147,118,190,201,121,166,254,238,4,14,69,35,89,118,142,207,144,204,83,154,84,111,23,174,144,108,118,241,79,134,255,105,119,151,50,43,5,30,179,17,167,89,254,38,12,30,238,93,172,243,131,129,106,175,18,148,207,250,123,248,122,77,155,197,149,238,143,44,47,134,254,238,17,173,149,157,134,242,47,218,244,206,192,152,148,42,87,229,120,19,160,250,153,35,158,153,79,255,53,60,30,120,29,102,107,137,40,207,198,72,252,240,134,159,198,132,104,189,189,167,210,128,223,171,139,11,58,76,163,91,7,75,104,109,232,211,114,198,31,179,35,5,22,154,26,153,18,246,84,29,161,108,214,49,106,110,164,81,82,71,87,190,92,246,232,32,1,27,227,133,159,184,184,87,140,16,15,240,41,104,14,5,240,224,191,17,211,63,225,148,96,200,94,165,228,192,239,40,226,148,7,200,174,107,224,28,250,13,80,34,191,159,176,20,22,255,247,34,167,132,223,200,252,227,48,236,149,115,122,133,68,113,211,52,253,197,143,171,66,134,122,123,98,131,106,139,86,70,110,154,108,18,71,212,110,186,255,185,5,205,67,33,151,15,89,251,141,111,246,95,221,211,75,249,19,173,50,46,104,69,92,95,242,210,60,26,94,174,104,127,37,155,201,130,182,163,132,211,84,64,247,198,147,207,80,185,236,172,11,85,120,202,238,135,88,139,86,46,182,183,244,32,52,201,242,229,69,236,134,99,22,85,35,84,235,55,40,199,210,101,39,237,117,23,78,175,99,94,4,139,8,220,93,35,232,137,129,7,13,10,213,100,26,101,47,35,68,149,110,156,244,193,110,101,42,153,244,166,68,209,120,125,109,54,83,116,137,218,77,116,230,27,47,196,223,223,29,29,157,88,249,194,108,94,182,50,0,82,106,253,22,138,197,125,86,17,173,228,212,163,130,252,40,187,96,249,231,214,38,166,198,122,251,204,209,24,60,94,60,242,239,33,13,11,245,207,167,187,16,250,56,135,189,212,205,150,238,234,168,249,33,154,162,241,13,10,188,13,10,150,12,59,87,192,236,3,19,174,16,204,255,31,82,33,36,207,200,210,212,155,251,176,193,147,234,255,197,180,143,179,255,48,178,28,183,111,13,10,76,15,19,119,201,34,49,69,187,4,104,165,215,27,155,194,88,115,234,18,225,198,3,52,87,28,103,56,92,0,208,181,112,211,255,198,199,255,13,230,44,24,60,118,174,235,18,223,254,225,69,158,15,200,24,198,33,184,209,47,161,53,126,43,85,212,137,53,215,11,241,64,180,207,254,136,19,222,253,71,147,80,178,13,194,235,29,60,187,26,45,61,198,238,151,93,88,200,157,97,252,80,230,160,25,125,169,165,134,183,34,85,2,61,228,125,171,239,177,30,138,160,36,20,194,255,98,88,162,129,33,155,157,221,254,65,186,125,121,119,208,214,241,130,36,254,34,247,212,233,53,95,219,53,191,126,211,65,143,79,104,208,147,172,72,247,216,254,65,148,254,182,200,11,157,193,247,78,2,60,96,77,234,39,8,159,152,195,151,63,249,244,173,123,247,186,230,1,219,137,176,141,93,129,57,185,94,220,246,200,133,255,168,179,228,176,71,126,112,64,34,87,51,130,107,172,253,30,196,160,221,114,220,65,115,72,86,171,159,183,0,223,131,202,44,232,18,145,59,209,66,216,76,92,131,192,178,88,55,104,25,138,249,232,133,242,186,116,135,122,65,66,51,32,114,52,170,95,24,132,5,87,202,17,104,42,171,222,137,147,83,56,135,124,109,64,75,222,65,83,201,130,126,177,109,102,193,215,58,129,67,200,162,211,96,79,247,44,229,121,250,163,197,34,75,172,72,234,131,186,132,132,41,148,114,0,125,233,100,102,181,178,154,204,124,3,176,93,202,163,138,72,191,249,242,20,222,67,20,106,228,224,79,167,5,66,25,23,249,155,197,69,51,240,235,192,24,73,227,150,33,107,159,7,148,230,246,198,182,27,82,239,27,25,80,192,251,96,152,149,195,197,95,245,116,22,63,200,182,176,158,102,171,174,209,129,14,105,143,243,124,193,249,38,178,205,163,180,140,125,119,121,14,189,45,81,75,111,56,93,57,127,113,62,195,173,57,84,234,156,132,97,88,96,49,211,105,232,185,158,83,64,138,121,214,76,52,235,90,86,222,138,103,222,145,131,121,96,233,138,102,252,4,223,160,235,222,33,219,0,50,52,187,120,102,91,3,157,13,10,70,154,2,33,189,84,26,247,20,154,42,101,156,48,1,50,193,69,129,239,118,111,255,190,203,168,181,138,94,179,249,84,70,222,244,154,248,99,168,17,61,23,178,231,230,236,222,175,195,131,77,77,249,0,227,71,85,150,232,111,187,78,41,116,192,144,219,74,214,26,115,125,97,29,146,180,83,90,194,145,197,106,216,177,192,49,210,249,181,5,187,119,81,123,115,125,112,171,55,35,219,82,174,42,204,213,221,47,97,116,35,237,60,195,156,168,130,239,65,117,123,247,21,24,6,169,184,176,243,18,128,136,99,227,103,63,181,77,233,57,179,92,222,202,127,188,77,195,189,245,165,244,125,53,227,69,145,108,57,54,108,139,79,67,156,225,198,241,131,92,50,11,209,230,115,117,176,59,93,225,140,147,37,111,37,23,97,164,200,206,192,16,25,192,104,227,68,71,188,197,3,185,87,31,232,0,6,39,166,179,218,213,133,76,188,13,10,45,105,229,168,244,107,199,143,106,123,20,34,51,78,199,169,138,190,254,155,131,224,29,207,60,108,146,115,179,70,243,36,14,162,37,174,74,64,131,204,123,14,161,65,160,119,63,222,148,7,104,53,142,180,177,61,130,170,48,74,19,134,212,80,193,192,198,167,213,168,253,43,211,19,247,143,133,36,139,81,150,36,30,49,229,89,95,59,192,31,55,112,13,10,45,211,212,160,238,45,208,26,54,86,156,213,7,19,14,143,91,30,150,203,86,11,183,218,21,86,12,202,223,59,44,152,4,161,29,158,128,85,201,236,112,228,140,29,33,62,183,86,161,55,111,46,220,183,24,157,120,205,61,108,165,134,85,55,238,195,28,23,216,1,96,94,253,134,11,11,98,148,114,105,5,136,208,37,117,2,198,247,167,91,154,28,27,57,119,129,50,152,50,207,62,196,60,9,241,85,156,213,98,196,143,169,80,2,149,205,59,13,10,121,13,211,252,212,104,74,124,122,196,154,201,191,255,54,179,154,159,177,72,188,40,211,121,7,67,57,67,203,191,12,189,171,70,211,234,134,220,143,129,200,89,197,45,21,48,43,148,169,181,28,25,155,113,4,222,236,157,118,156,38,52,206,207,139,112,12,233,192,65,82,204,89,201,50,107,218,203,236,67,18,222,237,146,221,8,122,28,72,64,134,141,159,151,202,192,70,88,31,118,47,117,232,210,77,100,69,55,13,10,63,30,13,10,231,74,100,120,217,218,195,126,127,165,190,190,192,161,224,129,175,137,193,187,247,245,30,62,46,34,200,196,5,232,103,27,168,95,27,240,223,121,164,101,218,199,236,7,247,49,224,6,50,224,23,209,144,169,157,131,226,126,92,46,99,215,218,187,162,59,46,136,51,76,99,114,26,197,164,203,197,212,95,76,23,114,89,243,76,46,173,224,31,160,8,175,101,235,198,1,216,221,22,67,109,134,170,148,201,159,60,192,162,248,113,52,231,59,242,47,16,139,130,90,137,99,180,156,108,104,84,116,175,228,165,66,200,100,29,192,55,93,126,254,154,193,22,141,151,0,69,155,229,45,13,163,153,2,62,20,25,105,242,92,13,172,70,104,83,75,102,71,236,133,69,75,233,69,232,38,178,109,230,227,196,88,75,151,163,142,43,64,160,210,52,129,188,167,128,132,254,128,224,13,10,113,167,144,191,49,223,70,138,67,94,204,136,230,13,10,87,134,11,188,163,214,89,48,24,110,153,23,203,210,9,194,48,232,248,37,90,122,188,125,63,4,58,228,215,173,99,217,152,11,237,240,98,183,213,194,152,196,2,37,182,208,63,41,160,51,158,15,202,2,19,142,82,111,6,185,239,71,245,231,168,6,138,132,108,253,226,191,222,189,36,245,167,58,102,192,121,24,102,42,236,128,180,50,70,40,79,164,226,238,13,154,171,23,43,30,89,166,204,70,184,1,20,157,140,13,246,222,201,165,93,142,27,14,253,157,48,47,246,24,7,89,68,204,203,104,49,211,54,177,22,23,16,123,5,48,208,152,133,229,202,17,165,241,252,200,214,157,96,61,161,107,234,81,17,109,66,202,177,170,30,77,123,155,77,121,153,63,43,254,83,234,201,4,254,183,11,45,51,13,10,137,120,14,172,16,209,44,192,195,91,131,153,242,24,172,41,118,229,122,38,186,210,12,226,250,42,226,54,61,63,210,168,169,113,116,117,86,242,149,157,167,74,137,99,194,11,80,71,17,174,28,176,208,192,36,87,255,46,155,246,150,177,89,175,3,29,213,21,95,33,192,245,84,155,4,113,163,197,220,137,24,182,117,206,188,178,62,41,50,43,149,154,188,5,40,58,112,46,135,141,232,239,37,234,118,15,60,92,123,123,73,211,152,40,61,226,237,131,127,213,159,124,34,214,44,88,254,68,72,177,4,159,222,191,200,120,126,103,215,218,254,151,116,151,155,179,128,34,84,218,89,188,192,33,159,152,194,25,248,77,153,92,167,104,184,181,217,212,163,37,37,223,236,224,3,103,94,228,189,93,141,255,193,16,37,175,43,70,143,146,7,181,178,180,35,73,185,130,50,186,192,117,151,88,193,244,162,131,64,88,21,189,113,69,201,63,160,143,62,210,130,102,85,5,58,60,37,89,7,61,138,205,25,157,234,44,91,165,246,22,162,228,133,72,180,55,14,199,52,147,186,7,225,151,22,93,202,119,68,56,176,118,104,103,129,156,17,84,209,149,159,230,224,30,99,18,224,171,145,252,46,43,210,64,252,134,82,162,212,86,161,222,127,52,239,55,42,83,121,77,76,78,5,11,243,202,91,123,210,241,184,222,147,180,200,0,36,133,203,33,154,210,208,41,115,159,211,200,28,198,231,142,223,56,114,53,118,26,87,20,62,237,229,204,136,127,40,47,236,210,97,246,162,93,13,10,126,21,78,205,245,220,56,228,38,129,27,232,106,170,69,133,119,229,224,197,240,247,90,175,169,196,30,93,29,201,217,30,205,121,181,20,248,205,247,165,241,161,137,71,13,53,253,244,249,184,120,136,121,204,189,145,180,39,130,46,214,88,56,158,152,30,14,229,247,251,135,105,42,62,62,147,29,248,161,209,87,62,59,1,102,32,66,64,183,8,0,137,160,158,247,72,124,154,238,45,102,95,90,130,249,76,135,127,181,176,220,83,28,235,241,231,28,101,146,206,162,64,30,75,81,34,229,9,29,240,61,32,61,249,121,185,166,239,186,18,226,246,180,34,253,241,93,73,172,9,20,211,114,210,30,135,29,230,92,190,205,16,95,212,163,228,113,75,156,202,92,104,3,250,57,219,176,21,234,138,136,190,121,19,80,46,86,46,91,23,11,135,191,200,87,45,201,223,73,173,99,105,67,17,239,19,52,68,75,223,11,76,163,36,82,113,193,247,164,215,250,241,112,62,58,160,225,234,141,92,110,130,27,40,112,126,224,201,180,242,47,35,121,111,232,115,86,197,138,226,202,220,25,31,76,88,225,251,88,218,3,180,90,37,172,149,219,174,19,162,147,71,66,23,189,178,20,116,43,157,157,106,243,95,112,254,210,137,25,66,234,206,62,98,94,85,255,184,32,84,63,187,37,13,10,6,45,61,57,91,192,242,25,236,254,13,118,104,106,193,72,188,65,71,106,136,123,196,148,221,189,57,107,226,0,253,62,3,207,161,46,201,175,107,147,74,40,60,66,170,5,88,154,166,180,168,209,105,70,187,81,245,4,25,202,190,206,174,197,174,249,8,92,153,137,40,158,155,70,186,251,111,178,120,45,132,222,43,6,143,145,169,116,74,171,35,124,235,27,165,19,229,126,76,48,113,8,233,147,201,114,163,224,168,152,213,168,210,120,51,21,80,49,253,185,136,99,195,190,127,239,48,4,203,170,92,182,13,10,31,46,62,180,215,41,15,245,250,250,8,139,28,236,203,108,245,26,88,218,173,153,143,8,57,108,223,214,143,90,188,156,28,203,143,101,20,16,119,115,198,156,38,135,62,136,157,31,121,209,14,134,105,16,228,104,65,134,252,215,28,150,90,223,98,57,186,52,24,179,19,162,122,214,50,48,9,105,182,242,132,81,147,102,237,133,231,205,150,141,100,130,63,140,89,181,145,26,114,208,162,14,183,43,96,58,97,227,111,82,242,86,255,205,247,6,180,86,11,77,250,93,145,143,188,83,13,131,164,179,192,27,221,60,180,87,46,36,36,45,20,27,249,231,117,54,105,58,4,7,208,2,224,156,218,91,25,91,241,204,244,48,174,152,36,192,121,40,160,80,208,180,96,242,112,75,232,249,230,71,164,136,76,69,103,13,10,129,234,207,124,192,56,100,62,176,255,24,163,118,255,111,50,182,254,79,25,114,115,50,127,187,222,198,68,58,41,156,173,75,38,247,119,138,153,246,90,17,189,224,71,21,62,118,64,57,237,178,81,147,106,164,61,238,80,221,253,248,133,101,25,5,106,175,196,197,174,111,32,81,175,5,121,169,172,212,29,0,119,93,125,190,112,2,44,194,99,220,165,224,162,91,156,124,79,92,65,133,135,102,107,47,226,72,22,177,224,236,146,249,7,79,20,3,187,131,175,195,241,213,44,167,156,56,123,222,248,100,54,110,52,201,11,229,47,122,160,153,53,55,58,7,228,224,38,34,78,118,249,236,60,185,231,237,229,13,239,218,72,36,141,97,243,206,200,128,163,184,132,51,6,55,93,151,17,229,134,69,243,98,91,219,142,135,5,45,166,127,151,148,239,74,248,219,11,207,224,6,119,195,162,105,7,220,101,27,200,56,196,14,195,158,43,90,93,192,219,211,69,148,74,108,50,34,96,137,214,60,82,73,15,161,11,33,90,231,3,207,182,99,235,138,71,121,59,132,206,115,100,218,28,78,127,206,50,223,239,9,73,1,33,34,39,116,145,91,165,156,120,194,39,95,130,157,21,207,77,134,134,176,149,195,140,115,27,131,212,135,56,194,95,64,184,173,212,135,195,80,162,235,232,70,195,145,106,227,132,203,16,80,249,245,223,224,159,203,217,18,156,98,112,253,134,213,90,69,150,24,253,250,79,144,126,107,71,70,25,107,183,23,134,90,179,120,65,64,41,1,117,81,22,26,82,233,210,75,228,247,238,213,83,169,39,147,61,74,188,143,37,223,96,119,121,167,23,144,156,180,216,16,222,143,87,98,88,25,0,226,36,228,185,21,152,20,155,164,113,207,128,104,171,232,116,67,86,178,97,96,11,252,197,127,184,190,69,3,108,246,87,29,155,42,149,48,73,51,189,79,23,33,95,142,245,63,142,8,26,246,31,167,249,88,60,52,235,86,85,203,14,203,130,36,105,89,240,144,145,243,105,137,235,221,100,107,237,202,97,75,154,97,171,118,150,179,255,24,16,88,161,80,250,110,193,190,46,188,127,100,53,122,63,242,162,176,73,29,47,78,11,151,13,229,183,120,139,70,124,166,120,3,155,94,245,92,136,163,132,87,141,66,127,210,203,22,200,123,11,240,163,211,124,232,237,67,224,240,73,175,36,54,52,77,95,71,201,72,198,50,201,74,40,117,9,40,37,97,108,100,197,210,98,254,91,36,145,111,254,233,130,166,154,108,207,136,139,208,29,98,234,89,30,236,81,244,183,221,250,255,190,234,147,254,8,215,54,194,1,41,227,69,208,107,16,36,106,95,87,21,28,25,141,64,119,48,113,63,50,41,150,56,239,189,192,19,103,226,62,181,154,173,66,168,58,180,27,67,45,180,98,101,46,41,129,55,64,244,104,13,10,93,75,212,123,24,50,143,174,107,223,66,0,207,164,206,55,115,128,155,69,232,136,124,155,46,66,54,152,159,108,72,214,79,89,134,245,99,217,167,83,138,135,22,8,47,129,147,106,235,208,70,30,111,75,212,112,67,109,139,118,86,240,253,248,145,8,230,221,2,171,222,249,7,115,29,69,141,105,11,198,8,234,156,237,9,235,30,110,100,192,121,12,122,35,120,32,28,233,151,255,224,49,118,121,238,29,78,233,249,17,87,68,147,35,229,59,74,218,128,150,205,98,139,88,97,191,121,69,67,169,143,47,162,171,84,255,15,37,161,61,173,67,218,249,57,67,41,185,90,165,60,163,39,73,254,203,11,43,192,53,221,30,189,83,255,159,181,173,139,206,6,205,137,229,86,128,145,193,204,49,76,251,29,152,33,215,249,172,124,85,245,94,13,10,22,227,154,135,212,49,72,32,27,146,143,60,66,177,16,252,5,97,137,222,241,131,116,95,59,99,116,65,222,139,212,195,199,239,18,244,37,142,48,107,40,119,173,174,198,52,65,1,7,80,219,78,98,105,164,199,138,13,10,192,27,179,96,60,56,102,81,254,129,64,49,203,93,140,31,20,158,234,255,101,42,83,229,123,189,76,140,12,227,106,132,163,25,165,59,193,229,253,63,30,209,238,114,244,193,169,191,38,75,89,64,98,252,175,178,44,193,253,227,242,227,211,193,125,211,247,254,14,21,235,216,18,213,80,34,124,6,208,17,39,56,83,116,161,20,56,171,213,0,72,225,114,85,252,210,187,133,18,42,111,185,183,218,157,94,157,232,167,71,250,224,218,69,161,252,239,233,43,158,112,165,178,202,198,104,212,208,117,39,165,193,64,50,103,216,35,4,139,230,113,247,37,207,199,71,75,68,252,90,170,52,132,32,178,215,194,60,108,160,102,102,111,214,242,32,142,50,152,120,217,12,239,28,46,119,237,34,211,190,187,157,84,120,16,177,137,240,137,32,162,126,113,7,242,8,89,26,132,212,99,206,37,118,199,12,61,254,102,67,228,234,147,244,225,218,235,65,212,111,14,47,86,252,16,198,154,213,3,79,201,133,157,49,207,39,163,161,238,37,108,147,17,31,129,193,26,207,31,192,206,32,185,11,172,154,163,39,165,200,90,121,133,185,81,81,159,212,176,60,64,190,99,113,98,175,65,178,253,166,143,13,30,155,118,2,254,38,89,211,215,89,85,197,121,172,81,223,106,85,46,185,88,26,195,247,18,240,131,241,155,82,166,196,245,96,243,108,89,206,235,12,153,106,175,23,40,162,170,69,220,173,121,189,123,35,171,56,141,91,11,100,162,185,81,84,182,37,155,115,11,15,74,114,200,199,247,204,147,199,214,77,157,136,16,209,246,63,248,171,212,219,137,130,78,45,38,79,222,233,22,196,30,41,146,17,219,26,83,37,110,29,181,205,208,72,98,240,52,217,64,75,115,24,58,153,211,209,61,100,42,102,63,18,155,109,22,112,149,190,180,234,239,208,61,242,255,47,11,107,89,76,30,233,15,219,32,61,168,159,172,238,35,241,186,57,1,254,204,117,254,24,17,189,112,18,89,52,48,17,38,43,106,13,10,151,7,170,166,49,107,195,193,127,120,123,184,13,10,200,218,90,172,148,45,144,248,12,90,59,181,158,71,236,118,114,68,170,149,198,62,80,191,128,153,152,149,121,54,211,191,106,188,36,176,163,151,37,143,158,180,220,143,101,105,44,176,35,217,9,31,177,128,198,148,152,205,12,8,187,235,173,200,74,126,0,22,232,248,190,163,37,217,36,235,13,248,46,117,210,204,44,203,240,57,177,25,52,54,61,67,50,197,251,197,236,85,107,232,94,228,231,7,204,39,83,204,196,61,46,213,5,88,229,26,16,66,33,201,50,60,220,176,25,155,123,131,69,77,227,253,200,16,208,243,98,192,41,159,93,217,129,179,29,142,61,218,40,79,239,157,200,249,200,222,19,141,48,101,67,122,127,232,195,5,114,173,6,214,46,133,39,173,55,174,57,170,176,178,37,247,106,37,246,198,80,82,65,237,115,186,73,76,249,35,233,25,246,136,221,235,241,147,225,136,248,196,193,84,242,22,49,8,7,99,180,208,145,232,173,29,47,214,100,158,12,217,54,14,141,26,103,165,181,250,252,103,84,124,163,28,149,165,234,141,78,181,214,139,159,109,101,50,219,155,84,88,71,53,149,88,84,42,42,229,140,9,243,189,41,24,239,190,22,153,233,200,242,194,161,30,164,210,36,199,38,210,172,212,168,216,171,174,220,101,136,207,42,229,102,82,139,148,245,91,130,58,42,31,123,225,144,0,243,231,87,157,9,78,4,112,117,223,24,200,200,104,118,2,149,83,59,38,235,62,217,6,53,177,41,193,122,202,103,156,62,136,176,105,152,206,90,122,37,68,183,0,34,159,90,106,80,75,211,228,91,39,100,113,149,156,138,63,129,145,122,83,66,135,57,181,239,158,61,70,59,59,167,49,132,72,226,163,231,149,32,210,210,69,162,167,47,49,255,112,112,182,228,98,78,58,94,33,107,209,3,100,12,141,243,135,228,157,115,37,41,198,17,248,185,113,7,63,23,235,210,246,235,24,249,183,74,103,225,153,121,38,223,23,141,76,158,222,212,53,185,104,47,26,39,156,129,187,159,96,218,254,18,88,69,162,255,59,2,151,158,84,129,199,138,69,196,121,190,251,159,239,60,226,186,155,196,108,119,181,11,3,228,141,166,209,123,118,240,111,58,209,24,55,26,220,105,225,120,197,43,95,180,178,97,201,49,24,116,237,7,221,109,91,50,38,160,5,253,215,166,213,56,72,9,231,6,63,3,108,222,164,22,25,18,38,53,232,53,210,215,76,187,106,169,179,140,170,77,129,156,38,233,81,21,254,13,186,180,25,143,197,131,143,44,145,183,168,123,7,215,52,198,212,244,248,52,68,193,233,13,10,169,191,201,8,162,186,196,179,222,249,21,122,252,165,36,143,45,163,28,168,123,211,99,172,37,233,231,127,116,29,75,44,110,2,240,73,135,166,244,157,48,233,3,140,239,196,27,161,114,221,103,90,237,139,57,33,100,65,17,68,229,183,56,243,33,11,14,102,177,122,19,203,150,49,195,61,68,72,78,121,42,124,8,45,208,165,56,47,52,197,99,118,83,38,27,30,182,210,3,91,8,180,217,31,169,171,119,12,175,64,161,3,98,149,17,247,180,63,39,67,215,229,131,67,61,236,251,25,194,31,212,253,13,10,252,194,42,65,25,231,124,135,191,230,254,80,6,139,34,71,144,21,190,90,159,6,190,171,77,55,65,46,6,42,69,224,203,205,123,179,159,238,116,126,150,48,111,121,252,79,46,137,66,223,93,157,160,229,90,172,205,165,71,218,25,211,11,132,4,250,18,18,152,180,76,156,206,25,140,112,140,105,168,214,191,23,89,28,92,80,211,252,91,230,150,31,122,186,143,54,109,174,149,122,28,55,48,218,74,91,79,3,90,146,116,103,94,227,187,240,202,140,233,216,52,159,80,202,187,28,62,164,148,138,190,111,159,20,53,146,241,234,149,64,78,105,9,169,9,22,142,50,121,169,87,174,25,36,36,92,53,99,49,167,94,112,8,190,233,43,234,163,4,186,64,183,195,244,143,116,217,1,139,50,71,223,80,235,215,206,84,29,164,142,204,177,176,190,81,164,85,195,193,60,39,157,77,134,118,7,140,62,190,67,8,116,141,82,201,176,65,211,231,36,76,116,91,31,47,116,45,1,13,10,158,96,105,95,62,196,253,193,5,13,10,192,130,185,5,214,165,126,143,64,122,59,71,47,115,16,17,165,121,137,101,183,177,163,7,226,82,254,2,200,247,156,238,221,235,110,22,95,26,148,215,255,241,141,219,223,121,71,127,20,233,233,57,129,171,210,0,254,119,113,178,157,29,45,18,14,231,157,40,185,84,56,24,82,112,57,172,116,8,94,175,242,65,181,109,8,34,12,149,139,93,156,135,192,192,74,20,213,42,253,71,91,84,45,57,27,197,79,243,61,239,141,148,132,175,246,135,59,238,211,45,218,75,55,17,18,181,35,182,206,34,180,13,27,65,107,100,201,55,15,28,223,44,84,143,76,203,233,225,46,33,195,108,195,234,82,218,35,45,207,182,95,102,178,43,94,46,192,72,82,81,13,94,38,78,233,57,187,103,174,196,118,75,135,6,42,235,127,104,11,64,188,238,4,173,69,199,81,158,179,182,25,156,158,14,51,38,97,70,54,71,242,251,126,223,48,62,254,248,72,145,206,188,240,250,197,247,35,169,208,71,108,63,140,9,38,4,200,127,198,156,122,144,244,214,74,228,90,71,142,232,186,45,245,15,185,63,85,163,84,97,35,240,176,226,193,196,12,152,234,174,159,15,38,184,248,15,254,110,107,148,183,226,125,40,132,213,139,138,17,150,98,45,246,190,96,140,85,105,215,134,75,183,86,223,46,221,24,75,144,129,43,68,237,74,50,208,1,195,19,131,164,13,10,238,233,116,54,81,247,149,8,70,21,196,142,64,45,188,1,200,24,212,119,234,192,52,119,149,203,39,146,233,193,30,143,212,160,46,25,78,237,28,145,157,69,152,254,192,3,182,217,168,160,188,125,69,96,71,161,192,87,148,83,252,29,124,178,209,88,212,102,147,154,35,215,167,184,171,237,126,39,119,236,116,135,151,62,115,242,38,109,156,37,12,227,7,41,227,197,34,58,217,59,154,232,68,59,53,113,30,68,106,61,198,96,18,62,212,92,225,148,42,26,42,208,97,4,103,224,129,206,44,139,146,166,200,47,11,23,181,210,66,158,153,241,166,38,128,114,198,181,170,170,110,182,40,58,135,44,84,211,105,76,216,37,235,41,38,229,125,187,199,193,102,48,117,230,135,161,68,228,214,28,34,87,129,216,15,202,225,73,123,68,35,66,180,163,241,205,107,219,80,227,23,145,204,57,40,195,8,53,254,248,69,182,190,94,45,126,63,47,95,8,90,163,250,235,69,202,208,215,107,203,177,237,133,154,156,235,185,247,69,112,54,240,188,63,25,92,177,169,140,156,134,72,246,88,60,219,178,56,148,188,113,157,104,194,219,216,0,59,16,208,140,140,170,64,188,231,132,215,191,180,238,201,234,83,89,172,5,110,87,184,176,242,235,203,31,76,228,12,135,252,120,97,24,1,51,224,203,108,226,252,79,230,144,117,109,50,122,43,90,224,99,227,2,28,12,11,212,32,208,86,240,185,65,230,179,96,136,165,91,161,29,12,53,253,1,50,213,244,142,93,150,115,87,35,71,23,27,67,40,212,128,123,151,40,49,192,215,76,255,165,99,140,20,91,137,201,137,230,236,148,33,72,32,125,109,184,34,87,88,89,88,3,77,159,157,66,33,199,201,247,1,55,144,219,209,48,242,119,224,188,136,187,23,157,208,158,39,6,35,121,237,6,242,94,234,139,127,179,60,53,134,26,0,52,119,110,56,19,210,233,229,193,14,34,124,197,105,171,54,203,45,157,242,231,183,180,71,88,249,220,79,250,215,162,74,199,233,244,122,168,80,194,33,4,140,60,179,90,55,206,142,167,86,50,174,101,254,50,18,23,81,70,254,205,99,52,174,61,60,95,73,47,6,127,121,94,30,143,243,134,186,25,140,183,79,11,180,220,0,0,218,56,59,196,204,63,7,13,225,119,33,67,25,136,214,156,139,26,90,253,204,200,60,34,225,106,135,224,28,109,62,121,220,122,250,61,176,55,27,8,102,239,184,182,248,137,0,71,42,254,241,196,168,120,36,60,82,212,224,46,130,101,137,121,115,28,132,28,72,154,107,151,226,113,196,201,56,0,236,125,145,249,62,185,185,198,89,165,84,225,252,228,42,94,198,90,195,145,144,239,75,102,222,175,111,192,86,154,0,13,10,158,20,149,244,47,112,111,190,164,211,46,183,239,17,166,72,145,2,89,106,101,207,137,156,47,50,47,86,121,198,209,35,70,145,146,169,191,26,127,31,44,129,197,84,173,185,123,209,154,219,116,106,79,129,164,213,85,158,96,171,148,196,131,219,171,246,206,47,40,205,180,18,213,15,243,252,250,59,61,170,172,198,168,60,254,217,16,204,179,184,210,193,149,144,175,244,215,83,3,74,108,231,244,21,104,150,161,56,8,224,223,234,197,71,230,157,60,136,102,145,114,142,74,53,172,213,117,180,13,114,30,143,204,83,133,162,235,40,215,8,16,29,197,8,17,82,149,40,245,203,12,0,155,167,227,200,132,104,227,119,104,251,13,131,137,90,181,77,178,221,84,38,86,42,249,216,175,48,75,246,237,165,78,156,146,100,61,249,38,245,195,87,130,105,117,1,32,48,42,55,203,20,13,10,24,186,86,186,1,16,141,74,202,206,143,234,230,64,166,198,149,142,241,86,181,136,173,176,234,95,59,15,55,187,161,43,123,203,34,28,129,20,21,56,123,2,75,112,118,250,68,3,163,173,110,187,93,156,38,239,235,219,122,222,124,96,180,68,171,159,144,234,73,59,101,139,119,103,174,43,230,73,189,187,63,232,95,70,15,30,209,55,198,27,217,95,124,211,216,176,21,206,69,19,133,56,147,13,10,182,42,160,229,75,76,225,165,236,95,236,13,10,43,40,179,69,182,112,137,164,228,174,20,210,225,245,169,200,132,141,166,136,202,41,143,147,134,6,73,236,58,175,239,62,130,13,134,152,140,142,62,90,77,75,185,55,121,24,39,153,74,163,232,29,11,179,238,17,94,195,109,95,185,163,146,208,158,121,175,81,77,17,199,179,160,60,159,156,19,53,92,231,158,17,154,25,23,127,253,202,52,112,77,56,17,138,137,118,209,238,90,160,45,20,254,177,65,68,25,245,232,82,68,173,197,192,167,101,165,34,238,243,97,112,6,75,177,159,238,59,95,123,68,30,77,185,103,218,224,186,194,196,143,198,168,54,224,239,90,105,240,115,190,225,105,159,85,233,199,87,235,214,253,139,81,78,43,73,214,51,56,21,183,219,209,224,105,70,149,252,163,210,19,32,160,196,184,82,217,112,109,173,216,54,154,149,253,217,23,50,139,233,61,211,56,24,149,77,189,44,33,45,44,168,21,96,237,91,194,132,235,4,122,95,56,158,36,228,63,79,168,201,127,236,244,101,137,250,115,65,7,101,85,207,85,177,194,27,40,224,193,203,176,13,10,184,182,246,116,114,242,123,192,209,17,72,244,7,130,75,1,89,181,24,141,75,183,56,111,189,191,28,15,175,52,114,27,123,203,92,15,203,124,64,16,220,182,161,40,78,157,120,131,158,60,33,17,160,93,41,171,121,151,7,59,89,13,10,129,198,22,128,32,241,212,137,81,188,125,132,118,213,186,89,63,79,35,202,193,249,187,14,9,30,132,180,233,158,92,88,77,19,112,221,18,222,232,223,22,175,139,198,183,178,62,47,234,189,183,243,39,121,175,142,43,80,148,166,233,183,167,34,95,36,196,58,142,93,43,151,126,30,25,230,51,194,103,113,226,48,23,237,35,61,187,2,198,79,140,240,57,146,198,72,69,40,208,200,70,75,70,242,79,158,131,128,243,133,213,208,27,136,147,198,127,193,3,73,137,131,207,147,148,50,170,56,12,165,118,208,144,48,205,82,253,153,189,195,190,22,199,32,76,220,51,101,191,118,41,74,131,161,252,20,162,54,245,254,83,33,144,78,119,155,19,35,42,118,248,254,82,31,66,85,98,103,132,54,53,156,36,97,190,165,171,39,32,149,65,245,87,174,42,166,0,9,201,202,13,10,159,199,137,140,20,48,108,227,90,80,1,123,173,239,222,203,191,148,238,41,5,34,7,6,220,128,100,9,239,135,219,29,115,234,176,105,138,210,219,114,205,205,178,147,231,251,19,201,77,159,200,126,116,80,46,105,39,162,18,240,215,210,242,209,148,100,247,166,106,192,120,114,225,140,177,221,232,241,24,53,220,188,92,78,240,57,51,63,255,192,252,20,86,218,173,231,218,227,236,46,224,211,65,91,12,171,182,159,197,0,111,77,20,164,238,26,92,169,154,212,213,230,41,192,221,30,15,9,123,91,147,222,45,208,1,168,196,24,35,76,156,69,232,193,61,26,224,78,148,102,218,184,207,30,203,136,164,224,89,193,17,166,70,141,45,171,185,13,167,156,124,121,233,77,178,143,105,104,177,166,50,248,197,125,158,86,95,249,28,105,22,2,111,250,192,102,24,86,185,251,141,233,200,22,97,129,98,33,177,252,21,156,254,241,117,30,126,64,63,95,44,227,37,41,221,84,7,146,252,23,161,42,61,205,124,80,211,142,234,173,189,16,173,191,93,138,130,68,42,169,0,206,97,80,235,122,70,57,221,159,182,227,133,178,253,9,52,147,220,205,144,20,178,62,177,114,226,26,168,150,67,166,202,209,9,51,67,216,93,129,38,25,114,222,13,10,203,22,164,198,181,240,190,76,151,139,250,18,211,202,240,19,79,158,164,159,110,150,135,200,249,154,69,103,69,234,37,47,11,169,150,140,127,149,134,227,221,132,26,169,45,199,112,91,221,104,45,174,65,81,138,9,223,14,32,159,50,29,127,163,65,114,2,244,186,118,169,132,218,58,221,188,88,19,104,133,54,47,2,240,162,78,188,67,155,61,187,218,207,253,132,152,235,210,159,136,240,22,177,254,171,193,7,133,67,142,172,134,11,85,69,37,243,38,96,151,166,117,41,154,160,150,123,211,183,160,238,238,63,197,120,209,190,153,211,83,59,217,21,113,174,217,4,191,201,218,26,20,81,253,197,64,110,28,214,20,224,199,251,199,51,86,60,214,206,108,195,30,146,55,202,21,63,31,4,17,17,67,97,215,49,99,107,207,152,85,90,191,18,132,138,209,9,55,26,66,182,54,117,164,19,11,129,233,124,42,46,226,187,93,143,174,38,64,21,96,1,175,15,85,217,213,223,143,242,60,138,239,225,79,18,0,0,241,65,73,163,110,92,148,205,144,129,222,194,119,194,195,72,112,208,80,17,249,157,72,176,135,90,95,245,66,240,103,247,233,136,1,9,245,134,188,242,181,5,34,161,242,62,206,68,52,158,83,158,112,248,78,32,125,201,190,199,205,248,86,160,70,241,160,50,38,170,65,245,65,113,154,209,175,136,255,33,30,87,221,12,18,117,221,11,123,71,68,13,160,137,185,140,110,233,42,125,148,112,11,131,206,190,25,234,237,216,166,21,246,88,117,135,186,139,186,60,227,170,94,142,175,177,251,15,72,107,227,96,155,22,158,251,23,138,66,146,244,192,55,138,254,93,36,238,209,202,171,81,77,220,102,198,150,216,227,127,41,74,101,121,19,29,223,84,136,233,67,102,9,172,215,80,195,219,13,10,148,12,132,254,2,43,34,173,194,103,111,98,233,30,143,137,18,37,248,145,251,165,55,103,155,36,84,123,187,243,95,4,145,93,32,177,23,57,246,32,209,139,91,33,105,33,210,34,241,80,68,54,133,105,170,48,41,128,185,34,91,184,57,244,148,88,132,129,185,75,12,114,67,82,178,223,96,13,10,34,176,98,86,29,134,203,143,129,81,79,189,170,79,138,4,58,2,101,249,146,250,183,31,201,18,74,69,184,71,94,30,243,223,107,109,227,92,243,41,119,125,69,240,131,37,232,80,94,192,217,121,245,66,128,122,231,126,87,228,83,82,95,35,188,89,165,7,64,55,30,250,152,103,138,238,108,66,83,116,174,183,69,185,157,219,93,141,144,143,219,85,31,188,13,177,88,50,16,123,190,204,78,17,161,168,222,198,147,88,165,116,162,237,70,204,49,213,100,84,158,255,35,16,45,146,191,220,187,43,185,133,247,143,54,3,62,52,245,156,14,186,250,59,221,113,51,135,54,70,76,239,219,169,19,152,51,153,94,218,66,7,191,212,169,134,125,50,232,103,251,235,125,230,13,19,40,3,239,147,71,203,23,189,145,49,84,132,239,101,112,137,34,151,221,139,125,150,97,3,51,149,53,226,138,0,203,30,236,164,169,119,95,96,169,245,252,155,216,176,109,120,254,142,99,24,195,29,162,232,71,227,249,202,88,124,176,26,226,186,13,10,46,189,227,8,49,68,19,244,242,48,167,88,24,78,214,13,79,113,246,206,194,42,147,160,27,108,84,224,68,154,56,96,252,168,149,74,52,123,117,136,50,154,128,151,78,203,236,218,16,112,251,192,85,102,99,117,34,159,19,221,153,94,153,38,93,248,112,188,139,140,198,52,127,173,188,26,106,246,69,153,39,26,71,91,145,35,73,61,70,190,196,18,137,190,235,103,235,151,168,222,215,169,201,115,13,55,198,81,100,207,189,194,46,92,165,137,210,231,149,76,113,54,239,78,8,76,67,166,199,243,97,163,233,105,137,35,155,221,185,165,147,204,42,128,186,22,222,158,233,14,149,205,57,57,60,33,42,178,46,236,182,119,253,54,211,77,235,70,196,173,13,33,191,126,109,124,189,12,128,131,132,47,205,135,177,143,234,124,236,249,57,152,126,153,186,52,194,20,228,77,216,76,23,108,156,197,164,206,167,109,56,12,179,22,187,78,249,222,115,215,59,74,253,74,219,84,69,21,145,222,248,102,33,209,56,213,160,162,148,65,80,43,246,194,173,230,113,206,195,203,92,171,144,58,101,126,178,215,12,148,63,151,108,17,14,70,197,217,210,155,192,13,10,135,95,39,56,229,210,36,150,164,62,9,110,0,156,93,60,183,36,180,202,187,50,131,141,190,82,127,131,177,140,180,87,229,123,9,44,48,46,229,87,253,79,0,219,156,86,230,108,159,223,78,201,255,170,184,95,96,208,43,167,150,148,250,186,71,106,25,154,3,49,195,13,10,120,169,46,16,65,123,162,54,226,51,100,129,116,200,38,51,29,193,186,184,124,95,149,2,120,70,19,12,106,43,64,39,147,14,191,154,151,186,27,3,157,56,111,197,28,48,38,72,226,89,128,33,47,106,88,44,222,39,120,198,119,160,31,191,179,197,209,184,163,116,173,175,106,219,247,220,148,7,95,37,237,102,212,64,179,146,44,95,37,95,178,63,216,246,226,30,166,91,29,147,187,34,86,132,181,15,17,49,14,36,43,8,117,117,151,51,69,178,41,186,98,193,226,195,91,218,236,4,209,1,72,245,178,243,188,247,57,155,223,223,31,63,121,17,151,20,174,166,151,36,91,198,71,49,110,161,87,72,78,203,149,27,227,103,35,79,208,46,139,31,9,26,172,61,41,191,40,45,255,64,17,188,12,186,142,85,35,77,148,61,179,1,124,199,167,102,114,11,188,41,178,208,151,169,86,192,241,6,113,119,240,18,212,42,220,180,115,205,232,209,186,53,180,3,7,87,250,29,130,17,152,157,243,189,34,206,93,80,28,33,239,135,8,251,52,73,223,71,216,134,80,159,247,181,155,118,192,219,174,68,63,51,111,238,45,97,93,126,237,28,40,79,20,51,91,200,162,107,244,98,30,16,222,150,17,251,47,29,189,82,228,183,86,93,140,101,181,78,163,109,80,139,207,12,87,138,73,162,102,82,39,205,225,249,118,142,254,132,127,157,148,241,187,183,219,131,112,28,35,33,152,92,114,131,212,123,46,64,178,122,38,132,40,170,239,231,95,107,47,135,100,168,73,78,88,39,87,55,88,203,156,164,111,169,50,8,131,107,204,200,181,86,74,105,245,173,136,32,82,175,28,20,23,195,250,127,88,5,105,82,134,130,199,112,128,243,104,139,101,231,252,36,210,163,174,182,21,116,180,163,33,89,39,40,21,68,221,215,166,238,13,10,62,147,136,248,246,49,206,114,81,114,77,247,7,38,229,145,45,220,204,140,101,45,214,201,96,143,132,98,48,61,134,127,88,157,224,242,247,23,17,179,81,66,238,110,249,59,100,214,50,108,77,215,220,131,39,142,5,113,0,238,119,32,130,230,186,54,142,217,26,85,83,236,254,34,147,164,129,228,47,131,188,143,145,72,199,14,172,233,31,123,125,156,184,167,36,21,189,179,175,102,246,142,167,51,161,122,190,157,176,5,59,241,72,98,145,50,150,149,137,243,141,48,234,191,169,106,1,250,199,38,80,181,166,255,57,53,103,1,152,161,234,51,129,13,10,155,17,227,48,235,139,69,31,36,249,53,68,38,52,54,246,105,171,90,144,165,59,22,204,238,172,54,177,68,85,116,239,167,232,2,222,115,82,43,231,37,230,135,4,130,44,183,211,145,39,23,51,51,103,137,91,191,190,6,150,106,92,198,83,170,181,233,179,89,103,2,8,107,240,1,0,133,185,0,113,25,50,169,90,207,21,202,77,196,90,117,78,163,52,233,235,132,214,252,142,63,196,248,151,69,107,237,100,187,147,181,147,84,159,240,213,53,34,117,216,228,23,23,42,102,100,197,224,236,237,16,25,73,74,126,212,154,176,185,101,190,193,168,46,88,115,118,107,179,141,125,133,96,73,204,226,252,166,90,175,97,233,97,182,6,52,226,166,158,240,89,117,76,157,129,99,216,127,146,140,34,39,114,208,112,216,63,236,111,165,172,115,74,246,94,64,191,222,82,31,125,156,177,101,15,223,100,117,75,255,33,234,63,240,175,118,17,169,61,82,94,201,178,140,81,175,236,176,78,127,200,50,61,214,201,176,216,83,154,52,252,60,216,206,183,149,142,142,187,254,212,49,60,119,237,70,156,25,149,82,169,255,112,186,84,35,176,59,97,72,212,234,174,23,183,28,91,57,220,67,106,197,61,107,168,167,173,129,170,139,2,51,90,139,43,17,233,244,250,145,49,89,167,37,184,171,96,245,47,26,46,165,14,175,77,86,101,110,97,91,243,130,204,104,166,144,191,131,223,242,79,233,134,87,13,10,220,2,144,237,26,55,193,194,173,70,156,231,137,224,234,11,181,206,1,2,1,0,231,41,114,26,243,181,186,221,51,162,218,166,195,62,184,249,6,79,82,146,247,21,248,32,180,187,253,213,111,118,212,46,122,26,6,140,28,189,206,70,64,8,47,110,125,88,45,25,57,153,12,230,238,141,39,0,21,162,196,97,121,139,55,220,181,121,142,233,247,81,33,104,183,109,38,194,139,228,164,154,27,249,108,137,210,53,242,26,29,182,169,110,93,164,116,208,177,155,128,141,19,215,161,27,243,158,168,100,116,153,196,16,237,152,148,161,173,243,61,65,182,252,46,97,77,128,135,244,200,78,67,123,19,111,60,179,45,184,57,60,73,23,122,6,117,160,201,231,238,206,244,72,169,122,253,190,132,15,160,31,199,229,242,232,254,206,220,24,132,132,195,18,232,99,92,215,145,149,71,93,219,253,212,211,141,90,2,70,222,44,127,33,96,143,141,44,13,161,55,29,48,46,148,21,114,229,121,42,60,244,229,26,51,34,139,147,168,20,208,63,212,252,34,60,49,76,243,113,75,179,163,75,212,247,237,99,72,87,127,238,217,222,176,130,196,4,158,87,181,211,205,183,242,102,41,233,243,186,54,137,62,9,227,199,70,61,2,162,45,112,86,190,118,184,119,99,38,14,70,228,139,184,50,183,238,19,248,220,5,55,236,142,129,233,189,254,173,140,39,235,223,26,215,6,147,62,253,17,19,30,18,129,79,35,110,187,1,190,133,183,241,178,214,39,65,59,50,73,24,210,71,96,79,86,236,18,137,9,135,63,236,56,87,2,139,239,118,163,73,67,100,194,167,0,45,16,77,72,98,54,195,11,72,226,183,93,133,28,52,234,80,186,127,254,180,225,145,144,137,138,226,23,104,193,87,192,202,198,40,162,24,26,50,121,111,188,26,114,113,210,71,60,216,142,83,149,221,189,177,252,58,168,223,15,61,88,134,55,241,154,139,131,58,253,235,95,101,90,136,56,238,205,104,78,35,21,183,44,117,206,239,188,239,148,52,74,206,141,106,219,227,85,0,142,199,47,231,206,234,176,19,99,168,149,244,231,63,134,118,57,190,13,10,11,230,115,51,132,136,22,176,91,65,146,33,190,143,144,102,195,98,194,63,232,91,127,57,41,48,191,228,193,43,149,38,255,47,222,195,143,35,161,89,237,97,160,113,142,113,21,194,69,151,216,73,250,118,54,145,83,84,164,12,150,93,77,114,236,148,218,97,160,55,102,171,57,170,182,132,225,52,253,20,7,165,177,177,155,254,186,82,170,13,165,217,156,190,92,130,219,170,102,55,17,230,222,186,24,14,29,74,57,195,32,81,106,67,80,210,150,188,25,191,27,224,84,133,154,8,137,199,233,114,122,2,31,49,118,254,98,15,176,200,55,228,20,31,236,229,49,169,80,192,61,49,158,50,85,112,50,32,183,24,91,210,15,229,219,166,115,248,18,154,178,17,239,207,54,238,57,76,126,0,235,8,118,98,75,200,64,250,134,229,139,47,88,71,84,203,107,253,253,118,129,14,48,7,65,235,228,84,78,90,193,116,19,173,235,33,198,47,102,202,79,7,92,50,56,23,150,186,112,151,130,222,52,166,117,183,23,162,199,246,216,129,4,203,146,79,222,93,247,117,180,240,182,142,14,46,92,47,120,139,189,234,240,109,142,31,194,16,92,203,189,88,39,192,176,63,214,205,100,240,208,115,243,25,45,95,148,131,150,68,229,236,108,81,133,186,220,240,65,18,166,95,73,168,200,49,116,169,174,149,142,118,162,245,175,70,158,139,118,200,51,120,44,95,251,139,215,177,187,187,62,160,203,124,151,134,195,190,42,222,94,122,250,140,143,32,137,38,89,165,155,196,33,226,136,69,161,8,227,78,225,120,100,4,46,245,135,166,214,125,236,223,179,245,16,235,64,210,34,149,133,52,122,0,53,103,15,204,118,194,131,122,78,77,104,48,79,225,19,197,57,179,92,31,2,52,181,7,155,142,50,147,69,70,152,41,120,197,228,223,149,90,69,78,162,99,195,202,93,113,1,243,26,49,141,130,163,249,252,181,168,175,215,166,82,9,102,59,15,201,218,64,11,38,242,133,239,70,208,225,234,248,172,177,241,203,128,94,57,134,208,75,197,133,7,63,198,72,149,228,218,225,204,183,73,187,67,156,179,46,169,17,118,213,195,156,54,80,209,13,10,251,156,152,132,213,251,144,24,52,36,206,230,126,242,23,93,1,210,71,141,103,81,30,201,245,79,136,118,60,21,38,151,176,109,148,139,237,73,36,0,150,238,227,208,106,180,87,94,142,139,44,184,38,59,91,207,79,161,96,135,32,245,43,103,83,9,131,48,113,135,157,245,44,62,194,135,29,32,243,152,181,202,200,248,164,212,29,15,29,71,88,77,217,13,205,174,164,161,207,22,12,75,59,241,170,184,144,181,206,182,203,52,136,103,42,166,143,189,147,130,129,219,193,216,188,254,146,251,245,20,218,83,88,68,60,182,224,20,114,84,233,27,56,206,103,135,178,187,13,237,210,211,143,89,56,115,122,151,123,94,164,40,146,82,12,88,248,251,181,60,153,75,87,56,35,121,233,73,15,13,105,112,185,128,225,189,248,207,159,76,60,94,13,10,24,246,110,134,238,147,255,231,254,84,109,229,15,65,54,75,203,55,33,182,55,7,37,113,250,23,121,241,214,114,250,210,96,193,109,127,19,203,223,62,67,118,231,255,86,210,167,16,172,90,195,95,203,219,206,44,156,23,229,35,187,230,33,134,23,177,60,31,166,103,155,48,137,121,174,124,97,218,110,104,54,147,36,198,203,199,221,236,54,78,90,134,112,114,102,192,180,89,238,123,44,3,254,88,78,82,155,255,220,233,140,144,162,243,217,48,90,167,77,62,216,67,13,191,58,73,254,46,207,217,196,188,159,239,210,38,24,254,156,138,151,58,208,114,171,111,113,62,77,240,45,205,167,172,83,89,178,214,82,1,62,19,27,118,179,237,108,117,253,83,186,88,216,98,132,98,100,98,127,107,158,112,216,128,15,109,155,50,36,43,116,122,103,187,43,69,103,88,64,211,79,133,42,168,6,47,166,176,30,49,237,36,218,224,47,108,247,136,161,127,123,147,104,23,81,149,219,0,114,37,156,206,15,251,44,16,53,193,210,110,23,119,204,163,213,106,130,124,50,66,6,158,118,214,221,105,182,83,118,134,20,185,172,255,22,86,127,234,97,80,141,81,69,75,192,47,108,96,247,85,174,246,175,174,53,54,187,250,24,35,248,225,165,60,65,18,77,233,131,229,28,236,146,174,244,249,151,133,213,84,72,138,81,194,8,133,52,109,31,118,29,167,144,23,148,13,10,12,85,125,147,241,219,107,61,0,255,214,29,8,233,111,243,175,206,95,237,245,69,204,159,71,162,177,187,38,113,52,49,214,209,228,127,214,189,110,60,102,139,3,104,36,31,14,187,95,169,201,145,223,121,137,14,82,232,58,54,117,238,105,155,97,186,248,105,222,145,246,114,120,245,16,6,28,111,228,29,226,216,131,244,140,208,224,104,226,166,82,178,68,18,141,130,229,205,82,243,95,33,13,218,227,5,70,145,237,85,167,217,144,136,170,232,251,4,245,37,194,8,74,192,159,94,223,128,164,239,175,233,129,247,76,13,233,209,148,50,7,9,179,70,79,63,242,192,246,170,234,109,151,61,156,50,63,83,222,61,116,31,105,143,191,1,3,103,22,187,214,41,87,203,50,205,129,211,162,103,69,96,255,188,91,220,92,110,79,84,126,88,154,208,177,207,225,79,94,23,254,209,196,168,171,228,230,124,207,138,73,243,44,76,96,68,241,67,30,28,195,130,231,117,135,34,166,208,223,158,210,62,81,248,173,20,209,29,123,100,40,226,116,67,113,94,186,78,156,5,214,242,56,55,143,148,152,174,240,231,238,79,230,133,102,34,204,142,110,209,65,238,95,16,158,52,60,182,105,92,75,225,224,246,102,1,194,121,117,152,59,245,87,192,74,207,193,146,39,161,173,126,108,68,192,5,41,252,126,221,127,136,109,36,183,224,41,185,195,149,38,0,136,187,251,150,151,33,153,167,179,39,150,210,114,87,222,131,167,64,34,145,193,79,236,223,121,152,197,201,107,30,218,222,2,128,248,86,138,143,80,7,133,46,237,48,57,105,24,11,51,41,145,121,115,194,211,44,8,12,151,101,182,186,176,103,59,199,236,253,187,251,234,152,12,38,56,67,57,183,241,5,37,145,217,22,103,212,254,228,19,175,194,61,226,212,185,218,116,47,66,105,198,201,57,245,252,50,163,128,64,115,13,10,1,129,85,173,115,63,35,30,77,91,157,1,192,58,88,234,231,181,245,144,204,250,242,94,220,133,82,207,200,217,92,96,235,174,24,55,215,169,124,161,55,233,212,164,189,44,211,74,239,214,141,100,179,244,246,35,38,172,66,153,33,215,251,60,35,81,132,254,8,153,105,13,10,11,119,95,26,86,110,194,157,88,48,211,35,114,101,38,247,231,245,175,221,113,183,126,7,97,61,220,79,198,62,223,73,5,26,235,89,230,51,122,192,164,182,221,135,46,119,108,156,208,204,184,97,48,83,34,216,22,115,33,36,245,151,138,134,193,134,191,13,10,15,136,231,51,206,56,228,215,193,186,83,120,197,98,155,30,252,151,128,96,89,153,14,212,44,92,209,131,186,215,233,64,112,228,5,133,105,218,46,81,131,31,254,13,8,3,1,174,171,67,80,186,41,3,24,174,197,130,199,141,5,221,146,229,175,180,66,78,168,8,98,155,201,114,230,143,79,242,72,156,36,85,147,240,117,85,202,106,43,37,150,71,148,207,49,203,211,174,92,34,154,185,184,194,152,6,192,29,17,110,189,15,240,241,89,237,45,61,125,252,115,234,180,145,11,255,91,11,11,88,124,217,234,110,111,196,93,99,192,151,102,34,77,131,70,31,5,136,20,11,37,139,23,41,247,11,174,121,98,24,155,21,84,72,51,146,152,140,242,48,175,64,119,25,62,83,51,5,25,57,77,217,155,161,53,109,71,48,171,34,29,198,166,96,25,191,174,86,72,147,221,173,123,23,125,173,209,106,221,33,211,150,207,166,195,220,129,128,82,226,247,17,73,253,89,74,22,222,12,47,253,211,102,201,155,72,108,85,166,233,145,228,210,44,203,21,132,63,12,51,99,103,106,242,245,178,209,183,239,102,204,242,241,45,197,13,99,119,107,255,176,88,215,13,10,156,118,220,233,108,117,72,114,215,44,130,160,195,63,144,212,156,147,84,2,205,210,107,109,116,59,31,67,190,213,216,181,57,66,72,73,193,73,93,174,115,4,78,136,90,125,15,48,127,24,22,223,98,68,166,242,217,123,253,78,32,14,147,246,155,8,175,57,234,33,230,227,71,164,124,238,191,128,63,115,185,120,173,191,207,5,103,137,187,142,110,37,99,222,135,221,154,140,135,113,87,185,52,16,45,206,218,197,77,72,122,27,178,105,79,0,52,9,60,72,241,13,10,23,211,46,43,221,12,114,60,175,89,173,221,27,227,115,175,140,155,235,68,21,170,90,243,99,16,195,31,36,53,74,83,192,185,98,87,49,72,190,249,29,153,79,227,243,216,69,13,212,214,134,114,87,153,245,60,55,58,13,10,62,60,6,12,46,26,62,128,5,4,159,38,215,22,225,243,129,185,248,49,37,228,104,50,100,160,126,45,137,56,246,5,151,142,37,19,221,32,80,179,216,161,1,39,151,203,168,150,22,50,190,210,96,145,99,56,168,18,174,117,28,123,101,126,8,106,12,125,220,211,191,221,255,62,72,184,71,81,146,87,54,209,49,12,73,16,252,17,67,135,243,237,127,225,99,249,24,149,235,245,95,203,66,92,239,87,41,217,155,216,242,192,114,227,108,49,5,35,231,92,216,229,222,73,192,49,196,38,52,16,157,86,233,26,70,200,200,232,159,217,32,18,160,12,51,208,222,197,37,151,181,198,147,50,145,167,189,197,206,218,149,220,218,86,0,249,174,28,130,80,84,231,238,16,103,69,140,203,102,97,7,4,197,142,74,79,192,203,95,201,51,208,50,42,113,107,44,212,48,163,173,72,218,179,212,203,233,210,63,45,9,35,104,207,196,225,245,73,92,19,58,146,148,46,198,33,24,212,92,23,114,54,70,230,148,7,180,168,157,205,253,42,179,255,192,153,162,29,157,41,116,29,104,39,6,41,170,58,65,79,229,134,88,220,145,112,194,71,182,226,63,53,196,188,95,248,48,9,244,98,242,238,244,219,172,95,209,88,166,88,87,249,182,220,31,81,146,223,177,105,220,182,86,33,202,178,241,176,123,210,47,65,85,168,233,226,182,56,141,67,15,222,94,193,200,52,210,46,160,53,197,46,30,52,72,46,173,195,107,76,174,144,42,174,137,167,40,78,98,179,200,75,96,141,107,208,95,117,188,49,49,11,45,211,178,192,138,0,224,115,127,16,79,3,164,25,137,213,246,185,162,195,139,34,241,209,128,62,229,215,164,216,222,68,228,171,212,150,161,222,12,14,18,196,188,150,208,18,40,70,63,14,169,206,149,9,254,233,135,19,159,61,211,249,208,223,67,19,245,85,190,133,67,55,24,246,208,95,25,124,65,169,217,199,168,176,210,116,1,150,130,212,159,88,221,95,102,177,42,101,32,217,242,38,209,223,31,27,101,205,250,38,31,152,12,162,90,146,100,91,134,182,70,6,41,63,139,253,227,100,196,125,42,242,199,9,187,231,122,112,165,113,47,44,194,111,61,102,245,190,44,48,122,72,230,248,135,246,129,211,1,33,227,43,189,135,39,27,93,196,97,93,40,195,9,241,90,210,99,251,55,66,78,86,221,166,225,123,153,139,69,190,108,127,198,194,142,51,148,168,118,76,158,178,223,92,6,98,101,147,181,198,101,213,80,212,96,1,114,121,28,210,8,174,159,55,188,8,43,11,36,43,13,10,80,75,117,27,24,244,215,73,81,114,182,151,238,33,120,52,168,164,251,124,193,109,111,158,139,180,0,190,138,235,8,80,150,2,131,220,231,37,36,159,204,77,233,125,152,134,116,90,182,6,108,62,47,100,221,138,183,154,161,22,103,241,17,136,215,150,93,193,30,183,96,183,114,226,130,219,241,50,73,243,25,134,172,104,152,254,191,226,62,62,139,141,44,51,224,14,166,252,73,56,80,236,178,230,216,49,209,239,202,60,46,200,238,46,57,69,153,9,30,213,139,237,233,125,122,67,182,247,57,235,15,132,94,172,29,246,177,235,254,135,96,9,204,93,128,75,21,237,75,86,118,27,60,225,175,89,192,123,73,220,121,138,68,83,34,151,173,115,213,16,30,212,127,54,163,103,143,129,130,151,204,39,246,170,162,170,204,201,170,155,111,84,89,145,29,140,86,207,73,158,57,13,10,230,7,243,121,4,80,178,185,201,190,15,0,110,218,12,113,91,92,160,72,23,52,207,176,89,116,120,231,96,43,13,44,30,79,120,240,60,104,193,124,112,228,180,45,125,45,60,149,207,64,247,52,136,179,113,142,44,176,90,84,153,68,216,105,68,215,135,36,226,102,195,49,154,248,154,228,48,231,119,233,95,13,121,43,28,101,67,6,228,33,243,214,58,38,178,30,116,182,232,178,27,46,43,157,197,150,208,19,205,161,109,8,230,94,143,36,168,75,18,178,186,220,101,62,110,17,16,222,46,112,156,28,27,237,19,112,123,112,164,33,179,132,242,12,167,169,169,210,3,36,221,56,63,40,178,211,199,169,197,63,93,76,107,124,55,141,38,223,17,207,85,35,139,225,178,79,167,13,204,23,141,173,61,53,103,15,228,145,144,133,235,28,217,5,151,29,118,163,104,253,252,249,210,240,162,55,57,133,26,58,109,46,2,214,93,84,222,230,158,213,216,19,21,211,234,94,53,111,148,239,37,109,210,103,253,30,26,158,220,156,214,62,116,63,41,155,204,74,69,6,35,59,141,215,101,44,160,103,247,65,96,63,147,37,12,8,125,54,143,158,156,196,204,26,109,237,86,116,135,192,91,170,153,43,0,86,167,127,99,13,10,114,0,142,57,70,21,169,219,36,254,86,169,86,101,14,201,222,144,166,194,37,145,137,68,2,71,151,5,65,202,25,135,72,146,130,21,192,225,50,168,26,161,50,8,216,99,193,254,129,127,112,202,87,59,84,87,125,16,183,49,0,175,142,160,136,32,138,68,251,146,172,163,20,174,88,121,112,97,128,120,140,23,187,29,11,129,182,185,90,28,78,15,158,166,111,155,57,191,225,36,68,166,68,102,145,167,189,176,62,15,3,217,240,122,16,167,89,143,33,102,241,8,82,159,52,205,144,230,1,255,237,52,121,171,207,203,222,143,5,28,52,142,72,198,29,149,176,12,89,234,18,135,66,63,5,102,108,61,54,40,136,68,6,126,131,225,79,107,82,16,132,44,116,43,137,241,58,205,18,107,159,197,13,10,190,44,167,215,237,81,61,67,182,172,127,65,238,218,65,107,255,252,197,200,68,171,45,35,212,220,9,178,213,16,80,76,233,141,2,231,32,32,217,230,105,221,170,52,76,99,161,183,86,50,249,18,161,192,218,56,133,218,74,247,226,67,228,164,198,73,61,101,149,187,109,86,176,53,145,6,149,114,89,229,158,51,107,170,243,91,209,206,197,205,231,53,39,46,188,202,232,212,144,74,235,210,179,38,16,198,254,162,182,153,65,214,84,46,203,68,215,16,146,163,207,6,119,8,163,208,135,174,153,255,41,103,26,183,221,135,88,117,155,151,26,8,174,27,173,120,39,13,47,190,227,122,162,220,177,25,215,47,108,123,12,133,9,1,138,112,208,176,190,44,104,48,239,142,11,36,177,206,17,65,239,135,58,77,125,204,80,31,128,139,253,148,228,220,15,41,21,170,2,48,118,188,200,0,100,144,164,54,133,234,37,170,252,24,115,2,235,222,127,225,150,90,4,165,163,152,152,93,41,240,142,8,81,39,181,107,5,115,52,216,142,182,56,164,221,230,74,253,32,73,116,195,147,149,54,177,182,106,84,180,219,129,21,24,83,145,87,24,247,8,19,240,150,204,27,14,162,94,54,59,73,38,76,42,209,113,88,164,72,159,145,69,63,190,219,222,21,215,183,77,127,152,232,29,242,50,81,120,93,88,41,91,162,151,242,149,170,98,72,169,18,205,212,241,17,30,107,98,142,236,187,81,57,112,158,118,234,74,183,67,206,200,38,98,29,8,230,188,100,105,28,201,11,60,60,23,120,147,26,40,211,213,177,226,14,150,198,67,49,102,19,252,72,124,155,96,76,67,70,63,164,83,59,202,18,54,40,110,111,90,110,235,47,29,156,52,189,222,69,149,73,90,54,95,136,5,93,146,104,84,28,241,101,74,207,71,141,56,74,84,150,168,119,46,161,64,39,81,160,147,88,42,102,37,160,164,72,22,181,253,190,22,104,53,213,152,100,66,150,36,155,146,204,144,170,63,214,68,92,154,25,191,39,245,156,176,97,108,115,6,7,15,51,199,223,78,29,230,74,200,197,187,47,250,193,239,43,27,48,229,160,39,94,96,4,207,100,187,226,198,113,14,220,252,58,164,173,214,1,6,51,71,8,134,47,250,102,82,130,91,200,72,66,115,110,71,174,105,23,24,3,101,199,91,39,80,94,237,60,97,8,233,137,138,120,14,32,195,246,6,168,96,34,154,196,109,4,113,172,160,24,125,109,83,154,27,136,32,246,32,247,43,65,173,29,59,243,131,75,244,140,162,175,234,139,245,53,175,116,196,86,45,234,220,182,61,47,92,117,133,114,43,119,201,137,52,45,25,15,249,38,200,165,38,59,79,37,40,111,153,207,111,198,46,230,226,173,97,200,43,41,216,36,104,172,16,253,39,118,66,120,229,85,140,232,180,27,161,17,203,47,4,9,20,69,26,72,12,147,8,66,55,202,200,246,107,183,198,104,159,52,11,138,191,1,80,224,109,91,17,119,39,138,76,8,116,47,226,47,66,194,134,128,241,144,144,3,68,173,250,72,109,89,113,140,37,211,114,117,188,228,223,152,26,172,53,210,199,232,92,114,160,24,139,137,83,207,165,22,253,84,90,238,11,244,184,186,48,28,253,226,20,66,65,251,223,61,32,78,61,40,35,48,21,114,226,63,32,76,151,48,90,130,64,22,96,225,41,38,238,123,166,234,26,129,255,92,0,121,51,175,199,50,102,250,196,193,52,237,129,138,72,231,218,1,199,26,70,51,92,132,95,157,165,233,96,178,83,57,213,81,88,43,55,88,20,20,141,148,207,183,129,252,86,9,56,39,183,133,120,167,61,79,246,123,107,135,244,12,250,94,63,67,37,217,16,140,219,100,189,6,66,123,136,200,65,5,24,115,22,250,41,144,180,227,232,237,182,199,138,191,22,79,74,151,23,213,35,121,75,47,231,114,160,77,171,190,104,140,202,151,112,144,151,155,95,71,206,185,13,10,29,188,22,125,48,94,171,35,28,159,66,96,196,173,16,136,156,183,133,22,153,2,252,11,237,120,218,21,184,65,116,83,187,101,133,110,160,190,165,36,91,160,87,63,98,61,33,95,108,12,248,1,133,28,48,91,53,93,38,181,43,11,52,54,69,254,37,199,138,53,38,132,30,218,72,9,25,161,187,229,245,111,193,13,10,190,170,62,31,204,167,196,62,229,96,240,103,241,170,42,253,100,47,118,157,26,206,142,42,170,243,136,80,240,215,87,205,128,140,146,29,113,110,150,251,192,125,167,134,13,250,112,206,174,40,136,192,237,60,191,149,134,68,53,50,182,141,174,217,169,38,101,92,21,122,65,108,56,58,83,216,242,131,42,78,103,70,129,18,160,154,220,131,126,216,236,149,247,8,82,146,31,80,212,65,114,57,252,66,238,54,36,202,151,246,130,116,92,197,231,108,199,198,123,217,159,33,128,248,192,183,251,73,83,156,140,196,116,194,92,13,222,73,22,113,255,50,158,81,188,250,119,147,70,212,104,104,53,163,173,102,51,252,181,224,246,126,12,169,206,216,242,21,190,244,210,64,69,62,178,237,214,173,178,34,120,170,91,152,95,161,64,201,131,77,56,117,61,242,1,79,140,14,230,218,209,158,143,197,76,3,193,246,203,15,133,137,134,105,29,153,89,37,98,202,217,95,160,165,178,171,228,168,181,75,69,125,66,232,195,58,45,25,81,192,65,154,114,251,148,253,167,142,205,146,189,42,20,22,69,158,157,236,169,70,159,53,228,196,125,181,49,114,109,238,143,32,61,112,66,237,179,47,2,93,243,213,130,84,123,177,212,95,122,91,112,211,23,223,78,187,22,227,107,13,121,142,9,50,253,42,133,176,79,214,113,67,228,178,135,165,4,22,44,31,90,3,124,205,120,0,136,197,71,99,133,175,129,104,225,45,151,212,75,6,48,98,23,89,23,60,143,30,48,6,181,177,198,215,19,139,126,239,195,204,95,84,226,75,44,60,167,180,26,172,253,37,229,84,136,13,10,175,64,110,164,195,198,226,29,59,85,11,4,15,177,149,37,152,167,232,230,72,143,227,130,136,178,174,182,196,113,131,56,89,138,43,254,77,43,157,20,198,87,50,218,48,76,22,255,62,31,143,3,4,110,240,149,182,95,214,9,218,135,236,36,166,146,120,191,230,92,144,92,208,50,159,106,72,107,133,37,183,238,164,247,174,86,194,99,60,216,53,67,38,158,138,205,109,113,245,0,216,47,223,189,231,247,247,177,174,230,115,40,84,146,50,226,108,165,80,133,182,232,77,158,46,127,116,6,143,147,169,12,70,84,242,243,150,229,124,95,118,247,230,28,187,229,35,219,251,166,231,102,56,187,163,6,77,160,37,167,158,58,41,79,231,241,204,40,163,180,197,125,214,253,196,142,84,26,133,83,75,37,225,188,17,180,247,128,25,69,114,57,234,239,212,190,144,7,210,5,241,217,133,243,137,219,34,64,11,39,156,16,148,133,81,166,180,161,127,189,160,255,201,66,139,24,180,61,199,110,251,21,252,33,130,33,111,27,96,180,227,68,160,58,214,192,15,20,30,249,159,137,242,76,129,156,62,50,135,122,146,125,132,194,208,6,148,15,57,202,139,113,229,149,22,115,234,155,253,23,73,146,50,25,222,56,146,158,202,169,206,67,176,108,250,125,161,187,237,253,165,108,97,255,108,36,244,14,89,177,56,112,213,253,235,130,217,129,21,79,174,93,109,81,82,222,105,51,147,89,70,26,65,169,113,59,107,190,71,232,104,201,51,205,116,199,93,183,29,19,186,228,222,200,94,2,250,161,78,173,108,13,10,37,59,22,199,149,20,101,123,21,230,140,207,249,238,106,163,133,207,249,226,197,61,154,228,15,133,199,147,228,232,255,80,178,183,66,15,79,230,152,7,188,95,55,195,227,0,230,179,195,84,157,29,50,70,162,231,15,9,16,84,17,53,189,248,5,224,166,152,226,54,182,73,103,2,208,97,36,22,135,183,184,209,160,229,23,223,4,118,218,9,216,150,103,167,171,55,95,210,103,45,203,171,129,36,229,17,80,45,219,208,139,160,77,148,29,241,206,189,204,247,237,72,64,92,188,195,55,116,166,140,82,18,252,111,19,38,65,255,65,60,152,79,139,67,189,253,123,26,42,52,53,241,90,240,126,244,151,13,62,74,11,185,71,193,129,233,202,39,204,20,163,91,209,189,9,104,117,180,88,115,140,162,68,248,140,40,114,139,116,226,92,184,196,252,16,149,165,108,167,94,69,105,173,48,130,239,25,74,221,17,53,13,179,183,75,150,118,29,69,56,89,111,247,36,59,30,27,114,71,22,161,68,16,110,8,13,66,3,100,68,253,71,41,152,70,12,233,171,189,5,180,42,249,56,154,196,82,189,187,163,161,58,150,137,0,37,120,159,22,185,217,34,81,253,59,59,235,44,97,237,219,55,13,10,32,69,110,59,254,95,64,57,226,85,124,69,28,82,79,128,135,1,91,175,63,240,95,81,134,159,185,117,18,150,139,219,43,73,88,156,28,122,241,224,133,37,13,10,71,101,116,101,244,128,183,2,62,36,199,103,49,172,14,171,103,4,18,61,119,151,125,58,44,76,86,182,145,52,110,190,88,156,97,156,4,81,93,52,248,31,198,161,117,39,213,216,49,144,19,197,212,255,39,204,57,37,226,76,153,35,26,199,251,158,175,11,186,72,45,59,117,128,122,200,93,3,205,9,222,93,154,224,176,123,122,129,63,4,73,120,101,0,13,10,232,167,224,0,128,48,15,13,10,184,195,153,5,126,221,186,39,61,210,225,178,160,220,239,173,59,51,46,109,74,193,255,173,132,97,103,223,215,14,3,70,218,248,74,242,146,212,244,36,37,110,213,172,78,16,79,128,105,112,80,213,8,68,167,8,234,201,231,247,120,79,208,22,70,243,189,12,89,92,165,30,230,189,96,125,37,78,120,173,220,94,21,195,182,172,73,64,236,134,90,92,35,16,91,107,224,158,160,159,44,5,214,215,105,96,168,67,184,30,228,51,151,127,170,195,203,218,133,205,210,244,219,124,40,41,58,119,130,86,53,153,42,248,243,179,139,68,128,217,161,57,177,102,35,69,168,171,225,99,74,119,73,108,63,87,89,125,41,133,233,229,71,23,171,46,153,202,53,120,148,65,188,221,237,233,169,226,16,107,64,29,150,132,173,190,254,64,214,7,240,117,193,121,233,204,3,229,158,101,67,13,183,11,68,29,67,223,3,242,170,111,240,111,34,75,110,69,91,1,198,79,184,158,236,145,3,228,132,83,169,116,155,77,96,40,8,199,228,8,168,144,48,145,216,94,6,170,246,53,208,213,41,195,205,209,184,71,154,192,244,32,140,40,75,182,120,165,71,242,189,119,187,23,200,109,69,96,67,79,122,209,147,119,96,166,170,85,182,20,207,169,255,140,156,150,86,26,230,200,242,18,28,78,32,35,116,40,188,81,223,32,153,182,196,158,62,250,24,230,212,57,230,230,152,30,116,110,187,29,196,97,37,157,142,160,248,9,156,71,204,162,123,45,152,43,114,201,160,124,242,27,60,5,214,226,110,110,40,110,52,139,137,68,7,142,36,128,159,156,95,61,1,75,76,186,2,83,63,86,33,191,186,31,14,219,119,108,99,71,70,112,60,159,115,186,137,177,150,13,10,73,100,32,198,143,84,229,185,1,166,215,51,215,172,199,159,39,95,255,178,83,243,137,170,72,0,132,70,139,179,77,161,231,151,228,59,127,110,140,175,94,140,147,6,154,58,39,48,229,126,195,155,103,123,183,62,63,7,194,5,85,153,247,6,46,83,179,122,95,0,153,144,125,46,216,127,247,168,44,149,251,174,184,136,3,59,223,214,123,163,166,3,26,76,220,86,203,30,76,245,176,107,70,225,109,152,139,236,206,250,203,158,28,3,112,35,215,191,92,207,93,101,170,102,161,122,179,97,190,121,129,241,50,165,120,243,171,251,151,150,13,10,96,52,240,82,217,213,175,220,6,121,120,46,201,15,36,15,148,58,95,154,61,150,158,215,57,146,84,255,103,216,157,246,104,247,197,111,206,161,255,220,242,4,129,71,74,200,73,93,58,244,182,215,238,9,62,54,156,5,127,11,112,133,130,32,105,59,57,138,207,142,129,67,85,129,50,228,57,20,5,227,13,10,115,147,124,83,64,46,69,159,74,163,83,156,247,169,154,63,81,192,48,125,4,93,248,183,119,87,233,46,162,245,27,240,187,79,119,211,144,77,211,85,102,88,112,194,181,159,30,215,248,79,199,31,221,127,11,108,93,49,130,219,119,130,124,166,162,6,13,43,140,131,196,234,74,67,46,244,58,77,13,10,149,44,198,203,190,82,169,240,205,102,26,83,137,115,222,65,255,233,197,207,85,242,80,107,158,254,229,31,186,229,230,59,220,245,82,132,153,164,124,3,17,99,200,141,48,34,96,103,132,222,47,70,169,201,35,90,238,61,79,113,212,149,155,12,253,197,183,231,140,140,13,10,143,157,201,148,64,194,38,61,186,203,52,60,92,100,133,119,245,97,11,80,234,177,207,127,208,36,25,239,57,65,199,202,11,14,100,235,173,75,44,176,90,7,147,219,195,143,25,70,212,71,103,189,40,127,94,151,121,198,17,202,13,170,161,231,57,61,190,6,131,200,211,69,92,223,235,192,230,75,84,183,55,226,152,221,166,5,34,124,12,75,186,135,170,62,199,250,110,186,236,57,230,239,37,55,213,151,67,145,211,23,57,217,252,66,152,61,129,174,228,71,17,200,35,243,95,142,35,33,172,116,148,56,113,115,157,45,190,151,72,254,104,89,34,99,231,113,63,39,224,212,155,155,92,183,164,229,93,229,78,107,128,13,21,133,100,80,255,211,174,95,40,123,18,174,79,67,139,32,174,158,39,230,202,160,15,62,174,173,190,8,67,38,132,253,249,147,30,146,85,68,166,128,24,38,2,163,193,153,125,229,208,99,11,213,160,16,83,94,102,225,193,35,1,61,35,150,107,53,69,199,67,28,57,185,114,149,191,164,9,157,20,70,16,4,196,44,133,9,94,234,203,155,71,197,147,188,109,184,99,83,58,134,25,186,224,144,149,222,142,202,67,45,77,221,73,170,96,13,39,126,117,220,63,92,102,49,226,160,83,130,203,0,120,37,250,219,119,67,141,207,167,142,37,45,121,182,161,150,213,22,76,47,235,133,215,94,202,37,255,128,177,217,127,225,14,135,150,12,160,252,71,196,29,58,33,59,241,65,180,139,195,170,169,63,168,98,69,6,70,104,57,70,101,191,213,45,18,195,190,76,227,158,253,129,17,117,67,152,169,68,195,253,26,250,152,236,51,123,170,175,137,157,53,232,4,207,65,106,215,254,69,255,241,63,198,53,64,7,80,16,67,249,143,232,66,141,232,1,57,1,186,106,40,113,26,44,168,90,39,11,177,53,183,47,29,80,38,232,33,117,129,134,7,41,233,79,47,24,120,160,233,108,89,233,246,39,20,251,95,143,37,0,61,252,115,71,233,144,7,138,154,51,28,179,166,165,53,188,97,134,111,2,81,61,235,152,44,74,19,173,191,186,195,255,112,167,51,95,64,213,72,158,72,229,237,237,239,22,25,25,115,217,50,71,156,98,24,59,14,37,238,140,79,118,212,241,174,69,218,234,74,18,174,221,158,248,29,36,142,141,25,248,200,165,190,205,209,234,30,152,120,62,183,163,129,73,23,8,81,177,148,44,150,197,61,224,109,239,128,145,59,252,4,229,57,236,103,193,16,73,141,21,183,130,104,133,62,92,114,244,133,248,162,123,118,133,105,229,66,65,246,17,88,117,226,151,50,146,207,72,255,145,212,94,190,214,39,174,159,7,102,210,34,1,178,13,10,253,212,14,91,23,207,51,127,41,153,224,189,21,184,110,70,235,60,24,252,18,183,220,173,207,157,213,12,108,126,63,55,230,21,168,146,219,63,87,226,80,160,114,164,159,114,119,221,106,44,128,66,105,130,51,211,90,105,155,23,236,165,219,218,109,37,14,212,161,111,204,137,59,240,220,46,51,251,30,189,125,237,234,60,28,57,96,60,139,126,26,90,131,58,143,205,213,87,11,208,136,116,155,178,50,97,83,102,104,121,98,199,229,110,208,137,205,123,9,37,5,202,250,90,128,245,3,196,207,51,127,7,173,240,209,6,147,126,37,103,8,57,212,145,247,191,247,165,35,219,96,157,18,99,40,193,97,19,236,188,191,156,64,4,144,68,39,161,8,97,138,229,212,237,128,159,140,202,247,34,81,16,76,148,236,91,238,33,249,27,23,157,49,219,167,156,238,229,236,127,246,152,235,132,171,29,45,26,98,79,88,179,98,42,120,132,76,229,20,152,178,206,243,142,175,226,89,210,44,123,166,17,4,101,26,134,32,8,188,29,221,165,140,196,95,102,62,178,100,40,218,168,94,119,133,54,58,105,210,121,9,150,239,93,150,33,213,48,66,244,47,121,73,98,254,164,110,70,243,123,138,209,251,118,252,141,92,242,20,104,67,248,204,98,81,57,199,95,180,45,218,113,167,82,186,196,143,41,78,76,12,130,137,252,70,218,94,253,156,145,189,166,208,39,81,139,126,129,232,178,31,117,90,150,21,98,125,88,18,172,166,116,209,82,122,17,133,238,212,227,198,40,25,110,125,7,89,177,202,230,185,183,233,1,233,89,154,101,35,15,30,228,105,205,51,185,189,156,16,76,68,227,193,171,150,108,150,120,189,13,10,215,129,17,164,224,242,208,122,1,160,56,206,222,112,54,208,83,77,104,74,21,98,161,122,214,74,0,242,121,32,12,3,113,177,203,166,23,71,103,29,42,33,211,249,100,108,162,144,246,184,36,24,169,111,161,119,198,39,130,119,80,75,127,186,147,99,37,245,250,18,74,176,24,161,93,193,141,44,94,143,147,205,238,165,43,238,219,120,165,120,40,216,26,62,108,56,185,250,243,220,78,183,39,62,206,62,164,72,42,28,98,66,163,53,134,44,44,55,23,249,201,237,149,247,123,20,12,78,21,105,178,25,47,199,220,247,2,208,188,154,80,66,142,196,6,248,189,12,175,136,107,77,151,147,32,211,228,41,129,109,136,247,199,20,109,150,13,10,193,46,112,242,203,122,159,78,62,54,102,101,171,63,27,75,100,64,245,94,234,38,220,158,224,9,107,183,118,55,49,116,13,10,83,119,102,73,12,140,23,71,35,191,14,180,12,83,112,26,173,18,178,29,67,106,220,226,34,3,193,5,58,157,196,233,241,122,230,23,136,140,75,78,111,58,114,14,78,99,102,186,98,130,33,163,135,216,171,21,224,74,214,147,135,195,16,211,82,139,210,250,165,178,43,255,63,164,148,245,251,250,196,247,113,201,199,64,43,149,88,12,90,196,187,58,246,146,167,12,178,200,81,250,92,241,23,62,236,62,194,155,90,5,160,183,40,187,187,81,211,183,173,139,13,10,241,122,21,99,232,47,175,217,63,139,113,24,31,183,175,227,82,135,79,78,198,211,52,171,103,71,81,154,184,232,71,183,188,237,51,235,84,88,168,40,224,116,231,75,166,33,189,205,3,254,166,4,127,123,106,189,160,31,199,81,75,161,175,240,212,208,192,203,143,78,66,213,168,126,57,93,154,205,208,44,204,34,12,21,113,83,66,32,24,114,88,70,0,154,58,205,140,140,221,182,107,198,131,107,64,38,253,159,82,106,162,117,208,108,129,49,121,229,146,79,38,162,80,148,231,189,168,189,38,175,196,206,180,29,137,100,212,252,74,241,223,176,89,91,197,214,113,76,50,241,93,199,25,78,154,58,115,1,60,69,216,250,85,204,5,80,161,45,154,174,142,159,241,153,250,40,239,194,66,109,141,29,239,185,58,101,113,122,243,234,142,45,91,74,168,239,14,243,142,150,0,247,212,231,217,241,214,122,46,99,236,228,120,159,167,75,21,155,254,47,145,193,155,3,120,186,82,233,61,241,40,48,217,149,83,182,97,134,69,226,97,38,132,42,183,2,98,217,110,53,229,231,80,236,160,206,52,88,179,229,27,238,47,33,25,17,54,223,219,202,57,189,192,121,57,229,33,228,244,146,243,146,222,189,2,156,30,162,55,189,137,175,118,188,137,246,24,213,48,22,13,10,177,98,105,250,107,105,60,241,75,220,78,199,198,48,2,87,3,197,51,127,97,69,143,160,145,4,235,21,199,203,32,170,76,155,219,124,239,58,9,242,91,199,243,20,153,81,167,205,117,55,41,147,184,12,210,17,47,118,116,206,253,106,250,118,74,163,72,103,48,210,193,137,122,38,77,130,169,23,9,254,196,162,30,48,216,18,245,88,69,24,4,238,111,61,238,44,76,67,120,70,188,189,160,124,91,108,186,29,148,175,2,145,99,183,56,60,172,110,8,138,177,220,20,237,55,67,238,119,226,110,167,173,49,25,167,108,11,95,146,92,77,227,5,205,123,179,160,154,69,57,71,91,155,215,155,226,143,196,98,216,113,140,224,95,157,148,202,243,56,123,165,94,110,68,123,248,26,158,221,211,163,78,23,190,102,188,82,176,192,187,111,134,246,240,8,130,145,115,129,109,32,81,130,237,46,206,211,25,134,74,121,106,182,93,78,57,80,40,139,173,169,79,163,43,111,69,58,253,252,108,57,164,252,254,96,53,58,100,98,126,32,87,212,179,121,211,36,0,18,179,187,14,208,199,135,108,184,60,27,165,239,182,226,160,63,52,12,43,87,103,49,248,72,247,98,167,225,204,175,38,126,224,109,98,27,195,63,194,69,208,225,84,122,220,18,204,14,181,139,38,186,189,184,234,233,203,251,171,147,131,111,255,34,189,161,131,29,208,27,115,70,173,55,122,162,152,216,70,40,191,28,7,67,50,132,176,169,15,200,159,90,235,38,81,186,44,234,64,93,79,82,221,192,231,75,135,29,67,247,30,180,172,224,210,180,1,249,52,142,172,58,46,240,173,41,80,54,191,108,246,248,112,213,142,0,182,25,213,14,167,221,119,188,40,222,249,29,128,92,213,39,220,188,253,193,108,4,43,249,184,116,227,177,86,126,186,76,30,112,116,75,158,126,91,209,253,166,165,255,110,16,22,19,251,229,141,196,108,250,193,166,90,218,246,94,73,117,126,147,4,226,172,154,145,224,88,134,0,199,9,166,29,66,49,115,0,115,163,109,71,63,81,138,20,94,20,29,13,10,90,73,68,65,185,234,153,172,35,246,15,84,248,18,123,71,126,28,230,152,187,65,41,180,177,223,238,223,16,217,230,101,194,71,166,47,17,47,92,163,11,13,10,229,219,243,228,149,255,6,235,40,235,67,140,232,170,173,132,213,245,15,181,106,58,240,2,194,59,207,102,171,194,112,122,194,51,252,15,39,35,219,153,210,207,231,211,179,102,119,50,165,49,245,220,49,92,231,78,219,144,80,191,117,210,158,100,48,245,124,182,119,139,42,203,213,125,252,239,137,110,103,102,200,252,92,159,159,189,112,28,214,44,172,243,62,224,252,149,231,141,173,210,5,181,244,44,198,48,36,98,75,170,13,10,180,221,68,120,50,180,225,219,167,123,223,173,210,35,152,159,142,149,140,141,117,154,170,55,147,6,100,198,239,236,112,129,22,36,138,42,122,243,214,86,221,234,253,0,155,127,83,51,133,70,8,230,126,94,88,138,133,113,103,173,249,34,92,246,198,65,245,225,156,62,8,103,138,40,17,153,237,218,200,49,181,114,35,177,190,234,223,220,188,143,111,37,211,47,202,35,54,200,8,22,46,143,56,22,86,232,71,251,108,177,57,105,87,36,37,170,5,172,131,12,51,222,110,3,15,134,163,168,93,42,102,167,127,16,60,112,66,201,114,5,82,109,200,130,234,154,0,235,139,213,81,152,71,235,66,76,21,248,8,169,22,82,166,204,137,182,106,87,49,18,109,235,173,225,35,198,61,136,162,229,80,250,205,235,56,134,255,152,100,96,0,198,75,58,145,7,128,18,202,48,144,75,113,115,124,239,107,236,171,212,61,215,2,136,5,56,245,167,0,133,230,204,96,21,210,22,54,129,6,124,61,81,58,140,102,3,44,52,160,254,23,165,138,212,188,151,202,105,191,65,241,29,94,145,15,223,233,114,150,82,211,234,33,248,221,140,193,145,96,168,252,119,87,59,30,156,239,78,121,13,10,121,216,173,103,35,182,128,78,150,22,70,108,147,83,3,224,99,222,226,156,170,108,59,174,191,39,139,129,140,46,194,241,62,214,69,171,69,35,151,191,0,219,139,38,225,21,2,110,37,103,70,205,12,120,169,89,54,79,222,109,237,220,208,244,65,166,26,30,186,50,199,188,23,43,176,149,18,20,141,30,186,201,231,145,183,213,27,113,202,210,220,155,131,178,249,155,55,38,96,125,156,190,88,180,153,161,55,83,206,135,252,220,226,28,13,10,208,82,142,208,239,185,178,201,39,245,124,120,198,38,36,138,162,184,53,160,121,18,68,197,137,102,134,166,97,115,236,159,128,44,76,99,58,66,176,134,51,77,42,72,120,14,83,208,8,9,36,123,230,78,82,159,150,173,47,139,57,34,166,9,125,65,77,222,30,199,111,149,82,249,184,213,139,142,52,243,89,173,121,43,43,229,12,38,219,5,3,94,116,151,22,46,124,73,195,141,60,217,185,141,98,13,10,166,116,146,190,90,252,163,168,26,112,128,24,92,127,11,81,5,34,63,31,167,120,5,80,42,46,140,95,238,162,118,153,133,141,132,169,88,66,197,242,251,104,104,109,89,254,36,9,31,205,222,19,155,100,99,188,108,123,30,14,144,210,13,10,131,101,26,240,12,133,121,123,185,245,62,206,193,103,92,126,230,54,208,217,231,125,189,143,137,103,15,133,94,228,212,128,15,243,246,149,14,255,9,187,248,160,218,246,184,36,40,64,207,165,186,115,190,185,81,21,244,167,139,204,2,216,94,204,224,192,242,239,111,50,138,209,221,108,192,73,90,51,21,180,20,164,214,29,165,13,164,109,122,204,239,246,238,86,69,24,5,210,107,3,89,175,25,53,49,249,95,101,137,206,173,111,160,65,175,21,48,103,248,138,13,10,47,236,209,53,197,102,130,219,43,69,167,29,31,167,55,192,100,238,154,79,64,75,183,42,112,179,175,3,48,53,147,147,36,126,199,129,81,36,130,87,152,101,36,13,10,35,205,132,121,242,28,44,68,161,25,235,196,232,27,48,141,216,170,134,230,12,61,216,173,165,14,13,254,131,8,235,26,127,32,30,222,141,207,218,64,90,239,180,126,14,108,167,221,179,118,220,178,29,55,247,172,196,211,233,242,107,3,168,222,14,137,64,202,58,158,117,150,58,56,157,248,3,141,44,72,96,114,246,28,12,234,245,0,117,60,122,99,82,177,205,3,56,217,33,43,66,164,211,218,35,213,189,244,76,39,201,75,136,164,21,163,36,47,254,46,27,51,36,119,162,29,43,156,224,117,238,71,156,110,101,122,77,136,116,168,197,57,100,34,147,16,224,30,212,243,198,134,254,245,37,142,223,59,70,77,214,255,215,241,202,244,115,187,231,34,214,15,177,74,180,145,142,147,135,138,138,228,119,57,48,184,206,225,16,244,118,127,66,165,45,147,4,197,91,225,40,70,201,17,161,13,10,185,178,224,54,191,157,253,89,127,83,72,212,34,51,49,95,168,13,15,86,60,56,139,194,83,33,3,240,94,144,219,241,146,63,34,159,152,13,10,47,69,133,199,163,115,81,19,114,208,125,203,172,165,131,9,158,169,114,192,62,90,166,126,102,56,130,109,177,52,86,77,185,147,206,235,110,122,102,89,199,197,192,92,49,2,103,213,248,162,78,236,45,92,195,227,243,200,8,230,214,6,141,26,87,100,107,55,250,189,152,236,183,186,249,158,125,154,196,65,74,73,26,115,202,52,197,47,57,67,82,246,181,161,95,15,196,216,134,34,218,198,148,105,156,36,100,132,173,172,59,29,54,106,254,222,42,44,210,4,44,144,81,106,102,106,25,169,28,128,36,139,17,34,75,237,223,26,50,14,35,7,57,231,85,208,152,182,166,115,21,83,95,76,24,124,250,103,237,129,122,3,80,86,53,63,200,89,191,40,99,23,153,111,255,180,120,162,36,139,144,143,241,42,189,231,5,64,34,36,163,238,95,70,61,211,210,67,135,92,132,224,45,185,104,236,161,204,82,199,81,113,234,80,214,168,140,169,19,39,167,170,87,149,1,159,54,192,161,156,9,58,28,157,55,35,199,86,143,157,65,242,228,255,183,18,253,71,248,151,112,61,122,98,11,88,107,129,147,108,132,170,237,97,216,67,50,179,190,188,79,149,183,150,185,62,247,161,245,101,196,148,248,166,94,219,33,226,238,24,220,2,85,34,239,142,89,152,135,202,40,54,6,156,221,216,137,136,229,134,41,119,183,71,37,132,48,49,152,204,233,126,249,249,225,68,109,31,31,94,209,207,198,102,168,160,195,160,62,23,146,239,182,13,10,155,64,101,73,224,222,223,106,204,219,217,135,66,86,139,71,53,167,71,216,229,222,33,230,48,18,90,224,198,145,208,84,228,33,153,193,91,31,128,202,250,110,123,178,0,95,55,74,154,95,153,0,171,183,64,156,205,80,195,175,204,171,18,20,230,168,86,247,199,235,168,155,195,41,24,1,225,52,61,169,218,210,198,237,7,92,142,202,20,35,180,62,88,122,236,103,230,20,82,114,129,75,63,25,27,60,40,86,57,249,226,214,225,72,160,45,194,203,192,224,84,214,41,92,208,93,186,193,149,4,0,169,24,147,22,240,38,91,134,167,50,211,2,197,190,232,237,35,55,104,242,55,198,38,0,203,170,255,58,17,13,94,251,108,199,202,59,146,217,101,202,124,94,141,62,100,236,242,57,254,37,7,252,121,127,219,229,76,17,18,178,141,77,164,76,96,171,9,217,148,197,186,120,214,99,162,89,25,52,204,5,43,199,12,209,220,163,50,92,102,201,203,152,46,32,57,245,219,112,200,72,211,220,239,101,91,28,44,208,206,200,134,95,232,225,192,162,103,190,79,112,126,206,111,90,61,252,163,204,30,223,146,199,96,67,159,81,170,105,164,193,128,30,150,202,77,110,164,173,152,2,88,243,209,92,137,57,19,171,206,9,16,25,132,198,27,145,214,3,5,62,73,169,124,184,47,186,112,125,174,138,241,213,121,253,105,200,72,28,183,183,18,203,205,219,77,40,123,233,149,227,44,2,179,153,96,42,8,185,221,132,144,57,181,103,63,25,48,190,199,191,54,110,176,130,210,202,93,178,56,92,140,196,91,227,252,14,49,130,1,145,168,20,235,167,196,242,59,25,56,230,196,216,0,115,39,135,205,44,185,127,118,45,252,133,212,183,152,128,155,95,34,84,216,38,202,66,179,38,149,66,141,18,2,152,180,76,243,132,148,229,98,64,183,93,241,228,30,70,229,60,68,220,80,84,82,37,109,254,200,25,64,141,96,95,241,77,108,31,63,21,47,47,234,150,234,13,10,179,180,114,216,112,78,6,190,159,140,62,131,149,202,173,208,109,109,160,51,232,26,222,93,195,184,61,175,247,67,198,233,228,135,22,0,61,53,141,246,60,215,253,62,47,114,125,31,45,12,41,150,47,118,213,201,94,212,75,111,8,208,82,2,90,102,87,133,242,100,163,213,245,89,54,119,182,48,230,40,181,234,129,251,55,207,253,122,48,183,250,210,38,182,253,200,43,8,120,175,76,14,196,244,36,58,128,123,152,57,234,98,188,189,247,194,233,179,13,10,98,56,118,230,50,224,132,235,244,162,30,218,4,252,136,161,192,112,33,208,199,46,195,233,105,212,73,254,176,142,88,38,236,32,229,91,33,234,113,234,89,246,227,176,113,11,13,218,179,38,27,74,32,41,236,171,104,193,154,221,81,116,229,93,94,152,74,78,95,56,245,146,163,2,254,230,236,231,50,221,232,65,162,134,114,198,32,204,93,104,116,85,165,192,111,169,254,104,131,148,160,79,150,49,46,208,37,183,170,111,188,226,146,95,58,229,89,204,24,134,190,236,219,112,130,46,46,92,163,247,50,168,116,4,177,83,106,172,70,153,137,233,97,12,250,68,13,10,206,67,135,90,112,202,81,243,108,182,246,41,217,66,76,30,53,168,143,146,213,218,60,216,203,174,110,132,37,163,105,104,226,31,79,48,52,151,73,224,32,91,255,141,85,40,55,214,252,57,83,37,37,55,11,186,200,51,247,95,24,84,201,63,197,51,164,170,83,173,247,0,129,115,167,13,148,164,235,245,56,234,158,98,188,218,124,32,224,160,115,190,226,239,172,52,210,239,29,3,186,189,81,71,101,158,80,181,87,4,91,46,184,157,179,3,116,155,4,211,245,75,67,254,214,18,252,198,130,6,224,1,167,175,233,2,48,217,193,47,116,163,44,126,219,93,2,65,220,58,93,81,72,31,215,200,250,224,143,238,38,63,188,237,124,125,145,27,58,48,60,131,90,245,250,223,210,24,246,26,157,109,232,4,133,171,202,136,32,0,71,176,148,68,31,119,103,185,122,36,232,198,18,89,15,162,64,123,171,30,139,86,199,25,20,238,242,53,93,217,124,250,252,193,146,188,6,252,224,99,211,217,209,166,41,170,220,117,227,191,32,114,52,194,8,231,227,6,99,237,214,145,4,48,101,201,203,196,115,217,124,109,77,211,223,245,157,106,154,188,221,68,18,195,18,143,96,49,96,170,216,248,28,110,122,77,202,243,95,58,153,180,234,16,163,67,117,180,119,194,191,132,101,33,167,234,189,77,40,7,142,147,64,69,42,25,143,63,90,204,61,183,227,144,137,57,255,110,55,9,198,163,253,152,137,67,154,74,227,225,11,97,140,201,46,20,182,132,41,163,173,44,128,148,13,10,16,121,69,46,194,102,242,84,101,123,231,215,154,42,36,8,74,247,63,109,247,31,188,211,43,246,145,58,63,171,37,249,119,120,127,123,176,195,163,232,186,179,141,122,45,176,180,130,105,80,100,61,209,224,59,215,221,31,177,73,163,56,98,168,146,38,183,203,69,77,175,97,49,40,194,7,84,112,228,46,112,169,68,74,142,110,202,82,99,69,171,72,230,245,22,11,162,59,91,221,253,166,4,158,196,78,209,70,28,126,13,213,20,177,110,47,178,133,247,32,57,222,60,121,130,239,212,13,127,108,142,143,76,243,90,199,27,70,123,252,87,128,2,232,210,35,154,47,210,196,188,205,216,175,61,125,177,244,174,127,45,46,8,17,223,157,1,85,186,110,222,80,181,240,82,241,79,106,184,132,255,242,68,216,128,108,7,235,203,73,237,34,216,93,246,150,153,89,145,169,84,170,151,161,236,216,106,205,118,224,97,183,84,30,135,153,127,239,6,87,168,38,189,136,239,58,74,89,32,70,44,101,149,231,161,86,244,83,41,28,160,68,206,216,16,134,12,59,1,73,188,231,59,236,167,19,4,6,100,173,5,145,48,65,6,18,150,0,175,113,49,123,13,41,7,131,156,234,201,149,21,211,87,233,128,177,147,123,110,18,0,170,202,218,32,84,33,0,31,27,47,145,117,62,128,210,38,60,86,170,22,74,116,112,26,141,95,210,142,70,72,11,13,217,99,166,131,161,243,85,215,251,68,99,199,52,124,148,234,94,44,164,11,96,181,98,151,203,34,217,114,197,187,16,229,103,21,169,85,96,82,86,193,84,29,159,59,197,118,138,111,53,92,211,184,99,240,250,26,120,30,219,73,54,143,81,178,148,129,203,180,29,74,235,7,175,157,190,143,82,197,208,255,117,247,251,100,49,211,125,106,237,132,215,140,119,136,113,203,15,113,91,79,7,88,15,35,181,134,201,105,200,27,71,31,246,166,199,39,111,126,20,30,2,168,88,77,75,154,176,14,123,214,67,210,195,250,170,41,155,31,30,37,4,132,97,149,46,164,45,72,130,118,138,112,222,70,178,19,162,135,248,211,26,196,109,84,54,242,42,121,108,5,209,254,80,169,188,42,146,128,102,98,122,13,135,221,87,163,173,145,219,68,100,4,180,21,87,209,69,120,115,72,32,5,234,32,145,107,190,70,198,19,244,86,200,73,212,107,167,157,32,98,123,68,107,47,73,227,250,48,154,225,79,140,66,12,253,148,146,44,188,15,185,211,90,15,125,190,245,119,241,132,154,26,128,224,1,29,168,172,8,42,140,111,97,101,142,101,173,23,122,189,242,62,225,124,140,240,210,107,159,163,166,233,72,55,235,158,147,3,54,136,151,103,168,215,234,60,233,128,168,234,149,82,139,0,73,87,190,96,103,205,155,216,224,42,15,35,204,23,98,204,166,86,211,52,18,255,69,233,23,253,74,3,235,110,140,31,67,253,176,168,150,90,51,180,253,38,188,36,162,11,48,76,168,23,232,132,149,186,155,54,26,62,147,55,23,255,176,39,31,127,112,197,211,203,161,232,109,15,81,191,58,186,25,77,175,50,195,92,121,102,39,208,12,123,34,113,172,226,70,62,55,233,123,60,130,108,243,219,96,2,143,36,15,148,82,203,224,143,126,188,197,253,177,188,187,60,50,122,159,69,11,158,86,113,145,97,1,214,227,229,228,88,202,49,240,77,18,245,146,248,59,173,162,195,104,61,56,134,170,59,64,57,99,171,93,190,34,15,236,0,3,122,116,88,57,246,122,54,53,223,211,191,240,143,54,116,130,150,45,237,136,236,246,50,40,82,214,67,165,77,93,48,62,176,75,253,222,233,187,161,235,204,186,124,101,59,58,97,58,142,113,154,222,190,60,225,189,126,117,78,95,73,119,232,99,227,194,211,136,166,82,39,180,81,212,243,164,249,78,6,81,60,186,74,193,242,245,17,97,63,240,53,97,22,132,204,196,97,89,144,0,229,70,228,217,114,202,105,96,224,149,165,38,228,115,90,35,66,26,76,155,89,126,206,8,175,162,117,53,146,189,22,222,217,50,85,161,227,61,238,206,60,94,183,123,148,103,14,129,55,242,164,164,185,138,193,147,37,142,125,234,93,184,64,138,128,97,136,242,209,221,196,64,204,240,233,166,226,240,199,143,219,215,182,141,212,147,157,36,88,193,150,91,248,190,212,86,75,50,70,47,255,62,200,146,192,59,17,211,234,129,63,171,76,251,232,211,1,99,41,197,183,227,223,237,15,8,40,77,68,170,11,122,47,107,201,110,164,80,62,142,245,42,100,194,43,237,107,69,37,129,174,143,248,145,125,83,151,100,113,148,26,145,22,162,216,120,251,37,65,181,97,118,122,189,78,49,204,216,165,144,202,3,73,76,98,175,253,100,234,13,10,27,199,121,23,61,173,132,153,156,122,141,132,78,177,37,157,231,187,91,37,205,2,53,55,164,116,165,36,235,228,102,11,34,86,137,73,230,36,216,254,160,173,55,244,206,30,199,89,85,238,250,73,198,191,24,3,190,135,233,201,134,95,243,246,184,82,91,140,21,254,136,53,202,21,61,39,230,192,255,12,165,16,41,167,169,24,93,37,240,241,77,134,252,121,125,204,31,153,238,151,226,5,75,156,42,46,6,253,190,184,222,246,205,211,104,191,35,168,88,217,248,193,222,253,206,175,27,74,141,229,234,252,96,76,236,207,13,40,91,224,13,10,169,18,234,182,110,255,77,55,173,46,254,52,133,59,191,216,124,224,155,24,116,155,72,153,67,238,202,231,136,123,0,111,184,39,209,1,145,218,209,132,102,205,31,134,80,88,121,49,13,10,139,23,31,144,46,160,194,106,56,142,19,181,60,112,2,114,206,226,191,180,122,203,88,36,124,19,68,156,107,185,208,18,50,195,37,23,53,143,26,61,224,100,212,60,24,248,130,125,83,120,156,207,60,226,235,231,137,73,166,171,250,26,107,132,20,206,54,13,10,94,34,175,183,209,220,230,245,160,97,130,195,185,132,180,249,187,26,144,90,157,90,20,131,117,13,10,29,224,168,87,205,92,6,148,94,183,212,162,166,191,18,55,243,42,21,79,220,6,213,26,112,61,68,254,5,47,211,197,62,158,143,65,123,53,209,200,81,249,32,58,137,151,82,21,41,242,26,216,73,143,150,147,13,10,167,126,186,248,46,224,42,87,188,119,199,146,217,242,32,41,75,69,244,142,168,253,148,224,28,210,86,69,211,109,22,137,35,86,47,63,220,147,203,121,221,71,96,218,12,16,60,38,117,114,45,122,27,121,252,180,36,94,209,47,160,219,82,73,44,156,206,88,179,51,207,238,130,40,18,247,220,166,142,128,44,69,27,92,250,235,172,96,139,149,3,134,182,197,130,57,209,198,45,98,77,213,209,87,130,252,85,34,34,204,160,109,223,56,123,55,62,50,195,194,134,76,99,199,104,53,12,55,40,55,96,243,81,90,91,13,10,253,102,196,138,181,34,235,62,128,140,6,31,92,214,189,150,205,24,201,131,157,48,80,142,125,78,219,136,232,241,30,49,225,9,25,177,107,121,113,240,109,120,119,160,88,216,164,148,76,132,252,108,174,223,51,65,180,139,110,13,60,123,133,215,16,224,195,95,91,80,83,207,75,71,152,179,119,140,194,139,45,199,174,13,243,164,159,159,59,205,142,149,215,70,195,92,63,71,214,139,138,163,93,151,170,8,231,17,181,251,231,13,26,98,60,130,84,30,189,197,26,130,125,13,10,105,230,192,73,8,122,210,111,37,110,183,87,127,88,204,255,188,203,165,169,93,9,61,194,148,100,201,163,141,233,91,198,177,133,57,99,178,222,176,181,122,209,36,141,111,22,37,225,21,238,185,81,11,87,114,170,228,227,200,102,101,125,176,179,191,14,13,10,195,69,225,22,248,212,151,107,119,8,118,255,227,116,140,54,22,85,34,153,31,70,163,111,25,61,209,161,201,71,19,103,60,126,76,129,88,35,145,182,54,199,45,233,76,230,37,67,116,249,155,98,62,86,134,193,61,138,131,34,232,62,17,187,11,13,10,137,108,106,140,44,79,117,108,83,133,205,112,23,242,109,35,247,195,238,151,55,44,134,140,140,145,85,129,114,59,182,183,107,76,60,232,153,142,79,166,202,64,182,51,223,218,165,155,169,2,164,149,45,169,14,196,252,60,240,242,103,106,207,167,247,111,120,35,111,162,222,16,253,53,69,53,114,21,36,107,183,229,39,242,119,194,139,53,60,198,215,157,206,242,27,204,143,119,96,60,221,88,162,204,221,190,58,152,2,249,65,206,216,224,53,49,56,117,49,149,72,196,25,146,162,190,147,154,23,204,16,148,38,227,56,37,174,89,188,209,124,177,159,80,217,114,255,203,231,217,180,176,187,9,83,3,217,220,157,64,102,150,194,80,141,108,233,158,17,207,0,246,70,17,71,233,116,73,237,95,72,109,72,13,10,134,211,167,172,236,183,233,169,69,152,71,36,239,194,28,80,121,177,253,3,237,128,60,45,234,252,227,50,125,45,120,39,113,95,214,93,149,6,33,108,136,176,250,38,147,94,149,198,65,20,165,25,25,212,25,3,139,26,126,156,30,130,159,191,181,50,117,9,55,82,223,25,137,26,151,243,203,247,113,156,31,214,203,23,1,154,109,45,37,54,14,202,128,76,75,53,23,38,98,204,71,105,210,183,133,198,200,126,90,78,204,227,23,4,229,159,113,38,59,124,60,174,200,172,180,199,66,110,194,95,17,160,4,35,35,238,108,62,235,4,40,77,186,226,199,112,188,65,157,206,121,189,69,96,174,164,21,113,195,181,149,245,37,96,25,29,199,168,251,246,61,65,58,119,160,144,94,81,116,65,177,108,43,80,30,162,249,233,156,195,141,5,38,121,242,136,253,241,137,69,66,227,166,105,137,160,9,1,133,235,46,117,19,75,250,61,145,71,195,219,138,98,29,157,53,227,119,134,133,55,121,225,87,180,127,113,98,109,107,62,99,48,5,145,89,193,117,150,193,184,127,226,180,255,71,237,157,120,250,76,33,96,7,114,118,200,181,140,239,93,192,48,180,165,216,60,242,87,9,108,4,127,230,77,227,7,197,152,184,21,5,142,114,213,245,125,245,195,105,230,100,225,55,222,41,52,158,47,157,205,140,159,78,186,110,118,91,99,39,215,162,13,252,178,7,17,39,63,216,9,28,186,96,92,76,73,66,72,7,111,126,3,223,101,166,165,1,100,152,11,187,183,8,116,30,91,246,5,110,111,153,109,192,127,255,64,140,91,142,171,141,206,195,21,233,40,115,34,140,128,93,68,64,166,71,14,62,227,152,55,88,221,33,28,156,236,219,250,164,201,48,12,186,0,96,138,75,36,4,163,199,175,1,122,59,126,103,243,159,11,81,172,249,80,211,231,92,199,188,43,141,52,128,32,47,169,88,232,238,11,36,5,1,82,50,238,13,38,76,124,160,44,24,202,69,203,60,45,227,34,211,235,127,0,249,69,93,182,197,177,244,229,156,62,149,82,14,195,109,125,144,60,187,98,93,112,181,75,246,248,37,94,65,38,4,187,178,159,238,2,108,198,96,87,127,145,219,29,180,166,19,238,239,178,12,247,174,60,216,157,86,90,200,56,65,107,1,181,222,79,250,85,80,209,127,181,31,187,235,226,28,241,213,96,56,134,62,233,49,185,13,236,46,33,30,212,43,169,46,194,68,212,206,44,78,197,202,135,160,38,153,39,114,220,42,247,84,252,152,43,148,243,110,167,183,191,117,224,236,233,12,187,42,106,161,160,18,232,137,139,214,121,194,60,179,130,124,53,213,208,47,5,105,199,170,130,97,93,74,166,117,24,236,246,104,211,181,125,110,241,168,1,52,36,172,34,104,186,13,154,116,213,136,121,237,207,99,130,168,157,57,120,100,148,3,3,234,236,69,163,131,4,186,139,28,177,152,150,122,226,62,184,16,84,190,116,177,105,9,164,5,232,167,121,156,238,60,39,15,226,166,220,80,189,115,112,182,178,200,253,185,168,125,136,213,212,3,72,211,152,78,57,198,147,182,244,72,109,153,71,120,96,122,128,163,18,40,114,221,101,228,4,146,16,124,113,195,207,112,138,151,23,233,238,250,251,221,194,57,197,58,169,100,91,113,16,56,229,156,139,134,27,55,65,26,178,3,155,237,249,207,208,15,8,217,197,215,97,84,66,127,245,221,57,135,140,236,197,215,191,179,241,240,53,8,113,133,192,152,31,60,33,57,190,132,135,47,250,211,64,133,49,196,234,147,135,184,159,94,62,199,121,232,133,13,80,153,45,253,207,145,50,188,85,30,152,89,67,176,118,24,172,16,209,21,4,81,240,132,76,13,196,29,110,23,235,80,141,200,104,158,199,38,64,13,90,127,111,235,60,199,188,224,95,9,34,139,124,178,197,57,54,100,216,221,154,75,150,177,2,14,242,93,112,170,45,145,202,233,58,251,95,43,240,170,24,202,92,89,159,161,167,8,239,53,191,143,127,254,201,175,193,242,66,135,13,2,139,43,20,89,6,59,73,57,67,239,18,131,130,151,131,225,1,2,66,229,207,77,163,157,147,213,6,243,137,41,54,231,214,207,17,36,112,165,33,211,151,67,135,51,208,83,148,76,255,18,214,255,174,130,70,242,6,24,104,79,38,55,21,170,152,225,93,114,165,38,56,62,5,194,50,20,183,131,56,229,180,118,240,152,29,144,5,110,110,93,13,182,107,29,242,41,142,89,123,42,190,29,129,126,24,190,176,86,230,94,219,66,52,52,45,150,0,71,11,20,32,201,33,4,25,216,52,228,49,184,47,88,96,140,135,172,54,26,2,208,241,254,75,71,13,10,61,113,224,210,27,184,126,16,35,212,40,226,61,89,108,185,225,162,24,68,3,161,110,54,230,68,188,207,155,189,226,114,144,72,80,87,230,40,39,40,62,115,128,175,120,107,243,149,179,150,27,165,234,70,156,49,87,99,250,89,224,241,118,239,129,152,95,56,184,130,222,86,167,77,18,142,37,109,27,137,147,151,40,229,90,146,171,162,26,107,120,68,250,193,186,123,189,216,179,74,24,25,74,41,132,176,0,56,15,233,246,114,232,62,253,191,39,111,231,151,163,37,129,91,15,37,204,149,201,122,157,172,245,109,88,52,134,48,93,124,158,81,167,227,55,209,78,59,144,3,51,235,56,253,147,169,149,135,218,35,65,177,12,5,156,113,206,8,15,231,83,60,15,5,159,164,14,86,13,10,249,196,164,26,75,230,251,69,132,111,248,247,129,101,225,11,74,212,15,38,75,207,85,150,161,232,239,140,182,234,75,26,58,92,105,5,154,177,86,56,67,103,158,203,37,17,169,14,136,152,245,66,149,100,156,183,61,39,119,96,216,208,74,186,204,123,204,110,119,122,5,48,226,6,124,203,192,134,115,249,200,193,120,249,214,114,172,138,21,229,54,127,12,86,81,181,62,117,224,207,165,124,147,23,70,174,26,103,156,36,109,124,148,23,241,205,137,221,219,209,23,60,47,136,11,123,56,71,203,204,235,249,159,113,34,232,50,215,201,186,254,43,84,203,170,30,212,129,88,222,63,54,35,139,118,176,230,118,68,162,138,234,153,109,220,0,111,106,192,36,46,75,102,118,57,231,82,60,188,144,160,86,17,147,193,175,52,72,28,46,244,2,238,67,168,46,30,191,78,61,96,27,179,107,45,149,205,147,85,13,97,206,231,169,78,114,246,211,12,50,200,249,26,97,233,100,177,246,106,207,195,152,127,149,212,2,143,17,110,154,154,132,116,170,41,193,193,169,132,190,14,57,59,220,65,220,239,106,111,16,24,219,96,213,32,36,137,157,142,181,213,93,50,77,115,243,155,250,71,55,123,158,21,179,176,106,117,133,88,159,207,82,165,70,132,23,62,81,131,54,126,123,9,82,220,75,194,118,124,76,98,71,177,214,16,62,82,188,123,126,166,41,143,69,76,93,151,172,87,95,25,193,13,10,205,255,78,16,199,211,117,92,250,180,32,12,172,84,82,105,255,29,141,176,214,7,199,173,71,244,13,223,37,122,180,231,208,117,5,119,0,60,19,228,148,25,96,195,221,123,7,116,221,172,24,232,171,175,143,83,224,60,190,246,213,123,68,242,76,248,33,1,76,6,66,120,253,81,179,66,117,147,209,118,148,180,171,206,129,244,156,187,152,76,88,120,205,240,195,141,30,215,253,153,176,185,163,189,141,143,246,33,149,136,179,184,250,89,208,205,209,217,178,246,81,34,171,69,228,143,23,87,70,123,146,4,146,97,64,227,195,80,197,169,39,162,231,0,23,48,83,236,53,211,241,218,45,114,88,113,76,151,250,168,87,240,137,137,23,189,148,98,92,109,30,45,119,19,142,252,170,175,81,123,23,254,24,122,34,18,194,74,136,26,44,106,100,125,239,99,118,237,128,174,65,117,197,238,128,146,31,0,25,149,180,78,73,240,211,61,217,7,90,207,51,187,3,103,28,11,204,52,173,87,132,173,28,223,237,58,109,155,161,3,179,221,193,204,45,231,77,187,87,106,2,119,113,82,117,33,140,209,156,168,137,146,9,18,82,102,216,191,18,134,248,129,220,194,195,131,116,157,30,118,141,103,15,64,153,247,222,149,158,223,232,82,88,49,131,201,17,22,1,40,129,165,106,36,170,240,32,234,69,205,95,57,102,13,235,206,48,172,28,123,140,252,96,56,123,27,12,62,54,27,230,18,253,250,159,1,183,228,180,161,136,57,162,199,224,227,147,235,197,173,154,138,78,188,49,106,116,12,28,41,93,158,245,244,223,250,6,103,249,88,44,11,184,55,177,66,196,207,198,177,121,142,148,118,208,99,17,17,3,59,139,167,90,16,253,200,0,226,171,30,14,130,150,50,248,105,207,228,115,123,233,226,128,7,89,238,8,49,220,125,17,149,234,248,5,85,119,25,129,221,109,198,96,104,18,217,44,184,239,134,68,127,95,108,111,98,109,14,38,92,103,229,42,99,25,24,158,227,73,212,142,73,223,230,169,233,143,118,196,20,161,227,33,122,224,162,21,161,126,84,170,73,143,78,205,197,2,66,172,199,226,50,47,99,187,47,242,24,157,5,126,115,84,227,42,62,209,128,49,22,23,107,155,157,1,41,147,15,145,158,47,236,40,11,44,137,36,228,158,123,183,87,104,162,238,29,168,173,190,212,227,88,153,6,223,27,146,58,239,132,193,189,50,116,56,183,49,1,46,105,187,13,67,161,132,44,184,139,181,78,164,81,100,119,247,4,207,235,40,110,62,164,131,68,90,212,215,69,134,252,243,46,150,211,102,144,16,132,54,95,105,58,83,197,251,83,47,191,231,188,12,173,196,4,196,152,80,66,214,141,187,144,166,220,218,53,49,238,50,77,85,138,33,79,147,92,217,252,201,160,206,190,155,95,176,50,63,75,56,32,82,149,153,239,72,238,6,139,90,206,133,0,79,234,41,132,240,168,111,90,201,213,97,99,187,254,17,66,183,116,20,143,30,176,164,220,137,195,52,144,82,83,58,125,230,103,41,219,36,65,184,47,143,115,96,17,29,172,246,146,147,201,178,129,160,83,79,62,158,146,36,167,92,73,168,50,242,139,46,73,114,98,71,85,7,182,221,250,159,1,202,13,10,102,150,227,245,172,126,166,133,149,235,160,194,235,138,71,129,63,249,54,216,74,193,178,62,202,122,162,134,43,121,60,203,176,223,159,221,73,49,190,243,84,206,193,47,191,71,133,89,254,194,159,129,173,244,69,46,131,150,62,86,84,29,49,243,105,28,147,165,15,11,186,94,149,82,196,242,162,58,110,83,6,7,41,133,74,61,215,28,196,48,139,145,149,125,177,158,102,170,161,143,166,112,85,169,80,241,194,207,247,138,3,188,26,88,140,246,36,105,96,104,6,135,25,175,177,0,28,69,129,238,7,33,19,136,45,144,82,178,30,53,93,64,30,216,205,36,208,103,185,158,97,107,218,90,13,10,90,147,54,252,73,150,50,183,159,242,253,13,239,176,150,239,70,183,94,45,78,15,72,218,234,35,151,25,254,196,217,162,152,24,245,135,95,197,4,26,158,219,210,108,175,13,10,206,20,204,128,186,73,187,165,158,145,142,179,216,241,229,65,170,22,2,101,133,162,247,45,247,216,53,65,129,109,228,105,129,251,62,253,12,48,228,88,207,173,4,199,148,33,171,124,73,37,226,58,234,7,249,240,24,67,28,121,0,2,89,109,38,189,150,99,181,27,105,157,245,62,72,130,203,195,78,222,136,235,85,4,91,136,155,96,98,227,95,209,224,24,188,231,133,21,123,133,236,59,156,166,200,93,75,22,35,130,117,56,91,130,133,219,1,45,143,183,201,245,185,70,164,29,122,15,184,120,255,114,195,150,131,20,77,138,0,124,255,99,27,67,116,143,45,95,198,144,48,15,155,192,200,55,0,107,146,236,235,224,96,94,140,58,74,64,14,24,174,137,151,209,180,95,238,16,6,142,36,124,100,124,248,44,109,251,229,232,129,213,17,255,166,135,183,174,183,133,70,191,208,125,95,126,194,66,220,239,73,48,216,170,173,140,97,82,182,100,42,172,50,89,99,253,20,127,35,107,184,80,169,150,101,115,157,6,205,189,124,167,154,82,125,207,70,30,51,242,43,201,197,219,0,218,43,211,221,221,140,153,217,151,147,188,152,40,42,168,135,47,249,108,57,66,133,216,45,148,25,235,120,182,174,55,165,245,25,57,119,0,247,93,98,74,9,189,37,91,87,110,149,90,50,62,120,78,143,195,17,49,240,3,176,227,2,74,79,88,254,242,166,192,67,121,98,1,252,66,84,130,225,21,94,34,157,27,45,67,239,123,13,34,50,43,34,239,92,154,27,224,38,161,195,211,117,237,175,249,149,151,225,229,71,121,82,164,232,210,172,245,208,20,188,0,220,42,39,47,166,43,105,131,226,125,34,136,129,226,239,43,139,149,166,129,203,233,12,95,222,22,51,28,133,34,47,226,161,111,13,10,60,48,0,166,62,46,33,102,108,12,17,159,138,248,154,84,61,55,151,112,105,165,172,241,85,99,36,240,82,4,206,140,173,80,255,79,182,48,217,203,191,195,36,222,218,88,74,165,106,153,211,167,111,245,91,220,44,46,163,160,33,54,28,205,74,131,199,165,226,118,141,33,15,166,222,136,159,212,138,57,214,121,201,78,195,201,154,141,51,255,17,55,125,167,246,241,183,26,42,5,179,2,236,222,149,79,38,119,63,57,172,136,21,66,240,208,150,156,57,149,195,81,154,142,247,11,66,32,216,107,240,27,238,204,100,98,133,94,123,104,110,26,255,28,169,31,184,253,139,74,105,225,14,224,194,173,148,173,212,68,73,80,111,155,110,244,54,65,242,2,110,255,110,96,92,103,5,96,194,183,71,6,251,148,154,167,232,204,106,45,13,98,7,228,87,231,253,135,236,27,144,146,220,104,185,20,57,71,204,142,209,74,253,220,191,143,221,162,40,167,104,71,249,104,2,229,97,246,124,238,253,228,90,229,135,103,57,131,252,4,201,103,68,219,170,131,242,220,131,141,99,57,67,199,93,203,158,100,16,71,78,178,123,52,143,38,229,5,240,171,144,135,137,64,232,70,197,233,243,197,254,140,53,88,195,35,107,27,136,196,5,113,105,73,184,80,104,65,202,190,23,23,71,75,183,195,13,185,28,222,227,59,15,132,72,17,118,47,174,197,53,189,207,132,193,199,71,206,249,177,250,97,210,175,181,168,19,53,188,66,192,106,148,215,213,155,126,222,85,188,246,249,134,122,238,16,117,85,205,208,132,183,104,76,44,135,8,116,117,163,154,157,166,52,123,226,129,206,86,53,164,208,120,101,186,152,206,38,193,70,91,26,176,52,63,73,255,55,180,208,202,159,59,182,147,215,141,195,178,25,37,203,153,106,3,141,204,23,37,39,254,87,192,116,96,239,57,192,125,67,150,231,250,151,13,159,34,171,210,26,156,121,75,100,173,150,118,44,116,40,245,154,135,87,195,109,108,79,251,35,33,97,149,160,76,42,44,46,123,16,239,113,147,147,21,68,215,130,254,228,185,30,1,17,156,85,83,187,198,37,34,112,168,216,197,109,214,45,68,143,90,216,220,105,204,180,94,31,23,240,170,30,68,81,41,221,0,240,0,0,91,35,211,141,233,58,59,229,90,76,4,25,71,243,107,78,69,54,227,7,208,24,5,83,249,46,70,183,67,136,28,181,213,56,108,72,199,213,248,76,43,205,6,185,197,1,247,140,126,230,31,162,53,22,121,31,207,77,178,120,175,104,138,46,96,16,165,102,146,173,146,0,132,151,72,126,223,228,189,95,160,131,250,84,65,56,178,13,105,64,2,8,135,227,93,70,224,147,183,31,122,4,166,116,96,220,129,22,180,212,131,150,37,215,202,105,89,214,131,28,217,63,129,172,78,162,112,144,54,221,115,131,100,253,231,17,19,191,34,235,241,61,254,22,66,229,100,112,30,111,15,254,117,17,237,240,63,228,72,194,178,140,100,251,125,84,185,76,165,118,228,129,250,86,178,177,138,241,12,113,246,153,182,191,212,116,89,205,225,134,157,15,211,6,191,72,154,111,66,229,178,240,92,207,85,187,107,149,38,151,61,25,203,19,76,167,241,63,29,179,113,111,140,194,23,115,168,50,86,140,22,37,11,92,219,22,223,36,191,129,212,159,91,55,1,139,211,16,38,46,167,7,129,7,134,138,176,33,108,236,131,206,252,171,30,159,44,102,90,49,88,92,160,77,192,24,121,202,167,154,170,90,178,1,181,22,247,5,43,1,177,107,238,86,6,9,131,147,176,229,217,249,229,227,244,235,32,246,60,149,142,121,109,244,28,242,136,57,245,198,42,4,49,100,135,69,215,131,123,81,159,58,163,107,198,192,142,240,64,204,245,61,155,109,140,12,125,26,132,215,7,236,87,163,198,172,154,98,171,55,37,26,1,165,237,64,253,236,111,91,230,227,76,106,145,208,88,49,148,57,119,138,46,229,208,54,62,46,31,51,70,60,51,50,125,5,255,192,203,240,141,91,196,87,199,35,4,72,151,47,185,180,208,215,130,186,125,191,16,211,255,239,139,245,35,110,193,109,77,214,208,216,112,217,213,235,92,100,201,164,106,79,88,61,79,131,31,238,116,176,229,179,58,9,171,253,68,68,146,155,216,246,56,205,114,234,185,156,242,233,85,29,244,39,104,57,100,165,146,228,157,24,111,40,82,88,197,213,246,33,150,169,133,50,66,29,115,227,73,95,130,105,95,238,198,225,149,44,86,45,84,107,40,97,143,250,238,190,255,3,165,127,77,133,80,33,248,91,12,123,195,127,204,109,169,174,202,9,155,100,107,153,212,24,150,9,211,255,45,86,66,47,140,55,233,118,64,41,62,199,201,14,51,128,136,120,54,244,147,143,191,73,92,172,20,251,165,100,141,137,40,45,141,73,217,26,247,62,211,101,129,19,157,139,212,37,81,226,99,232,48,234,60,110,179,129,216,92,66,215,76,80,219,12,202,236,3,245,53,173,233,33,40,160,22,14,129,28,52,116,131,9,175,118,4,145,155,102,205,67,235,92,169,117,48,45,203,96,118,254,182,189,214,255,85,151,111,233,144,251,12,233,171,177,27,25,84,3,251,38,227,214,198,160,222,28,91,231,158,23,26,97,226,31,121,238,141,190,122,131,37,25,129,62,246,179,62,160,152,194,195,42,222,162,25,171,42,172,139,9,63,64,0,9,149,83,157,18,118,213,242,239,132,204,208,153,183,31,228,38,155,219,219,106,141,89,200,111,125,46,63,188,207,135,115,208,250,233,118,64,188,26,212,60,180,185,146,191,173,251,9,219,208,202,174,184,205,157,162,100,24,124,79,151,48,14,154,108,157,238,213,82,84,121,230,5,198,90,227,54,203,189,244,229,215,247,154,208,152,249,119,40,94,6,85,121,183,72,254,170,151,242,167,83,225,249,98,252,171,104,215,43,170,142,228,255,102,145,194,62,49,188,15,62,152,26,150,251,68,4,4,133,106,225,171,50,167,32,91,23,212,17,216,242,28,140,147,183,4,208,126,197,148,66,42,188,54,140,218,43,22,16,206,106,151,63,68,116,225,43,120,181,50,102,103,151,245,117,93,38,151,114,201,245,64,11,59,252,108,88,57,93,56,82,126,44,204,242,155,86,18,63,125,206,243,189,229,220,29,252,91,2,147,187,18,80,133,177,210,217,41,188,62,232,79,79,173,87,26,73,145,195,222,224,63,45,179,163,9,126,82,177,167,213,199,60,203,97,72,234,198,46,142,54,222,154,113,197,118,56,198,228,213,217,222,209,129,116,232,195,144,229,11,74,91,145,60,7,78,234,235,227,144,178,20,179,166,143,2,134,43,154,41,109,180,180,9,118,150,73,229,29,115,140,187,223,183,112,46,21,199,60,42,252,107,195,124,225,81,113,244,232,34,207,32,239,229,93,159,6,26,164,62,100,137,137,98,143,247,158,101,147,35,144,203,177,93,142,98,19,51,177,139,17,195,189,249,111,132,29,116,52,224,26,213,1,254,169,100,167,91,36,138,53,205,157,249,163,126,72,161,229,160,156,98,75,147,206,68,240,4,47,160,13,127,158,232,155,159,122,183,133,233,199,24,207,110,114,40,247,67,39,28,44,155,186,23,229,32,139,146,14,68,231,101,217,157,134,101,14,180,84,176,250,170,17,39,83,170,27,211,162,66,57,233,197,252,71,238,177,84,122,201,210,55,49,184,220,72,185,112,120,48,218,236,96,200,211,121,11,186,17,32,247,118,78,250,197,66,207,251,205,92,5,249,81,11,39,178,83,75,112,78,205,54,200,176,65,253,73,169,104,129,48,47,255,91,1,99,162,221,9,199,81,214,214,175,234,145,112,164,244,196,171,141,70,230,47,118,63,225,189,165,29,209,206,74,39,231,114,243,162,134,145,85,247,98,255,38,183,170,111,207,164,241,41,46,86,240,58,171,99,34,191,134,126,119,16,195,77,67,181,216,91,69,170,104,1,74,215,135,158,237,5,27,25,51,228,145,73,110,62,38,217,170,139,128,160,123,242,185,79,16,119,232,74,151,38,240,129,153,136,125,102,222,122,48,123,243,60,48,221,156,243,218,24,128,136,192,59,43,173,9,162,23,107,17,13,178,200,104,181,61,169,166,108,133,115,123,166,108,147,197,138,37,152,96,226,148,173,1,145,227,167,44,115,244,11,11,217,134,153,170,8,218,240,53,135,183,143,57,31,58,67,19,197,141,159,41,181,60,112,120,86,55,189,12,88,49,1,9,197,64,145,171,13,10,52,203,176,196,120,97,58,122,192,251,143,13,10,139,70,69,172,150,99,149,216,186,119,82,98,205,41,17,54,175,253,223,1,193,216,61,212,235,59,89,204,173,24,5,127,231,217,42,140,212,165,143,34,80,141,159,215,207,53,101,113,247,1,187,178,62,116,155,221,203,248,163,23,253,160,174,253,149,43,177,133,69,97,15,250,211,172,20,61,53,27,141,179,246,98,147,55,94,14,80,35,95,13,4,102,147,33,129,211,119,237,211,42,95,15,250,78,34,181,160,203,79,52,61,154,126,74,52,46,157,9,223,246,198,151,99,12,211,151,24,2,194,119,165,89,11,140,169,75,222,107,56,68,108,121,77,7,43,188,203,114,77,91,194,8,238,241,176,24,215,57,55,59,185,16,214,104,136,44,170,119,156,45,104,96,129,222,106,38,6,65,123,84,215,194,14,14,127,114,38,72,216,147,228,237,186,232,240,13,106,109,163,113,47,145,174,134,12,117,109,17,39,209,51,171,130,142,157,128,2,59,80,177,98,197,161,197,205,247,12,203,63,221,126,160,96,237,32,131,139,225,229,12,64,148,201,231,158,26,1,135,205,247,128,202,244,90,114,89,100,240,4,37,62,3,76,91,228,107,191,137,217,70,49,241,163,59,170,53,184,79,162,169,208,132,129,198,103,65,38,205,150,237,5,220,228,139,218,6,157,144,45,104,54,213,223,186,112,29,192,249,138,134,62,100,240,227,18,20,93,141,192,183,127,37,180,58,236,114,154,18,67,180,91,8,202,34,141,214,16,28,170,42,197,173,204,142,255,132,164,202,63,37,65,118,194,204,113,30,230,194,115,131,93,15,211,82,142,202,42,151,107,136,229,31,227,71,253,182,15,50,55,11,102,211,56,147,29,101,129,99,14,213,134,243,73,198,56,150,12,49,174,66,4,232,149,33,169,110,18,25,230,150,185,19,222,178,170,183,163,176,34,208,111,52,253,252,184,16,160,78,96,164,254,190,40,76,47,6,62,13,10,233,237,248,119,4,146,28,207,161,147,189,201,18,183,71,225,53,112,6,98,35,164,159,31,110,42,240,212,214,93,160,76,168,118,255,122,70,47,252,156,11,162,204,84,92,59,211,109,190,118,47,50,178,214,190,88,103,197,159,71,145,149,201,36,64,220,22,80,152,183,78,165,195,173,147,205,242,212,16,176,76,22,188,120,1,231,149,111,78,81,7,69,7,135,170,89,36,147,23,28,54,40,230,184,244,157,79,132,41,235,152,220,82,239,2,95,0,19,135,188,26,112,147,247,169,159,16,181,210,215,221,139,187,57,59,246,229,111,8,244,247,250,26,52,63,34,13,90,30,174,113,104,199,77,65,190,29,193,168,59,214,91,114,185,130,244,247,179,79,36,249,127,158,201,169,16,17,6,64,49,250,207,242,161,73,33,163,32,36,56,95,78,6,28,208,125,21,46,116,27,249,113,86,217,81,163,66,72,143,167,245,239,147,76,202,209,62,39,83,160,171,122,31,86,92,47,127,107,52,157,240,59,188,37,187,217,114,169,173,248,9,187,92,80,72,168,204,239,146,151,178,237,51,36,209,136,103,242,147,204,102,232,139,58,57,209,7,182,16,223,231,154,59,78,131,169,109,61,82,161,127,232,166,44,159,221,39,17,48,20,131,102,148,44,156,229,117,88,208,35,218,95,117,1,49,158,191,163,61,233,230,209,231,109,124,32,219,138,9,182,87,131,157,169,159,61,129,67,241,238,98,83,163,41,92,150,81,250,67,102,84,120,147,194,220,122,188,191,75,183,96,157,229,208,1,224,163,109,159,251,224,31,125,9,3,179,32,138,232,84,126,46,95,20,236,26,244,194,83,92,168,244,234,55,227,243,206,23,44,122,30,131,8,153,91,28,194,62,110,129,25,2,70,188,171,110,117,91,248,104,212,73,187,2,162,170,135,196,76,156,192,245,113,173,199,37,71,206,236,190,16,75,178,116,184,172,22,220,183,93,95,69,141,53,100,102,185,33,172,222,234,227,132,226,235,29,246,239,57,59,65,185,116,127,13,10,79,174,180,175,25,40,217,173,111,183,224,111,220,98,30,76,111,201,140,251,67,248,133,132,189,85,217,185,124,201,84,144,147,237,229,134,145,33,97,147,17,98,177,177,213,45,4,67,38,13,171,160,42,242,180,67,33,0,213,80,101,70,1,61,167,3,87,63,168,1,54,133,204,121,140,229,1,150,0,147,222,215,19,255,204,248,156,162,185,16,99,144,25,140,41,160,8,100,16,140,220,193,152,74,139,171,83,145,144,40,192,27,38,236,199,146,94,56,203,230,204,168,151,142,226,28,43,6,231,179,228,143,186,151,142,42,125,24,110,86,60,8,143,132,170,35,23,139,96,228,114,158,232,125,103,177,9,31,59,105,115,103,108,28,191,230,83,14,183,115,198,46,44,36,151,1,74,176,232,183,26,31,78,134,163,120,170,38,89,21,17,190,227,207,61,100,201,72,72,88,46,19,84,225,96,91,100,87,130,63,44,94,100,13,10,211,128,41,70,187,46,126,142,89,78,140,4,180,48,194,56,93,212,7,70,206,133,52,245,8,66,231,77,113,21,243,219,12,114,209,201,198,7,198,87,59,9,74,235,115,183,167,152,118,207,252,62,47,140,159,234,170,7,211,191,206,5,182,31,119,73,168,121,59,233,12,204,236,162,215,7,127,37,232,153,211,51,31,225,97,167,232,108,132,36,149,213,132,198,228,160,136,11,41,81,216,161,59,136,196,103,32,128,160,177,190,54,191,71,195,172,231,40,140,254,65,168,193,186,166,240,129,74,148,127,189,107,58,167,43,108,115,168,197,120,202,81,204,201,111,35,82,49,108,70,123,185,96,233,129,242,182,72,91,251,68,181,119,231,30,253,161,110,116,5,149,75,199,201,240,117,159,90,159,30,188,210,250,156,201,100,141,88,49,166,136,135,244,27,21,8,26,32,76,36,180,185,146,162,49,222,249,230,152,212,195,162,91,111,84,116,245,190,106,96,31,45,51,122,88,160,210,31,243,127,217,30,184,109,29,115,136,147,160,58,105,240,205,116,63,97,28,223,254,105,219,44,110,208,228,97,29,86,248,3,187,13,192,110,127,232,90,48,56,57,97,39,7,100,123,27,233,250,248,214,132,18,44,169,229,203,139,222,41,54,211,244,255,37,77,49,82,157,117,56,187,212,211,85,57,72,159,158,115,22,242,66,20,185,150,188,220,241,129,142,116,154,113,207,14,136,69,170,30,42,88,170,98,164,142,2,186,69,100,98,93,32,170,34,14,231,25,96,133,33,215,215,167,252,160,189,137,4,164,1,152,25,211,113,243,245,157,70,193,53,78,95,193,166,229,247,155,32,207,74,202,43,240,242,222,115,218,25,58,111,154,203,254,11,71,49,196,188,235,230,217,111,232,34,150,93,233,101,35,34,130,163,161,48,54,31,24,139,58,171,218,149,168,162,121,13,146,64,190,0,139,106,109,228,187,252,173,160,91,103,134,185,187,142,13,250,12,48,4,58,59,7,237,70,39,126,7,185,128,132,34,200,237,22,117,139,156,57,111,78,169,41,215,105,120,91,44,149,104,229,112,168,59,152,155,37,206,32,15,23,39,212,30,43,112,46,127,136,241,120,79,76,131,250,96,167,78,178,107,45,169,81,38,229,8,237,81,154,97,204,21,29,182,128,79,97,130,108,95,134,216,250,137,208,110,82,111,237,151,160,219,136,237,180,50,255,50,193,172,201,182,34,238,223,96,16,129,175,123,150,60,156,252,29,19,228,169,199,79,234,13,10,28,142,61,134,83,205,146,169,68,212,202,107,13,48,102,25,175,213,3,80,109,119,115,45,101,20,246,4,190,70,16,194,86,9,49,189,224,180,9,57,188,29,18,107,14,151,247,42,225,180,169,37,33,35,181,79,122,39,224,207,164,66,91,69,70,82,111,215,65,202,119,149,43,16,209,62,13,10,194,227,32,6,169,3,128,143,240,205,1,63,147,98,56,199,76,199,95,217,21,36,76,86,168,65,47,55,240,19,72,64,52,118,153,80,141,111,61,127,50,3,162,91,124,112,16,7,25,88,44,213,136,89,14,227,75,58,177,62,37,91,97,58,109,0,56,106,1,4,204,94,210,198,70,240,154,136,136,141,55,81,101,29,86,70,197,34,122,60,128,232,218,27,13,10,51,17,33,221,36,41,241,244,119,93,48,86,77,255,71,208,27,190,44,108,114,206,77,31,217,162,7,124,4,210,176,39,75,137,22,246,169,209,164,166,150,74,83,79,71,207,36,29,90,142,52,178,63,133,190,154,207,252,47,234,150,31,39,117,57,242,21,248,114,141,103,136,246,123,234,244,85,2,131,155,207,35,216,118,60,57,73,53,47,0,197,121,169,164,252,64,142,198,37,227,16,218,230,21,18,223,230,132,78,130,211,106,47,129,112,158,31,5,179,138,233,194,34,237,98,201,97,238,99,89,60,237,122,175,115,206,46,211,102,119,64,199,123,48,155,147,238,254,27,75,166,93,72,87,90,102,190,134,116,61,201,229,211,194,255,65,141,17,247,242,17,184,110,130,126,225,223,195,97,62,116,152,3,15,7,5,5,36,83,109,31,138,148,221,182,105,139,231,185,99,197,92,179,247,75,103,108,216,21,167,179,223,75,26,14,162,190,27,11,154,17,255,191,213,177,250,73,102,138,238,20,98,147,22,175,67,106,8,33,194,11,238,247,179,72,8,71,147,74,153,246,216,91,104,244,221,248,133,154,117,78,0,148,40,175,137,169,13,24,82,194,32,166,7,255,8,6,232,8,7,38,237,201,77,105,29,33,75,69,33,193,71,196,39,58,235,221,187,74,105,126,241,100,72,205,155,47,201,82,147,48,88,88,222,207,212,6,184,155,159,63,218,226,172,87,158,128,207,50,30,186,229,112,31,178,247,202,216,237,4,180,166,49,21,136,109,69,214,18,15,105,174,241,162,29,128,173,60,45,53,210,137,159,25,2,36,43,150,205,52,158,13,10,170,218,64,247,161,18,130,182,181,43,221,151,112,142,88,220,94,45,34,209,21,62,95,163,243,179,0,188,223,175,152,222,194,244,227,200,42,28,133,249,133,115,95,57,135,79,85,117,121,244,34,102,78,7,203,225,157,166,128,239,176,252,130,195,35,236,92,70,68,197,23,9,172,141,103,70,8,168,4,60,145,230,199,152,141,67,15,16,186,108,225,252,127,192,96,79,205,143,114,56,149,37,13,10,236,54,204,53,179,250,20,254,42,13,36,9,93,204,48,178,9,63,34,152,245,240,169,118,118,160,190,102,195,220,154,218,207,226,252,15,114,26,32,233,69,175,193,9,106,97,144,117,213,233,162,100,199,150,236,108,144,239,26,238,168,220,8,155,68,255,193,61,39,203,35,112,7,13,10,82,212,65,108,83,243,100,57,62,70,237,215,237,224,7,153,150,12,230,224,213,126,73,9,232,138,221,100,189,210,176,235,226,215,63,166,172,248,180,2,128,218,160,99,126,112,92,101,170,189,82,59,136,21,242,47,35,233,255,129,231,130,156,126,75,201,128,201,20,58,235,225,160,77,192,210,83,57,107,187,114,104,189,90,238,163,86,182,16,213,220,238,3,19,94,0,174,52,56,130,81,243,23,20,161,196,14,24,38,82,196,140,218,34,17,162,44,182,240,36,144,230,154,68,206,203,22,151,84,197,59,22,2,141,53,46,1,25,245,213,250,224,189,126,161,205,166,71,18,166,20,115,116,182,66,68,226,30,158,201,240,209,56,26,210,45,91,98,18,178,108,63,154,165,246,4,95,37,221,159,94,180,72,158,163,155,25,69,51,26,199,5,16,197,117,37,87,222,33,208,166,207,193,235,16,169,143,168,103,183,109,166,228,36,148,105,245,145,253,21,77,57,232,147,100,164,61,176,7,170,13,122,145,28,250,230,206,43,85,121,151,251,196,79,85,162,127,98,43,215,184,177,14,201,245,209,15,38,73,166,70,253,150,74,225,177,17,179,91,70,162,82,196,222,228,78,116,38,235,87,57,242,78,138,57,6,148,89,125,179,161,254,120,0,201,126,89,85,131,34,240,228,154,12,206,42,217,75,30,45,16,38,175,167,113,114,62,63,82,57,22,245,94,216,102,201,251,74,47,117,150,81,198,19,162,207,243,98,2,140,223,157,56,240,93,76,124,96,36,197,51,233,48,182,75,9,159,177,175,4,176,31,95,185,202,104,103,230,239,245,90,119,44,83,145,131,16,89,152,126,16,203,249,135,227,243,120,224,19,41,247,61,84,220,4,132,23,125,60,60,6,246,115,151,149,95,241,202,78,248,173,22,6,183,4,85,37,93,99,26,125,110,185,43,253,186,20,160,255,40,178,172,231,232,26,214,102,234,155,58,15,90,107,163,181,223,227,80,68,250,75,61,142,217,86,0,156,96,233,140,193,50,242,232,73,103,244,169,138,103,179,54,213,238,124,175,125,209,247,77,31,160,134,25,148,19,97,250,115,18,207,34,93,137,206,249,126,134,76,131,105,234,250,185,77,151,240,86,85,5,216,37,151,43,117,79,103,41,89,110,234,145,33,11,117,221,143,100,83,130,172,227,109,230,8,25,160,43,59,72,221,0,245,72,95,146,100,249,250,146,109,115,46,44,38,123,11,232,202,152,82,111,18,79,151,239,219,134,19,44,94,241,107,16,57,8,23,47,197,31,40,111,254,69,255,37,53,18,224,3,63,3,127,241,130,186,83,106,158,178,223,45,29,178,87,217,200,108,70,225,176,2,251,50,172,112,202,148,98,230,235,72,153,71,82,206,188,227,159,8,171,212,244,176,136,146,131,229,85,0,112,33,133,168,65,227,40,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen022003l=45963; +} +#endif //_PDF_READER_RESOURCE_FONT_n022003l_H diff --git a/PdfReader/Resources/Fontn022004l.h b/PdfReader/Resources/Fontn022004l.h new file mode 100644 index 0000000000..4b6633296f --- /dev/null +++ b/PdfReader/Resources/Fontn022004l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n022004l_H +#define _PDF_READER_RESOURCE_FONT_n022004l_H +namespace PdfReader +{ +static const unsigned char c_arrn022004l[]={128,1,85,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,77,111,110,76,45,66,111,108,100,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,32,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,77,111,110,76,45,66,111,108,100,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,52,51,32,45,50,55,56,32,54,56,49,32,56,55,49,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,52,54,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,192,188,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,106,33,83,218,174,90,195,68,154,69,50,86,49,178,104,132,195,219,164,204,79,58,238,13,173,41,7,117,124,56,116,108,148,126,34,121,207,53,191,119,203,40,189,168,14,42,26,212,183,168,118,2,98,182,146,45,68,93,112,21,46,43,193,116,124,115,74,140,99,85,125,208,66,247,223,223,21,113,69,0,105,28,132,58,108,171,125,65,158,129,254,186,173,122,111,192,165,215,139,246,204,165,45,232,59,107,159,41,124,170,173,242,49,131,17,234,187,157,79,180,144,78,32,55,134,43,232,238,245,16,31,135,35,203,31,14,90,29,130,45,50,33,12,108,116,35,17,217,196,92,90,185,198,157,214,65,191,59,21,236,60,211,247,187,211,49,202,169,50,66,121,148,60,83,254,67,219,169,191,8,184,84,249,124,71,199,155,108,36,31,167,47,193,182,182,103,238,140,65,164,228,158,144,49,16,255,154,239,183,94,16,224,7,190,56,125,86,65,199,78,201,135,174,246,152,183,126,185,222,20,170,218,24,80,228,91,133,74,42,92,29,148,70,145,13,10,161,43,179,97,42,25,178,189,230,220,161,244,128,183,135,237,95,242,48,255,64,195,225,170,12,11,122,38,236,53,7,211,3,64,48,87,212,176,41,86,90,13,14,15,138,49,113,170,136,251,121,110,33,211,249,76,239,214,100,121,100,12,59,180,61,145,91,250,58,246,243,145,111,42,170,227,157,212,49,117,99,194,38,227,97,238,13,205,130,143,104,135,36,191,178,165,255,173,208,125,16,73,68,13,246,6,138,125,117,202,248,177,27,244,213,44,113,196,188,34,133,109,80,149,107,59,137,46,36,53,208,216,38,128,21,64,210,184,147,131,225,77,213,134,3,235,215,234,211,49,116,218,95,12,214,147,145,193,140,121,206,233,74,47,102,188,93,50,81,168,171,151,37,240,25,108,108,218,37,162,62,38,14,172,49,201,232,88,159,164,192,58,74,152,228,28,45,83,242,160,19,159,41,248,183,47,89,253,100,23,15,2,113,194,207,224,59,97,130,82,218,236,92,178,114,224,219,152,86,108,52,166,233,60,66,27,146,234,245,85,45,78,198,208,132,50,64,125,68,70,139,92,90,239,77,215,43,166,62,115,142,202,103,191,191,75,255,147,134,78,88,159,115,188,36,115,124,4,75,186,85,26,65,201,78,211,156,239,63,146,146,221,139,158,95,171,3,30,123,57,47,128,38,17,183,42,170,106,12,241,219,179,84,130,101,11,222,250,122,233,59,75,214,33,11,139,66,158,154,94,83,209,193,193,228,48,111,131,202,54,96,171,251,113,1,139,29,211,154,212,15,130,31,136,111,180,73,110,49,218,193,28,222,225,90,218,159,168,116,104,196,164,233,132,13,157,79,94,230,206,244,202,7,34,56,69,37,70,219,32,142,252,60,226,115,86,223,2,244,123,34,201,46,171,91,109,105,135,5,2,194,33,77,1,77,108,61,110,69,149,121,91,47,239,236,50,52,141,171,246,218,108,229,26,149,199,59,64,8,240,72,122,188,37,178,217,198,248,42,144,66,208,124,245,35,102,48,131,222,106,162,42,153,225,31,33,18,123,156,97,130,64,242,175,142,79,82,151,239,251,57,24,47,170,102,225,227,87,137,27,252,55,223,3,39,146,211,199,222,90,22,244,57,64,113,187,76,84,175,161,144,197,179,251,54,231,168,9,198,182,94,3,241,241,214,219,158,72,94,13,197,169,13,96,148,37,169,133,251,160,55,49,160,250,146,151,180,221,83,89,248,231,202,113,70,166,238,173,231,34,176,37,209,11,159,204,4,91,46,138,250,194,153,13,163,161,18,33,127,159,16,134,104,86,217,206,9,63,101,156,229,235,16,102,54,222,90,96,131,26,97,3,165,1,5,197,98,189,102,18,199,65,213,41,197,193,15,111,62,35,2,83,22,76,111,101,222,139,120,74,157,106,132,137,57,173,117,128,255,14,7,126,186,231,233,36,80,162,84,144,224,161,0,173,234,197,34,94,244,95,154,105,218,83,77,214,73,202,191,57,32,16,207,216,177,223,172,79,193,218,111,216,236,112,130,201,123,48,172,220,118,203,85,53,32,87,214,137,48,129,233,190,88,195,61,171,101,198,158,26,175,15,13,162,12,63,64,19,5,104,50,166,176,169,111,136,135,25,233,198,248,153,180,145,220,25,15,116,137,106,68,23,185,246,103,3,222,31,160,204,199,8,130,191,97,59,217,227,98,222,159,144,133,197,191,93,142,223,100,185,247,125,206,37,51,246,78,197,60,109,125,206,84,174,129,44,4,38,247,2,104,34,155,248,243,220,84,213,131,241,96,93,78,149,16,210,69,42,172,246,59,252,182,48,215,150,53,124,106,59,215,171,131,164,198,97,232,225,182,61,11,1,75,61,27,209,113,46,31,189,204,115,158,187,243,91,129,226,179,45,5,23,236,169,173,170,28,80,79,172,29,55,75,91,151,198,168,173,196,30,175,129,239,101,129,198,168,82,44,44,209,69,190,53,200,117,131,145,171,239,180,80,78,90,133,133,128,25,66,141,194,251,89,210,92,149,121,45,166,191,28,110,13,215,79,186,157,215,77,222,189,71,94,113,230,37,249,219,83,96,3,105,194,63,105,252,255,128,255,57,118,123,205,85,211,8,41,29,50,160,105,113,117,225,23,80,206,68,14,128,250,198,82,100,101,165,129,72,151,56,46,228,79,172,130,174,223,142,59,3,93,212,171,159,254,194,247,14,159,116,79,190,128,65,212,86,227,184,247,177,42,240,107,190,174,45,194,65,152,113,187,140,124,193,62,223,254,230,178,126,81,113,71,201,132,157,116,200,159,93,202,226,204,43,147,48,137,16,120,57,57,6,33,124,42,231,4,132,94,231,229,25,5,45,160,87,152,215,57,136,210,199,126,228,113,215,47,177,13,239,151,225,53,60,239,38,51,225,133,90,46,242,156,56,72,209,112,89,4,67,121,50,72,184,184,78,227,106,51,195,7,254,231,232,228,192,40,151,85,112,98,227,45,167,156,0,16,80,242,46,156,158,138,202,251,69,215,175,255,80,108,244,51,87,170,133,166,137,214,41,66,183,205,57,16,244,83,143,154,92,82,185,97,70,57,238,77,114,56,150,48,9,31,48,248,94,39,93,79,8,243,149,136,124,230,108,205,182,227,128,169,59,5,25,226,113,51,155,28,153,59,116,231,96,66,253,105,123,129,139,175,131,174,152,14,175,58,224,184,6,85,87,174,255,81,120,215,62,37,232,183,40,233,78,218,199,5,57,4,143,177,14,108,115,4,151,142,173,196,165,211,9,13,10,56,55,252,49,176,63,187,150,215,237,74,227,192,148,139,39,192,18,44,127,164,214,200,9,82,150,195,22,46,221,234,39,169,153,126,117,35,118,145,85,90,138,87,94,84,46,45,64,220,30,32,246,107,242,140,59,9,188,29,70,18,185,115,16,99,13,1,195,38,216,199,46,254,235,236,141,194,79,222,176,184,213,201,148,83,133,164,117,67,230,196,150,13,10,2,170,207,12,245,176,31,138,102,199,202,254,244,184,129,17,238,92,121,167,107,12,148,156,3,145,226,200,112,179,15,58,89,206,6,197,47,149,246,235,126,90,238,194,67,192,27,80,209,89,161,184,23,221,167,246,222,85,158,19,214,49,150,232,30,117,50,100,46,8,52,249,177,61,209,12,160,106,145,148,59,54,175,219,215,164,162,97,129,223,237,156,199,55,82,152,46,207,197,188,161,81,60,238,151,16,153,11,224,40,21,20,69,242,226,5,116,87,162,186,247,231,179,33,136,95,213,145,207,66,129,153,37,51,174,14,77,79,220,187,206,101,57,164,242,111,78,240,14,6,213,120,132,199,122,144,3,194,22,192,182,92,4,218,54,214,140,197,105,237,192,117,234,223,157,112,121,224,247,72,95,50,224,229,70,39,219,21,57,212,73,58,95,187,190,200,238,105,236,127,133,40,34,197,21,132,162,245,44,119,187,186,103,82,206,239,104,247,73,127,97,228,162,170,227,62,90,99,12,6,116,187,109,196,195,29,88,225,45,63,149,205,51,131,212,155,123,172,231,161,54,148,248,255,106,181,167,166,131,169,78,152,4,194,11,254,112,116,15,96,14,44,90,240,171,131,92,115,165,95,127,104,29,66,146,229,124,246,97,152,241,243,175,130,207,51,108,51,31,9,26,133,121,106,114,148,58,19,12,52,102,180,34,157,72,0,215,246,15,67,154,50,127,50,175,208,252,190,20,31,101,61,202,28,59,255,219,5,80,158,207,30,65,157,4,92,86,172,58,144,245,39,0,118,59,147,9,210,232,110,13,10,210,26,54,141,132,239,76,7,120,153,238,92,242,1,54,93,61,144,222,112,145,255,171,34,82,134,158,222,147,252,206,50,12,71,253,250,178,49,18,133,213,178,99,20,0,137,169,179,130,243,60,166,27,197,135,165,125,144,108,93,185,30,122,103,88,152,238,36,14,174,222,83,178,139,186,193,3,224,199,109,248,177,44,98,163,147,127,193,174,168,31,252,48,214,151,147,180,107,191,50,225,240,95,84,14,42,242,215,213,74,119,239,2,186,158,81,51,194,234,49,215,139,4,26,27,167,92,45,106,122,225,162,53,43,97,1,52,120,81,22,67,96,241,69,29,181,227,233,31,234,83,0,2,16,80,92,192,34,28,124,81,144,164,54,172,139,129,233,164,14,232,52,205,15,222,4,91,13,70,170,164,105,61,240,55,13,10,152,4,174,118,67,209,222,129,60,253,117,203,120,88,132,214,134,135,232,132,148,34,80,78,74,79,1,76,228,0,218,108,101,238,188,157,152,134,219,229,2,204,239,153,167,8,143,227,99,161,133,187,117,247,11,2,35,17,145,124,42,99,226,228,31,62,149,66,207,46,75,53,167,180,46,37,3,214,114,94,113,57,193,207,163,28,60,84,200,66,11,15,240,225,125,47,82,184,66,22,171,18,126,124,16,224,88,206,2,25,42,237,145,87,25,141,212,113,244,1,210,42,213,239,204,128,194,106,118,241,186,187,46,64,164,184,37,127,252,128,167,30,97,203,141,183,186,63,224,54,182,167,13,10,157,88,253,89,188,193,105,111,186,22,104,25,31,69,131,95,112,49,117,194,204,88,165,241,144,161,199,235,142,72,27,154,125,13,82,185,7,178,102,163,4,29,32,97,124,44,152,8,9,56,109,231,130,97,185,204,140,149,24,142,213,133,37,109,179,117,217,193,97,80,209,129,226,246,54,90,99,132,214,240,93,19,212,133,242,135,196,90,15,255,238,12,129,71,240,43,101,18,140,89,247,211,73,115,198,213,89,141,188,61,59,221,54,20,170,77,40,243,49,129,239,154,166,123,121,26,136,74,224,251,98,67,126,205,66,209,118,111,69,219,168,35,159,123,34,5,88,168,148,84,134,83,207,128,9,231,116,202,79,201,50,55,238,154,121,236,63,88,135,3,19,160,248,171,12,153,132,163,208,12,235,168,219,243,223,245,129,117,63,117,196,186,186,102,33,117,197,46,83,19,230,133,51,194,106,192,141,169,136,134,153,206,109,52,227,17,247,23,36,227,155,107,126,112,146,255,144,27,148,37,120,49,216,57,33,135,87,148,207,181,198,44,66,184,176,178,151,90,175,136,84,55,63,151,24,135,125,167,169,187,179,221,2,121,162,191,234,227,85,230,138,17,56,89,100,101,96,19,29,126,142,203,234,136,86,148,172,182,80,23,19,171,56,177,194,13,89,249,11,131,37,226,201,225,121,46,163,204,199,64,209,142,137,213,79,166,50,126,201,19,228,9,67,4,177,151,255,34,128,198,163,22,154,193,121,9,165,187,0,42,199,131,213,103,213,29,168,183,123,162,35,152,44,129,107,174,30,206,187,183,127,135,26,45,32,93,138,30,116,8,42,254,223,107,102,47,180,21,147,38,218,86,20,101,209,132,143,203,127,219,138,11,51,114,53,37,24,78,16,105,152,124,35,228,196,26,226,36,160,228,163,56,253,51,217,244,235,93,113,141,35,122,240,91,234,93,134,127,59,22,71,42,163,78,159,112,91,84,99,160,145,84,223,188,99,61,62,207,164,107,153,134,54,27,189,213,188,211,168,233,72,128,85,94,252,72,25,133,214,220,100,199,125,5,237,13,10,168,38,73,13,10,7,154,228,209,238,1,30,248,107,216,63,127,158,101,67,58,72,219,241,36,241,90,195,218,13,95,170,108,109,170,193,196,254,183,219,139,132,67,7,22,14,34,129,255,122,45,43,198,173,212,59,53,68,84,211,73,163,52,20,27,75,30,41,83,110,136,242,137,229,68,142,91,38,129,60,224,116,50,99,43,82,83,57,63,102,121,104,51,35,135,161,188,203,152,80,63,67,171,76,201,11,18,225,15,141,124,100,53,170,205,98,252,142,243,47,179,125,19,250,11,15,241,138,226,13,10,111,47,47,214,57,77,85,168,250,255,9,255,145,171,194,38,65,43,0,81,194,130,180,180,156,85,138,176,1,210,73,109,186,182,142,102,83,219,183,77,33,3,2,167,132,87,235,38,236,175,203,236,137,111,165,143,4,72,56,125,23,96,141,122,35,19,194,34,180,19,211,243,46,210,155,104,61,157,236,121,39,253,147,168,203,13,160,107,46,23,148,13,25,95,124,175,198,229,237,203,49,168,224,1,135,144,3,18,238,155,177,2,5,108,21,234,35,62,45,67,183,198,171,189,228,77,218,211,161,242,203,205,115,14,181,190,31,54,145,170,175,46,254,148,164,115,110,108,76,117,58,251,225,192,5,20,153,24,164,229,68,107,49,206,0,90,153,214,65,37,201,96,28,176,22,165,77,50,65,171,33,238,181,5,196,241,207,246,23,131,102,179,203,192,203,202,39,114,219,125,91,58,118,93,198,219,139,113,22,16,159,93,242,16,168,32,174,174,65,99,103,69,52,77,7,207,154,225,171,5,165,100,166,169,197,238,216,19,7,128,233,62,15,203,45,249,238,27,133,135,216,250,203,220,78,25,39,49,93,243,168,129,108,149,95,25,65,123,245,8,174,5,36,205,4,172,83,175,25,97,156,217,56,73,94,76,127,2,194,107,105,160,145,242,249,129,94,79,142,59,149,166,16,195,186,20,166,215,114,75,136,57,46,107,94,219,142,156,51,62,38,46,214,130,242,73,233,223,57,91,148,231,219,153,67,105,235,245,89,16,63,155,222,81,234,171,222,56,84,173,94,103,5,31,187,167,234,228,213,150,141,130,83,135,50,214,64,115,158,31,9,213,192,211,214,25,107,127,57,153,13,10,238,26,67,207,233,135,46,240,233,139,203,141,233,55,116,22,37,95,240,87,24,141,159,21,115,19,205,101,4,81,250,172,138,31,174,61,0,129,74,106,164,173,197,72,23,121,152,203,164,208,241,251,176,199,246,179,119,50,96,230,0,28,118,182,129,103,95,94,196,136,74,22,109,180,57,235,37,245,213,245,154,113,36,240,178,237,153,22,14,62,119,156,182,58,226,167,241,24,233,11,24,11,69,208,151,191,220,11,201,91,199,144,252,141,123,50,38,107,47,226,47,118,135,80,45,109,164,227,81,167,119,140,188,205,49,179,200,50,80,195,210,27,1,81,183,122,5,121,42,181,13,10,95,99,91,45,147,44,49,46,171,75,28,6,189,255,19,204,96,104,225,65,176,62,232,216,99,142,87,213,156,161,216,184,204,173,234,192,87,206,255,7,15,247,253,39,101,176,133,118,119,76,63,245,29,136,90,168,105,78,20,220,91,255,121,36,48,217,41,139,71,78,14,28,219,189,75,9,35,65,251,218,72,209,45,191,217,139,194,55,225,175,241,141,250,121,53,38,27,64,144,110,32,115,139,253,202,22,181,132,46,42,20,5,178,46,73,144,2,4,72,188,75,147,9,18,228,190,197,128,40,217,216,110,126,21,166,76,254,24,58,148,248,30,32,136,255,220,223,83,38,189,134,131,179,3,238,8,69,9,65,186,64,100,101,133,4,61,134,61,215,212,207,11,116,230,252,249,105,118,223,239,93,38,22,87,118,54,164,104,234,161,244,27,174,61,130,247,1,96,208,43,40,179,24,170,169,187,116,86,116,96,168,205,67,6,102,119,134,246,150,127,57,189,185,242,16,181,168,6,142,22,123,110,225,148,176,255,201,73,46,196,239,233,102,37,253,71,0,57,165,149,81,178,130,132,76,86,27,38,133,27,154,246,179,243,166,254,154,239,82,212,42,129,38,80,4,187,100,218,216,148,167,214,208,67,103,41,51,7,98,88,86,100,232,231,142,76,251,248,9,145,155,174,62,78,199,11,97,68,79,142,104,175,0,164,25,235,183,181,170,246,104,102,167,219,224,106,81,6,233,230,63,111,25,176,65,122,191,50,171,34,176,43,207,12,39,175,14,137,133,51,17,95,174,104,110,175,202,150,40,186,210,99,24,242,84,221,84,232,118,115,108,235,206,130,125,225,111,211,79,45,246,175,199,169,243,159,90,197,1,100,181,0,19,242,109,218,131,45,9,30,224,247,114,217,25,157,49,94,191,88,149,7,101,140,215,252,242,41,137,113,143,44,49,236,193,130,9,211,43,234,43,41,189,26,136,32,42,127,187,205,202,32,35,199,157,7,184,134,182,117,176,207,130,4,80,214,89,154,247,1,193,242,58,193,171,38,77,156,98,53,42,44,242,219,104,133,171,27,119,26,162,242,208,55,131,52,84,208,198,230,171,158,120,132,186,209,41,89,249,214,147,88,52,50,81,94,156,78,142,23,133,31,41,43,88,89,118,45,192,147,250,198,209,196,215,95,131,230,196,124,247,59,95,227,144,161,97,239,13,10,41,66,100,14,134,131,195,60,190,226,146,170,232,203,206,137,226,193,232,220,153,221,75,204,154,81,26,127,0,69,83,129,157,133,195,144,234,204,149,150,230,113,3,204,226,194,232,106,77,176,116,98,57,102,32,193,27,110,57,22,82,187,53,143,130,64,26,123,71,252,86,147,184,152,223,126,177,247,167,223,6,190,22,104,100,184,36,152,231,164,165,46,93,120,226,180,227,121,204,228,239,26,237,223,128,147,103,19,120,237,180,106,176,241,170,123,121,250,28,14,13,10,18,71,17,202,230,251,226,181,106,116,1,14,227,105,109,17,41,105,184,31,58,236,249,155,171,54,250,147,23,253,154,46,89,13,10,141,28,196,71,205,36,196,41,149,215,176,68,84,168,253,226,229,137,37,32,39,57,35,67,161,23,133,120,13,10,222,11,62,235,139,178,11,99,209,189,97,190,34,60,68,187,142,19,83,208,211,227,124,18,42,234,190,34,69,251,35,23,131,57,111,117,140,158,77,9,5,139,143,99,147,116,104,184,100,140,39,100,169,11,87,133,167,41,22,0,234,6,153,237,222,63,206,119,76,119,164,232,56,140,179,174,153,87,14,203,217,129,30,232,249,115,166,220,237,120,52,61,17,4,240,161,13,10,155,200,105,234,71,61,163,0,93,54,134,93,1,89,142,26,105,9,183,17,195,119,164,180,188,83,106,88,22,85,161,178,194,185,149,230,99,36,52,207,168,239,122,121,74,14,128,142,107,83,210,206,152,49,199,32,202,3,242,140,127,7,83,170,226,111,93,106,108,176,134,234,87,201,37,137,233,88,58,166,188,60,17,148,54,135,0,67,36,112,115,40,112,97,244,78,253,115,74,231,16,44,154,9,9,7,227,182,27,157,210,82,124,171,198,63,47,133,21,227,248,236,2,42,216,140,104,68,167,49,209,99,175,41,44,143,48,236,152,135,53,143,25,113,144,204,105,51,116,80,112,121,149,129,183,169,79,14,172,92,147,86,121,158,160,242,1,189,84,209,183,42,160,244,165,11,40,81,214,158,106,38,66,183,98,168,136,112,49,154,104,78,158,170,154,27,6,74,59,210,225,26,212,220,223,58,151,114,87,182,173,54,131,212,233,244,246,120,239,231,77,74,68,136,39,78,217,128,238,110,252,7,39,8,181,53,138,29,163,148,100,117,118,112,195,161,47,43,203,37,5,216,188,184,212,106,229,168,200,139,159,23,84,137,109,141,126,234,139,29,118,216,231,222,219,136,214,127,121,111,118,201,107,46,182,224,231,168,209,12,221,214,73,255,37,133,15,163,131,72,82,98,62,153,242,100,168,218,169,62,209,69,241,182,81,42,117,163,238,73,208,235,247,63,144,235,107,199,94,204,5,116,101,175,147,27,48,3,137,7,63,84,229,224,165,225,52,6,112,57,59,131,51,84,143,180,201,68,4,177,109,8,19,168,72,20,37,233,173,9,190,93,138,79,62,236,98,57,247,177,65,160,59,66,141,69,182,227,201,129,195,238,50,160,101,242,209,98,226,91,107,183,158,157,70,225,131,138,165,16,223,157,140,113,243,222,230,55,169,124,69,60,12,38,234,138,246,142,60,0,76,141,233,151,166,245,160,226,113,58,242,125,143,152,3,18,51,198,191,94,245,193,3,229,175,8,98,206,110,169,213,152,171,189,8,53,11,24,217,234,132,115,141,117,101,207,207,236,127,151,67,181,222,126,157,229,73,85,85,57,11,13,10,216,156,224,26,90,5,214,197,58,35,90,163,216,156,243,41,178,244,53,11,13,152,218,77,73,115,203,89,84,198,214,57,206,54,126,104,119,109,91,168,223,158,121,60,82,243,129,87,14,144,157,182,18,27,233,57,25,195,84,114,40,39,251,194,74,239,244,188,112,252,252,79,183,244,151,89,166,207,39,221,95,84,239,223,208,96,171,220,51,208,209,248,206,5,28,12,2,110,49,23,48,158,9,71,27,70,61,234,205,28,209,42,52,95,227,130,184,172,78,204,161,254,202,8,20,164,247,75,222,160,13,8,230,82,136,184,208,93,208,198,216,178,163,35,197,69,230,70,172,6,229,47,91,254,64,226,90,118,4,251,43,244,155,43,246,82,124,196,241,250,125,188,158,110,220,198,58,62,91,217,81,162,94,177,63,243,189,36,70,200,237,50,103,13,10,25,247,209,112,105,148,250,217,187,159,244,72,102,137,81,202,2,237,189,149,11,130,51,0,91,175,241,118,138,28,194,164,77,168,224,18,94,99,122,107,203,81,187,100,175,34,127,106,63,124,126,190,78,250,57,89,101,212,155,19,184,170,95,29,65,250,226,144,77,130,9,44,108,37,136,179,129,130,137,26,57,215,47,30,178,80,130,121,99,214,206,93,200,4,147,179,171,171,185,17,24,154,107,115,236,13,10,116,217,222,21,240,221,153,47,225,26,222,56,54,119,208,39,146,167,32,184,62,162,26,179,198,49,201,247,5,142,105,116,147,6,164,9,94,175,189,130,184,223,33,158,83,36,63,124,242,239,179,198,126,22,159,118,99,2,162,8,77,106,182,218,203,221,18,166,124,163,105,170,160,45,34,98,20,129,192,58,141,67,118,61,98,210,190,50,98,209,175,186,130,60,253,169,25,146,236,248,12,221,54,86,80,92,83,153,17,140,161,53,2,208,59,18,44,32,162,187,191,128,170,102,66,119,58,98,85,95,183,206,229,222,187,174,97,30,178,212,67,242,237,194,75,177,83,220,99,76,182,214,179,114,73,114,68,91,163,173,249,122,176,117,175,42,149,210,241,187,116,207,178,219,30,67,81,48,41,108,238,25,187,140,21,126,184,219,112,191,92,252,30,121,31,53,49,211,174,51,85,74,78,223,22,7,13,10,115,27,200,183,199,74,132,187,59,224,242,191,69,86,12,218,116,180,193,45,215,24,198,40,3,251,79,74,186,95,232,157,111,124,186,175,207,228,187,81,128,49,218,205,234,42,230,200,208,192,59,246,13,10,155,6,12,206,187,72,88,228,207,225,39,30,49,107,247,175,176,87,20,194,108,250,145,189,150,208,98,45,163,30,214,37,83,59,37,2,6,78,236,35,37,123,71,133,244,240,19,47,63,68,176,194,184,59,182,66,221,136,82,238,127,55,119,149,110,152,71,53,245,209,97,117,196,162,126,146,130,164,228,255,12,171,121,56,217,33,211,61,199,232,182,42,226,74,144,177,38,70,179,165,254,136,253,148,77,131,9,65,31,110,179,3,26,187,103,252,155,178,136,154,236,69,130,16,32,86,28,21,25,36,55,115,180,72,214,91,189,173,193,90,94,21,91,141,27,54,140,189,151,183,86,168,149,43,66,138,53,140,57,134,48,180,110,138,253,174,35,133,147,195,253,88,158,196,107,119,184,216,46,199,225,236,90,80,203,199,126,213,75,193,226,66,108,97,210,58,8,88,30,193,215,28,9,8,247,117,157,29,169,36,27,8,118,24,233,247,86,191,184,96,35,218,249,167,202,12,78,255,13,69,170,149,207,222,90,172,25,119,145,30,198,178,2,187,71,84,126,59,91,243,50,126,149,247,225,164,134,62,91,144,74,244,179,122,82,126,52,40,44,182,89,162,47,133,186,64,107,204,190,48,112,234,83,246,90,135,107,157,27,154,16,150,65,47,239,135,6,190,116,49,83,212,220,172,22,129,164,13,10,44,38,90,114,145,33,242,211,252,158,254,11,92,24,224,2,98,111,48,35,165,234,112,91,71,206,26,92,83,113,34,231,195,90,247,191,49,246,109,5,225,170,51,98,230,140,29,37,159,202,205,0,121,252,167,239,80,22,84,116,78,41,78,104,24,202,59,173,203,174,184,141,68,49,159,186,144,66,226,90,130,80,89,154,142,237,94,28,12,189,159,115,155,125,179,28,59,24,18,129,118,80,231,44,151,13,48,144,248,50,94,92,160,31,200,94,83,16,120,125,184,219,160,202,38,215,127,64,60,6,42,100,127,159,153,130,70,242,100,34,55,72,89,222,67,84,32,118,180,89,183,250,130,157,39,24,35,36,38,37,50,153,253,56,134,172,4,72,186,18,114,108,202,180,122,243,205,198,15,182,157,218,101,19,200,62,13,18,119,171,136,77,69,255,57,118,83,106,19,173,248,9,57,207,26,29,176,166,52,127,154,79,118,172,38,116,173,73,164,110,241,212,126,228,250,113,124,73,49,49,224,165,33,44,61,75,161,52,167,166,204,175,249,152,42,190,159,121,42,145,121,135,229,157,205,25,132,181,153,76,140,137,179,249,240,135,140,195,23,116,137,163,185,180,30,68,103,59,178,83,236,222,178,8,63,66,147,237,157,36,34,60,191,239,38,204,229,100,73,145,88,72,41,18,135,144,130,128,109,4,143,30,169,153,171,60,178,22,165,194,125,96,39,70,139,138,255,75,85,251,49,159,222,212,238,45,48,140,15,140,150,251,127,236,160,43,113,136,186,192,221,212,190,224,58,87,126,145,210,88,234,186,216,135,190,37,231,76,41,111,99,191,218,13,166,112,154,166,107,129,65,137,68,60,139,148,43,229,87,242,96,96,110,14,44,92,8,34,173,74,91,51,250,205,43,144,172,130,106,118,140,204,55,210,89,29,210,143,30,1,96,50,186,229,135,177,40,73,210,249,229,96,227,248,192,124,197,15,37,111,242,9,201,207,179,108,249,33,113,62,121,207,2,40,62,20,229,44,220,58,218,216,30,45,42,219,250,111,26,44,44,168,28,249,127,182,141,97,248,197,31,140,45,112,197,154,148,13,188,49,161,192,64,29,65,185,193,229,144,110,111,157,45,68,70,218,150,211,106,13,76,200,151,126,102,90,174,92,67,22,87,57,178,34,107,165,152,7,164,229,79,233,144,29,158,61,250,245,49,239,43,41,57,141,45,16,194,79,210,82,156,71,68,105,202,15,193,124,44,6,246,112,52,133,69,130,97,18,232,52,101,75,236,127,3,157,17,153,13,200,35,196,121,202,240,185,255,113,249,131,69,123,228,136,163,106,84,217,220,228,11,131,40,130,238,244,182,152,187,23,88,90,178,201,129,181,180,45,153,165,70,169,197,11,86,34,126,118,120,109,188,198,165,114,128,9,167,7,165,200,195,159,101,188,109,16,71,66,150,169,56,51,254,227,137,146,222,218,76,238,98,58,179,230,114,115,123,232,3,233,132,32,3,231,41,169,124,255,161,161,34,217,171,11,250,88,125,166,123,167,0,95,81,39,142,58,6,167,82,248,109,90,139,47,13,122,135,30,162,154,44,59,114,96,251,98,1,122,164,74,105,109,60,69,102,177,121,201,238,241,91,103,237,41,97,104,59,132,23,80,11,97,54,129,88,35,213,14,178,95,104,54,58,220,221,232,74,182,86,2,39,105,231,118,121,91,213,169,113,34,117,80,145,194,53,53,152,181,224,229,171,13,54,143,163,76,201,3,153,48,137,164,251,85,57,245,218,92,89,186,188,242,100,112,6,94,111,184,223,9,239,84,71,90,54,81,85,3,49,250,245,9,63,150,206,224,185,192,233,74,137,74,205,101,13,66,150,114,225,214,106,214,160,2,123,125,36,225,223,107,181,110,144,146,146,133,8,244,227,86,39,95,102,142,166,29,250,204,27,216,111,228,13,150,41,184,234,132,228,195,55,136,206,97,163,251,222,243,38,3,237,66,163,28,18,129,125,253,87,86,26,28,162,101,250,9,59,89,66,136,28,42,97,210,197,54,187,125,105,65,135,158,246,55,30,26,202,132,251,237,223,208,113,47,107,251,221,105,2,2,101,170,19,191,196,99,227,254,68,85,143,189,64,92,105,219,60,191,24,181,172,230,161,17,118,127,118,107,138,115,13,139,7,5,205,94,70,84,68,70,255,120,33,63,155,40,68,7,97,16,241,113,124,254,251,191,239,39,194,193,126,25,189,148,150,136,179,15,11,79,63,35,32,131,49,254,110,56,77,75,79,155,244,114,144,245,148,29,241,152,136,247,130,113,237,69,69,176,118,185,107,78,33,253,7,202,65,1,134,244,203,77,114,63,30,210,204,108,23,40,25,195,70,245,71,231,79,153,193,207,43,222,241,223,1,175,211,250,210,56,16,53,213,22,209,240,44,101,1,5,232,9,39,2,168,190,205,80,204,41,88,3,20,14,209,234,213,189,111,225,128,129,108,206,22,8,165,130,120,127,241,189,102,165,17,176,68,173,67,11,151,34,123,97,164,23,126,144,249,40,220,249,194,219,5,33,22,59,226,43,95,250,243,48,13,10,201,192,57,170,67,109,248,101,78,171,185,70,246,75,106,44,78,91,140,199,250,156,17,210,203,32,155,32,185,44,110,119,171,128,141,71,74,240,4,30,184,15,11,110,99,90,95,50,45,213,142,17,148,103,105,153,42,142,88,121,30,42,8,187,13,205,163,55,232,130,238,66,25,71,56,42,16,103,108,105,64,78,66,15,61,202,182,182,203,167,187,189,128,104,72,252,128,202,3,235,58,111,223,223,94,190,128,15,23,114,159,116,215,47,78,108,221,93,221,219,137,27,54,144,85,76,4,105,77,57,224,95,94,42,29,236,1,0,205,200,242,250,57,72,99,83,55,217,6,219,49,74,115,159,109,219,183,72,208,72,229,151,89,192,229,187,147,237,111,131,19,211,174,171,245,35,84,86,145,118,149,96,181,1,244,111,98,41,98,190,97,136,30,195,57,236,194,78,240,213,163,166,106,3,211,28,72,190,100,20,6,83,156,248,69,195,220,244,216,173,171,28,207,110,160,74,100,38,68,219,231,124,207,255,158,156,229,84,110,236,167,181,209,25,89,220,50,161,192,159,158,73,147,70,178,235,243,108,145,85,78,226,101,218,69,45,123,100,121,199,203,36,116,17,61,5,15,206,194,184,38,161,182,16,58,31,219,74,237,112,5,134,170,11,54,173,223,143,223,180,0,107,238,194,176,117,205,184,106,211,187,86,173,222,46,112,99,163,153,109,187,107,118,60,3,78,119,186,4,20,46,116,21,146,25,30,171,96,223,94,105,19,186,105,173,4,150,60,206,110,250,216,111,38,13,154,174,9,89,190,4,150,65,60,82,153,186,39,240,201,109,255,191,90,32,19,90,130,141,250,91,209,22,241,174,244,7,93,28,75,164,158,185,1,5,191,22,104,104,105,230,218,100,30,60,43,180,180,222,177,100,129,118,22,186,123,233,241,6,47,133,56,76,20,117,24,91,52,47,141,16,206,56,155,130,233,120,3,112,14,80,144,0,125,117,33,104,190,232,233,55,151,30,148,192,28,222,162,19,100,192,91,55,246,11,134,66,144,5,117,12,109,82,114,41,111,156,59,229,8,216,80,120,201,142,211,60,191,240,65,28,252,22,238,99,32,52,252,225,46,169,192,96,236,122,18,248,67,198,159,98,119,156,119,154,27,81,74,40,8,245,69,114,117,107,184,170,116,51,18,191,203,1,48,166,172,13,76,33,247,144,54,152,71,173,236,244,82,186,103,91,249,184,99,186,225,228,148,191,232,42,118,186,55,233,81,126,90,195,65,139,127,129,112,86,253,132,144,106,41,108,121,79,119,251,142,38,106,179,47,31,181,70,201,233,126,67,85,136,183,73,195,210,121,153,88,134,241,54,178,81,90,207,77,211,3,100,122,19,241,66,183,6,82,247,225,181,135,135,63,184,93,191,182,184,192,239,246,212,12,234,154,76,115,90,126,13,10,121,107,56,146,164,15,108,239,75,191,143,152,193,72,17,226,181,247,44,32,253,45,141,19,172,221,69,114,139,230,239,210,154,189,202,55,116,132,78,30,28,133,41,26,82,204,213,65,209,132,47,233,135,220,250,231,174,166,181,70,190,101,8,186,172,77,30,31,136,195,119,47,99,33,151,96,5,34,225,13,10,8,119,16,18,179,159,210,190,13,205,65,92,217,62,89,198,238,145,161,48,0,53,91,146,52,204,96,48,51,221,116,87,114,151,16,8,146,251,140,119,69,223,69,209,37,3,79,178,104,75,212,212,100,118,228,55,101,99,112,225,53,55,17,75,35,87,93,169,171,156,87,205,14,124,67,134,80,73,195,251,234,155,42,211,88,125,164,181,176,33,56,65,21,134,116,8,102,108,17,193,188,126,52,90,241,221,74,37,147,183,99,53,69,31,87,252,6,33,226,113,47,162,49,18,196,236,252,175,60,220,88,113,211,146,252,43,63,9,237,181,184,113,5,182,222,75,242,101,72,146,92,191,69,149,187,7,36,41,179,71,88,107,250,67,108,16,210,84,228,205,21,66,173,193,247,44,13,10,21,238,14,179,226,29,227,62,212,25,47,188,233,5,209,111,186,18,2,228,92,0,123,209,186,90,91,244,244,86,164,13,34,208,50,111,63,165,245,127,229,51,95,123,210,215,76,60,98,243,61,27,47,179,195,117,73,40,243,187,183,51,150,209,230,79,196,249,203,241,165,123,210,81,48,20,196,180,159,246,139,228,22,45,129,115,173,20,37,175,223,2,162,170,50,0,61,182,16,56,97,201,53,229,70,85,237,17,174,253,247,254,66,29,62,70,194,50,77,9,64,166,223,208,102,125,196,196,131,190,130,171,248,229,237,219,222,2,245,177,161,27,30,196,242,32,28,169,253,169,7,122,165,190,42,99,123,170,232,58,24,224,208,122,202,70,47,229,63,171,50,72,76,77,121,41,248,48,182,239,215,137,178,35,17,182,20,26,162,7,146,194,150,152,192,192,201,104,56,39,135,76,128,185,126,108,143,175,198,35,248,226,119,111,52,53,106,50,192,231,97,62,191,73,27,207,170,173,196,118,236,46,185,4,197,46,58,101,214,31,207,77,59,170,246,141,216,162,223,59,107,153,88,173,96,109,188,22,101,59,19,4,240,59,172,142,228,153,52,146,135,147,147,222,193,195,185,147,15,14,220,186,85,66,194,42,241,170,77,117,79,101,61,200,228,247,106,146,152,224,174,133,156,108,19,248,171,36,179,52,156,13,10,190,206,194,158,137,85,22,133,157,94,39,108,115,252,56,4,209,148,236,21,76,170,127,179,128,56,9,198,214,105,216,108,183,90,1,9,162,95,212,129,36,190,15,137,204,210,71,153,97,250,17,20,77,176,214,38,227,47,238,132,170,254,159,247,147,37,76,44,40,204,50,8,228,193,59,243,254,239,22,93,232,67,60,214,48,15,201,126,210,14,11,72,46,250,56,38,126,12,25,168,2,167,149,198,2,160,243,77,50,116,222,223,195,146,137,73,241,109,209,91,129,31,97,214,130,255,48,60,11,227,201,177,66,228,52,137,126,44,37,201,107,155,49,59,70,66,230,41,88,129,165,162,102,13,174,38,114,64,232,253,227,164,181,141,250,161,12,170,93,227,167,48,72,103,39,164,3,7,180,71,11,148,98,69,18,72,92,238,205,161,156,157,158,187,104,130,82,151,172,163,122,163,229,190,196,196,151,179,93,193,14,134,187,185,50,213,230,160,63,149,11,244,92,177,154,159,92,247,35,79,137,126,22,52,145,215,51,181,81,7,144,235,16,24,85,180,45,130,210,51,222,70,86,228,204,193,92,112,211,193,154,54,124,126,140,217,119,18,82,8,49,255,48,46,89,198,107,214,96,129,146,194,155,23,241,37,135,106,77,0,248,64,76,116,95,54,184,122,186,175,180,27,32,133,75,138,113,65,122,69,190,154,109,157,255,113,172,73,53,231,157,48,230,101,126,119,123,255,25,54,61,108,88,136,41,175,86,75,27,39,120,75,249,197,22,152,23,237,33,131,176,203,212,190,114,87,93,212,132,191,109,200,169,35,79,84,191,7,157,89,213,184,39,150,206,227,142,253,188,48,217,243,157,15,80,5,130,242,90,114,154,31,134,2,29,220,23,224,1,116,216,66,208,95,33,196,214,245,208,119,124,153,253,153,245,189,122,235,74,143,137,151,182,174,165,74,60,51,108,142,104,88,90,181,246,84,100,142,243,5,96,18,243,91,212,179,34,137,119,119,128,96,38,160,212,5,240,234,171,147,97,216,214,117,79,27,102,14,238,9,22,149,243,155,143,165,246,251,161,213,91,51,56,26,86,116,71,144,107,222,233,137,43,43,247,85,53,63,137,60,217,217,18,187,140,207,30,13,48,204,161,198,242,211,255,85,47,86,172,117,195,198,232,146,40,41,16,218,45,246,80,114,63,55,90,104,220,158,182,76,167,74,81,39,65,196,166,82,178,35,219,45,37,202,41,210,114,237,36,25,148,76,47,51,118,153,38,214,159,41,29,42,70,45,16,92,83,222,228,57,145,114,193,26,160,118,61,72,64,21,82,236,189,156,139,171,230,180,218,38,231,249,98,51,85,228,48,118,130,132,250,155,83,102,122,182,123,6,33,108,5,238,84,22,88,146,213,204,68,53,160,229,254,61,177,105,11,140,112,67,38,222,249,233,227,26,101,154,226,6,248,198,12,253,102,63,145,104,133,129,160,23,156,155,123,157,171,151,225,191,95,36,253,166,237,51,148,51,175,178,8,57,69,141,24,190,213,73,27,233,251,17,139,205,51,97,205,207,3,221,246,125,17,118,127,127,122,66,19,70,218,207,113,29,55,91,245,25,252,147,117,51,49,225,160,145,253,246,3,202,180,31,14,108,72,225,0,231,129,87,224,126,177,11,48,198,243,80,161,70,206,192,211,209,208,233,68,166,158,133,32,146,144,159,165,79,27,67,119,173,71,104,251,235,223,83,52,200,241,227,38,236,177,84,238,6,133,131,66,162,111,59,88,169,224,20,29,87,194,13,248,196,118,107,227,32,60,237,30,107,36,250,42,152,188,163,145,184,91,127,87,45,73,172,56,228,72,39,51,114,111,86,213,239,66,211,201,82,219,157,184,45,145,41,220,195,11,75,47,205,210,15,202,112,54,73,7,112,27,209,144,40,98,42,58,237,114,86,156,216,48,126,35,228,142,106,157,240,77,162,75,192,70,12,248,139,117,222,228,55,154,124,0,58,108,186,17,36,21,56,92,67,5,138,70,137,157,99,2,171,86,5,54,229,156,103,244,98,82,138,129,33,61,156,144,9,253,57,117,163,182,1,65,14,152,158,254,58,104,225,101,250,13,10,230,221,156,3,97,224,98,111,24,81,7,126,142,217,252,76,215,102,41,28,127,61,248,229,30,46,179,184,233,39,71,152,243,46,45,250,61,90,8,171,182,16,97,212,202,244,92,200,55,48,151,71,223,155,13,86,91,52,208,192,74,47,158,205,100,240,223,66,44,115,8,237,39,167,181,251,138,94,93,113,195,0,57,20,100,61,37,136,149,160,226,241,54,192,46,95,198,101,157,238,108,120,34,218,201,63,142,13,10,164,181,165,47,9,194,244,157,123,154,113,146,162,47,232,239,200,245,20,45,55,145,211,225,27,136,250,140,154,252,47,197,104,223,2,196,13,10,16,154,185,78,89,205,70,123,155,11,217,249,64,3,178,31,82,44,181,200,177,145,163,114,239,85,131,230,111,82,23,166,93,60,123,170,19,117,213,155,189,84,221,154,247,19,149,1,183,74,43,167,75,135,219,41,172,120,241,175,162,27,129,7,43,88,202,194,223,50,159,90,127,62,221,108,66,131,157,177,112,203,251,252,87,94,241,114,179,156,24,89,135,20,31,37,125,13,109,144,156,26,149,254,16,211,19,184,192,132,107,128,192,126,213,18,74,223,29,54,173,122,247,41,222,192,82,178,230,198,22,9,33,30,229,118,69,74,134,160,194,230,202,12,108,15,241,218,186,180,145,67,139,50,96,136,209,110,161,255,50,230,152,113,205,63,90,92,239,56,72,183,52,238,32,226,81,12,151,197,117,59,38,41,185,235,48,44,72,131,25,227,132,22,108,89,37,126,176,69,74,246,150,27,135,167,86,154,92,130,225,217,241,188,216,67,121,165,144,180,180,17,102,166,126,207,244,72,144,193,5,209,111,59,200,153,182,82,254,17,80,69,152,58,199,246,183,214,59,83,57,250,153,206,245,136,248,34,81,110,19,90,180,15,207,174,233,5,119,189,135,143,146,236,20,59,219,95,229,255,174,120,57,13,220,63,125,131,97,117,157,251,57,150,170,93,253,51,29,155,163,111,41,1,198,95,94,74,108,149,169,64,13,99,22,173,116,94,104,12,248,114,159,35,191,224,177,27,20,140,116,182,12,54,194,254,210,235,113,236,95,175,77,5,174,150,33,51,193,184,119,109,29,87,187,244,111,186,48,161,95,51,52,79,38,221,133,65,27,22,84,110,28,157,217,99,241,179,52,2,108,219,9,171,151,61,31,166,21,56,24,71,28,211,16,215,53,117,211,224,57,2,240,189,240,4,143,245,239,209,190,178,232,87,248,32,132,183,67,225,0,145,211,55,69,147,186,148,77,5,238,151,191,13,10,215,86,139,69,169,90,36,244,159,11,162,217,55,20,133,118,101,234,154,196,87,169,13,10,99,87,127,114,147,252,192,213,189,204,223,97,13,10,168,35,247,219,67,17,146,99,253,89,26,32,243,246,210,97,36,18,191,181,120,61,179,192,134,94,236,209,231,194,202,80,217,222,160,186,138,80,164,166,158,230,120,153,191,166,177,27,197,139,49,201,138,107,140,214,54,51,221,107,166,228,26,255,125,230,68,73,105,66,183,232,195,51,32,194,63,13,10,170,8,16,152,213,85,223,155,246,107,74,246,203,163,167,31,201,253,176,161,148,151,234,0,23,223,164,115,191,244,173,107,173,188,109,151,17,87,206,152,254,18,60,162,165,113,30,249,54,15,234,160,244,12,96,105,209,91,91,34,79,50,247,73,101,217,127,212,129,5,244,58,215,77,8,176,178,190,239,188,179,211,1,218,190,112,125,162,40,232,2,194,39,52,37,78,206,152,173,115,192,128,218,250,9,223,21,185,52,11,132,21,74,45,27,166,153,47,237,54,116,170,154,158,0,44,77,64,53,59,223,135,237,183,62,97,49,138,160,3,174,123,56,143,233,248,101,111,223,87,94,25,5,9,114,125,131,133,229,11,135,28,205,252,212,253,24,19,128,27,253,253,115,135,72,4,33,51,8,126,152,168,198,64,131,164,185,8,89,77,236,56,172,156,110,253,210,111,30,19,204,89,162,3,171,211,136,127,255,6,56,197,16,130,211,42,50,140,58,172,202,89,225,115,213,109,59,59,242,121,118,198,188,149,69,114,137,13,128,146,233,62,53,241,136,226,37,93,76,34,61,93,159,202,69,189,244,51,18,31,95,139,219,195,132,241,192,235,239,131,168,206,127,161,134,212,19,215,251,222,122,157,40,24,238,229,163,5,165,122,251,99,91,143,246,99,95,23,203,3,11,13,41,235,209,156,226,156,217,50,3,74,60,12,9,34,199,32,34,136,242,163,161,61,27,190,56,80,106,116,4,109,203,172,247,216,154,32,1,120,95,18,243,216,133,135,31,153,80,174,52,237,2,138,152,181,55,52,3,188,19,34,209,242,197,131,168,220,17,130,75,66,131,194,51,200,116,79,213,108,178,15,214,191,13,223,118,254,241,208,236,165,168,117,90,47,21,223,3,41,208,152,3,50,131,102,74,239,224,197,158,218,146,187,37,228,104,17,130,226,12,0,140,115,249,199,54,113,31,223,60,92,164,26,204,112,243,32,148,157,13,10,50,229,189,11,244,130,157,233,72,72,54,200,24,53,66,241,43,236,50,252,235,90,59,253,187,26,25,56,49,203,117,57,252,18,241,129,250,185,91,166,16,55,152,33,169,160,39,145,219,163,178,241,84,209,55,136,189,36,141,59,148,105,223,1,187,159,253,141,105,193,14,52,119,115,199,129,85,155,167,127,80,193,114,227,45,215,122,222,100,32,46,168,143,155,34,204,255,134,241,242,33,116,28,76,157,231,238,113,156,34,56,96,68,101,57,72,142,110,207,126,236,140,113,248,43,42,59,84,218,209,145,220,121,114,238,192,165,113,232,57,199,51,174,190,44,85,123,238,181,166,155,255,162,100,214,15,63,109,26,249,250,229,230,218,85,249,181,229,78,41,201,120,166,134,140,2,249,54,184,156,139,17,202,135,109,101,149,134,29,41,63,233,162,80,231,35,160,151,22,22,127,32,192,15,64,163,255,171,55,178,54,205,179,105,30,218,254,150,126,114,166,155,135,246,157,182,233,141,50,201,118,249,68,133,117,70,76,22,244,54,102,206,68,118,132,11,137,200,128,172,193,89,231,234,150,35,201,196,156,76,174,145,27,173,218,241,40,228,227,54,228,27,92,118,212,223,148,100,247,166,106,192,120,114,128,242,123,46,162,204,3,99,125,106,158,42,198,210,139,202,218,44,93,203,66,95,153,160,183,183,103,123,43,121,196,245,148,120,193,224,191,210,74,239,25,150,33,178,33,23,131,204,193,180,220,86,218,36,18,3,179,153,207,188,70,168,12,209,209,114,194,90,118,181,93,13,10,7,12,0,161,125,158,34,0,25,18,28,240,108,238,40,109,53,130,250,2,241,75,108,14,215,138,229,43,150,15,103,214,213,51,28,78,111,41,197,26,20,180,1,113,72,116,208,223,224,251,36,210,100,233,247,5,129,43,198,123,99,74,213,88,236,35,71,53,86,98,3,25,157,213,88,254,82,151,207,28,245,205,84,146,201,48,86,197,224,167,18,38,72,31,225,62,91,186,40,177,19,148,252,237,33,49,238,69,239,179,126,18,240,99,131,82,234,104,140,198,136,27,209,130,217,9,76,136,85,33,17,191,135,248,142,187,165,174,150,121,53,76,218,108,136,136,177,114,212,102,53,34,15,185,132,149,178,100,105,0,44,176,87,90,99,96,196,182,144,150,114,172,6,247,14,197,136,223,17,123,234,7,94,200,158,134,94,87,122,13,239,21,128,75,173,184,212,46,245,198,214,251,112,235,253,63,73,165,178,24,190,144,218,203,122,182,37,53,59,213,78,104,124,70,23,252,16,165,213,1,7,88,198,78,160,214,88,31,79,61,79,204,183,185,12,169,200,133,176,40,210,159,131,138,82,173,17,82,51,16,168,61,97,167,62,114,169,177,46,233,65,195,121,6,227,123,94,63,90,42,171,50,244,16,86,31,54,130,168,28,207,149,158,198,61,150,184,159,223,150,167,138,176,75,35,110,80,5,186,204,121,116,247,198,46,234,162,69,172,65,149,140,168,254,166,173,63,206,83,57,225,115,154,83,18,121,100,44,235,164,38,238,77,218,249,34,39,17,82,8,76,76,208,142,222,245,14,219,250,57,157,228,151,40,68,251,166,130,135,223,26,29,152,120,55,116,247,11,167,101,90,159,137,214,75,171,17,173,59,85,69,157,180,171,118,99,226,173,93,252,120,190,228,46,136,122,46,118,181,17,161,89,129,46,72,145,89,172,202,47,13,10,36,154,65,43,30,228,169,13,10,70,220,159,248,50,82,90,155,9,19,36,74,195,206,89,147,225,118,116,209,102,5,99,198,213,77,102,181,221,230,182,74,167,111,0,63,243,83,58,70,238,86,187,145,59,110,254,14,157,166,250,78,83,25,182,7,213,62,157,125,150,54,128,92,248,195,179,148,123,241,149,234,37,205,229,71,180,69,13,10,158,184,172,132,20,110,245,77,118,147,33,48,97,137,123,201,110,216,33,250,87,192,189,163,36,79,228,161,238,163,222,246,121,244,94,249,246,126,16,181,222,205,211,228,190,200,151,1,245,83,187,75,204,109,77,30,15,184,201,9,11,150,97,25,96,89,177,191,26,191,27,224,77,107,116,165,204,87,228,9,113,136,73,17,244,82,195,59,88,203,4,242,198,254,62,29,113,191,92,177,62,117,55,217,250,109,101,234,147,94,213,233,110,247,35,99,191,120,50,42,143,135,191,122,17,138,157,235,113,183,242,70,170,103,108,218,82,36,9,116,230,233,218,68,214,34,228,242,164,61,117,17,184,58,1,38,178,185,45,11,241,176,40,118,229,35,217,208,164,146,181,166,61,150,177,244,126,150,46,231,172,166,251,157,63,154,236,71,173,197,34,218,232,170,113,139,197,64,207,93,112,49,167,211,209,111,15,111,243,58,151,104,41,13,10,144,165,252,94,104,149,207,249,219,171,66,167,112,189,17,183,135,181,7,141,179,222,145,127,146,60,46,182,234,17,231,97,54,168,190,227,110,183,132,120,142,163,226,185,215,190,149,230,212,36,59,22,108,73,76,75,117,76,109,209,96,32,109,186,243,153,174,73,2,211,220,167,66,79,109,30,124,69,93,86,32,35,70,93,13,10,169,222,70,11,24,102,215,165,43,90,247,78,146,61,47,187,73,196,71,13,10,158,24,73,123,211,50,243,101,136,6,237,25,198,7,127,4,108,93,192,208,188,204,29,64,221,210,13,29,211,102,39,213,57,79,157,56,21,156,132,117,27,53,90,142,72,117,76,109,209,96,32,109,186,243,153,174,70,155,156,199,189,142,61,20,20,121,167,1,42,4,95,247,45,81,164,72,253,255,57,215,139,230,255,192,70,229,207,7,100,76,126,208,161,184,92,194,57,141,15,58,213,66,209,16,61,45,225,243,179,65,190,199,210,134,116,150,31,107,125,49,59,133,249,8,242,79,77,24,8,13,10,178,196,108,97,242,21,85,124,13,129,253,166,118,117,82,194,11,3,126,180,201,126,57,221,81,48,13,10,84,207,48,26,243,174,147,221,15,149,141,66,42,88,230,104,233,30,177,79,178,149,214,146,63,253,101,162,218,154,136,250,63,231,249,173,227,215,51,249,238,181,74,18,122,18,240,199,145,208,159,177,47,208,38,224,154,130,50,202,190,200,154,143,243,144,132,254,17,23,149,81,142,200,190,171,203,158,41,73,211,197,132,86,255,22,221,24,123,201,6,237,25,222,143,109,106,42,99,158,31,214,107,2,12,92,168,230,154,222,183,127,197,92,132,173,88,38,178,145,158,9,189,217,154,83,127,92,146,67,122,169,173,24,126,206,45,36,93,41,169,160,213,79,246,236,120,65,187,230,211,157,30,6,182,206,59,25,234,152,130,62,12,49,161,139,197,100,221,226,24,185,36,227,139,175,117,41,146,32,178,129,202,190,12,148,11,64,77,188,245,77,25,236,214,242,46,153,233,236,191,205,138,94,34,93,41,212,83,91,32,228,251,105,182,102,42,58,241,62,195,76,27,88,184,104,74,160,199,206,141,132,246,231,17,83,72,97,50,138,94,70,115,212,189,108,208,89,161,106,191,216,225,87,59,9,106,58,170,234,50,116,71,79,179,169,125,127,251,22,120,55,163,125,242,187,105,244,213,195,26,27,201,15,7,176,69,142,246,200,94,81,207,97,99,164,9,208,31,103,81,60,88,8,197,119,47,133,2,221,149,137,135,237,130,39,132,215,190,68,130,64,219,194,198,169,251,127,104,133,227,78,11,132,38,103,193,89,8,206,15,180,229,236,180,150,99,105,186,117,46,111,194,243,158,21,202,241,164,30,68,26,39,208,189,81,117,232,245,12,180,96,66,91,219,73,157,117,255,203,170,102,6,232,146,178,20,0,219,59,236,191,58,163,142,227,141,164,195,51,196,38,61,161,82,247,29,196,186,255,112,46,161,54,58,9,64,165,54,62,169,181,27,31,42,113,161,185,164,253,209,145,82,127,237,126,37,22,201,94,191,240,231,194,206,146,197,3,153,225,131,134,237,62,227,154,72,178,218,146,80,19,137,203,193,246,80,24,65,232,103,248,185,21,163,52,160,171,183,169,43,43,227,175,16,222,55,203,164,130,63,147,44,39,121,195,176,8,175,182,94,192,62,220,236,132,126,65,42,247,120,127,112,199,154,200,76,88,1,78,141,14,65,100,70,179,106,80,201,230,23,87,38,70,141,159,57,154,24,97,67,26,139,211,17,255,5,103,114,58,163,95,187,101,11,23,54,99,186,49,191,245,88,55,95,116,3,70,33,107,255,212,114,152,111,243,123,238,74,163,103,86,69,168,62,171,225,133,58,160,97,251,54,20,183,140,199,128,164,113,195,192,245,218,55,140,169,12,230,127,33,36,123,193,5,163,189,78,74,255,244,57,252,21,139,154,169,15,208,232,80,177,80,131,85,191,1,82,34,90,44,34,175,158,93,237,240,56,242,138,17,162,165,83,18,140,148,80,134,232,75,74,20,102,23,233,5,163,161,111,170,72,93,106,87,73,167,6,122,236,61,45,239,13,10,173,167,67,111,177,225,133,188,102,208,227,13,10,123,179,58,244,88,230,5,236,151,141,20,182,24,29,141,126,157,235,226,119,81,166,245,250,193,21,148,246,96,92,190,99,141,154,152,171,108,28,63,108,49,37,165,125,197,81,88,219,162,189,77,54,254,190,13,10,133,144,232,13,10,252,187,19,64,197,85,58,102,142,242,214,245,180,48,90,157,141,56,175,189,87,89,32,159,158,185,205,28,238,15,190,206,109,231,173,42,175,9,109,190,71,47,131,56,157,116,63,13,122,173,198,116,63,118,70,247,191,58,159,115,162,58,67,243,125,71,26,61,109,18,222,132,232,61,44,245,180,30,132,241,172,192,203,196,205,82,208,206,199,56,143,52,234,212,123,69,105,42,73,24,179,101,235,159,110,129,61,146,35,169,95,236,141,227,211,237,126,200,82,39,248,33,114,18,190,194,24,147,5,63,116,230,82,186,233,41,158,112,159,210,91,155,203,130,232,96,192,197,107,206,31,120,113,41,98,142,36,153,19,15,230,239,118,65,142,218,124,198,72,215,105,198,245,73,132,222,169,42,244,119,110,186,219,225,97,209,128,218,158,95,61,101,202,196,167,164,14,195,163,167,194,83,88,21,151,182,158,117,38,243,225,13,97,158,97,79,12,45,196,246,254,186,55,193,149,37,24,254,193,27,57,251,209,61,220,33,253,236,202,175,149,202,143,184,215,214,8,158,27,207,155,87,77,157,143,229,194,90,130,160,182,139,144,241,64,185,52,235,88,90,247,188,248,200,143,156,28,26,221,116,91,2,167,225,157,180,64,119,56,164,237,146,140,131,113,128,5,164,1,183,122,86,98,43,108,141,203,59,38,203,95,5,236,95,186,127,133,176,166,168,26,13,142,117,136,14,243,87,215,173,85,18,146,211,124,126,234,189,114,32,175,113,237,242,103,118,5,113,205,62,57,175,50,11,191,19,201,221,216,5,62,244,28,200,30,66,91,50,219,2,92,198,102,73,5,90,225,198,188,70,139,220,214,214,157,60,227,52,208,183,140,69,120,93,251,112,159,249,167,122,70,168,198,96,246,132,214,27,54,67,178,188,131,139,110,152,61,73,80,174,32,67,97,115,233,61,179,114,23,33,84,111,206,167,162,67,144,36,5,19,0,6,113,55,49,59,36,36,225,98,126,5,53,50,189,185,202,238,81,158,157,35,237,103,13,45,94,243,103,79,34,93,81,225,237,142,8,44,95,201,245,249,185,52,192,35,140,246,91,61,211,100,180,102,178,174,174,163,211,36,28,89,201,203,211,235,249,234,154,125,250,46,234,155,126,232,111,15,126,37,108,237,16,153,55,81,40,97,80,230,99,88,13,10,187,84,17,71,131,91,159,20,178,31,82,137,153,22,13,73,45,158,116,176,27,85,218,178,194,226,100,63,95,32,176,244,236,78,138,58,45,244,122,56,250,29,54,215,85,47,251,52,193,212,200,21,46,41,183,35,85,8,224,31,121,212,30,31,45,186,128,126,76,244,165,252,135,174,245,152,236,7,244,50,26,44,23,219,203,35,116,139,186,134,162,172,218,230,185,48,134,162,226,109,82,176,161,15,131,255,65,205,41,26,208,71,31,9,230,42,121,187,117,225,142,104,11,230,109,166,243,178,165,106,143,97,205,193,223,156,127,173,208,129,67,112,221,130,100,141,177,97,216,95,139,42,154,14,81,222,186,41,122,18,80,222,202,26,246,148,77,137,183,251,162,243,19,239,61,97,117,125,251,124,40,1,119,143,57,59,35,131,152,159,22,23,110,238,26,105,95,150,126,254,126,4,238,121,237,147,106,161,33,171,71,175,192,240,128,153,17,162,144,160,252,175,210,176,251,108,252,5,158,209,183,247,5,19,164,148,16,35,36,19,193,220,182,7,166,104,204,24,4,55,98,239,34,77,205,215,181,214,33,26,194,40,101,14,70,7,54,125,79,177,89,89,184,18,109,236,23,80,97,163,202,127,123,1,219,45,215,45,251,86,117,110,206,121,250,97,167,200,69,51,106,196,18,189,164,52,124,88,42,111,94,37,201,206,203,102,182,208,40,82,143,97,240,183,127,27,198,3,210,13,193,4,201,70,47,205,235,41,13,10,91,249,99,63,230,162,146,181,32,152,248,80,59,237,23,84,140,5,216,54,84,63,115,41,220,221,181,202,215,248,155,242,109,222,254,180,145,45,44,27,59,212,15,146,170,178,26,230,15,232,195,117,185,96,249,158,73,154,225,76,185,42,93,218,184,8,126,244,212,31,68,80,166,128,196,84,159,51,242,182,80,218,187,14,6,244,24,251,98,187,35,76,40,119,234,124,86,110,48,23,176,140,180,195,129,202,249,132,25,27,167,223,164,233,120,74,180,84,60,32,161,131,46,99,208,243,98,68,140,210,238,114,249,164,90,12,215,72,1,223,179,44,109,242,139,131,194,24,61,19,211,122,33,254,143,85,53,78,66,13,10,211,52,229,227,108,161,19,161,255,22,189,61,20,39,81,181,12,18,34,84,227,187,220,228,255,40,133,210,197,228,214,165,122,55,179,74,37,147,245,29,106,216,156,194,37,223,107,132,101,245,123,108,208,52,206,102,229,232,111,254,136,13,80,125,114,147,60,231,201,57,100,190,207,21,72,29,239,126,100,158,74,28,249,109,14,120,23,53,125,250,129,186,195,179,53,229,235,149,190,95,14,39,170,81,190,208,187,71,213,86,65,127,208,7,157,100,186,20,84,255,149,49,201,176,144,235,100,86,168,229,37,68,193,191,132,168,65,135,103,31,108,24,247,38,145,98,189,0,35,133,221,96,220,189,231,197,254,105,195,77,0,75,42,40,69,100,169,205,228,227,136,126,167,141,86,152,186,121,26,113,15,190,146,199,152,139,54,26,51,82,101,199,7,194,240,14,75,170,56,85,121,63,226,121,142,229,243,193,175,113,114,121,237,157,134,6,100,153,107,38,9,85,6,189,153,200,167,42,231,235,180,90,215,74,244,77,107,164,90,36,1,193,149,228,79,26,238,118,116,52,7,161,46,214,187,128,112,30,104,162,234,2,240,221,26,246,50,11,89,236,162,197,26,56,241,206,107,141,28,218,222,109,154,116,92,33,154,49,29,100,106,59,6,156,68,220,210,38,244,236,7,204,27,36,159,101,31,26,58,173,237,40,77,223,200,184,248,235,51,55,26,82,40,35,254,43,146,117,226,236,15,71,33,82,42,7,4,118,2,5,232,185,36,239,28,45,240,158,67,227,152,90,196,211,212,150,14,241,156,188,118,167,122,118,171,71,228,27,233,204,208,50,237,112,129,60,45,74,246,15,145,108,81,15,157,241,124,91,181,119,255,209,205,156,63,88,62,139,192,82,139,135,135,70,56,98,18,133,223,85,77,31,139,22,196,209,24,62,113,162,44,119,44,54,45,189,20,39,152,12,0,44,60,1,18,6,30,142,228,133,209,154,2,12,111,12,174,117,25,77,56,71,88,94,250,205,20,226,161,245,205,28,141,14,159,67,94,219,192,109,182,63,29,204,66,182,184,243,129,210,33,145,251,15,116,227,79,115,177,190,57,182,29,35,31,231,35,49,93,231,7,65,51,177,228,82,9,3,49,236,160,79,108,56,62,171,19,7,205,144,34,171,33,233,118,67,197,255,50,150,97,59,195,204,216,96,31,64,101,120,182,121,122,34,138,207,102,99,121,123,122,117,146,182,101,253,178,131,40,152,201,91,91,129,79,179,228,95,103,142,55,183,9,162,58,93,136,201,153,184,238,71,52,141,96,227,88,247,207,142,231,32,105,165,35,214,199,78,124,22,146,221,23,237,28,196,83,90,66,99,111,83,79,43,229,195,178,177,89,66,153,122,155,18,221,252,40,212,79,33,93,185,20,46,49,241,152,197,230,176,210,95,178,234,119,188,15,156,140,164,45,111,246,124,180,2,51,232,57,110,209,104,185,13,10,58,229,128,39,148,70,101,4,158,84,242,145,100,103,60,75,252,182,2,137,15,174,221,147,134,34,224,153,185,63,9,57,178,202,212,218,65,14,105,197,66,89,40,108,140,207,63,119,56,76,78,34,252,67,43,68,57,27,203,91,230,13,10,102,66,151,3,87,184,145,145,204,180,229,168,91,168,123,229,206,175,39,18,202,101,119,165,84,25,67,12,50,189,210,139,12,215,166,23,158,131,55,18,192,225,127,112,12,49,34,143,248,234,116,70,68,13,195,253,5,253,160,140,23,173,163,50,150,252,251,56,204,38,34,92,226,144,173,234,29,78,38,181,54,26,214,4,216,176,138,128,99,111,93,14,167,158,22,204,167,225,163,243,197,156,186,207,89,210,82,217,137,162,73,117,45,88,206,88,72,13,204,173,86,174,235,13,10,92,117,184,154,138,102,112,183,219,243,36,192,136,125,50,149,217,130,203,240,226,196,33,44,105,125,145,250,99,214,118,211,4,44,104,193,177,151,151,176,117,145,5,14,194,58,255,72,241,65,166,167,243,134,157,211,217,220,147,243,94,194,107,56,143,67,173,27,242,209,6,225,27,53,234,193,194,12,213,56,149,17,172,105,151,57,100,199,97,211,44,128,229,182,78,23,193,7,44,143,194,25,40,99,32,171,14,204,181,214,197,226,134,92,153,142,172,53,25,53,158,65,178,244,175,188,48,18,59,194,208,160,222,25,238,6,212,45,210,84,219,32,64,226,162,89,68,117,251,1,185,13,10,82,164,23,143,64,59,188,217,120,44,32,200,241,141,182,215,47,156,100,66,241,208,196,27,148,3,106,216,189,249,191,237,234,11,150,17,122,147,240,76,60,66,6,166,187,227,36,162,85,167,241,136,65,208,159,151,96,133,115,123,135,187,137,122,152,77,173,44,236,90,68,195,131,6,72,227,115,9,109,166,255,232,230,55,103,27,130,13,10,98,211,29,206,187,16,139,90,43,98,55,76,116,109,165,254,56,11,202,30,72,108,61,174,177,185,3,74,190,137,128,184,158,13,10,70,109,173,231,160,239,245,200,54,77,245,93,37,148,57,55,215,143,210,59,181,153,252,77,36,28,124,166,194,63,51,115,85,216,70,195,252,224,140,130,226,30,225,36,219,158,159,27,65,110,149,141,145,237,44,33,226,108,59,103,32,209,129,84,184,243,196,26,11,157,3,91,153,235,86,113,217,61,214,211,102,50,46,21,165,191,116,12,38,26,212,237,36,232,154,109,241,23,164,20,234,12,19,146,105,26,88,176,104,202,83,134,133,198,70,255,137,48,41,53,127,184,229,103,133,87,32,232,3,82,141,214,0,64,198,240,97,17,61,149,70,242,219,164,250,131,237,246,115,44,109,202,67,56,225,77,61,87,114,145,182,150,2,152,11,43,216,207,186,7,158,17,219,34,40,228,115,96,14,213,80,174,5,205,133,161,207,207,251,100,94,104,86,84,221,207,137,27,142,78,212,84,87,8,246,131,245,127,188,104,13,10,24,153,39,82,245,207,46,196,113,206,208,161,107,196,54,50,23,249,118,123,104,69,137,128,63,62,110,158,254,94,81,233,235,11,228,147,222,62,233,28,69,97,185,42,5,127,176,62,212,240,223,97,14,228,127,137,239,212,177,176,225,134,157,255,226,205,85,240,224,81,60,115,138,2,76,158,81,77,183,44,109,56,125,214,63,54,219,236,105,65,121,167,11,254,140,116,14,226,161,58,149,6,1,240,3,184,63,7,187,208,53,248,128,154,227,71,229,137,48,44,31,158,63,56,99,214,111,241,249,128,196,130,36,89,26,118,33,50,4,17,118,51,78,200,111,132,111,189,164,219,34,234,92,78,19,201,168,1,149,212,195,168,55,149,22,247,102,200,7,140,183,127,103,70,126,44,17,169,12,93,40,123,167,14,145,151,249,162,207,129,209,52,226,217,57,65,9,64,166,223,208,102,125,196,145,236,26,112,91,45,20,51,172,13,221,5,43,93,21,32,222,168,211,19,190,217,73,222,37,29,112,144,193,239,181,137,216,199,196,70,13,243,244,83,168,143,217,102,128,26,36,66,73,185,150,234,213,210,29,114,148,244,196,185,146,2,82,182,11,14,137,89,237,217,187,196,207,217,113,166,204,232,180,2,238,216,123,172,81,13,114,25,86,247,32,14,123,110,204,198,132,119,78,71,31,199,119,116,99,231,74,225,224,116,47,58,159,65,16,81,71,38,173,93,129,21,2,52,53,140,149,115,82,72,224,96,134,119,15,206,116,156,246,3,77,181,227,7,26,249,238,99,65,64,48,52,102,186,164,103,229,213,113,98,99,221,146,145,180,207,232,86,243,82,51,74,205,13,10,244,199,210,117,130,179,137,77,41,74,178,135,211,202,73,183,136,215,253,249,219,172,166,52,241,167,9,235,57,195,220,101,255,115,42,61,197,179,24,201,229,45,192,177,175,24,145,1,240,36,152,161,183,143,61,178,206,36,240,0,63,32,149,122,103,106,103,236,170,37,245,122,223,79,30,34,196,140,102,253,106,208,206,51,97,26,53,255,46,31,181,31,191,79,138,78,25,234,127,76,218,145,203,214,73,55,161,103,151,137,185,11,170,84,144,71,190,226,43,55,65,227,160,77,66,62,4,28,9,175,200,71,21,111,150,217,69,43,184,225,135,133,216,199,131,19,232,171,163,133,44,168,220,207,200,200,166,157,66,252,158,179,102,41,110,249,243,59,66,88,43,235,156,127,2,27,198,201,210,124,209,154,211,216,142,25,232,184,48,60,85,13,10,224,122,216,254,209,81,159,245,202,104,176,126,155,151,105,95,231,107,167,77,4,168,16,16,119,98,14,229,161,84,209,227,209,202,160,144,203,43,80,117,109,186,11,245,201,254,218,170,62,120,105,184,39,47,203,39,177,202,253,206,185,64,216,37,249,183,190,183,234,165,22,112,219,204,56,222,158,227,178,135,146,227,13,33,49,200,242,244,127,121,219,108,164,177,181,226,243,6,62,104,106,109,97,38,112,126,255,13,10,96,168,183,202,133,11,159,143,145,65,64,105,53,79,240,202,40,87,67,179,251,62,112,170,63,62,88,206,201,208,28,186,184,98,209,133,109,44,198,89,209,184,80,42,100,179,249,137,45,1,141,112,12,61,146,3,11,17,75,82,14,226,133,255,23,102,219,18,193,253,197,96,28,21,52,92,109,51,163,196,169,148,227,107,66,122,204,115,50,102,37,150,242,211,111,36,174,24,193,88,32,208,252,83,225,101,146,111,112,21,153,163,145,38,51,18,120,227,31,93,211,221,223,139,11,80,74,110,77,189,212,83,99,11,234,204,231,37,222,133,238,12,45,215,89,68,74,21,127,94,117,198,81,136,173,13,236,113,215,202,83,250,93,143,109,26,63,246,72,99,64,216,30,55,216,205,208,64,15,84,250,170,53,12,188,35,46,98,199,149,58,53,73,87,48,219,166,40,105,162,124,160,62,133,236,90,1,185,8,72,165,173,204,149,117,251,14,96,195,210,106,222,45,114,136,108,235,53,97,175,43,59,177,47,46,255,147,88,211,19,205,206,34,138,70,141,165,102,249,90,97,152,112,0,114,12,98,171,214,127,183,185,205,44,181,213,247,75,232,224,145,157,203,96,165,54,75,23,53,211,31,179,253,181,159,156,34,240,98,47,141,243,145,41,76,12,47,237,59,205,24,92,157,147,47,9,123,203,44,6,107,111,43,84,97,63,48,238,153,207,224,179,183,8,207,221,5,101,186,223,110,30,123,32,65,207,1,110,59,58,209,165,192,59,227,49,96,51,218,9,28,13,161,116,115,146,94,121,231,143,138,63,72,238,35,72,178,165,28,238,107,219,226,162,34,68,179,255,216,226,241,246,235,33,163,175,0,29,20,232,149,78,128,89,137,55,236,170,208,254,129,160,48,38,159,154,235,19,67,80,131,109,164,45,248,31,34,191,53,84,77,175,61,98,255,135,1,77,61,98,234,88,104,110,94,24,45,147,13,10,45,195,250,194,88,139,73,182,96,162,44,58,85,191,140,153,222,196,54,157,29,103,130,16,219,19,83,92,15,179,70,240,203,154,140,53,178,150,82,231,99,48,8,118,40,126,209,189,142,228,64,141,88,111,44,39,243,193,28,124,174,158,177,17,59,1,213,33,169,27,36,197,46,216,249,229,225,34,177,89,250,114,71,175,65,154,35,120,234,9,165,157,114,20,115,150,55,42,125,30,109,125,83,61,13,10,9,57,206,201,162,124,107,172,201,75,248,235,166,32,161,4,131,176,156,163,16,202,65,166,194,96,110,32,41,243,236,30,97,42,252,217,229,48,38,128,209,252,8,142,162,109,131,85,49,241,87,233,212,83,12,201,124,172,41,208,222,59,184,121,151,14,179,215,129,162,34,176,6,176,250,233,126,98,51,252,71,215,31,26,177,148,230,114,204,81,99,196,5,46,235,136,163,26,179,163,249,165,159,130,21,204,114,158,39,30,93,181,0,54,184,16,205,149,207,217,130,104,132,174,107,29,158,151,116,116,122,13,10,157,240,57,167,124,122,200,52,6,185,210,58,247,150,65,37,80,82,77,244,139,24,172,138,36,227,199,156,70,74,37,63,227,50,163,193,131,153,251,172,244,226,160,198,111,21,44,159,137,149,122,98,139,53,144,112,199,115,235,124,123,8,116,80,40,130,90,250,176,91,9,32,137,165,152,206,235,52,161,244,11,204,97,224,82,112,190,39,158,80,237,145,3,243,19,160,234,184,32,240,83,181,54,105,51,14,143,110,239,69,4,160,93,8,23,131,85,242,197,22,44,1,6,164,102,23,205,11,66,79,192,78,61,173,110,166,107,243,243,170,188,198,60,213,4,164,121,122,118,152,164,134,234,245,34,4,69,127,13,20,150,214,45,39,160,87,23,178,59,171,20,243,122,128,130,191,155,144,184,188,130,177,159,217,132,4,217,172,35,172,115,138,240,230,36,128,134,19,83,141,52,240,1,26,231,117,173,179,97,227,48,219,151,87,19,182,114,225,6,34,141,170,28,103,46,238,24,131,179,164,137,233,243,117,20,62,149,99,214,141,23,117,186,21,19,231,121,13,10,124,167,70,128,17,66,13,190,3,243,114,51,154,94,53,74,238,1,141,254,160,118,220,137,98,223,251,180,67,53,6,165,191,196,75,5,18,232,168,235,125,11,160,248,31,91,18,49,113,166,155,45,66,255,92,248,168,30,137,168,49,224,6,255,82,24,218,244,79,37,247,224,70,198,176,107,177,176,119,119,134,82,220,246,133,82,83,18,154,65,136,79,134,219,145,46,87,215,196,224,109,125,200,161,22,206,101,182,40,57,156,178,27,245,221,143,148,2,165,161,22,84,140,86,83,163,8,62,65,43,83,127,216,50,78,109,179,241,93,248,62,1,133,203,141,76,95,19,45,223,31,136,17,229,116,2,159,62,250,8,40,249,34,62,49,140,13,10,131,139,47,146,3,247,7,242,37,78,100,155,123,120,117,126,148,5,109,144,246,93,240,76,71,231,59,215,245,204,87,114,193,37,63,31,20,21,103,239,84,53,135,173,217,7,242,6,24,123,97,18,53,198,52,201,119,97,228,131,64,119,230,89,182,14,224,249,211,122,248,85,96,24,207,5,78,170,64,13,10,130,13,135,183,47,51,19,126,178,250,59,140,63,143,14,111,33,194,129,203,148,12,15,169,250,0,88,146,67,211,39,149,18,90,174,218,217,215,206,186,57,155,161,81,248,175,99,187,56,32,188,245,229,156,43,172,94,184,164,83,200,235,168,16,106,5,230,200,70,3,210,249,22,40,135,138,148,129,14,188,156,117,217,81,203,73,22,180,164,200,212,113,187,115,157,38,152,76,126,13,10,13,173,207,68,170,203,245,152,58,84,217,121,155,32,41,140,36,33,102,196,71,184,46,117,82,1,74,97,93,33,9,31,51,150,27,91,8,76,247,103,13,10,96,206,230,175,25,25,228,209,40,164,225,85,9,96,124,170,128,32,147,197,102,139,225,213,253,84,3,185,204,19,93,46,166,194,217,24,40,53,228,190,62,213,196,132,185,20,72,170,179,202,57,111,76,186,181,182,210,148,61,122,4,127,81,173,223,125,201,190,199,238,79,149,43,203,9,5,155,45,160,177,173,86,186,153,153,75,173,38,235,218,154,162,98,107,108,216,129,198,183,202,125,201,110,121,133,215,164,156,126,233,208,53,187,221,1,63,248,155,219,24,28,28,45,7,129,89,217,5,159,212,69,157,201,103,175,49,49,1,149,163,207,155,189,226,66,35,56,119,63,92,180,187,247,251,55,35,19,59,211,152,163,159,205,251,203,136,172,176,0,128,205,225,234,219,128,25,241,81,227,177,250,231,104,20,71,201,152,122,251,77,244,101,52,69,144,244,125,32,228,126,196,40,92,91,248,40,250,59,162,227,163,62,190,180,132,244,19,254,26,15,166,170,217,127,144,14,39,65,99,2,166,175,241,121,38,13,10,32,105,153,219,114,3,82,34,177,188,209,238,48,246,210,2,226,85,153,181,54,220,177,12,231,176,194,131,242,84,60,183,105,87,38,116,29,26,71,126,12,13,177,209,236,8,95,88,230,168,234,145,224,94,218,48,240,246,110,214,243,167,190,113,23,6,67,205,5,142,166,31,100,155,207,217,219,34,160,94,140,14,38,76,205,176,222,25,138,182,230,41,172,76,64,67,40,2,105,240,190,67,13,106,223,112,184,129,245,110,213,17,40,87,250,14,160,140,162,191,158,32,152,156,18,74,84,199,73,139,239,91,141,98,123,240,180,45,93,3,204,6,63,142,174,205,57,50,149,103,105,54,124,114,13,64,67,214,75,104,170,153,98,130,238,226,150,199,244,65,162,38,237,129,89,177,102,225,170,153,109,36,172,166,94,206,128,182,116,233,125,111,126,57,42,214,191,89,58,180,243,138,59,32,108,160,204,49,40,216,71,132,88,115,189,17,180,41,48,67,162,41,82,218,183,152,53,45,114,206,254,248,255,224,21,25,44,168,246,12,144,211,20,168,171,35,138,19,97,3,130,249,248,236,29,140,31,202,250,215,194,22,13,124,228,126,243,115,192,197,93,123,174,155,33,20,135,1,247,168,192,231,204,130,222,95,38,215,54,61,149,22,61,225,135,165,112,152,32,227,123,190,173,110,20,128,36,97,82,245,204,134,91,129,157,41,81,43,150,122,144,68,125,152,249,113,244,196,194,140,41,121,208,124,176,230,236,141,64,41,220,100,170,227,219,239,142,186,87,18,54,33,38,0,206,13,10,206,163,234,68,78,65,12,83,233,229,241,217,213,34,21,170,5,230,144,250,52,131,203,213,69,31,67,17,205,15,210,63,57,212,225,6,230,157,104,21,101,172,1,166,8,36,36,57,144,205,155,3,77,62,209,253,181,192,117,43,94,100,226,228,23,198,182,77,35,200,228,90,241,180,88,150,236,135,124,45,135,248,143,79,74,133,208,164,7,177,209,19,127,83,101,12,19,70,105,100,152,6,136,108,46,176,73,237,215,243,182,118,245,35,69,250,110,249,171,74,65,128,102,224,138,129,83,2,243,170,143,251,95,187,117,209,44,195,186,199,217,221,171,186,198,68,194,148,74,68,105,111,105,209,48,227,39,141,154,228,87,195,156,153,101,226,125,206,138,71,150,109,171,18,93,232,225,16,210,102,183,252,214,238,242,216,32,192,41,250,96,221,50,128,132,250,248,174,59,107,208,245,112,133,91,252,85,126,21,76,125,73,49,186,109,46,74,171,165,39,224,208,152,51,76,163,140,154,120,237,221,192,134,205,31,3,187,184,229,172,116,13,97,64,246,125,116,150,5,84,175,233,77,218,158,27,211,165,92,77,89,28,52,236,194,114,119,251,214,33,171,157,171,124,150,153,193,28,136,1,14,201,123,196,109,209,170,214,79,13,244,44,37,96,123,85,184,133,68,69,90,168,114,129,146,50,55,37,8,81,111,113,207,203,92,114,180,239,223,40,15,190,226,129,152,34,205,187,234,76,175,134,39,58,130,211,240,80,225,66,225,224,184,182,40,227,79,40,244,61,87,247,7,24,73,143,70,144,219,179,226,207,254,209,59,129,117,132,87,84,24,104,161,77,12,115,185,218,143,67,58,216,167,255,29,30,227,131,72,206,26,109,149,246,37,200,200,114,135,140,70,216,124,32,233,205,61,44,66,34,212,91,181,77,62,191,235,48,229,60,250,103,23,181,42,144,37,146,92,239,209,127,121,95,120,223,59,171,218,43,234,230,178,193,153,87,81,195,52,250,222,203,165,152,23,85,190,189,215,96,52,135,30,20,69,23,26,113,246,2,130,230,120,80,89,203,64,70,173,11,172,152,213,161,229,102,138,47,199,252,202,59,145,88,117,252,208,213,41,166,53,214,76,179,67,135,205,144,148,125,60,144,159,61,50,196,235,64,166,15,48,195,225,248,25,189,138,162,160,53,219,195,221,178,105,194,98,112,36,76,34,76,58,147,186,67,80,49,108,102,75,44,231,21,59,9,234,215,211,155,196,157,110,240,76,131,112,62,139,116,230,160,35,44,65,160,42,125,224,90,254,14,148,218,218,139,31,230,32,143,18,184,126,0,239,140,101,213,139,2,70,111,246,151,214,70,127,102,160,63,52,40,78,99,66,178,17,160,2,37,166,7,165,86,171,29,76,140,66,161,1,255,103,93,149,29,15,90,117,47,36,121,206,62,215,164,248,68,136,211,159,98,46,229,58,84,195,32,45,78,96,23,131,39,8,212,30,83,56,19,168,214,112,118,66,31,199,110,178,92,107,99,115,244,19,246,123,1,214,251,193,168,109,56,30,251,209,68,133,199,21,152,74,19,24,157,119,247,13,10,248,3,92,141,245,209,210,59,242,83,82,69,97,121,17,164,189,88,6,137,65,224,6,231,211,102,80,252,224,105,4,139,176,188,248,49,211,96,111,62,115,13,237,11,135,168,211,40,44,204,95,245,248,240,220,113,196,224,247,2,220,91,138,142,183,24,37,224,155,105,42,218,230,121,63,11,214,220,217,47,94,195,113,21,159,13,97,183,225,116,151,119,102,145,13,10,93,32,19,175,64,38,78,85,53,29,232,247,183,7,123,5,137,24,187,221,236,94,77,199,253,84,184,59,13,10,244,95,17,167,26,229,150,70,147,83,65,189,56,27,114,177,198,75,130,71,44,201,86,31,30,213,173,107,93,249,64,136,79,101,116,208,48,78,91,157,204,40,135,90,138,233,126,243,254,52,6,142,46,54,250,70,170,92,189,61,216,127,146,238,139,86,57,148,19,0,161,3,79,80,250,212,96,2,78,70,194,113,13,188,255,37,227,209,122,156,12,118,151,227,24,177,68,167,127,13,10,57,177,251,233,16,204,169,168,216,99,44,14,242,194,133,213,171,141,1,77,11,45,206,141,123,6,137,175,4,73,209,162,40,117,203,122,166,216,192,59,84,78,135,43,168,4,173,228,97,201,235,255,135,70,22,65,187,123,158,30,104,209,58,220,143,65,19,226,224,142,121,176,220,48,213,151,101,129,74,71,166,75,106,51,20,59,153,148,212,43,118,126,0,14,68,161,167,126,82,65,220,90,148,100,135,43,17,147,223,49,135,198,144,39,69,32,180,108,77,44,4,208,66,132,181,141,5,231,55,141,71,30,52,68,78,237,57,135,71,218,233,23,40,184,177,243,9,154,179,104,141,76,231,216,39,5,166,163,223,73,231,97,244,197,158,7,30,62,29,119,28,161,184,166,12,53,155,240,118,232,6,29,20,138,109,216,4,129,58,89,108,84,20,159,175,27,210,226,93,196,78,196,88,175,94,38,25,164,24,197,59,126,175,156,199,95,194,19,135,173,139,127,142,94,152,72,60,174,126,134,133,56,144,215,69,136,200,112,120,197,130,55,236,151,219,254,138,171,132,136,19,132,2,203,218,92,135,107,67,194,128,239,179,87,52,33,120,33,120,121,144,157,254,246,90,33,151,156,175,248,48,103,89,216,180,117,195,223,215,24,80,116,193,133,228,34,45,235,120,31,202,28,46,123,101,227,215,188,120,142,171,210,167,69,81,197,188,210,208,118,149,16,118,115,200,179,140,83,203,66,94,3,228,38,225,217,136,196,114,110,111,187,152,142,162,139,218,202,81,86,57,50,19,169,203,28,38,234,174,123,149,52,226,210,80,131,55,242,191,165,116,80,74,79,122,121,70,126,151,81,30,224,82,88,98,136,178,224,149,196,25,32,206,119,3,77,82,234,157,7,223,219,243,240,148,215,209,95,15,61,189,175,63,221,241,212,74,31,81,212,112,236,15,103,35,248,43,192,232,116,189,92,141,30,95,5,48,246,94,107,103,95,250,179,205,25,241,227,191,106,34,110,62,207,210,181,1,133,144,57,95,191,187,229,136,98,28,223,46,82,225,72,55,148,196,76,101,72,32,96,121,241,185,152,191,49,17,119,45,181,203,184,202,246,147,15,34,83,115,216,145,225,154,79,230,44,248,164,48,149,97,39,74,50,154,59,235,168,245,137,191,246,203,197,165,214,45,44,224,56,211,182,75,239,150,11,65,133,121,111,80,108,154,219,7,20,244,119,56,199,108,48,236,202,97,160,25,66,77,106,213,237,70,190,209,50,11,102,92,72,64,181,20,105,47,154,107,208,249,60,83,253,113,202,41,123,63,0,217,231,236,132,154,37,110,99,166,71,254,49,100,221,46,62,163,101,175,37,165,193,235,38,177,59,19,12,174,129,190,22,35,160,200,219,117,236,214,136,6,33,155,125,179,172,244,229,93,80,66,18,228,115,4,68,101,166,248,187,102,247,48,242,130,65,243,21,153,83,234,60,164,175,147,57,91,190,159,27,90,28,50,33,16,126,212,204,225,197,9,245,34,187,23,39,144,73,4,29,117,238,216,49,160,246,166,118,40,109,176,115,159,93,158,250,19,168,28,61,56,205,236,109,246,30,236,1,20,81,51,141,178,188,110,92,22,136,96,95,171,28,207,235,132,45,225,16,210,4,124,200,145,56,119,74,69,179,194,177,116,164,36,27,153,89,171,57,214,55,141,42,27,221,2,210,0,41,12,255,112,165,252,60,202,191,161,102,56,28,71,247,62,62,248,28,53,157,53,97,15,224,0,55,30,108,212,243,142,82,90,238,156,2,252,168,98,200,204,12,197,72,168,70,146,139,80,228,161,165,175,25,167,202,183,221,84,13,89,234,169,48,191,255,105,205,103,41,77,71,11,219,14,1,9,15,125,7,17,255,40,122,236,76,149,245,78,206,187,239,69,174,104,224,123,32,230,201,102,111,178,53,90,151,29,234,175,93,14,119,17,71,135,213,121,115,78,57,194,34,160,20,86,117,111,125,5,160,121,231,199,40,216,174,211,78,40,180,250,237,181,228,75,40,211,222,246,243,81,212,171,228,13,10,43,2,135,138,71,71,177,173,6,75,180,58,194,148,140,157,98,227,189,109,60,163,44,142,6,37,82,171,65,104,142,16,143,216,56,201,105,219,28,232,67,95,23,51,73,169,110,47,11,21,107,156,125,194,177,217,163,213,121,106,102,78,191,11,97,85,229,32,141,151,106,149,198,218,74,128,202,124,174,1,110,70,111,180,206,78,203,201,207,204,159,70,243,137,70,75,162,30,81,72,2,134,254,240,85,49,141,116,218,121,160,97,47,243,22,219,65,133,87,148,85,158,167,51,204,240,249,100,98,109,163,41,178,1,73,101,36,8,173,55,89,95,210,167,134,154,211,7,82,66,17,16,208,243,27,57,86,32,184,43,50,228,219,121,40,4,85,173,240,40,165,124,96,204,231,50,62,112,36,2,63,233,203,17,196,86,57,37,193,230,147,146,146,159,175,4,108,22,129,59,0,81,110,193,245,95,214,84,69,149,209,234,149,41,1,90,23,204,129,6,112,146,65,227,91,105,88,108,31,0,85,95,15,221,250,116,106,38,118,79,209,254,207,16,31,99,196,242,90,117,178,100,146,0,252,92,119,0,61,133,37,1,21,58,251,163,210,165,185,13,68,133,46,20,230,182,130,126,111,113,68,129,189,239,236,122,104,178,50,189,72,53,101,211,163,29,232,97,118,178,221,240,164,47,201,112,12,100,60,166,105,56,144,18,123,132,43,165,9,153,8,190,216,119,210,162,191,33,182,158,31,154,202,254,105,31,166,132,244,14,250,127,41,127,15,73,185,178,142,100,253,179,120,224,230,110,231,86,113,66,150,156,92,185,47,233,15,161,144,91,13,10,92,53,74,20,237,247,5,182,46,160,105,36,139,109,62,126,239,27,123,38,210,101,117,97,164,218,92,179,210,124,169,190,140,40,62,35,160,83,28,188,153,146,234,88,157,58,57,166,41,169,77,207,218,123,250,3,71,200,82,163,173,162,214,49,162,247,77,209,154,127,150,162,61,97,167,62,114,169,177,46,190,69,243,192,81,247,161,0,81,125,95,30,212,60,13,10,13,10,197,150,31,203,192,152,127,145,145,250,23,138,203,157,21,253,151,23,64,149,46,104,234,204,189,215,8,57,107,107,107,57,149,151,111,216,165,113,229,37,62,232,207,28,195,26,245,35,221,34,61,19,212,174,98,233,50,38,216,52,121,214,67,82,215,165,23,115,188,18,58,88,162,79,193,25,11,58,2,204,94,189,45,52,164,2,64,177,221,119,90,180,221,144,65,89,38,4,236,1,213,169,109,230,18,11,55,207,103,42,169,18,66,32,3,255,79,147,142,229,113,185,141,25,12,154,67,97,59,17,39,157,88,111,157,64,160,191,148,2,81,97,54,58,245,37,162,67,2,62,237,48,132,35,210,123,214,36,96,119,174,100,211,134,37,68,63,209,62,120,145,95,136,226,132,2,16,9,86,139,158,42,9,217,247,80,185,46,181,180,138,96,209,217,174,34,123,164,124,182,254,73,177,197,27,255,90,121,125,8,127,230,200,69,132,101,205,51,88,187,219,181,79,214,38,60,26,186,198,151,172,56,15,116,23,223,226,83,102,2,240,167,111,172,116,194,73,46,82,79,183,67,251,97,76,196,159,130,191,89,254,229,66,166,222,52,195,62,189,19,83,24,104,14,193,75,119,189,114,176,165,121,47,13,80,81,152,19,56,132,227,70,211,211,168,218,23,71,165,227,65,53,99,172,117,13,109,45,99,58,92,144,171,19,107,240,244,196,30,25,0,225,218,85,85,112,121,109,215,198,111,79,188,15,222,239,0,231,117,68,144,213,137,204,76,194,87,252,67,119,6,204,16,78,0,144,52,40,29,168,30,116,251,205,140,45,222,53,89,165,235,89,166,113,146,188,169,237,73,255,196,155,96,90,157,172,161,148,234,2,92,81,197,236,188,179,167,144,13,10,63,191,77,28,43,151,64,250,118,119,4,237,117,195,181,140,123,147,165,53,191,67,250,123,14,30,14,105,107,108,59,248,252,137,5,244,229,238,216,12,35,155,209,156,149,52,146,44,39,134,194,249,255,24,1,210,225,224,137,14,26,110,97,145,138,76,144,74,216,248,183,158,41,124,242,190,174,200,122,251,172,169,81,93,201,135,226,221,220,64,242,28,90,112,210,169,61,141,13,10,98,110,110,97,132,162,207,232,95,134,99,11,3,210,55,209,82,149,195,197,4,111,123,213,162,79,89,168,188,174,128,144,155,150,235,239,223,108,226,197,130,59,19,82,245,167,106,223,184,106,102,147,204,44,182,84,173,9,207,171,166,142,35,56,245,206,17,118,4,252,92,3,117,18,133,126,67,172,9,127,176,36,204,81,70,41,78,160,199,83,20,94,165,194,241,106,24,252,117,246,141,3,98,212,71,90,30,144,47,195,65,163,200,46,227,7,68,23,157,57,195,229,41,185,107,17,45,229,7,17,149,74,66,255,48,236,119,127,234,163,215,194,62,15,77,165,208,165,59,237,171,214,228,100,87,170,98,146,88,93,58,20,138,49,240,85,158,133,85,100,20,191,46,158,11,98,194,13,10,178,74,229,56,42,109,37,194,74,93,84,178,103,44,86,137,195,255,116,53,138,109,33,31,77,68,225,133,198,75,158,149,42,194,214,14,109,156,129,109,94,25,214,98,214,239,29,24,179,128,147,91,44,204,163,16,102,253,120,144,249,180,211,195,157,125,74,17,108,22,216,149,55,55,237,252,245,17,233,73,16,241,188,195,165,49,9,198,162,30,23,122,210,65,186,22,245,208,156,113,30,222,89,67,0,156,123,139,106,2,151,108,51,195,141,67,184,115,2,144,151,220,90,147,132,24,152,18,38,8,252,76,243,172,220,202,58,44,176,130,216,170,69,57,216,36,61,191,54,60,251,222,227,56,135,157,162,100,41,46,223,126,223,119,118,168,209,43,244,149,63,31,227,25,118,13,10,12,107,98,117,219,78,209,178,113,53,19,32,98,235,75,122,207,178,189,168,178,221,43,169,127,82,77,145,3,196,62,129,252,14,249,224,138,241,172,188,240,238,224,88,236,91,236,176,74,28,173,233,194,61,94,80,223,247,168,251,44,129,63,79,146,31,226,2,169,100,130,7,233,92,185,5,141,118,198,227,75,19,234,60,86,193,236,63,59,235,249,137,99,252,86,106,232,8,16,190,223,6,78,50,183,90,157,203,81,66,102,151,9,63,53,113,175,54,24,97,159,224,7,208,197,43,249,218,105,90,175,28,42,172,219,206,3,232,143,32,138,5,13,10,2,199,234,169,70,244,26,203,245,254,252,3,231,144,208,136,103,226,85,230,135,182,100,161,48,201,242,247,83,127,234,171,154,67,31,247,139,210,247,15,78,61,57,172,232,30,104,168,56,119,230,38,35,5,116,46,125,22,220,55,149,198,0,63,171,240,21,202,86,57,22,171,123,96,251,127,110,252,238,190,79,159,122,5,241,32,185,99,142,157,119,128,28,227,25,209,153,161,241,93,175,175,73,181,62,194,114,234,31,54,41,208,19,13,49,235,72,84,55,95,23,18,104,134,109,165,236,46,199,254,97,43,185,248,48,140,46,13,243,72,28,219,79,151,248,213,38,235,4,220,87,217,168,68,3,144,41,103,81,107,125,107,168,148,88,62,116,197,201,162,70,35,206,164,77,241,119,46,42,202,187,92,14,31,222,197,130,177,67,13,10,115,88,127,213,241,107,120,70,130,192,208,42,128,17,46,32,68,255,174,171,53,128,243,228,0,13,10,37,116,29,8,153,129,72,50,69,114,144,190,118,81,184,239,215,43,72,95,149,212,5,198,81,94,204,237,196,91,155,188,118,178,6,118,165,246,169,26,88,80,30,104,249,108,176,190,101,222,246,98,205,29,177,158,168,3,31,238,251,207,64,53,59,112,89,71,106,175,163,59,162,106,249,59,96,149,106,234,109,120,159,243,216,14,211,0,15,38,106,45,135,115,238,172,127,239,211,119,109,166,94,208,26,207,155,67,23,86,2,194,106,83,139,29,240,97,187,59,82,79,42,106,228,221,5,46,155,162,136,178,211,95,238,209,162,243,37,194,3,7,34,87,219,104,64,77,213,185,174,182,61,68,30,65,173,56,95,23,13,221,74,165,89,41,106,207,66,102,199,227,187,202,91,147,110,96,40,171,27,186,74,68,199,155,71,0,178,159,162,237,101,216,39,75,143,84,193,125,233,244,241,81,237,8,197,119,76,26,197,54,68,119,127,230,117,53,93,171,94,84,177,49,214,75,187,170,129,29,172,121,37,224,2,246,43,189,169,120,198,236,233,183,197,28,34,87,55,2,187,8,189,33,134,6,242,167,201,200,171,171,27,38,43,146,60,72,55,48,180,230,35,86,7,55,138,107,119,13,10,89,132,94,251,100,83,18,156,235,200,110,184,48,46,69,252,219,222,188,136,200,181,179,17,89,37,4,69,32,25,90,66,220,1,13,10,215,113,179,32,8,58,131,154,113,73,67,63,89,68,42,36,238,192,130,134,5,21,22,233,122,175,9,108,78,135,238,142,137,54,91,157,76,199,200,28,113,224,0,177,83,162,126,116,224,81,95,243,14,64,18,82,17,77,199,212,177,192,31,174,94,243,38,32,215,77,157,76,97,182,60,93,117,59,50,35,169,199,38,125,213,22,209,205,24,247,254,95,166,15,143,219,170,168,119,141,121,168,122,184,144,25,39,172,135,13,88,11,63,153,0,182,235,163,142,131,4,85,137,144,236,74,133,253,160,202,107,60,223,151,87,62,77,7,54,173,191,207,54,101,150,245,227,79,89,249,234,21,211,142,76,194,78,248,8,6,100,87,152,99,153,211,9,206,44,183,254,44,29,27,169,33,241,25,138,145,118,110,29,228,83,25,128,245,71,119,112,120,61,172,233,222,197,153,34,97,75,31,216,137,136,0,124,106,223,16,204,238,225,56,239,194,52,99,144,252,136,209,173,248,97,126,78,86,255,167,32,146,145,60,27,38,53,132,8,155,78,30,33,66,19,245,106,244,71,103,138,69,115,9,30,62,220,59,100,56,192,5,57,208,3,0,107,177,122,186,152,245,231,185,203,204,173,255,104,3,179,30,106,217,65,153,4,98,254,27,147,92,103,255,158,74,164,182,21,178,133,90,210,136,65,178,150,132,26,159,26,59,248,111,158,59,22,89,215,231,123,75,110,7,218,49,175,132,193,245,126,80,32,207,140,91,53,47,212,18,78,19,17,127,52,86,209,234,63,255,190,36,168,105,113,183,18,82,85,5,16,79,68,226,96,85,61,16,214,89,120,165,235,247,238,102,199,172,102,3,231,190,149,210,185,232,18,105,49,186,19,137,105,135,249,124,174,165,183,235,225,197,64,105,222,167,75,97,87,241,155,252,190,162,229,154,213,117,16,50,145,235,54,146,63,49,52,27,157,18,196,206,220,62,208,56,63,25,230,221,243,107,165,38,82,222,232,30,34,86,145,160,11,73,170,63,162,27,93,26,59,112,102,51,69,38,63,181,155,240,215,22,103,162,120,57,77,113,97,99,18,225,248,178,51,21,114,183,144,47,162,150,141,105,173,61,66,169,56,215,230,249,233,242,99,9,68,58,109,151,124,100,97,53,1,131,157,9,135,15,2,210,130,217,16,39,115,140,23,209,100,56,75,244,158,223,190,88,89,1,112,82,72,58,56,95,61,108,35,200,236,49,238,158,7,197,118,29,133,214,112,43,228,35,27,149,254,53,123,246,114,113,69,77,139,165,65,4,41,29,245,28,32,146,130,61,88,215,212,80,201,146,238,220,43,89,167,32,199,25,87,144,68,218,225,71,183,96,186,156,131,246,110,39,116,195,99,82,202,36,45,75,198,223,176,125,21,137,110,223,93,7,98,161,185,73,27,196,244,162,236,226,160,196,78,184,243,164,226,6,190,135,200,87,243,195,186,1,231,193,179,41,215,85,58,47,91,140,23,238,110,51,158,92,50,199,90,145,78,217,51,198,1,103,109,206,117,241,159,118,151,55,86,80,252,113,160,31,235,124,136,207,147,176,135,8,137,223,150,45,148,154,192,198,114,202,90,99,251,155,110,159,115,27,7,92,2,186,185,41,126,210,49,128,153,189,195,210,235,38,130,28,249,13,10,47,56,138,105,98,193,33,8,155,243,77,8,227,206,81,9,153,47,48,185,248,232,181,32,42,208,61,3,208,224,0,18,133,204,70,71,217,25,179,40,70,236,35,251,200,201,16,107,186,122,73,60,129,179,165,139,177,61,213,215,164,59,182,98,42,214,140,132,29,127,17,54,248,149,177,212,148,150,136,122,199,173,196,148,68,128,58,22,74,13,10,31,174,194,153,218,28,26,185,100,251,117,49,75,185,215,212,170,4,255,179,87,86,65,247,123,221,15,126,120,14,183,205,193,122,136,33,140,24,231,16,224,248,41,106,222,33,251,223,53,186,6,232,13,10,166,190,200,159,27,42,3,7,108,109,175,63,15,186,132,90,91,136,20,2,210,192,51,91,104,123,64,48,64,150,136,150,63,109,172,84,69,9,77,102,211,61,120,167,99,182,245,0,253,76,155,200,128,77,64,245,44,244,186,235,198,211,93,169,205,238,122,48,183,15,222,208,241,133,135,161,126,8,21,64,112,176,163,141,224,0,53,26,137,244,75,108,214,102,8,216,168,104,68,249,13,136,203,37,122,74,249,198,127,21,80,54,232,51,213,245,208,252,120,29,201,139,31,193,183,76,66,130,46,116,118,83,208,102,0,103,218,167,170,118,84,113,146,158,212,227,141,156,214,155,221,180,112,127,177,209,29,18,55,179,165,6,76,248,193,198,40,226,61,233,238,157,254,204,75,222,66,151,141,181,41,117,42,58,132,185,18,70,117,105,234,63,157,111,64,151,136,150,184,100,23,193,20,36,205,163,8,52,71,245,194,223,102,194,92,85,2,234,66,78,58,109,220,210,48,230,73,255,200,43,59,192,22,139,185,153,188,81,8,27,54,191,230,17,119,174,171,108,199,68,217,148,123,197,168,147,129,98,199,154,38,142,105,69,195,132,45,253,135,183,125,20,143,156,121,65,204,98,157,83,84,125,169,48,134,48,235,123,211,225,192,242,127,138,194,140,204,232,11,160,170,0,96,242,107,186,183,29,23,87,7,171,96,144,47,251,217,201,156,56,216,82,241,20,240,18,120,150,115,24,155,36,110,182,78,9,140,94,157,209,151,171,246,38,158,225,180,173,252,246,140,28,123,62,82,49,120,15,77,171,61,67,5,161,138,137,138,227,211,254,64,83,144,82,72,196,206,114,161,1,83,112,41,135,226,203,251,1,207,238,248,106,25,237,95,208,6,102,255,147,241,244,120,70,204,191,33,109,66,67,146,24,171,188,149,228,86,192,116,145,167,193,228,111,29,32,28,45,128,102,73,252,210,52,223,18,47,137,179,182,192,216,100,5,58,199,18,104,97,167,31,64,203,39,28,20,153,228,101,30,82,164,148,17,190,81,198,70,213,157,221,145,221,232,115,106,2,151,136,90,14,2,129,67,47,37,68,8,172,170,236,129,163,116,197,6,13,15,7,118,119,170,66,160,107,77,188,71,123,70,15,141,102,23,137,255,12,254,184,41,171,236,214,192,111,161,173,183,111,39,254,83,129,187,0,155,208,91,171,52,106,45,101,45,36,120,176,168,199,106,166,201,152,201,114,110,135,203,218,102,249,188,98,252,68,14,186,20,199,52,112,20,178,110,132,243,5,86,184,114,75,234,129,191,118,211,66,99,248,228,90,234,86,132,30,187,96,24,82,192,130,1,109,87,5,167,48,14,139,225,39,107,147,193,30,107,255,132,111,28,181,243,119,52,196,103,191,166,78,147,88,151,183,137,213,152,92,227,218,154,142,184,11,151,54,93,242,94,94,135,94,209,101,132,86,106,250,57,41,216,105,163,250,156,215,170,244,123,120,147,152,18,251,225,143,41,33,179,147,215,136,247,91,240,240,198,42,91,210,81,36,204,152,132,78,14,78,222,204,37,217,55,223,86,112,9,101,120,127,196,209,145,163,61,184,194,79,251,47,245,80,74,78,97,8,229,251,95,102,18,219,86,187,215,210,244,51,254,225,184,240,215,128,236,79,118,64,180,255,192,31,53,46,179,152,183,196,17,111,244,63,147,161,24,224,86,214,216,32,191,59,65,167,192,158,173,28,196,255,144,82,66,23,105,197,107,69,153,56,126,176,143,117,13,106,105,55,176,108,202,67,82,163,244,150,22,22,235,18,57,239,89,45,114,247,167,128,18,149,161,238,62,151,130,188,149,234,104,50,241,178,113,94,241,174,160,244,114,46,133,22,253,173,27,244,20,92,210,97,3,33,8,231,137,42,141,4,7,113,248,108,233,137,148,225,180,181,104,141,89,214,4,122,81,50,51,216,109,54,8,172,77,164,204,228,202,215,120,227,102,39,28,22,9,221,197,6,48,76,101,183,80,184,189,185,53,206,159,14,13,181,51,125,46,80,113,90,33,209,221,4,146,13,10,253,186,219,106,65,105,50,189,198,151,170,229,204,243,46,153,112,255,5,161,142,199,102,132,209,37,96,126,38,211,113,239,110,105,23,43,240,102,247,235,111,82,113,120,160,155,64,119,174,254,5,144,168,191,0,13,10,159,45,72,54,137,183,92,253,2,87,20,83,67,82,9,236,153,94,108,7,44,120,140,179,104,125,99,6,215,159,119,28,207,244,33,77,243,230,60,116,232,61,191,43,174,205,71,44,177,41,250,183,96,102,58,90,100,41,16,113,49,135,180,39,99,232,163,102,197,23,13,10,129,162,51,110,152,129,245,22,111,217,224,166,255,108,4,179,183,108,53,98,224,241,223,71,7,92,161,190,154,121,213,140,179,146,249,217,246,181,92,73,5,74,53,172,225,179,206,62,141,60,129,186,25,89,193,103,130,51,117,98,110,218,108,163,249,214,76,35,222,122,159,46,35,189,50,21,191,62,101,131,12,216,163,100,252,83,60,236,168,182,123,70,97,114,215,13,10,137,30,75,63,227,90,220,246,30,62,31,119,113,127,163,146,75,123,190,128,67,185,129,95,151,119,164,240,7,121,45,109,111,153,66,208,36,69,194,176,220,7,180,81,12,163,53,35,89,170,49,98,50,13,52,112,208,20,123,21,104,184,169,20,224,223,16,140,46,90,118,210,189,125,88,200,194,215,64,62,117,95,232,150,170,117,34,5,59,76,184,70,189,160,164,233,181,107,151,169,208,137,227,231,65,110,107,29,208,20,34,155,144,253,49,154,69,254,22,26,14,48,146,230,4,190,36,18,91,81,243,231,22,28,100,255,251,210,237,158,180,139,209,67,66,202,193,227,3,12,99,63,189,107,135,210,133,41,250,41,165,69,103,153,190,200,29,88,28,60,232,39,252,218,33,1,65,155,17,154,74,246,128,28,148,92,49,79,128,244,215,171,243,111,115,227,231,82,121,83,6,54,254,9,52,78,152,195,104,36,11,158,67,102,217,230,106,97,5,116,235,238,111,49,204,17,30,131,224,84,74,211,33,207,47,98,248,197,48,190,204,250,145,197,243,197,100,93,98,14,203,53,222,111,163,218,215,105,100,219,58,131,7,232,146,140,154,24,188,183,45,145,159,238,112,241,185,117,136,219,92,24,225,107,199,69,53,151,161,242,13,122,157,145,49,176,2,165,109,76,54,141,107,246,158,139,173,78,13,10,68,92,118,251,224,175,42,247,199,77,183,154,184,247,103,253,236,239,250,176,12,98,13,3,143,222,131,65,173,20,104,135,4,84,137,72,157,104,14,16,65,41,41,58,63,39,229,252,206,117,41,187,74,39,114,229,4,5,65,87,44,34,83,43,245,13,10,162,252,125,75,77,185,166,179,142,38,104,206,216,253,95,179,75,38,247,237,95,41,223,67,165,177,127,159,31,225,249,51,4,227,26,46,23,204,216,242,85,96,241,96,116,177,220,162,92,17,224,134,54,61,62,189,97,57,211,37,148,205,89,162,216,182,0,172,158,231,192,32,210,43,74,206,118,98,179,73,130,76,146,109,41,170,95,220,156,29,196,252,23,24,176,29,122,4,255,113,251,16,24,27,5,205,97,63,251,164,57,40,88,98,151,58,2,8,149,88,106,5,67,40,28,182,233,74,177,133,211,254,233,200,202,239,223,252,149,158,231,237,81,1,141,82,123,33,220,165,186,66,186,46,58,138,119,219,168,110,100,206,13,10,178,126,155,93,176,20,0,27,221,200,144,219,127,97,224,144,4,89,130,26,124,112,99,219,101,19,110,138,240,90,104,210,111,100,33,250,134,228,174,98,101,60,101,119,172,145,135,243,214,65,11,219,215,200,16,156,157,36,67,118,175,212,183,131,202,0,71,62,39,151,179,133,200,88,92,22,114,147,46,21,71,210,24,61,132,173,247,230,248,207,66,13,3,164,231,138,209,113,172,141,82,244,67,199,105,137,239,81,160,119,76,19,113,17,67,235,0,236,84,74,43,116,33,114,139,121,80,46,139,250,42,57,76,208,204,21,175,113,59,92,224,187,120,231,22,137,24,2,162,129,187,143,230,197,242,20,91,102,230,77,255,101,9,49,63,53,3,40,36,96,228,201,76,207,133,86,155,28,229,132,15,214,56,239,81,79,218,157,232,177,177,232,119,87,156,212,123,135,133,185,145,100,26,72,27,160,239,70,3,88,12,142,219,148,78,39,244,233,41,53,238,2,126,42,85,251,175,249,146,247,158,3,247,178,66,104,191,147,178,75,166,198,4,53,45,20,126,169,179,55,208,142,2,219,199,95,236,127,80,173,72,65,174,101,81,6,118,65,83,230,224,140,132,162,38,79,42,24,12,34,37,250,30,57,172,8,31,60,74,62,51,131,187,157,81,7,236,208,118,237,198,26,122,128,217,174,127,85,151,91,96,118,226,69,240,142,195,100,69,216,240,93,209,55,72,153,90,246,95,255,231,85,151,233,134,131,230,136,162,64,83,1,27,199,27,105,154,225,97,220,218,131,90,42,173,205,244,217,168,39,80,149,138,57,174,104,80,88,206,116,248,145,98,110,153,73,123,200,45,98,210,53,73,77,216,63,135,228,106,55,86,130,62,35,67,77,71,174,79,53,162,222,232,49,70,128,95,181,226,138,249,226,223,120,18,73,126,246,164,91,173,102,223,123,41,228,149,18,128,49,205,150,86,67,35,199,90,136,185,142,115,51,246,248,222,28,142,117,38,251,95,140,17,16,255,174,75,204,254,50,229,50,241,34,143,122,9,79,103,179,81,142,0,160,113,137,127,78,219,104,139,249,151,81,35,203,225,222,8,149,234,13,10,136,39,122,105,165,215,105,76,68,177,90,228,181,146,207,58,23,106,182,233,105,61,128,217,177,184,155,211,92,216,136,183,100,146,14,134,94,126,154,208,232,38,111,23,4,78,214,82,81,141,135,255,238,29,195,100,66,47,87,98,26,254,169,22,13,10,140,121,93,68,166,206,12,34,98,58,168,175,90,8,203,35,25,243,53,231,54,78,16,112,109,108,53,125,253,240,130,211,235,227,176,80,63,6,72,183,74,173,221,83,143,88,5,177,30,237,88,214,229,15,125,126,110,26,99,30,137,200,30,50,31,107,163,46,19,162,183,46,36,154,178,220,49,231,58,35,186,229,150,21,54,241,99,125,26,30,193,249,247,119,199,85,231,37,16,223,78,134,192,172,184,251,218,63,168,112,132,253,113,83,108,237,37,13,10,143,49,133,31,12,155,65,73,164,255,25,80,110,224,214,181,112,101,87,184,49,224,156,104,123,171,206,120,77,202,176,23,196,166,44,243,157,242,191,139,37,232,27,41,248,225,28,181,161,244,243,235,0,20,86,15,191,27,142,71,49,150,119,232,48,100,101,125,194,34,244,184,159,94,205,6,111,14,249,44,25,147,209,98,71,206,113,174,231,200,180,100,119,34,19,255,167,184,236,201,180,252,11,195,7,131,45,235,96,94,104,95,110,231,213,74,208,100,66,78,18,121,226,161,236,45,66,177,210,147,227,150,238,13,132,50,165,160,220,50,229,41,154,167,145,19,32,26,165,210,32,122,244,43,75,46,97,125,128,165,170,75,40,186,132,208,229,114,236,255,52,253,194,2,182,114,99,178,144,14,91,138,32,74,242,39,47,179,136,192,193,193,194,58,138,130,27,111,179,53,59,246,108,92,1,169,6,138,254,30,141,112,16,125,193,184,132,97,175,116,18,64,14,168,155,230,217,238,72,179,6,98,150,131,98,31,175,90,213,249,248,123,141,179,29,121,33,8,65,46,78,49,123,13,10,79,161,248,15,161,151,49,82,50,220,93,77,210,163,163,177,108,135,103,250,51,226,242,39,204,183,231,95,190,152,157,29,81,226,50,36,38,186,227,90,233,76,168,115,86,197,207,33,125,222,129,173,240,98,83,134,232,16,79,202,33,120,33,120,121,144,157,254,175,60,75,73,34,255,13,247,183,66,253,142,83,255,6,206,55,206,122,183,218,122,107,216,62,117,51,20,180,165,219,88,35,0,29,122,229,78,105,111,15,206,80,6,73,31,157,159,187,79,65,95,50,198,203,172,161,224,236,224,142,111,53,54,27,164,203,211,106,183,0,231,214,92,158,126,104,40,199,160,94,243,71,236,42,67,63,77,20,238,215,224,6,105,86,56,248,195,235,131,67,109,93,71,221,101,88,3,194,95,161,172,174,117,6,112,113,204,150,137,105,100,114,80,203,8,42,235,254,25,157,118,63,83,72,80,173,123,236,198,17,156,136,195,106,229,222,77,192,22,49,199,75,35,191,192,190,32,98,220,160,244,12,54,185,134,208,111,117,106,143,106,211,238,81,27,115,185,74,33,101,50,1,168,35,12,102,222,17,175,197,221,17,240,199,187,202,110,218,78,32,35,150,16,209,183,195,151,88,57,85,119,165,216,52,206,128,140,129,117,215,65,216,52,177,132,200,101,195,216,166,92,120,115,19,169,251,96,127,151,119,81,82,106,115,132,193,83,217,75,106,146,157,178,101,18,142,224,235,125,169,206,177,95,121,51,132,121,3,23,200,122,74,43,24,231,101,81,142,146,141,197,205,37,125,23,52,239,213,241,86,19,69,48,175,121,231,32,4,199,179,239,5,208,225,251,207,9,33,54,153,72,158,103,170,235,57,89,139,113,139,170,216,102,48,59,86,1,234,86,193,120,4,44,37,181,203,88,94,193,42,51,107,247,75,179,230,85,149,158,111,133,158,99,18,236,24,114,234,197,143,233,73,102,251,44,104,225,96,180,144,26,111,231,1,218,96,126,182,227,113,226,162,61,46,164,55,84,23,143,59,221,109,163,224,218,181,19,242,204,3,221,232,93,229,246,103,167,70,39,219,200,201,50,74,50,92,204,82,194,206,211,12,102,21,189,112,191,127,89,134,156,201,162,213,117,123,106,20,188,141,37,150,185,73,190,117,195,230,163,56,237,241,177,60,239,63,226,160,45,231,41,223,86,204,7,181,207,37,118,233,113,88,74,151,39,184,78,174,110,217,211,83,245,66,9,76,59,17,252,154,7,81,201,134,243,11,16,211,90,90,221,158,49,2,208,140,0,221,164,143,148,36,71,162,1,93,150,199,139,1,30,247,99,213,212,77,226,171,140,149,187,56,14,116,19,138,147,110,3,225,184,197,182,186,183,17,201,149,254,223,185,16,182,55,20,95,234,23,103,201,40,61,199,137,37,20,47,62,135,14,13,19,153,84,184,223,102,100,35,229,38,28,178,12,175,194,137,142,206,178,114,12,238,146,170,98,119,241,18,130,114,144,103,239,61,254,224,170,157,74,187,50,25,2,196,87,68,118,97,186,120,82,97,116,18,79,124,157,85,102,253,171,93,223,79,182,192,138,12,183,128,140,89,187,66,222,73,200,127,173,212,247,89,53,160,206,215,20,184,243,181,246,132,138,231,166,5,150,13,180,178,188,180,119,151,98,100,226,168,74,67,207,104,84,184,40,68,213,9,110,66,42,57,2,17,175,243,166,246,39,28,3,196,189,189,181,99,23,103,243,69,208,156,206,75,79,160,233,194,249,207,54,167,255,177,47,44,142,163,19,105,69,192,135,249,194,189,233,126,90,167,224,120,30,20,76,231,191,94,250,250,113,80,215,3,80,91,247,65,43,185,50,9,31,146,179,113,83,156,228,68,114,62,172,153,170,80,131,153,211,237,222,191,79,76,169,5,100,187,164,74,190,115,165,14,98,236,38,139,42,238,102,114,111,252,226,50,221,72,104,205,25,129,133,129,96,100,182,49,110,174,210,244,253,187,212,203,117,20,95,218,135,57,107,170,110,88,120,21,76,218,11,109,139,199,153,174,7,210,42,133,244,179,234,221,5,1,5,28,15,70,198,156,194,106,104,115,139,178,13,10,203,38,152,21,249,124,171,73,57,105,252,22,240,113,78,55,98,156,131,81,50,104,59,79,94,77,127,207,43,120,182,200,242,242,9,196,239,7,95,131,238,119,213,50,214,170,112,152,200,147,230,241,75,13,10,119,122,191,124,1,233,136,76,238,85,6,105,55,23,131,86,189,249,127,156,27,88,157,225,97,148,252,59,21,43,34,188,6,228,132,46,207,222,104,71,219,230,149,223,37,186,112,13,215,92,14,46,194,204,151,22,223,226,164,231,92,85,142,14,94,82,30,112,215,48,94,83,121,189,176,245,172,48,240,145,167,124,100,183,187,217,79,205,4,72,134,93,134,111,77,36,30,25,33,239,82,145,196,20,174,115,130,70,7,217,150,92,161,133,195,0,91,37,131,132,98,185,55,201,30,217,195,166,73,213,44,219,205,32,207,106,29,138,48,50,92,151,160,248,51,26,240,196,26,35,101,240,227,116,131,3,70,239,157,137,95,233,36,83,16,152,135,110,68,7,145,64,188,77,118,39,32,139,29,9,228,102,42,164,91,151,150,172,162,94,63,248,98,79,20,238,18,124,106,134,55,121,150,164,250,142,189,75,229,50,47,236,210,241,255,133,100,90,154,17,68,93,199,50,138,122,105,191,245,38,58,195,183,127,150,143,105,94,74,163,129,184,88,29,243,248,250,162,206,70,89,135,177,242,86,137,216,180,255,111,121,211,118,163,234,227,170,199,200,204,100,54,229,113,58,97,173,198,213,142,138,158,158,151,137,147,139,243,157,222,53,243,173,93,47,97,157,7,182,187,93,53,39,125,39,208,13,21,188,52,171,68,238,143,235,194,153,53,244,215,143,113,131,71,27,50,252,50,122,99,28,184,118,151,219,27,249,234,53,186,9,151,97,35,91,208,251,8,201,236,237,192,42,86,242,1,50,128,190,246,197,124,157,172,207,28,254,46,100,121,109,65,133,237,196,105,167,29,150,136,158,100,70,196,12,112,5,57,155,137,95,241,229,188,244,106,194,48,16,1,121,31,191,126,137,95,191,100,135,9,55,238,102,114,95,44,86,113,45,164,212,128,184,166,56,44,49,126,239,160,38,130,17,102,72,55,192,174,72,230,104,134,224,73,12,248,101,12,19,109,234,225,54,40,250,59,1,52,14,126,209,122,238,72,227,248,50,64,150,144,187,228,238,30,78,48,249,215,147,15,181,78,247,46,240,111,189,233,215,174,104,253,174,95,20,110,122,220,68,184,153,100,60,194,7,197,62,20,199,102,7,92,234,65,50,20,6,171,200,145,106,210,247,99,242,104,136,97,54,171,38,81,18,93,162,147,72,182,187,77,23,33,32,62,96,248,80,73,53,206,152,183,120,28,236,224,0,101,182,162,70,153,2,2,110,32,252,48,239,40,173,164,82,248,32,151,237,93,164,135,79,213,64,159,112,86,160,46,80,24,149,192,245,97,118,130,173,149,167,64,19,217,95,207,199,191,32,59,95,239,232,173,237,127,39,19,117,11,210,36,184,54,29,59,231,180,239,246,236,114,196,228,132,85,106,93,125,98,222,198,30,127,79,144,44,183,209,90,221,45,124,245,185,101,83,113,56,76,236,167,54,174,135,132,141,151,84,30,198,69,252,13,231,222,212,227,200,186,75,138,153,113,110,118,122,47,66,66,2,139,97,250,42,194,232,16,253,202,33,173,7,162,142,165,171,165,50,205,97,93,8,71,146,108,68,231,212,253,107,244,96,99,174,114,84,119,187,233,255,208,28,202,17,108,93,46,53,203,145,67,107,160,215,19,233,110,129,225,136,33,124,188,96,60,58,30,196,83,248,62,149,128,99,5,60,122,244,3,222,57,169,237,71,83,219,58,135,111,109,165,215,25,0,116,199,206,71,158,253,196,27,243,68,139,248,89,162,223,180,130,238,208,9,252,56,197,72,171,252,84,40,132,25,236,59,114,73,182,111,21,245,53,156,70,28,221,109,119,185,110,157,239,62,174,198,213,38,209,159,9,101,71,6,30,231,196,203,90,12,113,188,93,223,9,12,54,58,141,230,72,212,76,183,113,102,82,89,229,5,115,255,148,91,82,41,30,130,37,34,192,221,37,90,211,173,66,71,101,138,193,189,247,30,44,139,182,47,67,194,243,153,68,17,184,152,132,130,31,191,150,60,175,164,88,154,65,15,142,97,49,127,4,203,249,184,126,242,54,114,76,133,13,10,66,249,175,47,54,168,80,114,187,22,145,29,120,16,206,53,181,138,107,58,151,140,110,238,179,121,190,68,81,246,38,1,35,165,107,115,254,84,219,188,79,25,52,253,24,95,179,116,162,244,178,5,237,120,56,194,36,119,248,235,76,209,2,197,59,76,165,173,116,120,154,68,104,207,167,207,221,221,210,61,178,43,164,49,92,112,55,99,214,179,218,87,142,220,78,192,64,212,240,72,66,120,239,246,178,244,177,227,24,165,117,220,83,189,173,178,75,232,197,168,31,72,252,151,4,201,99,90,87,242,188,139,135,146,31,43,63,92,171,229,23,183,144,159,111,172,59,184,90,79,246,13,81,39,228,93,155,56,215,102,32,230,237,144,26,210,15,238,85,169,154,236,135,153,95,84,128,159,34,97,123,40,159,48,58,199,104,151,25,206,16,249,213,69,111,122,72,4,17,90,190,76,219,92,254,44,199,21,148,26,149,184,177,135,181,63,116,194,184,46,170,220,169,107,216,185,2,197,142,23,209,187,94,142,135,187,13,10,163,84,203,237,131,117,58,239,222,29,27,245,78,50,70,170,20,133,247,150,254,59,233,205,93,182,153,44,38,71,228,211,43,161,75,253,94,240,203,95,177,247,127,14,93,19,215,1,84,190,30,43,224,234,108,108,167,26,80,36,221,76,128,146,196,101,145,48,25,204,184,217,73,226,221,92,216,122,25,102,64,189,246,64,36,204,243,141,202,183,240,34,166,136,185,198,112,230,180,251,251,13,60,111,197,6,170,90,166,185,204,160,255,43,253,178,13,10,159,135,96,64,219,127,183,236,44,203,197,48,74,21,34,6,207,0,249,131,21,234,26,168,250,138,70,153,194,106,240,74,217,69,90,182,126,96,204,149,185,255,38,48,204,119,33,232,15,180,193,126,15,154,27,122,175,181,205,224,138,72,158,71,104,157,81,56,198,214,82,151,249,51,55,181,198,217,145,126,45,152,198,94,115,40,229,91,105,53,230,184,19,20,248,132,87,72,95,157,194,45,105,218,165,247,251,238,137,64,82,30,231,35,41,43,175,223,105,185,23,41,152,183,149,25,103,0,28,140,105,25,244,62,122,165,79,53,45,246,91,129,48,164,93,95,239,230,114,41,30,21,243,79,143,184,101,96,9,49,209,199,81,171,216,220,168,204,110,195,199,231,53,163,172,203,107,64,126,40,186,148,18,118,188,210,226,33,240,106,162,225,128,32,200,138,117,224,44,135,81,80,88,0,161,216,232,221,164,196,23,196,143,175,215,178,133,248,119,25,137,208,232,79,137,173,202,29,150,95,251,55,199,79,99,224,143,158,90,203,8,90,102,200,91,132,173,140,62,133,53,77,23,224,84,148,191,175,146,221,78,145,239,166,252,83,254,146,183,194,203,217,60,230,155,53,207,68,186,202,163,58,89,222,128,213,0,70,161,36,3,9,226,97,241,251,53,94,73,249,177,91,86,202,80,50,122,44,98,192,185,68,239,125,68,139,98,251,117,128,86,101,165,13,219,48,156,223,199,203,115,104,23,42,117,66,250,183,235,157,56,96,25,136,116,147,13,66,143,55,81,216,92,34,138,198,108,161,159,63,123,95,43,185,51,3,178,221,21,50,191,39,230,134,57,118,43,156,181,37,249,22,208,71,142,167,237,110,233,115,94,118,129,41,30,23,178,211,44,174,65,89,204,254,119,61,154,204,151,38,14,114,26,240,148,62,43,204,184,204,191,23,7,127,247,255,211,137,220,240,6,6,79,141,137,228,33,162,232,216,9,143,114,190,158,40,108,62,130,78,160,96,79,137,87,137,134,108,219,38,234,1,218,212,180,111,175,56,4,244,172,151,255,42,98,107,192,240,89,210,20,58,176,90,173,148,69,137,172,181,225,84,19,44,147,146,216,35,192,114,170,135,153,148,13,92,152,56,106,15,214,180,208,181,54,82,94,48,86,153,244,23,115,36,33,187,88,167,85,104,173,78,219,83,38,140,129,104,249,20,190,133,44,134,234,2,211,105,49,93,213,146,54,57,21,220,70,151,41,240,30,241,191,250,244,165,210,158,231,13,166,50,185,230,61,211,131,238,205,78,163,33,20,100,44,60,75,232,1,38,90,158,149,148,234,109,206,240,130,188,153,210,204,126,146,51,58,239,164,58,51,211,196,105,106,28,227,99,201,179,145,90,168,86,62,182,22,200,151,183,149,210,147,97,248,37,60,38,125,203,101,47,96,90,150,214,73,45,220,172,43,19,191,144,78,136,201,15,215,94,199,127,115,100,187,117,174,32,11,97,54,21,38,4,74,148,199,224,51,187,134,212,69,151,237,57,177,173,59,123,206,142,16,101,156,173,191,158,7,179,251,4,28,241,168,173,196,183,76,57,48,106,133,144,213,141,54,54,237,135,41,156,71,204,18,168,71,18,12,169,247,113,130,96,111,134,183,36,121,41,8,54,114,85,103,125,86,73,95,34,170,18,117,178,255,175,28,239,218,18,58,137,132,198,7,212,56,205,124,0,183,105,73,123,154,246,33,148,137,92,108,121,129,147,87,38,76,125,11,76,231,162,89,221,22,150,231,115,205,7,34,226,138,91,234,254,38,199,208,74,216,103,136,106,197,217,209,248,61,254,151,246,112,28,32,0,7,206,129,133,158,141,160,101,5,70,143,37,231,124,189,11,229,145,148,112,14,197,179,156,48,0,24,19,152,36,139,57,230,80,55,107,47,189,151,80,187,39,69,127,180,202,225,97,93,22,123,106,222,68,213,212,185,176,132,146,231,210,18,42,241,105,186,141,31,32,30,14,131,51,118,155,249,1,134,42,212,110,204,157,88,184,247,43,88,254,198,27,221,105,28,193,74,239,143,93,122,52,17,63,155,13,8,234,164,251,191,213,48,183,60,21,240,254,239,76,69,167,200,199,182,142,83,16,224,147,102,114,130,71,93,165,219,103,101,255,86,96,105,33,91,192,157,208,168,229,24,108,194,193,30,53,119,181,110,177,58,234,96,53,210,220,58,221,29,19,122,225,95,143,154,169,181,11,100,199,183,193,223,213,129,91,219,255,172,199,91,132,37,72,4,184,190,20,73,179,47,69,174,59,119,76,182,15,58,155,163,69,14,8,164,67,47,242,82,118,134,227,205,4,167,240,53,71,27,180,189,223,78,78,217,48,158,112,139,224,67,83,157,41,129,6,203,76,110,120,38,123,86,130,33,207,100,88,245,162,238,23,206,8,203,168,33,217,184,114,181,185,133,238,147,156,16,164,93,176,203,179,160,148,50,189,172,45,16,183,60,41,153,15,218,222,74,193,97,165,223,68,193,188,141,96,223,204,225,117,185,252,165,254,220,52,127,207,122,156,137,123,55,133,127,125,140,177,231,175,19,244,88,106,35,191,201,134,11,136,162,139,92,221,162,91,116,180,187,37,83,232,237,121,107,3,35,19,229,198,31,244,20,187,110,238,77,158,95,62,139,75,120,17,213,128,154,43,228,166,9,227,154,12,143,172,187,171,150,97,154,52,223,150,170,244,46,197,187,15,22,201,46,16,75,149,37,12,226,3,170,156,6,42,64,154,4,8,157,2,150,111,69,75,143,197,240,39,44,160,244,114,170,59,255,45,85,115,79,158,62,147,201,239,131,215,195,15,83,179,52,204,13,10,225,232,176,202,28,212,199,79,89,147,202,183,39,79,220,223,232,107,219,187,243,234,118,46,86,141,147,121,221,244,31,9,90,84,36,51,114,119,248,228,241,16,191,219,101,68,188,96,60,106,21,60,46,19,8,77,51,63,106,173,202,81,231,180,80,3,212,69,148,120,185,81,11,72,215,8,225,46,48,199,174,126,74,31,31,135,45,49,238,118,223,50,4,174,193,150,184,54,92,143,59,109,63,56,106,166,58,20,158,146,60,32,93,120,215,212,193,81,87,130,185,97,146,125,224,152,192,25,200,101,217,12,89,162,75,178,254,130,21,56,40,124,219,154,183,3,172,184,40,146,85,139,59,19,33,163,22,32,235,233,116,220,26,18,116,106,4,122,94,199,147,229,124,9,16,38,232,204,14,208,124,191,144,207,25,247,146,98,158,85,165,166,183,217,78,102,124,135,1,83,202,68,13,10,114,47,57,64,26,170,156,58,228,23,233,78,33,22,217,118,48,194,137,234,67,224,38,181,29,2,101,211,138,132,136,88,0,9,155,20,75,243,113,136,207,179,229,156,216,70,135,29,82,67,114,163,172,199,33,249,186,86,89,5,44,220,43,120,242,97,146,176,87,148,84,149,253,36,86,8,156,61,249,197,67,166,67,243,157,188,38,213,50,200,138,164,250,105,54,231,87,156,221,200,223,131,19,138,218,236,176,183,9,107,82,13,10,196,217,124,239,118,2,34,0,249,101,66,16,7,23,196,124,192,197,158,72,220,87,248,2,140,69,61,141,69,8,255,205,91,63,255,143,9,166,77,161,141,8,165,249,30,182,150,241,105,117,142,53,115,34,22,115,111,18,33,146,167,101,181,4,58,113,135,196,115,14,219,94,17,193,103,219,198,47,183,140,198,212,120,199,157,65,100,92,32,18,160,103,168,200,149,215,70,199,127,209,6,254,52,194,200,136,2,15,220,144,84,125,250,246,3,96,39,50,75,250,209,1,87,72,58,13,250,146,213,119,16,43,137,46,154,211,206,102,108,225,56,248,243,45,134,203,161,237,31,61,189,91,70,169,184,61,125,222,170,87,220,125,231,235,213,206,220,136,4,65,15,109,246,218,211,103,6,117,79,7,150,219,86,228,247,253,134,182,3,214,141,38,144,4,112,31,129,49,4,19,162,247,141,30,118,83,41,194,107,55,100,123,176,170,228,174,177,216,162,83,189,172,45,167,71,144,245,2,12,185,204,24,55,63,20,92,237,84,195,154,65,173,8,163,23,86,54,107,237,39,225,195,88,214,16,8,236,43,102,109,52,141,80,243,182,219,114,188,104,116,14,140,171,98,225,114,170,147,50,39,234,11,43,102,146,202,128,213,36,78,39,0,222,60,90,35,243,103,5,239,172,197,102,238,197,148,192,253,235,49,155,5,228,143,37,170,107,92,191,95,113,52,63,238,41,50,221,219,248,188,254,98,163,141,131,2,208,210,135,82,157,192,56,62,142,253,164,81,119,190,180,177,160,158,59,97,33,219,95,13,10,37,222,195,184,161,104,137,176,210,218,199,206,158,231,51,144,49,181,221,72,178,226,23,34,76,206,102,106,91,33,141,250,237,171,107,185,219,163,107,107,88,142,208,237,56,4,4,7,133,248,103,46,161,122,107,38,32,246,83,217,142,101,135,100,82,202,172,235,212,248,211,153,232,88,30,234,137,156,89,229,245,8,50,220,186,12,23,20,28,8,166,9,244,112,71,243,58,162,11,129,85,49,215,220,144,114,42,38,34,176,59,126,130,207,76,252,135,31,69,247,183,240,64,191,32,242,160,219,16,11,249,243,82,35,58,203,16,80,209,66,186,91,232,169,87,241,178,175,79,62,101,27,26,179,8,63,12,127,186,204,147,72,99,210,132,94,80,113,250,225,227,152,158,242,40,12,86,168,47,121,238,224,90,164,235,223,107,97,194,89,24,215,4,215,247,109,12,13,125,188,27,136,63,97,79,53,68,224,37,73,156,22,150,123,198,109,213,159,199,30,254,253,155,173,62,194,73,69,188,111,225,181,136,73,168,25,188,84,76,96,212,223,16,32,27,43,228,183,101,157,76,68,187,194,188,49,1,5,184,103,198,232,35,122,241,38,40,83,108,125,66,135,231,203,59,252,96,253,200,68,111,49,12,106,173,69,127,27,66,13,10,166,30,218,116,146,109,201,105,215,82,208,183,207,111,54,173,216,138,198,103,191,73,18,162,55,24,75,194,13,56,252,162,229,12,249,105,143,151,19,251,21,66,117,155,33,2,65,9,208,109,93,245,18,102,52,68,236,64,181,141,130,135,34,240,250,117,40,84,164,250,39,242,225,122,61,157,91,102,118,150,168,135,28,242,252,238,37,133,82,51,182,112,231,142,64,30,168,4,101,16,166,205,183,243,73,46,138,188,77,35,245,241,24,154,229,177,91,177,67,7,194,170,188,222,11,57,139,205,200,203,51,158,227,250,72,187,47,197,177,166,54,179,8,132,179,66,196,209,101,186,9,41,234,168,212,17,248,122,184,179,107,80,165,27,162,48,94,104,104,15,122,91,75,200,85,80,82,53,74,29,169,166,253,166,162,179,123,178,72,35,126,116,24,33,108,56,138,42,106,24,242,120,136,189,45,87,21,178,100,99,179,189,41,36,163,25,152,30,104,124,21,221,71,228,234,113,235,200,127,215,92,114,69,59,114,136,200,197,120,0,98,179,24,43,11,171,185,206,107,214,237,229,99,39,211,55,186,28,60,127,6,153,50,41,45,119,234,160,181,21,211,235,225,59,91,183,14,23,198,102,88,99,172,3,79,235,131,76,85,216,205,28,7,131,4,135,27,247,209,167,130,164,35,185,21,246,112,165,156,219,48,236,201,77,42,0,79,79,179,148,99,162,129,91,203,26,150,129,123,93,16,90,141,28,161,168,17,151,163,168,60,214,75,177,92,201,191,49,205,125,23,77,30,167,140,149,117,122,96,122,109,60,228,222,0,78,132,15,254,121,12,185,143,64,0,82,13,163,170,117,224,197,17,86,125,141,9,39,231,176,194,202,194,222,23,32,148,129,237,174,145,141,93,90,118,202,106,191,95,243,82,241,26,61,236,38,219,74,198,183,40,107,164,93,77,229,237,221,56,98,173,231,246,188,19,116,255,86,35,252,39,73,236,75,95,216,232,222,196,130,16,81,27,73,255,136,170,103,167,105,122,65,183,85,120,166,96,3,84,171,63,248,223,96,239,131,74,6,224,168,143,106,155,80,80,227,221,50,36,181,17,121,126,248,43,176,204,114,163,119,41,138,113,77,3,128,236,36,166,100,99,232,209,32,202,102,189,196,191,244,1,113,139,137,137,13,10,76,3,226,163,74,173,153,73,219,102,148,174,231,214,59,50,121,129,36,229,76,220,53,170,78,248,253,183,72,210,198,129,133,228,34,45,252,240,176,61,60,18,21,88,67,137,86,41,36,80,231,188,96,224,12,54,243,186,90,37,88,193,83,179,167,179,229,182,120,153,65,248,200,63,101,176,230,191,122,98,104,36,176,233,48,8,201,144,155,109,108,114,16,243,72,199,37,132,166,126,134,45,132,52,132,1,5,178,129,19,181,181,30,134,72,226,131,170,98,230,12,226,21,4,103,3,59,222,36,172,177,118,6,225,237,156,21,249,212,100,57,221,0,207,91,32,232,56,77,162,186,238,196,141,60,251,7,99,255,55,131,160,5,185,164,231,236,11,243,106,241,117,95,251,8,44,105,240,232,244,128,122,41,135,215,163,140,229,14,27,127,255,61,105,20,223,226,177,154,212,184,164,195,88,47,244,164,163,131,177,94,177,95,229,243,97,52,185,6,177,143,107,35,30,172,244,122,189,27,82,171,87,13,10,201,100,20,25,151,216,78,135,84,172,181,157,229,188,39,115,112,239,46,32,60,102,29,50,33,59,38,32,233,17,229,240,44,75,45,153,239,136,39,30,92,119,44,205,108,114,72,125,223,90,222,121,198,31,65,76,76,32,188,85,190,142,136,122,87,125,219,13,129,41,73,238,62,225,68,104,210,197,230,194,50,93,37,195,161,121,14,176,221,160,216,136,97,167,127,208,67,145,32,101,240,110,114,146,144,77,150,75,202,84,131,149,159,111,212,55,2,215,239,19,224,70,252,103,77,143,219,243,185,244,173,17,210,177,76,31,18,13,10,229,34,174,11,105,176,30,177,222,137,179,167,148,181,254,180,214,70,75,209,56,2,221,97,122,181,58,168,241,187,150,36,82,89,52,86,49,108,246,169,173,106,4,200,147,48,189,165,140,226,173,91,48,203,54,143,220,142,43,98,132,94,17,124,150,91,240,82,238,210,156,2,196,58,136,176,68,96,68,95,59,45,73,53,206,77,70,249,44,153,73,137,70,97,169,44,36,29,8,141,38,167,68,20,64,11,239,245,92,27,162,192,236,104,13,5,197,65,46,117,58,16,86,110,124,141,178,210,48,61,181,22,29,95,51,23,113,5,214,186,124,244,143,172,203,58,78,172,169,35,213,161,35,242,149,31,195,125,249,74,134,26,112,48,84,100,86,116,105,213,71,34,251,130,163,31,225,138,101,5,108,173,67,168,114,150,61,231,180,8,80,5,219,11,230,151,139,2,132,229,19,168,152,135,186,208,216,243,139,186,165,114,246,102,12,124,197,38,84,199,6,240,184,225,152,41,108,194,198,238,101,97,123,56,58,63,73,29,86,39,70,252,189,1,77,183,38,165,13,79,68,16,230,78,214,15,16,213,228,245,136,157,116,30,222,218,210,144,192,59,157,156,169,149,244,158,38,4,66,231,48,125,124,205,54,234,203,213,7,96,29,102,170,235,35,38,5,96,26,162,185,144,95,110,124,89,69,63,14,93,108,232,69,11,138,219,58,55,43,64,183,101,11,126,129,176,152,15,9,82,9,232,218,177,148,1,76,41,157,101,145,68,175,239,44,223,95,18,192,95,49,1,199,57,68,215,110,158,226,253,146,144,107,37,182,40,87,180,146,178,58,102,204,255,25,8,12,85,149,95,161,103,183,170,126,19,191,95,168,115,17,102,149,81,131,65,167,13,10,164,24,68,239,3,196,129,194,163,111,100,22,29,114,92,21,14,134,158,40,4,37,153,96,56,71,127,197,166,219,6,75,141,47,217,190,211,17,155,141,147,209,156,251,228,24,185,93,100,131,187,248,211,4,124,183,136,227,181,211,235,46,34,14,236,123,72,54,122,145,109,247,114,100,89,187,144,70,76,96,150,2,157,47,120,29,48,80,40,137,172,44,147,68,184,250,69,236,251,31,80,153,85,31,60,109,236,99,87,88,7,39,226,119,116,126,98,183,87,208,172,114,50,183,220,202,162,253,139,32,55,157,22,69,121,154,105,28,100,212,124,252,149,49,69,29,234,183,38,100,85,138,42,224,109,144,228,94,83,125,191,161,184,247,241,79,247,97,147,16,253,83,101,3,106,191,159,41,73,46,234,164,24,225,204,135,229,63,243,233,130,185,151,109,173,197,242,52,97,220,84,209,56,100,188,139,245,254,14,151,82,135,13,10,57,157,122,154,184,21,135,112,90,224,25,1,166,107,77,137,179,149,17,234,3,225,68,245,110,203,47,172,135,165,51,126,143,189,194,204,125,83,182,46,221,83,211,205,119,248,216,163,190,65,120,9,199,226,121,0,209,252,75,252,137,211,226,24,88,22,186,40,36,187,176,93,228,240,229,120,28,41,234,130,98,230,137,197,37,187,115,231,68,130,82,251,133,115,224,27,133,85,144,191,74,186,160,118,173,238,148,254,137,90,44,81,229,126,84,188,19,246,227,163,141,97,57,113,17,101,245,169,227,4,84,125,208,212,29,147,4,115,156,77,222,194,124,7,199,76,74,160,60,237,171,254,117,100,177,74,101,172,218,188,124,152,98,177,62,88,0,75,39,192,228,137,254,126,197,234,109,13,252,227,28,27,80,6,128,96,115,114,190,214,106,227,61,177,174,102,162,21,239,87,59,82,221,7,41,157,180,1,238,213,54,238,75,11,88,123,145,12,204,61,81,114,180,172,21,72,144,152,166,236,189,203,239,242,201,104,210,110,220,51,154,205,251,124,48,228,177,62,155,83,98,64,38,75,204,42,52,162,234,189,100,28,158,154,237,112,111,38,108,73,27,106,198,24,192,34,178,63,223,32,229,128,159,92,175,1,152,135,107,169,43,87,123,18,143,129,216,13,10,255,196,182,170,155,140,167,71,183,131,46,81,15,64,76,190,182,57,57,181,216,167,127,61,125,167,242,63,178,118,213,80,9,89,163,148,162,168,84,218,26,54,27,142,64,209,160,244,31,198,125,81,52,13,104,124,43,235,205,165,187,164,24,105,76,195,146,48,30,40,227,194,194,62,7,174,170,244,73,112,224,219,143,46,68,230,127,159,55,42,255,103,247,53,177,223,26,34,139,228,223,211,235,192,146,45,245,190,206,44,177,188,142,120,67,49,170,45,64,95,71,43,185,237,180,27,128,199,132,245,167,167,243,187,218,133,104,183,178,234,203,161,12,250,87,40,245,166,96,154,194,165,144,183,72,131,22,12,177,241,45,29,211,110,11,84,206,56,140,92,143,48,52,248,133,162,153,121,89,159,230,213,158,147,115,159,249,139,46,172,121,120,95,249,86,66,36,214,180,84,252,194,8,67,32,210,140,144,3,2,55,148,117,185,17,223,217,149,27,7,94,79,20,38,134,163,122,67,122,239,62,21,129,64,223,113,53,62,15,147,37,70,255,146,185,251,183,196,77,177,83,112,96,233,74,66,17,100,232,20,222,50,209,243,212,8,212,52,86,38,184,190,227,136,150,255,51,80,70,170,41,49,133,73,204,199,139,126,203,45,23,214,252,37,91,105,201,39,129,249,165,97,221,216,189,224,159,4,196,55,76,2,37,124,152,226,78,46,228,7,116,26,143,2,184,96,34,217,220,196,73,183,48,150,15,207,27,155,141,101,175,158,15,16,175,142,223,123,211,241,205,170,157,94,21,4,22,182,51,64,137,220,134,46,63,222,102,51,250,217,64,191,136,92,151,97,133,173,86,103,153,30,117,162,89,48,56,252,140,94,218,200,47,6,194,19,176,218,153,12,112,34,68,155,118,122,97,155,190,233,194,158,101,217,202,83,206,150,1,109,12,212,13,10,170,24,138,167,198,11,206,16,20,38,94,253,146,6,221,171,182,192,171,190,84,241,137,12,64,69,72,93,29,79,160,3,135,75,16,82,20,124,210,105,85,43,102,52,96,147,27,94,247,130,76,236,183,215,184,95,102,100,167,191,236,68,138,126,89,29,175,104,145,248,248,176,197,248,200,36,213,6,7,44,158,246,131,188,133,190,30,127,78,36,14,228,11,177,226,61,78,143,111,138,49,244,100,241,165,209,57,137,69,100,4,255,58,80,205,225,73,86,219,59,36,224,106,247,189,181,82,122,0,15,42,133,62,149,53,145,77,70,36,205,57,234,144,164,239,220,172,174,120,17,55,12,129,48,158,243,96,2,29,12,121,246,86,191,212,44,238,248,242,167,172,111,102,71,72,36,68,245,135,135,112,107,233,199,171,132,68,40,170,187,102,121,228,184,152,39,175,140,249,85,0,147,176,247,234,120,165,60,162,75,140,137,103,9,174,34,19,48,133,32,44,91,92,62,73,51,9,43,108,90,45,78,248,140,210,70,151,41,76,215,74,122,48,87,30,20,50,119,112,143,84,15,76,238,125,216,84,13,10,193,110,197,244,222,212,212,61,206,95,35,141,43,96,125,119,40,163,122,76,209,16,135,147,37,245,131,193,179,112,209,110,191,186,149,128,106,182,43,240,254,147,28,165,142,104,252,16,16,87,204,225,190,100,139,169,157,106,246,244,242,136,168,26,62,117,194,38,61,195,42,171,147,212,237,5,44,217,249,127,45,217,18,125,211,47,137,90,126,118,11,108,4,188,168,4,236,40,108,49,213,136,80,172,183,131,228,34,126,143,230,165,94,181,15,107,185,170,162,95,228,100,33,22,154,16,136,195,166,12,63,131,145,172,130,44,87,164,216,63,1,142,211,57,213,167,249,27,42,71,201,81,238,169,13,10,115,104,3,147,38,65,131,113,0,197,205,76,182,206,255,223,21,122,152,53,133,95,83,216,191,225,229,74,152,84,216,247,88,78,212,233,119,48,99,84,151,96,74,157,241,86,66,187,123,190,133,76,135,21,117,85,111,11,251,60,207,60,138,126,241,174,175,243,113,135,90,210,48,20,224,229,207,161,209,236,206,90,196,43,183,47,244,99,51,60,239,178,55,123,228,205,113,204,6,84,125,206,116,130,122,96,187,61,44,146,13,145,143,101,176,244,237,67,108,58,57,152,121,101,32,52,153,114,141,127,11,164,163,222,98,179,138,33,104,145,75,39,156,148,85,149,156,81,242,220,73,5,129,49,45,38,243,145,19,228,44,252,129,120,124,211,158,216,132,25,134,117,41,140,153,112,206,107,7,164,57,174,23,211,70,241,161,196,197,65,127,0,211,162,133,245,155,8,190,35,1,128,114,96,142,141,33,3,221,110,181,40,37,53,36,108,120,192,106,190,226,142,137,129,104,35,25,111,109,169,246,209,85,46,186,210,162,134,51,172,243,242,107,134,222,101,31,90,53,52,146,59,245,71,88,243,148,70,253,140,150,11,193,8,255,144,32,200,138,208,191,148,242,79,140,68,73,97,191,23,66,222,223,52,131,154,78,134,150,81,41,76,140,154,131,131,41,26,91,70,4,22,166,195,15,200,178,109,116,116,77,59,6,153,188,125,125,249,175,25,230,194,151,3,46,214,28,217,190,4,29,66,225,168,82,114,217,129,23,106,141,61,2,131,70,210,179,253,108,243,191,235,117,154,118,20,159,60,131,163,114,177,106,161,125,141,19,39,83,81,144,30,85,190,243,71,125,209,68,14,216,80,154,86,92,254,11,75,93,131,37,58,115,130,185,234,91,174,216,48,59,122,181,33,90,76,211,172,187,210,138,63,194,79,216,230,235,89,0,62,8,60,85,186,176,172,232,135,151,166,23,66,8,217,173,190,110,227,19,113,42,97,27,221,223,9,250,93,5,185,171,137,173,148,104,27,83,110,200,54,243,48,218,228,7,98,95,95,127,227,237,255,80,5,7,205,40,216,109,15,116,119,236,187,209,8,92,131,168,73,229,13,10,236,73,117,156,92,25,58,121,184,177,224,62,128,131,71,234,201,73,206,24,127,168,22,246,158,110,222,110,183,149,249,16,219,252,93,133,201,245,129,98,27,91,126,169,130,171,191,89,231,224,30,182,101,105,83,85,72,109,70,163,34,45,204,247,158,250,5,37,66,9,3,78,171,176,20,123,197,226,29,187,54,18,150,174,176,20,226,166,36,113,102,210,126,86,67,191,192,106,196,177,56,192,187,221,13,10,237,209,92,70,142,174,247,67,36,101,26,202,103,192,247,190,66,18,38,219,127,191,4,178,186,237,175,47,230,117,47,19,217,223,31,94,48,110,83,148,81,222,109,112,142,88,50,141,25,184,36,232,239,48,141,48,68,248,85,43,91,165,179,30,177,250,237,21,220,154,153,240,212,110,81,48,181,230,61,119,198,61,64,125,39,116,145,251,157,162,103,29,36,229,205,193,90,56,178,103,35,25,20,34,63,251,69,95,125,248,187,33,249,101,67,140,55,71,183,193,240,79,140,90,159,125,171,225,234,67,5,20,115,51,56,35,37,103,196,161,35,74,168,175,152,228,69,226,103,211,154,247,14,158,184,194,166,96,162,21,60,206,51,171,228,117,179,168,148,226,60,49,251,16,192,240,171,153,76,104,155,95,220,43,109,7,167,15,154,247,251,79,248,179,227,76,95,29,226,150,137,105,241,189,131,75,171,90,38,38,241,242,91,25,105,39,198,128,185,67,143,121,94,79,31,49,196,30,171,241,237,230,46,188,70,186,82,70,208,134,172,209,13,50,73,42,18,158,237,145,26,24,164,179,223,121,42,77,191,200,228,79,188,107,113,215,220,214,222,145,86,242,3,9,40,199,215,193,88,79,244,245,52,242,33,55,125,139,46,116,223,128,203,42,189,204,104,87,52,171,132,102,239,185,129,163,97,223,221,133,156,166,115,1,132,15,118,73,31,33,198,61,213,86,212,123,81,58,166,191,86,220,66,124,166,202,194,40,9,103,26,249,9,248,124,39,72,190,228,199,172,77,186,64,35,144,148,48,111,43,64,226,141,205,191,144,207,178,46,18,124,213,242,124,29,84,60,160,197,73,150,62,148,217,92,160,127,240,250,109,31,74,253,254,234,82,137,231,163,58,177,163,238,174,211,43,188,87,109,241,213,135,170,156,36,175,53,14,229,52,159,30,30,249,6,173,252,221,235,151,168,175,85,86,25,180,90,139,124,113,66,13,10,206,137,250,222,31,152,7,151,144,146,87,8,62,38,35,44,12,254,13,56,126,24,212,212,209,0,34,160,1,191,122,38,80,18,113,91,13,156,172,83,13,109,110,223,37,145,254,205,158,187,25,234,21,169,49,245,129,76,110,131,214,62,54,204,54,82,25,96,251,254,105,118,133,85,99,118,102,30,53,77,254,207,209,83,252,135,182,1,186,205,3,177,202,133,55,204,120,140,70,39,164,115,1,23,90,186,157,36,166,6,250,89,21,150,126,12,71,177,35,165,166,85,46,143,11,253,116,142,167,63,34,254,91,93,226,239,192,37,29,167,210,145,124,96,205,237,202,236,99,227,77,45,22,188,23,122,158,59,46,155,231,242,86,99,222,112,139,116,146,235,157,170,14,156,122,122,140,81,23,70,20,113,163,248,169,215,4,253,252,104,72,149,111,96,51,233,128,6,208,251,83,49,69,62,220,141,56,84,20,60,165,73,64,221,38,219,86,201,4,131,154,241,206,143,127,178,151,3,8,164,209,105,116,22,60,140,134,224,162,179,181,238,170,31,78,171,89,69,119,183,108,243,90,29,218,148,105,235,49,156,38,104,186,124,87,180,236,123,128,196,19,163,132,18,123,164,185,41,24,38,212,129,90,99,217,135,101,127,158,168,112,199,99,204,35,203,116,1,3,255,48,13,10,80,187,187,48,194,154,141,245,176,129,211,239,211,216,207,100,18,107,163,96,132,250,124,239,63,77,93,79,45,139,38,1,31,133,76,55,119,71,112,166,195,79,253,0,134,165,13,107,97,206,198,226,94,216,92,54,119,106,209,213,34,240,6,156,111,111,177,32,243,25,27,15,74,6,192,186,80,194,154,66,131,199,216,118,35,62,35,193,239,165,87,96,202,70,73,27,105,163,12,142,99,130,121,164,56,91,51,89,206,181,188,74,97,106,62,30,206,190,226,171,66,121,197,204,178,170,91,117,118,208,119,114,21,33,124,172,63,22,219,115,251,21,38,196,201,91,219,102,36,72,207,242,75,72,11,34,72,52,248,178,179,228,158,66,231,182,104,217,84,40,98,20,17,101,59,64,107,255,189,124,213,254,174,190,16,218,222,32,76,134,191,211,163,192,12,18,171,121,13,10,89,217,228,126,119,152,229,128,113,221,187,181,131,226,201,108,39,135,109,253,64,246,173,142,8,33,38,126,79,13,10,87,77,142,94,104,76,154,69,167,15,153,158,62,222,139,0,193,80,107,94,240,0,28,40,51,74,239,209,246,48,156,242,144,239,88,251,7,83,121,218,159,198,9,195,27,31,208,189,51,223,174,93,228,167,4,224,40,134,163,253,162,44,5,84,189,226,199,31,101,136,3,98,186,223,234,20,113,181,76,6,75,45,222,3,97,181,134,185,7,21,84,215,126,92,69,215,4,174,19,246,84,163,74,157,52,193,152,206,143,86,190,63,153,211,198,163,205,161,42,111,72,139,170,200,255,130,183,206,43,42,52,26,30,182,211,33,252,224,161,254,239,180,193,161,36,169,18,63,98,128,219,126,254,240,67,79,221,156,31,87,12,61,31,112,133,92,22,107,118,252,223,55,35,126,192,109,240,186,40,151,16,177,161,70,113,66,163,34,202,20,18,201,107,65,190,176,0,59,18,246,66,63,169,42,68,96,37,155,173,163,112,44,33,226,187,121,158,112,62,172,62,120,117,246,115,175,200,167,82,147,234,157,161,111,31,135,70,90,143,9,132,228,69,126,150,123,167,197,210,101,242,217,151,238,252,81,126,39,102,56,33,68,103,49,98,214,249,55,188,109,7,90,121,232,245,71,35,155,216,164,46,128,164,101,124,12,146,125,62,122,113,205,184,212,149,52,206,37,76,31,11,22,28,111,73,135,102,209,27,126,64,187,71,0,236,142,198,246,40,37,53,199,138,206,63,222,83,159,247,109,133,68,12,172,254,7,2,38,81,99,222,15,237,18,243,204,209,213,253,93,84,4,41,44,81,55,243,137,218,78,5,183,81,195,33,151,220,109,254,92,203,77,128,22,221,166,201,36,129,93,109,128,253,191,208,78,19,87,146,42,233,49,41,58,146,85,158,97,34,224,249,161,171,73,58,79,130,172,98,144,244,32,193,141,36,40,127,236,76,212,28,34,108,192,111,5,18,18,254,142,78,51,243,233,213,61,55,224,252,120,25,206,133,159,41,99,226,190,188,196,122,239,59,135,125,248,58,210,231,161,227,190,199,84,7,158,215,243,48,246,132,220,83,205,35,137,254,167,37,209,0,37,48,245,92,77,114,174,56,91,110,131,106,56,211,6,231,100,234,28,196,108,160,11,6,196,169,1,189,212,92,215,110,69,220,111,124,204,2,206,225,88,234,227,25,112,187,237,195,29,171,213,251,13,194,229,31,248,85,229,49,67,199,38,16,111,56,8,74,255,239,140,236,126,173,61,225,148,220,255,175,119,88,57,13,10,33,174,99,187,252,177,140,77,179,145,56,67,84,146,120,18,71,226,159,226,8,154,242,198,204,153,250,210,175,32,0,240,193,244,181,148,78,21,204,64,47,153,215,233,234,238,3,245,169,109,65,152,189,211,220,81,64,179,171,208,181,48,13,183,180,13,26,57,134,215,171,223,181,153,52,215,221,0,234,84,201,134,120,5,186,106,41,246,14,253,152,115,215,173,143,245,35,153,218,244,83,17,198,221,189,41,99,179,219,229,173,224,38,2,9,249,252,129,234,58,136,180,2,76,177,127,184,188,240,94,105,6,253,149,251,197,4,57,218,172,178,134,103,89,232,200,33,45,14,103,167,235,74,173,214,188,93,148,248,233,127,103,5,115,12,60,210,187,211,3,214,193,113,76,123,166,65,234,218,150,221,137,203,111,225,214,85,244,182,115,84,161,112,143,241,91,198,164,82,69,213,118,149,205,82,55,126,127,211,227,143,148,169,196,218,13,10,122,146,27,58,104,124,94,232,208,189,43,114,92,149,232,220,181,130,247,158,165,213,167,40,198,105,30,164,121,80,97,76,120,196,195,119,25,222,251,198,229,11,173,129,101,241,237,13,204,2,8,175,209,35,101,231,9,72,212,75,20,249,27,249,12,253,232,34,150,192,33,170,17,35,100,54,148,87,86,123,245,132,151,236,233,163,111,64,88,200,235,23,19,150,146,116,210,152,22,104,6,35,112,77,3,78,175,144,12,82,224,73,117,85,107,88,195,234,99,229,68,124,25,116,36,141,113,57,136,197,141,27,102,99,33,213,53,190,12,95,144,224,97,162,162,247,195,108,30,5,143,178,192,31,77,118,117,56,166,228,30,202,226,40,84,184,58,119,16,27,248,101,214,221,68,47,137,207,202,206,140,189,163,147,33,239,188,43,121,218,69,251,179,159,45,68,139,3,117,115,16,40,59,251,115,185,126,235,93,22,13,192,2,209,120,235,56,104,162,147,190,119,15,228,182,60,1,76,27,11,191,223,26,241,145,60,213,72,13,150,208,144,128,34,81,131,56,241,138,231,195,150,30,29,135,203,165,182,164,37,77,34,90,44,156,175,93,151,111,23,100,161,66,118,234,176,255,71,104,138,89,64,195,0,133,20,36,234,147,76,213,60,89,134,157,236,46,216,145,57,254,208,161,228,64,55,144,89,150,135,38,207,28,56,8,144,121,107,14,89,142,91,30,63,229,153,138,99,34,73,5,203,141,190,125,149,94,233,233,117,158,13,129,149,35,154,53,158,142,77,165,199,131,234,45,25,208,121,70,146,240,213,155,245,9,5,115,247,203,220,99,84,41,248,83,245,91,117,189,227,125,251,92,29,86,66,181,143,88,115,208,121,190,101,208,4,123,1,41,99,148,170,205,76,76,226,66,211,192,195,116,39,118,90,123,28,187,225,159,79,145,83,112,54,19,187,204,138,166,225,198,22,223,87,111,245,21,60,30,188,249,245,210,2,244,44,98,142,112,19,120,55,227,163,56,131,233,250,143,4,118,229,65,76,243,55,101,13,148,181,51,170,44,180,91,124,71,63,144,170,24,36,198,154,33,32,93,183,243,1,232,210,214,101,38,133,219,97,81,60,195,173,17,196,73,0,8,70,35,149,141,65,159,7,82,198,125,136,29,247,210,3,0,116,143,15,83,228,16,213,52,102,76,109,19,180,201,107,73,203,153,26,193,237,164,244,37,173,39,81,13,150,254,53,11,145,104,165,54,174,158,198,197,11,232,222,50,226,238,127,233,242,219,142,236,165,219,122,128,206,237,201,109,90,11,150,249,25,48,219,192,13,44,199,80,105,241,89,12,129,215,91,182,247,230,170,114,3,7,119,111,37,134,127,182,46,120,205,251,170,19,235,161,254,24,78,254,213,247,9,28,79,160,139,172,160,134,191,248,48,134,51,67,50,184,167,88,146,165,189,197,20,183,81,24,34,43,199,27,143,143,218,207,152,78,221,211,190,76,205,85,108,200,243,15,106,128,194,178,12,22,127,87,126,238,229,147,50,62,34,7,105,71,50,88,122,14,91,1,107,106,222,48,190,40,135,184,237,2,109,45,244,197,57,209,160,48,139,11,9,119,11,230,29,219,160,251,32,146,111,7,57,154,230,201,201,55,64,30,30,22,13,3,117,168,158,135,9,23,222,60,244,150,89,125,34,168,172,103,19,141,67,19,80,120,65,174,36,186,44,12,248,252,30,252,26,197,184,187,81,239,107,80,179,64,134,32,23,117,158,225,116,180,188,202,144,135,245,196,99,25,132,7,244,29,244,14,173,191,189,215,215,55,89,204,65,169,164,60,80,177,160,241,125,234,254,15,169,54,105,203,91,17,161,123,192,118,103,195,87,180,162,43,99,133,146,183,33,251,245,5,216,222,108,125,105,73,103,82,207,240,49,113,148,163,235,163,127,66,98,113,38,250,57,85,150,245,192,88,92,213,230,150,74,30,245,60,161,184,216,134,242,157,249,23,130,203,66,1,248,115,167,249,58,71,159,198,46,242,1,62,80,59,234,38,209,237,190,211,255,69,12,154,210,31,192,79,79,105,246,113,126,216,158,14,249,103,98,14,219,133,155,176,215,239,163,176,237,43,165,228,213,186,32,14,81,217,135,176,80,44,164,178,31,110,254,197,210,244,113,104,79,174,113,48,234,227,228,237,144,6,238,92,177,78,107,152,131,98,40,114,177,190,85,224,155,225,228,159,59,182,191,7,99,12,88,197,152,86,242,61,31,96,212,69,137,231,201,89,33,7,25,247,233,32,250,6,122,211,67,63,221,73,15,40,201,4,140,217,250,74,164,61,19,78,48,88,19,122,9,24,78,228,255,68,18,207,194,4,255,74,153,117,185,106,248,190,23,3,31,254,20,131,4,175,28,78,1,45,114,250,101,186,170,150,238,87,154,181,72,236,34,216,164,14,143,203,44,46,250,181,41,132,199,7,115,9,83,248,102,191,252,49,168,30,64,66,125,206,197,41,163,190,34,247,119,46,38,236,15,188,38,235,196,163,181,97,239,117,233,44,119,118,132,234,123,56,211,61,153,216,247,206,78,187,225,239,54,206,199,18,96,89,33,224,204,66,33,15,115,139,114,184,176,110,44,105,157,106,120,99,121,162,254,206,160,121,145,117,86,159,231,118,0,253,63,166,97,245,233,216,230,38,4,245,156,51,24,207,83,226,250,253,104,252,229,68,143,47,4,195,165,91,132,174,231,242,187,18,149,48,4,170,59,104,248,18,206,127,37,207,47,138,9,2,211,141,115,90,11,158,252,71,82,170,63,232,34,34,58,114,39,39,99,214,73,106,78,130,99,75,141,93,102,108,34,200,243,109,63,162,92,180,156,216,203,87,166,172,123,72,214,151,144,87,128,30,93,233,27,80,221,95,173,153,153,153,123,99,134,59,115,187,150,148,89,141,191,226,87,5,177,221,70,104,145,9,85,165,230,18,135,105,68,141,53,220,14,210,31,180,192,23,209,12,220,213,210,75,56,108,65,226,208,111,62,60,16,94,218,222,253,166,165,255,110,16,22,19,190,57,186,94,245,17,121,62,150,165,170,236,212,30,225,191,75,133,161,68,225,71,237,236,195,109,253,236,130,12,84,188,90,225,123,19,139,255,244,163,11,93,16,179,7,99,205,148,73,53,191,125,62,192,174,131,150,241,189,240,104,181,25,81,210,167,222,172,170,222,5,61,13,10,60,106,53,8,31,32,193,186,244,183,104,56,249,139,21,125,156,205,159,250,102,147,2,233,40,134,52,13,10,142,0,50,20,73,104,163,32,30,199,211,200,125,142,85,69,153,43,8,34,82,172,244,150,235,62,174,197,9,210,125,50,109,85,98,198,134,42,3,130,150,96,174,150,126,202,24,235,75,254,4,25,29,219,163,224,63,182,219,171,9,236,192,28,102,164,75,250,7,116,51,160,72,183,65,217,138,4,247,234,94,125,49,4,228,214,177,180,44,243,143,95,72,33,235,103,50,198,222,247,226,176,103,201,238,44,180,172,2,60,164,195,41,211,129,161,167,81,30,204,51,180,187,75,211,38,115,145,186,94,74,136,216,72,41,197,65,56,45,78,196,238,227,164,104,63,124,11,173,63,33,154,58,181,208,245,167,220,59,227,19,221,212,52,37,93,18,153,13,10,118,41,199,18,165,91,115,46,199,101,27,95,166,31,188,108,53,227,242,183,226,195,182,43,114,200,60,103,57,116,19,216,138,230,115,147,226,216,199,126,218,89,63,25,251,217,162,95,105,238,152,131,224,42,231,230,109,236,116,247,236,153,32,37,34,129,165,128,55,78,71,139,235,88,17,140,197,161,28,28,32,173,192,24,208,112,106,163,96,202,187,25,13,58,154,125,206,110,232,198,141,167,167,132,53,135,145,133,0,21,163,36,22,145,220,18,84,54,168,192,203,149,147,86,240,195,43,76,234,254,57,252,17,30,98,153,219,128,104,189,216,86,75,18,0,166,44,21,133,109,216,128,77,167,236,243,79,125,19,92,244,86,20,162,67,205,52,180,232,83,29,166,154,98,83,142,103,36,173,78,63,122,30,43,44,113,231,127,198,134,115,138,79,29,47,81,249,119,6,132,250,39,13,10,148,206,238,124,93,88,4,202,73,34,13,10,70,62,125,240,166,58,172,227,162,199,63,9,64,157,0,45,131,17,90,241,52,123,153,9,208,140,13,84,123,102,67,70,109,17,159,66,150,9,79,76,239,13,10,16,14,178,60,189,28,220,124,246,232,191,35,99,160,66,198,77,130,52,190,180,187,221,50,157,98,12,153,166,92,86,4,39,119,128,195,67,181,31,132,41,8,239,30,102,177,37,182,83,135,136,91,193,82,181,5,102,218,156,139,113,206,54,15,125,114,72,33,197,160,111,152,179,213,64,140,1,33,126,72,61,45,64,6,59,210,190,124,68,127,190,179,152,224,80,230,8,210,219,252,138,232,183,81,109,86,168,87,133,166,166,59,161,213,89,151,110,140,105,153,56,99,27,16,181,227,20,73,58,70,237,215,223,66,154,127,117,41,16,30,50,197,127,8,187,165,187,110,152,6,81,12,195,158,20,206,70,221,182,38,253,74,91,14,137,68,68,9,180,35,52,231,214,165,135,131,109,28,176,192,150,41,59,13,207,236,135,215,61,196,233,249,13,220,44,49,42,2,26,240,91,149,243,43,220,75,150,22,251,109,177,68,215,106,42,41,232,205,226,119,167,3,54,32,136,167,109,182,65,60,132,6,97,179,170,228,94,229,98,49,88,108,33,248,255,232,124,48,194,240,11,107,149,83,112,148,151,63,84,165,193,83,117,230,84,159,228,94,46,2,11,111,197,246,36,232,195,169,179,13,115,208,163,151,229,163,45,225,146,13,10,21,153,123,34,2,118,186,59,157,112,25,37,90,136,69,85,183,123,194,124,18,65,175,13,10,244,214,29,108,138,78,205,187,21,141,134,226,30,237,227,204,107,40,144,11,113,172,92,148,94,89,108,154,133,70,171,1,18,95,138,181,251,23,201,204,247,90,138,51,74,171,215,112,90,45,241,22,92,151,193,126,214,120,161,170,64,253,228,244,166,43,80,48,153,114,127,239,90,252,50,128,124,5,24,102,202,111,39,172,71,41,172,1,145,237,240,2,129,169,20,132,110,160,133,38,236,13,105,115,1,40,81,232,117,48,89,27,22,139,108,214,155,15,68,164,80,136,238,44,237,93,83,224,94,27,165,99,53,28,153,34,34,242,58,88,162,107,226,220,236,67,206,22,226,129,247,145,132,253,161,201,228,6,4,65,39,9,29,87,40,215,212,13,105,6,224,245,40,225,45,143,130,166,177,117,227,155,186,180,90,150,83,178,180,187,228,104,29,164,147,179,193,106,32,229,100,118,134,190,91,7,231,244,16,73,162,100,75,239,226,138,16,14,79,245,238,52,16,95,115,110,33,111,227,232,26,30,125,42,184,173,130,59,213,55,196,182,194,189,158,228,6,22,113,23,200,179,175,210,202,170,54,89,95,227,83,175,51,211,6,6,219,153,47,77,204,140,116,225,193,181,234,14,180,114,47,108,157,13,10,183,170,78,68,230,29,100,234,156,195,239,99,122,174,84,13,45,13,10,199,217,203,45,171,177,163,190,52,99,54,1,165,45,32,109,179,95,116,241,72,26,84,205,238,242,255,99,187,49,2,131,97,157,205,123,45,82,8,124,254,149,123,147,30,121,38,239,181,196,123,237,134,79,93,216,231,229,88,58,214,107,52,238,81,51,223,215,184,140,150,85,241,150,212,213,194,208,111,71,140,137,92,70,162,127,30,248,2,245,18,100,119,250,64,127,128,212,210,203,85,17,155,140,216,114,39,47,13,10,232,142,197,195,21,170,70,158,55,203,122,249,105,216,136,104,81,66,106,227,230,237,91,196,72,19,95,204,88,40,47,178,56,103,37,99,169,111,32,194,211,141,107,110,67,26,247,6,239,229,148,79,103,92,209,105,158,204,70,68,69,137,176,180,171,65,197,56,123,26,232,68,57,156,203,175,228,205,119,114,217,116,72,234,164,2,203,223,159,125,245,80,170,181,77,71,226,246,125,117,242,195,100,49,143,173,157,8,228,125,21,56,199,175,6,214,1,240,195,28,169,41,88,73,248,9,230,234,23,161,19,136,59,94,25,43,167,235,63,154,12,107,85,21,158,103,192,192,133,254,124,233,205,238,72,159,188,160,102,45,47,241,166,213,95,138,30,232,125,12,172,59,70,187,79,143,181,141,251,44,240,70,245,48,115,42,241,203,32,235,189,168,13,10,219,185,93,255,126,194,139,87,53,95,253,212,43,170,123,179,107,39,126,108,118,241,177,218,57,12,55,136,228,47,221,211,147,23,133,98,109,181,46,148,6,216,135,173,204,238,194,172,110,231,54,188,243,69,74,139,81,7,24,253,15,66,154,62,6,220,62,201,222,4,123,217,230,1,134,101,123,18,82,100,124,191,55,37,118,123,20,63,249,189,192,167,181,138,218,157,148,116,94,117,176,76,188,221,117,94,44,30,38,176,214,248,167,35,160,78,4,186,196,148,179,101,145,174,165,200,199,168,56,143,184,62,36,111,152,63,80,154,14,145,23,218,11,210,16,120,195,191,242,69,181,228,120,162,183,51,30,79,60,189,222,240,210,0,32,8,17,135,194,201,221,13,10,89,26,56,11,243,246,149,109,123,141,101,220,19,162,213,134,218,132,113,58,229,91,116,88,83,170,9,179,243,181,61,227,147,192,61,76,143,221,216,41,216,64,156,65,233,103,182,90,0,105,15,149,40,203,24,179,251,148,181,89,200,106,130,15,23,146,229,139,188,69,174,220,2,235,191,160,132,12,142,114,152,30,204,166,152,139,123,235,147,18,232,99,6,75,88,97,142,177,207,242,107,77,219,82,165,106,196,195,100,227,14,252,32,33,29,111,16,38,34,165,55,140,255,149,11,27,56,184,133,36,35,235,174,81,166,5,72,117,81,228,206,153,72,77,247,98,119,145,123,238,25,51,161,34,111,161,2,107,109,116,87,189,54,146,128,121,197,252,43,204,40,174,201,150,103,209,1,141,165,60,144,111,34,183,28,82,201,238,61,196,231,36,57,21,87,23,166,212,69,16,202,43,166,20,70,1,191,166,117,197,37,58,68,67,225,131,80,198,183,169,188,7,78,138,201,115,228,182,25,86,42,67,161,59,232,211,30,52,175,49,218,112,207,139,195,153,9,171,128,192,62,13,199,232,66,91,31,223,186,137,142,53,42,170,13,10,28,76,56,199,17,179,195,172,96,167,114,94,149,140,9,116,144,143,163,13,6,32,11,251,132,11,144,137,233,202,186,15,61,155,0,35,37,22,173,207,37,46,166,183,60,23,142,98,88,235,106,69,13,41,190,140,246,246,110,33,213,48,159,11,117,180,159,230,171,171,74,176,126,72,221,247,120,228,251,225,151,72,18,70,214,128,233,102,124,125,209,228,32,37,125,183,98,223,254,120,118,246,248,227,5,214,104,207,68,86,185,160,184,236,198,224,31,249,115,20,79,85,39,161,230,6,93,47,103,151,252,58,204,184,142,94,82,221,226,33,70,79,215,120,35,206,247,160,89,42,64,140,192,235,55,114,91,179,57,238,160,247,146,16,87,136,178,255,152,20,132,214,148,141,21,186,81,239,227,234,198,0,196,2,182,172,225,109,20,95,150,238,117,50,74,105,167,124,248,220,67,38,122,86,203,223,161,86,144,61,35,146,57,58,143,18,243,62,243,63,155,154,167,169,217,90,223,127,35,104,163,77,44,71,186,204,147,178,163,169,13,10,18,96,252,58,51,66,24,191,236,205,237,29,127,65,130,204,170,152,121,246,224,6,242,251,112,32,225,209,145,93,79,177,44,242,6,149,7,82,118,210,126,206,0,40,101,250,246,6,30,219,20,209,91,180,52,224,113,151,164,161,66,234,101,156,36,9,128,136,190,119,126,175,187,229,15,41,2,193,47,111,168,253,181,124,228,133,36,66,191,225,106,37,163,174,154,27,243,36,134,204,4,72,83,47,83,248,33,121,235,207,15,220,215,235,54,234,139,122,188,189,149,166,230,122,238,56,130,61,198,50,56,98,41,68,115,152,46,238,243,251,62,181,16,24,58,126,23,227,248,123,1,44,72,94,184,235,135,96,0,123,189,29,234,236,8,16,108,218,181,144,50,206,24,170,14,129,239,190,9,200,122,157,250,3,230,118,79,187,174,8,231,32,33,170,154,234,70,164,128,64,234,72,230,106,2,134,116,125,196,99,111,104,6,6,170,242,155,204,81,148,63,176,155,128,92,175,21,52,166,91,226,103,185,79,20,137,173,110,129,1,185,16,27,237,186,202,135,15,201,89,206,40,162,248,78,2,168,132,113,238,181,3,211,6,177,31,252,217,152,202,62,67,145,193,136,246,210,199,204,110,130,71,90,165,195,117,210,209,88,47,152,251,162,22,140,75,242,93,200,226,171,105,165,47,165,17,75,81,157,21,153,252,223,82,27,180,0,138,205,201,28,97,100,207,63,228,203,119,183,158,199,75,98,5,62,93,84,108,225,252,252,56,14,60,12,173,207,208,18,11,94,108,53,159,220,42,65,137,214,149,78,199,211,85,16,235,9,213,211,5,201,110,72,36,49,80,92,145,115,75,150,93,119,62,158,55,121,121,81,206,134,212,226,219,118,7,87,116,188,148,218,19,53,64,213,102,71,14,103,141,142,146,203,201,127,86,124,142,61,162,143,158,114,12,128,125,146,71,94,164,181,168,176,138,123,78,164,46,119,169,121,176,56,14,185,209,104,115,84,6,121,92,225,71,13,10,14,179,21,233,148,90,252,21,232,0,90,39,48,71,153,67,75,117,182,6,109,5,30,113,43,155,146,216,42,179,251,137,7,197,202,219,117,235,89,115,48,250,126,237,209,100,82,112,168,12,96,42,42,238,160,99,160,175,48,84,210,140,171,52,94,37,198,23,29,161,240,96,13,10,75,123,177,253,64,228,174,234,172,137,65,96,9,233,145,185,197,73,206,61,158,40,250,60,97,26,121,167,69,146,164,244,142,93,81,202,75,177,148,21,226,3,30,109,63,91,98,121,186,131,141,156,130,237,64,50,106,164,45,103,168,159,85,85,207,212,41,157,93,153,19,28,226,190,219,60,68,153,137,33,74,218,221,137,137,196,144,94,34,71,91,219,184,19,231,238,244,121,72,120,167,165,56,209,224,248,49,215,94,118,84,185,129,202,228,131,184,201,15,94,184,84,143,118,104,71,150,237,142,207,1,65,213,152,208,41,222,138,169,89,249,33,138,134,42,16,202,181,37,255,141,254,6,13,25,116,80,150,93,211,153,15,150,131,62,88,51,2,242,2,53,171,124,4,217,77,6,70,177,238,75,40,88,207,151,151,162,131,169,240,178,201,179,105,95,175,0,132,93,125,164,8,245,205,85,115,74,215,77,22,14,151,67,45,61,5,152,20,120,237,115,97,117,68,136,165,204,78,63,122,225,163,115,252,43,179,3,32,174,184,186,244,40,100,237,127,203,64,34,175,169,8,42,127,13,64,123,23,167,211,94,79,126,119,11,127,252,3,255,64,145,238,154,157,79,239,46,140,116,95,50,53,141,137,240,39,130,178,229,11,38,92,104,69,92,113,40,43,152,12,81,254,196,250,126,133,173,97,144,152,98,41,92,217,15,12,167,239,192,131,61,158,112,54,31,105,168,58,83,37,202,224,19,44,144,7,110,251,65,111,218,38,69,243,71,249,226,159,126,59,32,9,128,220,50,19,190,188,111,253,92,69,155,140,173,208,238,83,3,64,248,52,125,182,39,199,160,110,104,32,71,168,76,54,77,7,74,51,15,169,26,163,32,59,30,200,248,169,108,201,197,11,54,191,117,22,184,179,223,182,252,254,80,79,251,55,66,42,93,43,175,1,206,82,151,195,139,11,193,167,236,62,53,112,193,222,192,138,236,121,145,186,44,137,7,210,9,114,39,141,46,219,5,46,64,239,255,149,56,207,170,23,252,166,165,12,34,205,230,162,156,58,221,116,58,114,0,164,216,153,118,36,225,247,115,44,129,53,70,244,191,249,240,28,90,148,4,232,106,43,24,247,182,117,155,40,120,170,79,138,143,245,91,54,164,113,190,127,5,213,136,74,160,191,8,139,135,102,89,1,204,243,94,140,205,206,134,129,28,92,78,79,85,202,38,206,47,16,182,103,223,213,14,96,99,233,145,77,131,64,217,83,59,192,204,200,235,206,57,244,93,62,68,46,234,74,153,167,62,91,84,232,137,105,217,215,239,2,41,140,64,246,0,187,162,116,169,17,207,25,83,44,208,20,71,240,93,30,66,76,230,84,69,134,97,217,141,76,220,26,116,114,36,233,14,96,156,63,175,68,187,41,203,221,30,154,151,91,71,94,37,239,70,68,127,67,128,155,167,34,146,84,12,248,29,230,204,117,26,169,101,20,39,5,8,37,36,98,145,132,14,79,26,156,106,69,43,218,124,226,157,158,246,141,0,7,231,33,125,253,168,204,203,64,5,48,129,196,233,18,171,74,123,197,100,47,137,133,103,252,22,4,201,95,53,216,133,43,127,229,248,124,170,242,71,98,62,182,170,83,52,45,35,26,80,71,216,45,205,51,201,107,145,151,181,164,29,130,172,245,83,243,24,111,171,1,94,159,178,28,104,26,200,116,210,54,201,56,47,19,254,103,45,222,229,51,9,181,164,106,158,255,25,107,66,110,33,221,211,151,132,172,163,248,185,5,136,172,155,4,185,147,83,52,131,172,182,227,18,90,93,142,149,101,11,133,141,77,208,23,4,56,136,144,178,111,30,112,124,193,23,143,84,93,196,163,205,242,26,151,48,211,230,210,155,96,0,102,49,14,73,190,80,24,19,111,186,188,176,40,121,155,116,247,241,92,71,175,190,48,225,75,196,19,53,36,80,179,252,135,65,132,197,225,40,3,41,24,132,91,3,155,242,223,226,155,168,122,47,37,166,30,107,239,100,242,208,100,177,205,19,220,163,211,133,68,61,246,214,109,219,203,249,173,151,116,171,253,255,192,95,18,39,21,155,138,204,141,175,124,199,113,62,127,118,58,200,153,176,102,104,58,63,209,78,217,199,142,24,21,254,136,167,146,106,141,59,227,68,129,185,31,235,180,194,175,86,158,135,13,168,249,100,167,139,70,42,82,201,169,113,207,244,86,13,10,154,70,47,149,212,159,117,151,114,239,117,204,20,105,252,198,28,157,221,108,144,230,130,115,225,176,36,147,191,56,255,156,17,77,117,231,184,73,37,36,152,97,39,94,37,8,133,106,134,223,142,35,245,144,242,229,161,210,251,16,219,115,255,163,93,221,191,26,187,0,44,147,123,169,110,255,203,130,140,123,173,110,186,102,174,147,55,172,82,16,55,140,52,71,217,179,88,166,196,73,202,28,168,39,18,196,34,23,56,147,185,96,90,63,31,170,146,148,110,218,127,178,184,221,142,213,244,229,198,14,252,223,56,169,39,57,225,108,225,130,255,119,119,41,81,75,53,50,101,206,33,251,180,135,16,51,131,4,49,238,114,66,32,132,166,125,234,144,46,14,239,151,221,249,85,146,81,19,239,249,84,140,159,149,99,37,161,239,157,199,93,5,112,244,42,209,79,125,189,9,178,87,131,50,188,112,176,238,138,103,93,140,0,226,69,117,118,170,42,40,216,38,134,119,60,204,124,137,66,60,170,100,17,250,89,255,224,30,4,240,75,151,179,34,8,17,5,189,170,126,9,255,133,249,231,207,51,117,109,74,126,37,66,149,12,226,174,58,202,166,44,91,79,16,114,70,35,112,103,108,37,196,19,177,56,136,144,203,246,76,201,226,26,88,68,227,7,145,233,207,133,77,191,109,200,149,47,106,98,158,192,140,236,149,220,159,161,235,22,106,80,209,53,3,204,148,180,217,190,15,161,249,13,140,145,79,131,254,114,104,6,190,84,146,131,122,189,33,28,24,248,46,228,237,249,133,225,45,248,115,217,11,80,212,111,27,222,46,186,157,24,35,180,142,140,103,248,227,69,38,0,70,107,227,156,155,13,10,181,234,85,169,182,213,19,176,37,225,153,206,179,211,238,217,247,177,45,72,22,193,55,97,128,245,227,82,123,50,108,241,18,209,56,188,146,92,103,180,7,152,50,220,8,110,44,83,157,224,63,114,250,182,240,156,146,184,232,172,207,46,215,106,95,5,82,65,194,5,241,18,104,100,73,73,77,230,157,109,208,19,0,38,155,27,5,68,86,112,60,46,130,216,57,11,199,212,107,135,194,240,46,101,174,74,29,71,72,191,15,1,205,227,40,189,11,239,189,49,195,191,48,202,9,251,60,24,82,75,199,246,28,242,233,124,236,133,4,91,248,234,150,9,243,100,78,231,126,240,27,245,243,216,220,30,127,240,19,112,196,208,7,252,208,110,123,11,13,31,161,144,120,78,156,94,76,147,50,76,244,254,94,237,120,17,150,42,208,138,19,239,15,210,153,7,55,254,1,205,160,32,16,81,83,96,145,22,206,96,86,116,208,71,11,67,141,115,243,221,97,243,176,5,159,113,162,145,243,44,244,99,195,13,10,227,140,32,210,244,205,82,191,47,222,215,76,89,241,157,124,219,151,160,219,252,209,56,119,174,64,35,207,127,241,219,141,118,85,253,228,111,58,171,249,95,92,74,48,80,195,249,195,86,53,146,95,6,232,32,227,88,153,131,144,67,250,65,107,79,194,132,236,62,109,207,216,179,5,102,107,147,160,114,226,99,208,210,177,221,133,89,58,103,66,1,155,154,170,152,155,115,7,175,189,254,238,182,225,194,66,150,104,193,119,170,160,170,47,78,39,73,91,24,24,142,183,123,147,243,115,72,229,233,241,195,222,150,27,91,103,177,9,48,93,132,177,23,141,53,118,154,244,171,146,140,47,245,119,63,167,189,0,236,116,53,135,218,92,76,188,25,189,60,188,79,124,21,70,2,19,201,16,59,247,225,188,253,143,56,153,66,47,131,70,31,122,140,11,157,17,31,100,102,25,85,244,189,186,40,120,52,9,246,207,93,84,248,198,33,142,7,151,160,52,112,32,104,66,58,75,252,27,25,208,190,51,109,153,0,68,240,132,70,106,43,45,65,152,71,110,236,209,48,158,44,48,227,62,141,182,32,47,211,28,20,132,245,49,5,104,22,205,37,184,12,75,110,217,177,255,222,96,141,221,22,132,69,14,170,244,93,129,60,170,249,56,228,221,243,237,233,36,162,44,128,20,162,99,49,85,217,14,226,58,205,2,204,211,127,14,153,16,128,24,1,145,7,158,179,48,62,198,198,133,104,93,235,226,237,103,239,210,70,26,189,112,36,2,164,39,127,208,99,129,249,22,91,135,47,60,119,168,70,132,19,165,162,221,2,166,31,205,228,69,56,55,111,63,109,60,247,45,17,251,219,168,28,64,15,131,231,234,111,67,134,145,27,56,116,85,122,243,52,199,116,13,10,7,13,60,25,118,116,118,239,33,219,217,202,102,183,70,114,55,26,101,65,169,243,243,12,164,220,58,250,188,238,48,153,127,225,94,163,0,15,73,123,68,86,210,25,248,73,44,205,255,43,13,10,143,123,108,134,92,184,144,252,7,95,113,95,130,182,251,83,28,188,104,211,68,202,224,142,200,62,216,119,59,230,210,99,43,35,151,99,228,99,35,7,179,32,120,89,178,187,28,163,157,19,188,39,99,209,39,51,158,244,174,34,233,26,219,156,176,182,198,20,124,238,160,121,150,175,170,250,25,224,191,223,223,158,176,172,67,247,61,128,175,114,69,216,12,91,3,4,126,78,5,96,252,184,50,238,31,142,240,45,64,84,231,40,121,163,253,100,254,235,252,173,117,13,10,188,101,117,88,90,213,157,122,33,104,30,228,39,5,42,185,92,203,18,131,210,247,80,189,207,202,241,230,110,105,201,144,5,20,18,107,144,171,198,158,254,92,151,97,102,184,196,192,225,143,148,204,176,20,163,3,198,27,128,41,140,102,26,102,66,243,175,129,118,110,125,198,214,153,167,120,15,147,165,56,134,51,73,223,247,40,160,85,127,48,249,92,194,179,19,223,196,200,241,46,42,148,201,227,243,36,190,27,152,20,43,16,111,25,14,48,120,59,8,88,170,81,233,202,35,13,214,73,136,59,111,124,42,141,186,227,153,8,179,75,96,166,123,20,115,80,191,138,231,112,97,159,52,249,198,4,199,0,134,200,174,228,38,206,90,146,250,146,39,251,82,186,130,251,23,207,173,39,238,178,181,239,208,199,6,241,70,45,1,36,71,174,63,104,55,49,18,131,215,171,195,232,102,252,104,149,125,60,180,248,97,117,201,36,33,138,169,95,117,147,196,39,122,125,9,56,134,156,46,7,241,4,70,242,212,94,169,162,132,151,33,222,84,16,86,17,176,134,152,141,189,86,255,114,232,92,77,1,173,219,170,193,176,83,249,164,125,218,34,221,198,240,30,201,141,244,12,116,116,63,89,209,73,235,53,183,30,85,231,75,91,171,211,108,14,74,36,239,90,253,183,221,56,35,215,37,226,148,152,106,102,189,84,92,206,204,80,16,248,166,239,46,182,4,122,116,230,140,242,98,59,108,232,78,106,11,55,147,63,210,73,153,27,1,139,11,98,23,151,80,50,112,12,129,170,224,114,47,93,145,86,84,203,153,145,200,13,10,97,98,91,55,66,231,108,105,42,4,42,228,47,183,244,237,53,95,108,63,207,253,42,204,121,77,233,224,142,157,187,211,149,89,98,13,40,25,162,62,133,247,73,143,0,118,182,35,11,127,147,222,153,38,68,40,173,227,255,50,114,186,207,211,181,47,253,146,40,14,29,25,55,151,30,114,67,239,248,3,132,131,222,26,194,204,0,15,179,148,49,92,53,218,68,111,9,140,231,46,138,63,137,42,113,81,68,38,171,190,107,174,249,236,237,118,255,22,191,179,14,134,71,240,230,202,103,169,135,53,60,95,136,72,224,54,181,73,153,177,13,108,120,153,128,159,252,102,17,118,137,45,127,253,20,61,193,176,151,138,210,230,129,111,204,94,222,254,81,182,9,241,54,74,105,28,216,128,123,78,150,52,142,152,66,238,92,36,87,226,102,49,141,83,98,215,140,23,179,3,212,205,162,248,220,145,113,95,13,222,91,118,195,134,54,96,90,26,21,209,190,149,217,242,63,18,250,181,228,128,222,211,254,210,89,74,83,248,82,27,2,42,255,76,26,178,180,75,31,187,108,0,40,108,105,55,94,158,11,231,48,103,102,135,255,96,214,242,245,111,138,117,57,94,21,206,84,90,13,10,30,95,182,141,204,45,219,100,127,233,219,97,105,175,152,72,41,133,155,196,34,115,163,74,104,6,184,29,124,164,222,211,146,44,179,233,13,156,105,157,87,105,4,19,45,132,198,158,247,147,9,123,201,12,89,161,3,36,154,196,159,234,105,48,4,2,229,219,117,177,214,227,110,222,115,157,145,188,109,131,4,45,180,236,175,94,104,231,139,254,0,154,106,101,73,191,183,213,56,250,90,200,14,39,22,54,128,217,81,164,138,165,66,9,53,215,27,102,36,75,189,244,178,101,134,151,97,199,174,208,40,66,152,35,245,48,19,140,241,126,133,31,211,62,239,207,28,183,227,165,87,152,241,73,89,95,148,109,174,51,63,55,171,140,234,136,70,171,128,176,253,53,68,4,181,229,234,196,207,231,230,195,231,166,99,17,170,141,139,148,232,197,154,30,12,231,227,73,91,23,111,142,232,237,20,193,224,51,254,222,68,248,107,26,48,23,184,32,214,13,118,222,64,139,107,1,4,28,73,182,156,113,92,72,74,166,173,212,220,49,71,236,99,227,23,43,252,35,128,83,94,38,57,212,21,55,176,83,168,128,233,157,229,197,189,216,201,103,42,44,56,78,168,96,68,84,182,5,100,146,204,134,108,47,226,241,249,85,105,48,237,255,156,109,183,240,141,112,173,223,80,183,54,201,39,252,190,67,151,165,114,217,174,165,122,7,196,221,106,126,160,36,2,251,242,29,114,129,253,236,209,15,170,108,197,25,101,250,112,203,214,130,131,66,39,228,92,255,209,84,153,170,121,119,76,153,192,170,154,49,65,162,34,228,219,153,252,74,145,229,73,128,236,156,43,16,186,61,222,71,60,64,45,215,29,200,121,120,42,41,192,247,92,27,149,76,143,236,213,193,129,207,204,91,172,179,237,195,139,113,172,116,240,152,250,13,10,31,0,3,41,122,201,32,158,79,253,222,148,143,13,10,35,80,204,132,110,172,97,112,123,7,135,21,144,133,94,85,93,57,94,251,22,138,64,17,201,105,174,18,249,13,200,122,56,229,68,159,211,0,246,17,26,80,175,32,47,29,90,211,166,44,113,203,246,54,216,44,39,195,92,180,247,3,231,119,60,163,52,181,199,188,106,149,202,218,220,181,94,156,230,141,113,107,215,112,131,133,93,11,42,103,42,41,36,151,64,151,123,125,132,138,52,173,131,58,29,157,221,75,216,30,123,17,138,98,227,13,167,112,189,139,46,236,51,173,25,148,165,129,200,54,236,129,249,146,67,169,171,35,59,158,42,15,27,16,98,55,151,96,11,130,205,5,105,162,218,65,74,182,81,200,214,244,124,13,10,129,149,152,134,85,90,70,32,77,116,203,228,242,125,224,138,66,17,173,118,75,154,51,14,91,111,236,201,72,44,57,26,224,134,231,84,78,191,86,107,164,14,246,122,106,180,82,109,223,164,203,152,115,60,202,13,10,88,153,3,226,181,215,184,35,100,181,113,77,123,112,227,217,78,238,107,194,120,102,83,207,101,145,249,254,182,166,210,155,56,146,243,48,20,242,176,34,119,6,19,107,49,236,104,172,108,214,141,85,96,35,200,5,77,143,8,99,50,223,31,243,140,2,129,1,237,45,176,180,27,97,6,64,203,89,146,27,162,226,81,191,141,107,219,60,142,172,129,137,44,25,227,84,247,78,174,140,225,29,98,174,18,220,42,62,169,117,81,70,121,7,209,3,129,228,223,88,71,255,209,4,110,233,148,144,42,76,66,91,169,23,248,112,76,166,84,203,233,59,208,76,104,180,12,247,145,9,221,43,179,114,4,4,35,159,90,118,17,155,99,179,151,37,47,198,172,96,111,220,180,8,191,186,0,49,204,210,13,10,211,230,70,122,9,254,17,120,141,145,224,128,89,18,56,159,226,104,156,188,161,3,231,209,11,211,120,69,64,121,101,242,80,175,222,114,50,57,33,252,203,123,219,17,150,216,31,212,159,62,153,168,117,227,1,230,131,163,122,154,157,149,118,38,19,86,31,65,186,28,91,124,100,54,42,80,138,23,114,71,235,205,99,182,24,87,125,37,44,180,66,128,28,55,159,243,70,35,111,77,65,168,58,26,220,22,39,79,250,164,178,249,83,68,17,110,113,11,17,159,15,13,10,29,102,248,77,15,201,124,96,96,249,74,214,231,44,75,130,29,109,120,16,162,74,178,235,148,219,37,228,205,227,181,129,60,249,13,161,98,101,158,255,205,211,72,111,142,69,29,189,196,51,228,139,234,28,85,65,181,203,53,213,219,80,123,105,57,123,187,251,14,18,205,72,31,33,209,0,185,93,32,191,48,66,169,71,92,156,157,217,13,140,78,183,131,80,201,109,210,145,29,21,237,250,179,180,101,199,167,105,99,174,220,134,43,166,40,85,106,153,59,51,87,57,206,7,67,5,230,222,164,5,253,245,216,103,88,123,117,14,64,26,209,112,252,186,223,148,138,185,47,89,36,251,202,141,216,101,159,184,216,143,207,16,68,9,91,61,62,203,184,143,75,119,7,2,54,197,20,56,108,100,146,51,69,40,219,249,134,239,200,95,159,142,151,23,144,210,117,224,199,170,240,186,252,226,244,112,173,3,148,19,236,242,179,157,132,105,73,201,50,52,106,27,4,69,44,161,31,108,227,110,243,40,102,236,182,80,18,85,193,218,202,1,91,241,66,191,51,149,109,48,9,131,136,200,23,81,125,249,93,141,94,81,6,43,242,175,63,170,58,143,13,10,196,99,114,80,88,241,235,105,67,214,208,161,120,214,144,235,19,169,239,135,251,31,133,176,250,219,139,107,39,9,174,220,187,203,88,255,122,230,197,131,112,32,154,166,11,21,47,238,224,167,71,182,15,11,66,82,37,38,199,130,49,215,146,248,59,206,16,126,204,78,131,34,89,117,17,199,250,253,90,186,139,58,176,245,25,2,42,222,237,137,192,230,28,137,158,175,126,80,154,61,171,179,153,166,244,197,215,255,154,104,181,13,10,251,219,103,184,158,76,127,57,214,87,79,202,13,100,196,252,176,229,76,21,137,206,249,39,249,131,148,3,114,246,226,27,8,59,123,245,168,95,224,153,146,103,126,179,44,159,212,98,119,197,15,217,146,196,120,194,146,175,126,5,163,84,159,113,44,102,189,40,24,184,39,187,253,226,196,129,191,72,151,55,167,30,136,111,55,8,42,252,90,140,11,2,183,191,167,252,137,77,136,73,152,119,88,164,251,172,8,71,8,166,41,105,215,25,36,99,83,140,196,205,49,238,199,222,6,27,0,218,90,9,203,30,185,126,60,154,44,32,65,2,74,98,13,122,226,186,169,156,176,112,252,1,188,191,177,36,63,253,6,164,201,234,106,77,77,244,47,135,56,254,82,167,37,44,222,87,13,10,114,150,174,181,237,53,28,212,178,246,67,136,18,205,97,145,13,10,77,85,215,114,168,129,203,24,109,58,55,67,204,19,43,39,48,107,223,96,195,171,77,117,94,62,255,142,16,194,202,36,49,165,15,79,75,59,207,96,165,17,42,143,249,27,213,30,176,194,193,68,174,233,233,39,133,136,38,226,3,34,105,135,178,146,193,215,248,254,229,51,181,122,155,5,80,132,202,198,21,145,90,195,165,168,39,238,4,217,31,169,233,226,103,227,174,68,239,17,1,73,26,39,160,113,41,33,158,155,78,32,121,47,30,237,66,213,202,137,196,196,151,83,175,112,120,182,235,110,122,86,255,247,206,202,179,150,184,57,138,253,215,51,173,40,132,247,188,255,91,66,246,75,75,5,106,112,157,101,107,13,94,180,13,10,118,165,246,101,166,155,219,37,224,35,138,172,53,197,192,202,255,131,43,152,230,72,41,49,154,239,176,127,185,116,3,110,13,169,130,97,41,219,122,197,34,146,119,15,172,175,2,189,106,251,168,134,33,82,191,71,98,66,94,187,178,45,123,111,8,210,153,40,165,59,17,170,53,81,110,174,169,210,73,80,144,99,197,57,172,254,57,84,225,249,101,210,113,75,134,37,126,159,206,50,204,235,13,10,80,102,31,135,89,38,173,126,87,234,85,170,32,47,98,248,141,81,161,62,107,145,25,57,27,7,83,152,122,87,19,215,205,150,80,108,210,188,157,154,84,158,107,110,199,218,13,36,222,151,132,255,117,56,220,243,44,167,54,117,76,206,22,45,32,8,164,31,161,199,153,156,42,143,114,218,44,81,126,6,240,240,119,189,136,162,255,137,13,176,88,98,40,132,42,1,20,32,239,227,233,16,2,68,146,22,30,180,119,251,218,255,175,30,115,210,75,117,186,114,190,92,20,53,140,69,93,83,133,133,117,78,159,104,22,162,38,246,14,109,23,198,108,148,31,81,108,31,5,166,24,192,34,193,167,168,135,76,176,211,247,172,251,111,215,157,118,1,173,109,218,97,29,49,3,127,55,57,189,18,134,22,39,142,112,37,202,131,103,8,200,85,222,229,227,180,73,198,197,144,75,149,202,244,194,235,9,81,149,100,196,138,247,129,251,204,73,240,222,222,108,178,190,135,24,197,21,192,86,8,84,159,213,229,72,49,55,32,118,37,11,226,42,15,188,222,225,127,181,132,157,48,32,94,52,126,99,184,132,29,26,229,113,178,195,114,253,150,52,233,241,107,72,35,249,77,251,128,123,124,9,132,15,146,64,158,216,4,27,21,21,219,157,242,33,135,69,31,62,59,66,115,122,17,97,26,74,148,45,236,149,60,251,249,135,93,54,163,99,227,162,213,5,217,107,111,143,3,183,234,28,37,27,171,47,247,157,216,205,178,135,150,209,253,54,75,17,3,218,17,155,234,100,172,52,101,144,35,104,95,184,213,178,117,92,229,35,179,47,133,50,132,94,76,48,88,3,111,8,98,203,215,183,212,220,32,32,247,210,150,64,181,0,122,120,175,109,147,21,18,170,1,85,133,191,128,218,137,253,220,225,55,2,239,170,234,81,197,28,133,109,124,138,127,40,90,153,125,116,158,245,253,219,62,177,69,245,27,16,113,132,58,255,72,108,122,222,57,67,202,44,229,56,114,21,250,173,218,45,180,20,51,17,97,127,98,129,251,195,248,210,97,2,114,207,35,85,100,112,63,131,46,133,22,124,180,68,237,20,127,174,103,86,84,254,8,148,86,148,249,230,62,63,31,194,246,166,79,110,54,192,186,119,74,139,32,186,214,17,90,197,68,80,227,45,53,3,30,117,85,72,29,204,2,41,223,89,153,81,231,88,166,84,40,45,199,94,98,66,225,65,163,21,106,92,152,197,51,34,142,139,81,24,1,199,22,102,93,250,35,254,197,170,32,243,251,166,186,55,252,136,37,141,236,100,124,59,76,133,182,99,200,48,215,99,170,245,104,189,163,133,88,228,49,75,107,81,13,151,77,159,33,199,131,196,73,142,237,98,200,219,41,188,162,34,242,121,16,179,209,150,192,232,80,43,35,74,115,157,163,42,15,100,20,191,197,228,201,204,22,121,137,72,249,150,241,179,13,23,101,252,153,117,27,235,18,22,136,50,181,247,249,26,125,245,148,14,183,99,115,31,105,147,157,180,37,237,56,12,63,254,43,65,90,126,150,0,85,187,183,171,67,110,107,140,214,106,18,166,102,44,248,141,242,108,56,144,190,172,75,43,107,195,192,117,113,102,20,210,4,90,24,9,5,235,146,112,219,15,142,66,198,196,17,79,40,89,39,187,3,233,44,61,147,1,113,13,204,23,25,13,10,31,120,21,19,136,215,13,10,236,56,84,15,3,30,55,109,143,49,218,149,89,56,178,33,150,174,86,119,104,38,199,166,88,130,37,130,165,56,170,71,82,185,105,74,94,129,78,243,156,29,244,16,183,93,0,203,144,105,205,71,184,191,24,56,249,46,245,161,185,29,172,160,45,135,152,193,223,131,156,36,48,232,208,40,78,29,22,239,114,179,99,103,14,245,25,208,208,106,254,50,111,55,234,4,143,210,224,156,21,17,3,17,120,121,194,239,162,104,100,85,132,255,74,28,212,120,83,100,147,173,188,179,228,158,66,231,182,104,217,240,231,122,197,163,33,253,127,51,156,170,253,201,50,103,20,79,148,103,182,5,200,105,4,195,209,184,107,192,225,112,123,71,195,164,193,191,153,28,163,86,251,195,46,99,86,35,244,66,118,204,115,88,218,84,65,67,139,95,203,74,103,91,214,11,209,18,205,219,76,131,87,89,95,122,240,130,175,9,36,18,62,103,58,30,116,33,78,126,65,152,253,228,174,241,232,94,18,155,106,120,161,233,117,151,142,242,69,12,99,35,37,136,109,164,101,33,185,55,72,65,62,2,24,94,224,97,100,140,223,255,16,202,82,73,209,159,170,215,134,25,120,63,193,12,183,117,84,187,80,42,100,14,91,36,60,158,144,255,22,154,133,91,101,210,157,37,180,211,13,228,229,58,19,158,138,32,5,156,219,121,99,105,236,64,5,127,116,183,220,75,90,77,61,212,99,198,107,228,232,160,2,109,237,111,1,16,196,91,175,33,241,151,182,73,2,106,238,86,95,71,194,122,74,188,21,83,121,3,3,188,43,52,173,183,198,229,71,35,121,78,239,170,196,220,113,69,167,195,174,22,198,187,99,90,112,78,252,178,185,187,101,22,118,84,36,90,229,212,102,180,54,35,42,71,217,162,36,124,58,90,78,233,167,230,242,155,131,252,185,215,8,47,174,197,202,246,180,137,118,176,0,173,146,25,157,246,87,66,205,141,228,175,5,65,70,31,223,7,244,78,145,23,142,143,242,66,62,1,7,71,4,218,231,55,13,247,8,13,23,69,25,12,194,148,53,241,135,175,234,55,227,13,10,162,197,223,217,196,7,110,21,193,216,11,104,138,202,238,138,199,244,246,245,181,162,234,179,151,141,167,199,121,88,113,156,105,109,154,84,91,226,212,75,136,78,185,78,135,57,66,206,240,255,73,116,80,251,13,10,178,28,57,46,166,76,190,192,171,40,50,131,234,75,115,158,54,242,252,20,95,165,126,255,67,62,54,251,223,33,125,179,79,142,253,2,247,161,91,119,49,26,80,103,73,71,133,81,241,30,28,240,201,132,235,210,126,236,33,151,186,188,149,6,36,47,124,66,91,192,187,53,161,211,50,195,215,68,36,51,186,128,154,21,165,13,10,100,135,161,206,233,0,169,182,4,116,124,104,33,81,43,147,69,120,190,187,237,125,53,217,44,53,190,60,161,40,222,206,13,216,230,214,21,114,181,108,96,167,90,35,9,50,246,200,241,58,12,130,71,93,129,157,65,152,73,192,70,190,182,24,255,210,186,155,78,53,89,62,206,16,235,186,42,146,54,72,174,157,146,18,85,39,123,110,129,82,131,125,116,120,43,51,255,90,214,160,125,140,108,30,89,19,45,62,94,31,28,206,134,79,173,31,121,99,181,1,124,126,187,61,41,242,175,101,176,221,115,34,221,110,148,232,18,240,237,39,112,70,106,65,204,64,166,203,87,69,62,224,222,50,166,51,168,103,213,250,91,162,184,103,54,162,210,199,205,148,175,61,188,146,93,252,45,223,235,4,244,4,129,80,122,40,126,28,237,191,53,235,251,169,68,41,206,84,230,182,54,195,61,136,33,112,140,254,195,164,80,225,92,57,59,93,91,247,204,132,140,156,87,128,221,150,109,1,179,77,181,249,195,19,127,160,9,99,104,242,174,136,131,230,44,219,252,97,50,247,104,127,209,233,97,71,121,39,79,107,146,161,42,109,74,140,65,95,89,81,9,19,205,222,246,118,133,203,79,151,254,15,123,140,233,144,202,233,216,177,82,177,252,34,51,96,250,84,128,226,61,98,191,166,157,241,29,151,239,139,157,79,143,4,115,1,245,219,126,227,75,79,57,150,166,226,38,184,185,50,161,149,204,142,205,251,235,52,207,43,194,4,118,154,26,26,178,230,190,24,209,86,211,193,176,184,103,206,74,196,229,114,3,88,95,152,173,138,212,161,194,205,152,35,246,9,175,139,233,102,247,204,137,231,135,67,95,49,43,124,103,194,249,239,162,47,22,154,94,129,200,243,222,116,175,212,86,117,180,119,174,157,241,152,61,226,71,71,41,236,128,253,86,70,5,128,81,216,240,155,37,62,87,190,85,64,186,11,126,156,42,88,136,121,212,93,172,46,148,148,27,71,5,34,149,186,41,9,185,29,183,49,59,165,211,199,128,17,62,231,54,239,87,215,169,170,136,3,26,230,20,17,243,46,211,171,44,185,122,151,138,187,39,184,34,196,66,130,239,81,104,20,143,195,46,201,145,247,5,40,140,140,253,108,131,138,55,218,78,42,93,186,93,33,87,57,0,95,236,154,192,12,84,104,132,248,96,219,19,12,252,193,241,129,204,95,145,63,120,155,254,97,0,153,205,229,132,213,219,177,86,4,102,86,23,209,53,157,97,16,73,239,246,121,174,217,54,170,231,194,127,205,227,5,85,240,238,57,237,184,81,43,222,80,7,170,155,27,255,106,75,107,86,232,131,189,40,78,33,54,2,223,180,70,93,49,17,104,45,78,43,62,51,159,187,14,4,85,85,114,129,120,138,107,85,234,165,136,30,98,173,28,188,101,208,235,170,212,165,96,8,153,185,50,13,10,15,201,142,140,162,231,150,124,108,44,228,137,16,209,128,189,207,47,97,110,117,54,247,39,151,227,177,191,125,79,221,208,129,121,245,243,66,155,195,136,83,7,8,155,159,77,175,178,254,170,220,138,118,31,107,65,249,215,230,206,117,13,93,143,254,153,157,165,93,194,57,147,59,202,21,36,170,0,120,238,36,136,30,18,13,119,75,41,63,21,147,98,18,48,253,82,148,66,134,83,235,69,63,191,151,178,117,191,234,56,155,172,94,142,202,225,35,137,177,95,100,51,138,89,19,31,106,186,254,63,99,44,33,94,56,249,122,190,128,211,252,147,53,45,14,39,112,43,248,51,6,160,63,174,216,248,145,96,65,111,28,62,245,245,56,143,40,49,55,11,100,191,124,183,55,175,92,169,90,128,35,129,90,34,43,232,17,180,184,92,245,43,235,4,111,12,69,135,100,63,192,218,119,129,13,10,105,191,172,76,13,10,74,113,223,208,192,171,45,86,53,2,13,38,73,88,138,138,212,232,37,71,134,81,149,13,10,131,213,240,242,189,140,195,30,130,80,116,64,77,22,192,83,84,209,135,48,252,212,44,204,213,20,55,162,242,169,13,10,106,158,41,77,48,165,245,229,63,24,229,62,212,182,15,14,15,97,89,79,234,19,111,46,208,200,175,94,247,202,233,70,179,58,24,217,226,208,200,184,173,63,240,225,144,141,48,255,205,171,88,162,142,89,251,18,209,242,142,120,62,213,142,52,78,145,5,217,189,186,142,207,183,176,223,97,203,127,67,121,36,255,113,96,86,59,231,9,76,118,159,54,250,184,220,116,32,123,199,137,238,192,17,227,78,248,30,55,71,140,196,201,213,161,17,138,192,166,133,210,81,54,247,226,149,184,76,6,15,79,182,58,228,204,138,241,185,106,218,75,24,59,5,77,247,239,140,163,13,10,239,201,176,205,35,69,183,40,166,34,226,66,74,224,170,87,140,6,94,88,232,195,78,189,43,109,246,72,169,120,13,234,41,57,119,148,106,154,60,216,236,71,121,243,15,138,75,81,0,13,10,85,219,239,179,40,226,213,9,141,188,63,152,89,212,154,70,63,210,76,216,194,142,196,38,8,130,69,176,144,128,199,155,164,63,196,109,213,95,43,162,193,144,248,193,59,13,136,63,182,115,123,192,249,172,181,240,172,59,250,78,140,52,110,245,208,169,166,23,191,185,226,253,159,188,104,227,148,1,213,151,131,25,254,82,121,16,134,117,232,231,104,244,46,1,160,184,193,51,219,28,139,231,224,165,83,237,28,22,118,237,72,139,5,131,163,49,127,35,63,122,67,53,183,180,238,32,93,29,50,73,87,32,74,81,160,179,114,65,147,143,226,165,77,138,236,74,129,73,51,132,89,4,50,213,175,173,195,168,75,78,8,119,27,232,15,38,72,172,249,251,199,119,165,27,83,15,12,163,79,167,168,168,161,203,57,29,13,184,240,159,16,189,252,25,53,32,66,49,113,132,148,219,161,43,221,198,255,254,32,212,243,183,6,47,238,201,120,160,121,120,4,137,141,178,241,66,121,54,59,114,112,141,110,127,218,239,113,170,164,149,237,22,219,57,229,204,234,48,144,207,32,194,192,214,110,185,8,236,129,77,175,63,84,180,70,89,86,239,205,250,70,7,26,14,174,122,183,154,46,34,127,139,40,25,193,197,202,1,134,70,16,107,53,48,62,203,231,61,73,35,140,193,15,59,187,201,67,191,183,213,71,19,44,77,235,193,146,61,244,232,18,13,10,50,38,203,153,235,142,241,98,84,104,171,114,0,101,214,186,204,202,59,244,205,251,47,146,182,20,40,176,51,242,107,152,94,132,17,130,12,160,205,75,83,4,81,100,101,242,156,137,74,108,27,173,137,66,222,225,56,36,33,166,192,96,118,221,6,69,26,229,131,185,231,171,224,226,115,54,82,71,250,36,205,104,233,178,32,242,191,163,90,219,214,2,89,245,160,222,75,102,11,2,65,132,30,47,244,88,92,101,134,131,221,158,109,200,71,0,11,35,130,37,153,8,32,193,250,238,244,231,57,120,155,158,68,171,3,119,48,220,79,108,96,219,5,231,132,115,96,228,75,12,20,229,154,244,120,207,84,169,103,12,163,93,78,227,227,248,30,191,197,128,67,71,129,153,170,14,53,218,116,180,238,17,192,17,120,228,66,53,46,238,47,87,166,81,251,27,229,18,58,204,151,56,72,221,121,177,191,91,105,223,194,24,102,98,201,165,72,23,195,60,177,166,181,137,235,100,165,136,90,232,237,94,143,252,233,203,201,241,208,79,170,253,2,116,213,112,44,34,9,239,158,82,179,87,226,47,69,139,211,190,178,68,254,136,195,109,8,141,218,34,158,80,18,39,202,170,114,197,138,125,90,149,251,29,126,56,8,25,218,171,165,157,46,235,220,95,124,194,188,192,66,231,63,19,242,223,177,158,245,186,112,208,14,116,190,208,173,115,114,109,204,205,123,62,205,1,109,192,16,24,91,195,74,172,103,34,146,126,196,207,200,212,13,91,136,205,95,1,242,13,27,238,114,183,21,185,212,147,29,129,220,151,44,89,179,18,76,163,94,119,54,18,103,62,67,147,222,139,147,185,179,198,179,120,96,51,7,0,81,76,211,25,25,244,42,40,249,183,200,20,49,172,137,18,173,202,233,130,105,214,166,79,130,34,143,14,219,197,157,228,246,144,102,196,118,254,53,31,152,105,164,187,219,236,246,73,162,227,93,1,158,144,161,210,128,161,254,85,188,245,40,21,143,251,1,250,207,70,217,246,235,2,102,20,158,212,3,7,217,176,112,202,140,94,67,76,183,165,85,183,77,24,166,6,151,132,137,110,47,37,3,105,252,107,111,196,38,119,60,100,243,52,151,171,174,128,150,226,73,155,193,245,176,135,240,134,220,211,197,191,155,118,208,245,15,211,38,123,49,155,131,99,241,74,52,42,144,207,2,54,232,189,138,232,240,132,175,35,125,4,229,110,251,187,161,232,109,53,47,248,23,198,123,170,59,233,143,230,63,196,208,76,124,24,167,101,115,178,198,107,52,127,117,72,215,150,7,184,77,144,137,157,173,186,174,185,252,211,123,27,255,44,168,101,186,243,92,143,62,75,233,128,100,224,254,87,184,201,213,202,171,26,169,151,175,230,251,98,83,13,10,200,131,50,54,213,172,127,205,101,220,24,225,224,45,5,145,121,238,2,195,60,252,111,93,189,6,9,29,8,148,47,66,13,53,151,83,255,44,158,219,225,108,194,58,151,204,107,102,211,43,224,180,30,13,203,152,58,161,203,182,83,74,22,232,246,232,178,66,42,149,184,128,198,19,81,167,110,29,83,229,191,169,170,198,121,182,13,10,127,155,45,253,236,135,142,187,13,10,211,14,155,111,235,211,63,152,101,38,240,62,67,221,206,19,173,82,100,82,26,137,113,117,44,1,202,231,56,236,59,212,229,86,220,107,238,118,168,133,15,14,247,56,152,2,116,68,138,0,216,104,23,135,163,20,220,107,28,251,129,232,56,37,243,176,74,226,82,236,105,129,135,208,162,66,56,158,239,225,234,252,5,76,155,192,195,3,168,236,35,192,99,48,123,33,178,169,128,52,246,231,196,117,139,229,12,211,84,116,234,191,43,124,75,174,110,161,205,80,136,61,98,163,138,34,129,156,214,102,172,109,47,57,177,250,214,250,64,52,65,108,3,217,121,94,76,175,89,33,86,114,242,174,136,97,159,23,44,49,26,43,123,48,31,48,204,49,37,48,118,42,164,35,97,219,219,118,64,52,41,40,152,149,91,255,56,252,44,246,199,22,171,82,81,24,191,11,114,87,49,124,129,24,233,37,58,26,234,108,135,139,198,55,125,100,40,232,206,95,183,133,68,147,13,10,70,208,43,75,8,8,27,239,199,132,2,202,68,76,116,44,32,61,209,250,61,188,53,29,241,18,221,167,120,177,229,195,152,75,3,206,158,126,171,21,220,72,221,196,105,199,239,53,67,248,225,149,51,172,50,163,246,184,177,33,3,88,35,3,203,70,8,109,126,182,153,23,185,226,47,146,176,127,121,75,128,245,179,163,46,68,216,141,46,102,201,228,29,201,214,14,52,110,12,153,171,102,4,187,234,85,15,190,74,29,150,86,211,216,92,217,184,214,50,161,53,75,118,222,161,216,118,20,141,155,252,109,113,8,170,27,18,108,23,221,22,163,145,63,162,99,251,148,39,74,42,164,206,135,161,34,215,39,112,243,208,175,237,172,202,161,33,191,194,244,47,122,13,10,209,120,123,200,88,195,246,171,140,218,231,109,134,138,163,187,171,209,225,102,167,234,5,96,142,94,177,6,141,76,242,215,114,100,33,141,161,186,51,228,241,204,61,36,134,135,104,116,127,192,140,220,175,87,198,123,36,152,36,109,127,246,243,58,203,47,131,169,112,182,182,122,238,11,47,192,183,108,43,75,221,187,155,152,108,90,13,35,35,65,109,217,84,247,3,98,55,177,140,172,138,28,234,254,78,111,161,210,57,107,72,122,3,185,179,48,28,169,183,149,98,111,237,179,41,59,54,79,203,226,155,142,96,111,53,134,50,132,50,45,130,187,32,117,115,126,128,98,69,72,145,226,69,224,241,236,119,67,241,153,123,59,54,210,77,148,246,155,228,186,33,138,148,54,70,107,121,216,22,230,167,44,115,6,227,194,113,24,73,233,169,65,152,60,197,137,226,241,158,209,141,223,247,81,54,226,83,237,174,191,87,182,116,19,70,132,209,250,162,30,1,75,157,84,117,174,129,95,86,182,6,171,98,249,174,28,50,49,90,20,72,221,212,21,29,6,244,170,19,71,68,77,50,64,223,79,130,249,252,93,200,112,145,18,147,138,207,155,178,94,122,75,15,239,13,210,81,91,21,223,180,13,23,64,72,237,42,61,132,27,208,230,200,33,224,124,94,149,156,23,214,242,186,101,157,121,44,151,103,185,23,36,83,174,156,65,90,106,168,24,243,153,145,103,121,3,33,223,118,149,251,234,118,236,32,251,96,181,22,248,77,89,191,221,9,162,252,161,189,94,179,236,227,62,81,237,34,90,48,195,73,253,228,51,97,99,215,155,162,5,51,67,237,4,236,205,248,69,59,51,249,191,3,62,173,91,245,146,37,133,109,122,105,22,87,205,254,41,238,175,177,70,244,29,76,201,200,212,174,13,45,40,122,147,193,109,200,95,115,8,57,9,41,190,245,50,174,239,135,112,185,175,110,167,250,94,110,150,141,33,29,31,12,238,152,160,154,69,71,173,96,159,98,220,107,91,167,11,154,41,221,179,250,161,81,2,165,106,1,123,159,218,203,168,149,95,104,126,45,78,186,197,113,147,119,64,241,198,163,229,217,88,78,201,215,117,143,210,122,70,123,39,62,92,93,43,73,161,15,76,147,95,118,160,113,131,71,174,89,249,245,226,158,143,38,149,102,76,239,13,10,16,17,38,54,72,212,134,229,238,156,49,59,139,47,14,214,233,201,166,165,174,21,78,31,29,185,81,100,253,161,33,254,172,7,120,97,200,90,118,89,41,166,158,21,126,19,210,94,94,5,59,213,125,22,7,145,25,50,147,150,228,179,172,72,253,232,14,9,84,182,101,214,27,125,59,235,14,123,56,0,180,254,126,204,199,65,88,27,212,235,228,95,29,9,15,248,161,63,246,236,255,155,118,239,49,46,191,72,119,94,102,0,232,38,29,87,220,137,142,219,236,28,231,47,152,6,172,90,154,181,133,51,33,51,175,96,255,42,195,27,110,151,210,139,210,50,165,13,40,35,21,149,210,178,194,27,37,58,39,167,212,48,167,120,255,13,212,70,187,249,60,55,193,164,251,26,183,13,10,209,198,97,91,81,93,114,70,45,129,83,81,69,255,39,99,13,235,180,15,132,57,224,147,201,15,236,126,189,4,173,129,134,99,144,239,141,249,212,212,170,71,184,218,159,247,245,186,58,58,108,198,25,24,99,153,1,244,197,140,134,253,24,68,192,95,231,149,236,248,130,78,95,245,121,179,57,225,140,242,152,120,104,6,233,21,155,201,134,148,203,69,163,195,60,81,151,106,134,222,172,178,171,240,186,137,20,113,168,70,238,159,2,64,234,131,79,29,246,27,212,57,171,138,4,242,53,81,74,102,123,202,73,152,44,187,74,253,15,11,13,144,66,19,11,67,118,168,205,195,83,238,120,70,204,128,209,59,56,255,125,192,247,34,226,65,235,55,224,21,242,195,196,73,174,26,201,144,134,171,77,9,227,89,180,224,203,64,253,83,156,61,149,161,119,253,27,43,111,130,125,218,143,79,55,219,77,46,181,201,204,12,5,206,102,74,226,117,39,45,31,19,26,254,48,201,126,76,26,232,228,2,69,117,124,236,221,163,67,251,245,127,99,63,242,156,205,221,69,197,78,178,26,62,141,17,53,111,38,196,214,223,196,204,36,209,77,183,209,245,105,221,80,68,88,214,66,18,65,169,70,11,118,12,200,145,130,163,190,77,94,39,79,186,23,176,198,106,115,163,18,68,249,78,14,37,168,154,67,73,254,3,187,123,43,118,213,8,127,207,1,226,58,184,169,70,84,18,149,254,59,129,88,193,159,213,40,25,130,121,75,171,212,216,129,75,39,130,24,232,158,147,56,199,3,20,115,203,6,112,192,1,12,98,236,184,208,195,122,187,116,166,143,85,50,186,73,244,121,223,162,118,185,29,253,149,212,104,159,117,83,222,116,50,39,170,150,182,116,220,236,129,134,85,107,168,175,98,154,121,198,36,222,41,124,25,234,168,110,39,75,76,203,58,108,239,128,116,105,167,151,234,230,55,144,156,25,35,47,40,1,181,191,173,138,107,220,101,101,191,192,194,23,0,72,84,220,101,76,125,152,105,120,49,166,37,179,238,124,226,79,95,5,176,170,106,224,24,124,152,194,33,130,12,90,35,162,117,51,222,211,3,84,196,202,173,58,173,38,30,187,92,0,83,114,20,7,217,235,107,213,83,128,147,8,64,125,224,56,210,198,166,172,215,127,239,116,207,181,217,97,220,190,170,45,166,184,222,236,166,78,74,221,167,54,114,86,193,54,28,126,169,154,107,149,80,63,233,1,208,86,38,127,110,54,219,120,209,101,183,68,131,87,110,54,171,161,158,104,1,163,62,158,11,194,30,174,42,14,142,86,148,63,76,47,191,148,103,175,237,7,152,73,99,85,121,234,129,253,231,224,122,28,155,209,44,114,235,47,252,34,80,3,11,237,248,216,84,47,252,75,142,213,38,137,37,197,107,255,69,179,62,11,176,249,78,18,238,105,77,207,211,74,87,114,76,243,185,211,71,215,168,69,160,197,141,168,3,185,153,218,83,203,193,227,149,94,173,7,108,232,111,98,8,89,133,201,217,252,253,171,144,178,210,108,115,215,103,8,78,186,112,58,19,174,65,255,219,42,152,15,62,160,240,182,126,213,160,175,244,180,24,107,220,242,23,255,87,91,21,8,67,77,252,230,122,32,228,9,104,37,115,89,208,194,16,178,141,255,86,27,142,168,90,167,79,180,67,218,165,111,76,195,122,198,245,205,57,81,89,26,203,184,77,3,97,112,21,106,102,64,0,9,130,231,170,174,166,54,247,38,96,153,130,204,57,207,159,12,66,134,138,105,163,165,77,24,4,0,178,144,148,196,62,98,79,188,183,160,135,181,76,194,234,147,15,135,64,130,139,107,109,114,25,172,34,55,131,143,99,223,115,251,153,244,197,29,224,62,87,140,247,4,123,203,164,240,138,124,86,224,8,40,78,149,204,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen022004l=50711; +} +#endif //_PDF_READER_RESOURCE_FONT_n022004l_H diff --git a/PdfReader/Resources/Fontn022023l.h b/PdfReader/Resources/Fontn022023l.h new file mode 100644 index 0000000000..3a9c073cf2 --- /dev/null +++ b/PdfReader/Resources/Fontn022023l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n022023l_H +#define _PDF_READER_RESOURCE_FONT_n022023l_H +namespace PdfReader +{ +static const unsigned char c_arrn022023l[]={128,1,109,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,77,111,110,76,45,82,101,103,117,79,98,108,105,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,32,82,101,103,117,108,97,114,32,79,98,108,105,113,117,101,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,50,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,77,111,110,76,45,82,101,103,117,79,98,108,105,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,54,49,32,45,50,51,55,32,55,55,52,32,56,49,49,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,52,55,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,223,164,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,106,32,133,17,198,208,194,85,185,165,187,47,222,219,77,57,156,108,241,148,255,172,35,104,131,118,124,15,104,244,239,132,238,105,107,103,125,231,4,236,59,9,115,132,242,230,115,161,245,22,146,183,178,96,105,55,56,194,17,159,125,144,255,219,33,235,113,95,213,184,19,79,200,125,186,50,14,229,76,44,236,106,77,107,179,80,85,94,175,242,236,79,132,54,92,204,8,2,219,179,189,14,63,13,159,133,134,71,221,99,119,37,194,202,249,85,127,223,132,42,13,166,160,202,15,27,68,46,248,238,108,191,43,3,133,132,104,164,102,172,88,131,203,189,56,21,178,131,52,59,57,32,88,3,192,44,145,125,6,130,92,9,226,187,20,96,159,163,44,40,215,32,192,225,74,75,18,212,241,37,255,98,129,255,50,77,163,58,86,252,73,152,122,199,211,170,32,101,64,248,18,114,115,255,233,163,218,207,254,43,28,38,157,61,185,168,17,87,138,199,213,50,194,239,193,131,118,244,115,251,178,179,46,246,66,177,156,222,193,214,222,131,100,55,35,227,198,223,200,127,151,167,0,123,96,129,137,75,188,69,201,85,183,0,30,179,98,17,178,106,215,163,208,116,89,207,179,63,156,84,164,13,10,54,12,184,2,253,32,44,142,147,212,219,136,139,50,92,226,70,208,45,18,32,171,245,92,230,70,223,180,95,7,203,132,132,6,228,112,54,47,128,206,76,2,217,141,216,69,24,152,119,115,39,68,204,22,199,245,102,159,119,239,9,110,165,90,255,152,170,16,62,234,239,185,113,115,30,191,55,130,230,171,114,93,78,158,53,178,150,134,137,232,0,124,3,140,242,91,106,230,148,81,164,115,30,121,172,34,189,38,143,86,148,42,35,62,82,215,24,115,232,62,0,161,135,78,4,211,178,46,114,251,45,6,113,175,129,198,152,83,195,137,181,31,74,37,115,115,174,191,77,226,218,30,77,165,226,202,136,148,31,129,234,224,227,45,152,32,100,200,175,221,122,154,96,13,86,215,54,5,185,70,60,98,64,96,107,51,97,186,242,42,247,78,248,154,200,4,165,121,59,213,18,218,45,19,244,187,27,115,239,202,30,98,30,210,166,93,102,90,173,13,10,210,40,179,183,227,217,13,189,182,6,30,23,43,104,110,146,53,90,124,116,89,216,49,153,4,13,10,54,139,86,151,221,195,184,29,218,211,65,111,244,64,94,16,150,177,36,14,220,24,160,233,152,92,165,90,13,105,121,114,187,17,233,241,188,48,118,93,103,117,187,104,198,151,4,190,32,14,239,78,17,183,138,221,182,34,157,143,164,154,107,21,37,173,173,241,113,34,192,255,245,26,8,170,122,237,21,135,36,172,67,82,235,185,30,208,193,87,226,66,129,189,193,253,97,1,149,244,149,232,112,98,168,195,142,13,4,109,164,6,126,225,110,129,188,95,135,229,131,49,91,151,49,132,228,116,6,68,130,155,42,82,224,211,126,36,155,171,49,152,139,144,111,137,26,201,4,209,187,137,1,240,103,58,236,230,13,10,206,222,151,184,219,121,53,198,72,138,222,141,253,137,128,39,66,74,168,90,17,163,218,73,68,152,176,132,19,59,133,112,23,166,213,7,215,13,10,52,33,35,84,134,235,60,247,97,60,89,19,159,212,220,185,46,173,198,11,182,34,93,156,208,89,151,121,33,123,218,244,129,58,69,57,137,178,229,105,3,244,219,184,61,131,223,72,55,200,107,180,195,211,204,249,143,7,162,62,187,247,171,86,135,195,225,230,121,46,64,249,42,122,70,109,227,82,41,64,100,83,117,5,238,243,249,195,8,201,235,148,80,109,176,44,250,226,137,241,0,5,166,228,45,45,206,67,115,26,122,227,104,86,75,41,131,3,141,173,105,135,246,112,98,25,144,24,57,91,192,252,175,40,122,43,4,12,113,247,50,95,161,233,169,128,137,121,178,254,241,144,150,185,139,138,13,10,114,142,185,143,43,163,211,59,73,227,194,11,233,146,130,44,122,27,204,165,180,228,209,9,157,69,109,141,125,131,197,126,203,160,255,33,66,128,36,247,87,42,20,112,49,124,184,203,200,103,154,151,78,19,216,140,104,19,56,198,140,154,201,85,127,151,120,79,78,28,140,46,97,242,96,35,172,244,98,50,203,189,243,192,188,197,88,59,147,95,233,250,9,165,98,18,154,137,39,174,115,152,141,176,247,231,51,198,86,28,167,201,113,109,202,155,136,32,138,113,81,102,242,250,230,213,239,242,137,169,178,237,206,129,52,3,164,22,242,67,241,181,126,237,231,216,30,16,194,218,64,101,163,8,43,201,42,56,178,69,115,104,238,201,195,193,114,150,203,9,129,158,158,100,45,115,101,249,166,239,67,15,199,221,97,30,165,253,189,237,250,114,99,74,181,153,235,102,106,93,193,120,176,160,189,31,171,4,39,146,17,94,243,182,34,44,18,65,220,227,108,179,139,115,143,104,177,179,203,72,159,237,158,83,49,85,83,243,197,195,187,206,64,69,30,71,183,234,83,253,61,58,186,108,224,173,34,93,174,231,52,189,250,59,241,216,28,27,66,198,216,86,160,93,9,36,224,63,118,39,197,235,36,215,251,234,59,216,87,22,32,127,150,27,86,128,61,190,4,110,129,237,95,220,55,143,156,165,44,20,253,133,68,202,124,83,146,1,190,224,100,135,235,220,48,255,59,40,232,38,78,199,253,93,167,224,128,101,176,169,20,115,68,206,40,218,81,130,51,88,117,233,248,178,52,122,68,227,61,250,161,103,35,42,92,62,105,232,197,181,139,124,114,22,83,120,39,201,54,245,116,27,135,252,104,117,62,176,212,164,102,150,29,0,80,219,89,223,49,149,189,51,121,245,100,127,140,254,211,93,169,82,215,207,45,237,69,235,68,45,191,233,146,113,29,34,235,34,139,221,243,107,141,125,186,39,6,45,96,210,39,30,168,232,65,47,66,144,181,143,91,226,111,240,111,5,89,135,47,157,228,222,170,186,1,94,171,73,4,186,31,80,159,109,81,124,110,137,115,18,221,213,113,215,105,188,71,79,211,120,175,67,96,232,177,241,3,170,117,244,135,33,185,224,186,88,147,25,225,93,116,172,11,3,215,48,195,239,112,140,124,80,71,135,72,63,19,78,166,41,112,151,180,109,38,128,255,138,165,11,122,37,85,99,200,141,89,75,145,47,85,116,86,74,19,113,70,54,116,121,62,72,52,175,17,209,76,121,145,231,253,179,166,171,248,82,158,26,79,16,202,231,156,96,211,116,41,87,144,147,219,208,65,236,175,3,130,77,249,192,7,233,111,69,89,90,82,75,39,239,135,116,168,58,238,189,58,113,52,171,68,53,200,9,68,222,255,92,28,186,146,27,13,10,65,185,101,25,104,88,29,164,131,75,60,14,109,77,225,60,30,121,47,206,237,38,167,42,220,77,158,57,3,102,29,136,3,221,181,142,178,185,41,206,49,252,159,80,166,148,17,107,0,172,159,62,239,83,255,219,26,202,51,148,191,17,22,16,56,243,153,23,176,34,57,76,117,160,212,103,214,75,137,164,78,85,5,222,215,217,198,184,186,107,160,152,241,64,201,192,14,9,32,14,180,130,131,86,162,214,190,158,193,213,82,75,9,192,109,156,111,203,94,40,8,5,13,10,51,155,94,95,212,221,108,32,53,164,143,233,103,69,32,144,30,220,173,16,127,103,172,140,142,80,142,96,3,1,25,120,215,126,210,37,243,97,188,15,134,169,139,97,32,238,175,183,63,115,119,219,30,114,19,224,45,18,195,48,245,73,37,17,180,221,224,133,88,215,93,91,138,162,213,106,49,17,220,205,37,126,233,110,52,70,239,28,118,240,0,200,145,108,76,226,97,66,94,217,209,91,88,206,209,40,218,166,193,48,4,102,231,177,82,188,251,94,111,170,178,81,155,138,152,242,107,41,249,129,51,175,136,106,13,10,167,229,134,160,144,189,161,220,97,32,219,181,100,8,133,198,9,168,189,173,238,254,93,224,218,91,117,168,162,158,146,81,94,134,231,230,107,178,149,129,229,175,248,203,101,81,216,209,16,61,246,13,85,142,121,135,230,245,97,38,161,61,178,201,160,72,134,198,85,6,78,104,160,162,13,27,125,226,77,173,34,187,254,225,183,195,194,8,212,253,106,88,222,120,214,160,166,18,110,253,238,59,26,151,19,222,233,64,105,169,240,162,179,146,162,243,145,196,199,83,39,128,59,83,242,82,204,158,240,50,63,132,146,155,164,113,108,80,56,86,129,255,91,78,213,73,41,130,21,148,249,2,107,124,18,151,148,27,23,140,63,138,112,76,224,151,96,83,61,188,108,244,177,138,251,203,173,3,158,203,46,189,199,131,138,148,16,231,178,39,146,75,237,113,35,148,70,117,165,219,202,56,139,113,15,138,246,4,139,3,223,183,19,248,129,234,15,59,25,26,92,217,137,234,21,11,151,144,89,200,170,222,64,56,85,129,93,143,121,128,206,98,136,244,126,170,55,193,9,125,51,241,55,118,240,135,121,6,60,82,23,215,64,141,152,53,170,203,229,192,113,234,64,201,174,109,246,133,244,169,130,123,130,136,21,216,243,166,114,231,58,65,142,92,177,86,132,235,108,111,224,153,138,56,110,18,77,118,98,4,70,144,127,153,59,225,111,229,175,206,198,129,245,133,96,30,24,24,46,220,253,48,36,6,42,48,130,175,151,232,3,196,125,50,34,157,13,10,36,89,108,247,224,63,24,34,159,166,49,23,86,153,226,240,214,15,192,156,79,25,84,197,209,45,3,191,180,57,95,14,94,182,198,135,112,131,128,125,145,217,60,164,23,122,107,90,141,42,165,0,19,31,203,103,14,113,24,115,248,163,199,117,117,236,147,163,172,186,55,234,17,125,178,104,207,16,208,74,208,240,121,72,77,177,36,246,220,20,165,13,10,211,176,41,79,113,87,208,131,125,143,154,96,96,251,203,56,86,6,6,100,1,112,140,4,21,148,224,57,106,11,228,184,182,111,234,20,28,206,75,210,147,102,169,134,173,185,141,154,105,53,196,156,87,248,205,65,94,147,255,138,224,223,117,228,99,224,42,172,104,223,6,76,27,120,155,104,95,132,225,94,81,36,4,224,101,163,158,158,143,85,104,167,217,118,113,174,22,2,96,95,199,228,147,57,117,24,152,55,88,111,177,165,80,7,251,176,233,19,130,166,41,39,124,54,161,144,188,133,175,73,239,63,15,56,212,173,210,181,222,224,153,22,183,150,144,236,131,71,60,99,233,44,246,23,97,122,102,223,71,42,73,100,29,161,6,84,227,173,56,128,208,96,176,42,74,108,117,181,30,78,153,23,162,182,216,239,218,18,213,157,229,168,226,34,220,126,130,240,47,35,169,211,219,246,55,21,79,113,155,20,17,77,187,16,43,229,235,118,180,65,215,233,153,14,246,66,12,46,128,148,44,138,237,90,29,11,25,188,225,21,181,146,154,185,225,69,241,73,103,83,221,107,23,152,50,79,94,193,208,199,242,111,195,4,93,123,180,106,20,17,12,153,186,7,164,94,193,96,2,203,117,76,11,174,122,26,136,235,56,123,179,69,250,112,176,163,138,180,213,50,194,222,73,39,77,79,134,242,88,39,40,162,204,84,180,192,157,38,192,205,235,143,238,106,66,136,92,98,7,215,73,83,207,204,88,62,216,45,215,192,242,157,53,189,174,91,178,81,184,162,212,177,220,151,226,38,77,206,3,94,53,157,251,173,222,132,247,55,234,106,89,194,61,26,100,217,99,230,53,118,146,51,98,79,118,130,234,52,99,107,89,92,205,6,74,175,243,136,125,145,104,103,71,87,49,191,203,247,249,109,94,94,31,190,106,171,244,84,194,245,4,234,78,142,179,130,145,21,96,25,82,149,200,119,147,213,247,115,154,215,236,113,118,225,38,65,60,212,209,5,142,189,125,110,190,225,75,185,74,30,207,40,182,134,65,29,145,224,115,115,232,145,247,140,76,13,10,5,210,232,217,13,10,138,226,97,79,127,194,99,167,98,208,244,52,133,71,58,84,195,23,38,248,84,119,1,212,163,141,32,86,94,209,112,120,71,174,217,200,5,120,15,6,43,132,126,102,142,21,86,92,186,7,167,43,11,169,159,3,251,87,210,111,162,111,245,121,195,14,237,13,10,171,111,236,27,93,190,168,26,168,143,22,240,201,190,134,149,5,190,24,193,203,121,101,125,145,214,112,110,42,63,11,233,146,6,85,185,62,187,174,43,77,11,93,246,190,98,44,149,31,44,250,66,174,219,247,174,100,158,33,80,254,135,205,191,92,38,133,239,54,5,16,128,191,57,216,100,87,58,69,174,38,72,173,151,102,43,31,105,120,112,49,185,188,67,81,31,184,65,85,236,220,61,145,226,71,93,7,43,222,106,82,7,172,234,30,13,46,203,29,168,161,188,75,238,195,53,165,199,16,41,99,232,75,151,190,116,28,68,88,172,195,215,42,126,83,177,240,140,149,95,51,237,195,160,220,62,115,8,39,12,15,127,248,20,177,17,69,153,133,115,60,98,232,134,54,37,165,81,131,121,82,243,203,243,42,220,253,159,52,94,20,181,133,178,62,204,68,7,117,49,6,84,218,247,244,30,86,255,69,248,151,1,41,32,25,169,75,243,14,178,214,94,20,177,161,214,191,137,212,204,67,24,122,218,223,63,110,3,169,14,208,30,93,135,107,211,170,86,229,238,132,219,170,77,173,152,36,222,153,132,189,69,175,150,251,138,86,192,16,179,195,163,198,19,157,88,233,214,157,145,9,219,24,86,27,85,234,214,69,36,151,132,11,154,233,12,116,156,21,91,99,41,113,111,1,82,167,173,82,219,208,184,162,91,153,149,225,65,102,129,243,143,219,223,164,67,135,155,92,76,37,170,41,224,220,192,125,232,187,22,28,54,215,110,242,134,236,136,213,124,116,191,68,219,203,79,239,247,113,211,189,130,200,244,226,51,53,124,72,229,22,239,227,219,158,96,239,22,142,44,69,181,70,81,223,154,90,203,95,23,144,247,146,155,203,22,206,94,159,106,67,145,154,210,135,219,200,225,45,159,158,151,229,219,170,89,40,121,26,90,2,211,157,37,159,60,226,115,168,112,144,106,100,60,193,141,134,226,63,17,93,42,53,222,105,38,5,61,140,132,185,64,179,98,231,219,24,60,73,5,6,3,22,178,105,34,61,173,48,158,181,172,150,222,186,117,123,234,69,250,49,0,247,127,71,101,51,78,223,61,101,158,9,189,26,85,82,218,73,43,233,23,77,212,6,248,53,58,5,158,207,238,55,9,66,41,64,168,195,105,145,158,225,242,47,124,2,65,44,153,95,233,61,196,85,157,50,163,21,93,210,45,53,38,216,155,22,217,173,220,48,203,122,218,110,82,214,44,95,45,253,20,45,77,123,110,6,102,113,235,173,8,245,73,23,227,23,4,31,65,12,253,138,50,67,248,179,148,89,196,24,183,183,198,73,69,81,198,246,117,58,148,7,45,9,224,216,18,53,29,98,145,99,131,198,224,97,243,94,216,100,146,48,2,0,126,98,96,137,119,45,38,155,41,141,202,44,193,242,93,155,228,63,216,173,98,213,84,193,106,254,183,239,110,93,218,102,208,90,129,15,0,60,221,207,210,192,47,255,2,187,97,52,73,104,9,31,103,211,134,44,20,153,64,158,204,161,55,185,162,169,190,49,73,149,184,24,172,205,174,39,237,74,213,131,190,41,221,228,232,194,64,12,95,129,82,200,87,9,173,42,71,55,186,199,104,254,183,12,232,26,146,201,101,125,221,178,208,188,249,22,157,39,42,6,60,117,193,80,173,223,203,194,245,242,80,61,227,209,50,49,170,140,251,57,109,179,142,128,25,122,96,95,107,194,14,250,30,222,64,207,66,76,242,33,33,141,81,190,172,230,74,61,200,131,119,228,243,239,228,61,180,244,252,8,3,191,97,118,65,4,207,240,182,24,201,3,17,152,176,148,226,11,15,172,251,148,36,11,67,139,103,186,41,142,49,211,244,227,31,209,144,228,139,252,226,123,27,226,157,54,231,101,231,210,149,233,110,220,224,144,148,250,196,59,135,226,148,129,143,222,147,99,252,125,197,234,54,161,73,126,226,87,98,208,45,250,0,169,190,83,248,122,190,98,229,46,214,245,152,24,253,252,166,67,4,46,193,61,103,13,237,25,128,65,57,80,238,67,55,45,49,174,38,148,184,61,218,66,225,251,176,73,247,231,183,230,156,147,255,163,25,90,36,98,66,61,210,192,34,229,20,23,131,255,160,126,25,42,235,197,7,15,8,178,58,236,145,66,238,213,109,167,79,147,189,181,4,120,218,85,221,208,169,152,127,234,19,30,76,202,14,252,81,6,78,75,55,99,39,40,38,19,105,195,254,218,202,16,15,26,167,143,183,24,236,231,169,245,98,150,197,251,67,120,30,99,243,107,14,29,52,187,116,142,255,53,225,149,57,65,249,77,26,155,15,164,116,253,104,180,113,131,242,172,83,166,63,159,29,48,185,184,156,95,229,76,55,101,180,61,180,3,213,121,148,112,28,19,62,66,185,80,217,187,28,162,2,241,91,94,89,14,231,85,152,250,228,61,92,241,84,101,114,119,11,186,154,99,115,241,0,205,198,29,180,229,235,190,13,10,147,224,229,28,134,0,94,51,63,105,17,11,28,142,73,47,43,242,82,202,221,91,115,231,211,235,181,62,117,147,83,241,239,60,155,139,57,194,48,209,58,183,21,138,93,146,238,76,69,47,129,246,223,193,136,3,40,13,10,160,35,131,47,208,220,180,130,206,90,246,21,201,82,188,63,126,88,246,65,125,105,119,95,199,192,213,180,5,170,198,50,133,119,54,172,243,43,46,224,242,162,192,243,179,202,212,131,198,20,80,91,233,71,6,50,47,42,40,48,252,90,181,146,144,125,2,145,237,24,115,55,126,122,97,88,20,12,44,219,27,14,39,238,201,202,80,23,97,2,32,9,146,48,128,69,204,181,161,105,182,30,160,84,103,120,184,210,128,115,115,25,4,103,22,96,73,69,162,31,42,28,185,225,94,58,93,179,30,15,181,163,176,175,223,223,111,52,36,183,83,109,71,63,151,86,202,54,148,222,228,48,31,177,171,26,228,113,40,248,210,180,97,192,81,193,185,153,219,176,16,231,141,209,58,252,187,166,247,213,34,109,84,5,39,241,120,129,161,143,85,27,62,239,118,167,226,139,79,221,135,147,129,162,33,126,242,255,159,153,130,233,234,112,173,32,3,184,98,215,195,109,87,197,255,159,190,170,181,96,64,254,233,115,239,195,179,77,131,25,25,96,1,1,16,186,16,105,76,23,183,99,90,224,60,193,205,8,124,11,5,82,42,122,121,31,12,163,64,34,163,245,134,11,83,109,149,81,189,253,191,86,13,10,7,246,58,164,230,135,64,126,94,72,88,78,104,149,145,241,181,38,113,33,62,67,13,10,112,140,6,163,77,46,29,81,207,166,179,40,161,34,0,124,129,181,235,38,59,150,119,70,150,27,207,200,119,47,133,2,221,149,137,135,36,171,243,105,176,135,127,51,19,161,103,243,247,20,2,60,34,156,87,87,212,212,111,205,155,74,254,205,9,61,202,190,82,183,129,50,206,154,182,34,92,154,52,76,75,248,217,111,44,80,196,39,44,185,170,13,96,111,1,59,38,66,248,200,128,224,142,162,130,44,140,245,9,125,44,219,100,147,47,225,149,171,213,253,243,109,59,225,35,174,221,139,162,248,42,138,98,141,190,62,214,18,157,192,253,196,190,80,213,87,74,228,254,204,101,6,46,112,244,112,59,254,203,53,234,222,25,98,148,254,23,62,165,121,56,103,157,186,109,21,68,143,244,76,13,26,144,59,32,36,57,218,147,192,176,230,18,17,0,104,248,7,146,25,170,137,244,53,228,77,4,100,245,72,51,190,179,56,103,11,216,32,217,65,223,75,49,245,27,137,91,237,248,51,249,196,60,183,97,109,184,15,152,140,231,47,211,193,44,125,73,247,64,207,133,180,118,108,14,211,152,235,131,118,149,209,2,222,193,110,36,183,71,90,15,93,222,136,251,242,214,185,79,18,100,23,200,17,232,54,43,156,204,82,216,137,28,19,193,9,55,170,204,34,141,98,29,71,18,203,157,224,186,182,14,222,42,151,233,41,43,224,78,66,230,211,66,85,148,223,86,147,26,97,225,249,97,114,106,246,230,137,29,99,178,64,230,231,158,91,243,12,5,32,145,214,129,186,17,2,64,152,116,207,216,237,195,238,43,227,49,103,110,49,172,0,248,7,145,209,1,155,183,137,202,79,89,7,244,130,59,0,42,243,88,20,72,195,82,187,103,216,15,223,252,209,197,190,239,96,82,51,48,170,44,4,86,0,143,98,222,181,94,105,172,47,134,54,159,171,30,204,144,210,72,121,84,230,17,23,169,13,146,105,166,93,251,223,41,126,189,41,195,221,31,98,117,95,143,40,156,66,165,52,245,150,80,104,95,133,118,234,47,197,210,107,153,184,227,220,211,241,254,236,115,19,16,0,249,154,169,134,142,169,186,192,181,109,174,44,244,109,166,204,29,24,192,171,141,119,190,207,247,184,153,146,23,92,186,46,34,119,156,19,219,157,245,63,245,177,200,254,149,225,100,153,125,148,32,44,55,23,94,86,44,134,34,152,155,7,92,220,222,23,52,82,192,100,39,67,84,213,219,143,125,90,120,212,138,212,161,3,185,228,117,0,208,142,220,124,81,193,243,207,167,244,60,54,134,163,194,74,126,181,1,139,15,65,153,97,86,79,135,226,18,206,13,10,7,65,172,104,214,130,44,122,185,253,104,133,245,208,178,172,36,156,183,245,14,35,83,204,75,13,10,106,36,86,47,86,79,187,199,9,12,63,223,18,132,171,14,198,21,224,179,251,225,50,243,21,112,200,166,92,129,79,147,145,13,10,164,187,128,213,22,203,112,210,225,209,25,105,35,142,111,2,45,98,143,162,243,58,13,10,21,196,239,12,231,247,83,223,128,168,173,148,148,136,90,27,154,218,230,195,138,201,218,111,176,166,22,150,173,58,80,38,48,37,42,215,181,116,200,65,17,125,52,189,32,189,101,129,33,125,151,123,53,245,208,78,2,185,51,225,232,79,92,9,15,102,21,175,72,77,99,38,93,40,81,123,167,75,234,136,118,253,163,50,168,74,234,18,230,205,130,185,74,225,13,10,119,140,211,162,22,171,192,132,149,239,49,159,6,173,111,248,173,210,55,217,17,248,70,165,20,253,191,170,138,30,200,224,170,159,128,241,31,28,230,21,81,154,75,4,79,61,28,241,161,125,127,61,33,116,34,42,95,250,139,57,242,1,151,255,108,175,37,11,106,219,219,245,25,28,82,80,112,200,211,130,32,251,80,28,34,63,73,61,128,244,152,98,26,2,235,204,214,239,233,20,241,107,42,67,93,96,192,161,164,83,226,136,165,61,129,143,225,237,202,125,85,162,106,1,127,46,228,122,129,110,144,214,195,252,223,0,53,238,163,7,223,176,109,43,204,228,52,88,166,115,84,164,237,182,229,197,114,51,222,79,190,65,237,7,238,94,199,122,93,250,220,64,50,19,141,169,225,183,68,40,202,208,42,145,62,64,21,47,128,99,167,116,212,253,212,7,14,75,138,108,8,159,25,154,247,197,41,194,119,233,2,25,93,183,96,216,30,198,85,223,253,27,178,131,243,197,170,139,181,143,36,118,188,121,123,40,146,233,68,20,171,190,150,212,219,147,226,128,207,125,226,62,184,82,231,202,149,77,102,130,166,241,164,190,5,7,136,76,42,5,172,134,61,43,167,63,59,84,102,131,151,182,197,77,194,244,24,49,48,171,65,72,117,243,195,216,121,43,247,229,252,77,34,141,248,119,72,191,11,20,23,141,183,227,255,183,137,29,112,13,10,30,149,32,215,120,176,149,218,128,228,128,31,83,68,45,92,7,62,222,183,6,165,219,132,102,255,231,231,1,171,169,195,100,163,113,105,245,133,200,131,168,55,19,166,28,156,59,217,51,106,102,126,164,227,219,95,77,246,188,106,85,43,232,211,239,9,54,57,236,103,229,255,113,137,89,249,144,36,119,245,170,137,78,210,209,205,49,46,216,46,228,23,217,92,73,201,102,113,178,63,176,225,115,142,137,42,223,254,98,236,28,61,76,190,182,205,8,156,152,222,141,36,125,247,237,23,223,162,149,157,54,98,241,5,232,56,109,117,173,48,132,128,83,105,89,248,230,207,143,44,105,55,176,159,46,129,55,200,17,50,125,107,22,90,190,70,197,24,52,169,85,254,131,6,209,0,51,248,194,163,70,103,241,58,139,168,49,204,245,44,122,33,193,61,185,47,62,119,181,92,226,145,246,25,11,177,209,148,163,63,215,49,81,195,246,26,189,45,138,12,155,222,144,231,150,189,153,109,45,0,148,219,43,233,134,87,231,81,189,238,254,138,67,238,69,1,185,143,12,198,216,8,5,24,148,56,135,42,96,4,122,140,170,144,57,137,53,48,163,229,246,189,117,187,70,107,37,22,87,55,201,57,175,243,234,89,191,244,167,219,9,194,165,179,107,138,31,12,108,94,88,112,199,201,65,37,137,135,126,244,79,132,40,75,138,83,181,183,67,21,206,114,210,234,252,99,27,196,204,46,91,113,220,149,139,90,99,80,203,95,97,92,58,69,2,233,115,98,46,62,24,25,59,105,87,45,239,29,2,48,58,55,94,214,13,10,186,27,200,161,121,250,160,242,33,164,144,120,254,21,174,19,56,53,133,251,69,255,77,95,59,179,208,246,216,191,98,233,189,107,171,60,154,125,56,200,165,171,11,229,122,205,173,203,208,43,29,199,149,45,115,174,247,2,212,6,246,39,25,146,43,234,150,184,253,201,184,121,112,142,121,72,145,199,160,164,47,44,205,104,18,195,244,219,3,11,81,120,227,166,39,195,231,118,33,211,18,206,78,190,129,92,211,135,114,8,250,217,39,97,165,57,107,103,232,53,34,38,9,248,35,114,139,28,152,120,87,207,234,174,33,242,173,94,169,216,65,33,41,147,80,128,145,164,162,194,104,191,29,141,161,198,80,246,171,147,153,94,124,19,163,248,77,181,87,72,198,38,253,9,192,218,30,51,37,204,176,191,9,30,153,98,69,191,81,235,72,102,128,22,43,174,99,182,81,60,116,206,131,185,35,89,147,132,57,146,25,80,215,19,198,147,36,168,123,206,103,180,90,3,12,156,241,13,10,223,160,168,39,129,212,159,242,36,172,87,162,60,108,179,33,249,89,21,197,225,78,65,250,133,47,102,225,226,4,74,158,123,29,195,190,158,129,133,21,210,139,44,77,47,34,16,9,140,57,85,112,103,6,43,164,35,159,42,174,40,129,109,153,153,85,145,2,152,164,80,116,25,71,169,161,170,188,189,138,255,53,48,98,96,137,151,140,135,223,199,54,24,192,68,115,27,109,184,0,119,57,169,105,154,188,53,74,111,152,94,3,193,29,117,11,139,158,154,224,84,54,32,95,170,209,184,149,177,89,226,201,5,98,184,42,98,234,26,127,251,80,23,103,220,226,177,28,81,213,90,23,82,158,245,173,240,160,238,154,150,208,231,232,159,104,229,14,237,129,56,54,83,27,75,70,233,7,30,132,170,65,63,65,53,204,136,44,232,50,191,120,236,250,124,171,12,159,100,235,146,200,109,252,209,21,43,183,212,171,51,131,26,160,193,57,181,85,150,127,99,70,6,141,92,51,81,167,164,54,142,235,210,147,62,107,159,120,157,175,55,239,83,111,207,150,92,57,122,241,183,249,138,248,100,179,1,243,244,64,183,172,247,4,181,149,64,69,54,120,253,108,21,4,81,148,129,137,56,18,62,47,71,178,101,236,79,92,242,23,45,57,69,67,216,76,212,40,17,101,203,235,17,52,155,49,90,133,222,178,209,105,149,7,176,200,193,16,199,38,98,234,41,89,196,150,47,240,147,170,94,230,242,31,137,179,204,176,20,156,239,239,24,85,185,164,141,40,187,54,52,22,192,21,161,244,234,25,117,195,216,128,127,97,108,88,23,200,22,37,54,23,111,70,74,25,142,190,230,201,112,41,241,95,65,66,117,163,155,130,25,18,139,140,133,66,233,72,53,80,127,194,211,144,139,176,236,55,87,113,40,11,158,190,135,232,39,129,20,24,239,147,229,46,247,5,70,137,27,252,15,179,73,105,253,125,234,76,231,82,77,158,239,242,180,107,237,144,140,15,178,224,46,252,29,22,36,100,46,174,161,202,193,235,72,65,224,32,83,46,136,229,154,200,144,230,195,244,71,52,185,151,34,233,129,100,2,209,208,253,248,4,92,84,129,236,5,81,0,131,110,191,180,142,159,188,57,33,67,3,44,144,152,83,201,186,56,161,147,99,20,27,237,9,218,240,47,223,78,124,201,128,131,33,205,7,8,161,180,82,112,191,252,195,160,215,194,127,126,120,23,19,213,222,206,130,199,46,211,3,134,176,45,20,87,90,26,100,71,84,126,204,127,170,193,189,255,51,44,146,152,71,88,226,66,37,108,5,70,86,205,210,196,93,70,230,122,236,111,131,159,149,215,78,34,42,110,174,18,239,170,183,35,167,200,22,212,228,45,78,210,114,90,121,71,67,246,117,151,243,219,140,205,222,69,186,171,194,87,38,184,81,224,46,86,52,30,190,105,228,217,31,42,35,53,131,236,129,111,24,161,222,203,218,74,182,147,32,245,94,115,6,23,54,15,207,184,172,45,43,115,118,117,180,6,41,127,127,140,75,195,112,203,8,76,34,191,236,95,239,2,233,171,41,2,130,247,177,83,240,164,177,174,86,159,30,82,55,26,67,70,167,72,221,224,147,54,202,209,245,51,127,195,215,207,6,119,9,30,89,72,13,10,177,80,33,224,35,227,86,176,225,186,198,198,71,26,213,54,37,199,2,6,195,56,83,111,77,13,64,115,58,178,23,226,41,127,134,181,147,113,124,97,69,139,108,147,161,96,39,204,136,106,140,253,192,30,241,156,52,201,166,8,185,90,132,182,162,227,20,84,188,3,193,15,165,92,220,183,177,235,125,193,106,193,233,57,129,164,109,236,215,231,240,6,56,220,172,86,135,68,105,162,217,180,92,188,129,57,135,39,228,237,61,181,219,49,150,95,53,141,129,121,203,249,52,238,44,77,101,44,156,194,17,128,127,7,12,128,227,168,34,43,76,49,255,236,141,251,158,224,122,148,201,115,70,34,84,188,27,21,129,144,62,230,249,173,145,82,74,120,113,41,166,63,206,4,139,69,187,230,133,88,38,117,12,88,107,107,35,184,5,254,195,231,170,172,7,149,118,148,154,6,244,34,252,44,130,107,219,120,174,150,19,94,158,44,32,194,178,239,246,23,29,97,11,46,184,99,90,202,183,197,197,237,156,159,252,38,205,84,210,253,76,185,228,41,78,23,140,236,161,225,108,200,227,252,6,81,139,209,111,77,99,174,43,67,87,83,83,136,52,205,217,216,174,125,230,36,0,108,230,136,147,128,49,51,99,81,166,87,140,48,76,46,84,128,163,252,180,58,139,238,73,83,218,188,48,85,139,119,144,198,231,166,240,249,255,165,87,197,4,23,64,122,198,160,221,161,231,54,247,7,11,200,148,85,252,41,52,83,61,176,4,170,144,112,115,76,140,38,8,160,115,48,228,33,160,34,13,171,153,248,167,116,137,19,47,100,19,173,185,234,99,127,59,117,148,128,80,230,103,39,106,85,190,176,157,65,83,220,18,107,189,190,13,185,41,138,199,153,169,67,215,42,251,118,155,250,20,136,211,17,190,184,106,144,126,201,56,90,174,79,119,131,93,255,228,56,158,61,154,222,209,176,139,188,43,30,214,8,75,61,16,116,163,38,204,191,56,224,107,208,38,145,145,7,189,3,189,156,48,71,13,183,121,80,141,254,13,200,45,255,210,222,215,73,232,114,235,126,185,221,245,9,213,49,152,101,7,13,215,104,70,195,78,78,67,105,26,244,41,170,64,219,75,242,205,213,11,39,85,137,152,125,128,129,247,197,160,70,26,165,209,69,90,102,1,120,169,74,11,160,220,182,156,60,235,245,238,4,38,214,83,79,111,145,157,151,149,173,106,14,26,31,69,42,243,180,203,46,165,77,96,17,250,128,145,50,66,29,17,30,252,81,23,78,34,58,182,161,53,150,65,26,151,35,7,146,49,176,80,206,218,231,101,156,241,104,195,154,234,156,105,2,194,205,55,210,84,146,206,224,0,150,237,214,61,199,100,59,102,127,223,222,91,89,93,197,79,13,10,114,194,101,14,30,70,153,5,132,199,138,92,239,155,252,60,95,136,207,176,196,156,214,202,221,157,186,103,81,119,214,1,146,125,117,198,144,43,85,170,237,14,158,60,181,42,87,124,136,125,88,27,60,230,32,26,28,119,201,84,108,238,90,19,185,41,99,51,127,23,7,14,43,249,245,197,232,107,132,34,88,99,135,70,24,170,80,244,222,133,93,229,103,191,42,183,22,57,68,237,67,219,215,244,187,192,225,98,49,128,124,67,220,180,123,46,182,148,230,254,220,251,226,97,148,210,217,148,58,27,254,50,170,30,83,5,245,227,65,234,2,31,145,83,33,98,151,141,209,184,197,41,90,94,117,81,226,222,228,109,194,52,124,107,50,25,122,244,48,175,59,182,118,165,59,202,155,209,234,136,103,131,119,220,13,10,154,134,226,171,109,226,158,62,38,27,253,85,115,198,111,181,104,123,169,192,84,77,137,74,117,152,102,176,102,225,219,92,102,230,13,10,224,113,204,58,28,74,228,1,151,205,228,236,114,63,123,128,19,118,25,222,220,153,175,87,165,73,125,110,3,193,201,230,114,231,79,72,246,194,19,163,207,172,242,105,156,174,114,52,90,81,199,28,29,105,52,141,229,188,95,68,62,192,234,222,30,118,168,163,48,102,146,44,243,134,158,60,29,38,163,179,78,84,13,192,142,164,218,45,222,62,235,23,193,103,144,218,78,241,163,167,109,113,211,75,120,138,135,131,139,242,165,163,219,129,118,249,192,151,210,50,0,80,167,158,166,196,169,73,38,218,17,171,205,205,38,219,160,159,211,63,48,174,237,151,126,139,90,217,40,243,150,127,96,118,40,133,148,41,220,180,236,236,125,163,65,27,227,90,3,133,16,23,181,53,152,86,50,99,157,55,140,220,209,59,0,254,83,122,73,253,158,182,223,30,58,175,92,65,235,227,87,33,250,104,51,194,254,8,170,60,255,195,71,126,127,206,191,158,249,244,218,230,47,247,143,49,148,129,195,241,231,41,153,200,164,147,236,110,226,149,49,107,88,165,205,98,255,171,98,200,150,229,33,182,120,52,47,4,188,225,97,60,247,246,119,140,191,82,39,186,32,80,69,0,215,67,39,7,113,149,58,203,213,198,88,100,50,243,250,108,9,135,186,211,59,136,188,108,21,210,156,75,60,197,74,157,215,42,35,87,170,91,174,178,203,5,124,220,231,45,200,12,201,140,98,177,106,197,11,76,106,118,65,55,155,118,108,221,249,144,219,178,252,127,156,219,186,117,91,110,61,234,67,143,214,105,156,48,169,154,139,49,120,230,214,19,170,147,129,32,131,94,81,116,49,210,129,20,188,161,171,116,92,17,254,110,82,173,184,43,157,61,83,163,59,204,73,116,12,147,1,125,149,49,236,244,56,49,53,156,92,147,203,14,146,109,180,64,177,57,227,18,92,194,224,105,177,207,109,150,239,104,64,127,50,219,81,114,66,195,174,11,198,114,62,86,11,15,69,252,127,135,165,228,78,23,81,200,183,249,246,105,194,74,213,207,22,248,79,176,59,161,33,184,107,6,148,35,77,143,44,156,148,114,105,175,150,252,160,138,120,247,54,228,224,74,206,164,76,91,170,253,227,96,252,216,186,106,89,114,76,168,97,96,165,82,127,213,100,70,129,35,211,2,219,69,23,60,27,33,107,1,220,91,109,52,21,177,63,189,187,211,18,26,84,147,55,75,51,87,239,177,49,202,191,229,8,122,161,210,199,71,43,3,119,6,107,54,50,200,32,115,198,168,70,40,92,201,83,168,242,142,19,28,245,135,179,82,23,238,73,141,154,29,181,123,6,60,224,104,218,245,93,140,193,119,28,12,48,153,156,164,253,197,214,123,228,231,230,148,24,246,51,75,198,20,144,0,130,27,137,167,67,124,205,249,166,160,237,112,45,89,104,241,224,79,126,79,233,254,201,209,233,148,136,92,182,36,3,91,188,84,38,203,142,223,4,86,130,143,142,238,117,190,73,27,69,250,193,146,164,5,235,162,92,170,79,76,102,192,220,35,77,123,65,118,40,218,82,118,192,130,96,190,81,43,36,50,37,108,64,26,102,227,181,131,230,157,35,233,253,39,140,213,242,23,133,68,208,84,22,185,180,246,26,136,164,114,138,242,206,237,7,192,142,32,127,49,214,68,232,227,186,30,78,47,157,142,48,147,107,203,156,106,235,84,227,125,180,107,214,79,46,204,16,33,51,109,5,100,223,15,24,229,166,182,186,71,2,51,216,212,31,221,157,16,121,112,110,166,133,182,216,167,64,87,11,251,120,227,152,75,177,85,195,21,92,105,188,204,180,28,181,25,117,238,161,193,180,41,76,181,70,207,176,61,195,27,248,110,195,188,177,151,126,143,148,167,113,202,176,157,225,42,130,241,214,199,145,250,120,0,229,162,29,248,28,156,143,205,167,134,34,171,231,91,84,174,234,116,122,164,242,109,86,50,0,153,46,51,114,49,164,48,19,124,114,13,10,23,212,79,58,214,207,254,99,178,222,18,211,24,75,211,225,81,249,85,120,107,141,220,204,178,144,196,39,24,243,162,25,23,89,223,118,55,28,47,193,119,84,74,108,66,92,171,20,170,171,49,98,138,156,249,215,27,82,87,175,240,213,152,67,152,156,240,215,71,55,90,38,220,158,210,155,102,172,33,71,218,1,104,48,108,72,194,72,76,112,202,146,243,60,12,19,143,146,242,118,245,234,245,234,48,130,168,161,203,18,219,102,22,51,194,247,30,59,105,145,143,80,144,96,172,148,159,205,82,195,100,152,162,171,183,125,19,157,241,235,51,227,184,70,167,193,187,220,239,93,238,202,78,240,173,37,12,234,156,39,81,225,62,247,104,30,143,174,4,145,207,166,193,68,219,172,31,195,157,57,231,110,177,45,62,233,202,21,154,167,125,39,148,240,196,51,52,91,19,91,166,50,245,68,8,43,189,201,71,30,159,163,174,211,167,212,101,171,113,88,232,172,151,246,139,31,188,141,54,142,35,80,69,193,142,252,202,222,233,135,120,216,148,217,99,1,249,3,40,60,90,227,85,168,99,187,13,197,128,145,88,247,225,8,102,45,4,165,193,35,73,21,231,189,91,76,48,249,239,165,94,112,46,84,248,127,202,6,251,50,21,7,188,87,161,229,92,193,23,226,26,164,227,164,223,183,124,26,148,158,254,54,109,147,242,189,130,126,248,204,22,211,135,202,130,172,3,159,119,254,153,91,230,217,174,252,135,248,216,9,233,12,16,23,128,59,207,161,199,55,218,213,241,166,49,235,230,137,74,210,12,112,121,22,101,231,188,113,242,28,44,63,68,98,246,15,222,117,200,163,119,207,73,190,153,49,70,99,198,236,181,56,177,191,2,27,47,33,116,210,178,44,246,250,209,21,235,14,206,138,46,100,9,122,95,176,162,175,102,110,30,225,50,118,174,197,159,208,201,212,191,242,63,113,232,53,152,78,94,238,227,100,144,197,78,7,122,215,53,93,188,152,189,211,125,242,155,61,223,140,85,72,11,115,73,196,209,115,34,65,135,5,121,106,140,82,31,255,146,13,209,23,115,252,68,252,99,28,125,110,155,66,13,121,101,215,246,46,199,56,95,43,227,13,10,81,226,215,150,72,49,52,248,64,174,199,31,161,158,209,39,44,39,249,143,44,220,156,126,84,218,181,133,172,23,3,237,8,245,249,232,37,86,73,2,239,208,142,223,153,223,212,148,68,194,31,166,190,22,203,138,27,109,12,138,90,191,128,165,11,184,208,85,72,49,118,253,13,10,160,126,186,234,216,143,214,148,249,111,235,214,7,81,229,196,216,249,188,116,125,79,64,48,188,223,155,3,112,183,165,224,166,146,63,246,13,234,22,239,71,248,134,241,12,206,230,149,110,207,65,162,31,124,89,111,59,199,130,153,169,101,114,102,128,126,1,118,43,43,40,120,229,81,145,76,163,18,194,166,141,52,205,145,228,245,17,94,161,251,232,1,52,110,20,174,82,144,73,8,155,107,2,115,226,88,120,87,115,169,206,142,75,108,66,17,203,124,39,103,49,149,118,117,143,129,28,186,243,163,255,180,27,49,48,108,73,243,121,139,105,138,71,191,162,227,202,2,81,196,217,12,11,2,172,162,140,97,23,68,82,105,6,121,29,158,21,126,84,206,78,27,207,91,104,105,144,186,138,183,137,125,98,78,240,14,171,146,203,172,37,90,233,23,125,169,240,216,100,71,211,91,69,44,210,243,55,20,123,93,62,187,242,185,82,53,119,138,114,145,78,179,112,126,167,130,148,179,163,188,74,203,25,254,135,199,42,161,217,130,228,184,34,240,123,17,92,173,244,211,231,238,61,27,167,8,101,59,236,111,13,10,53,42,12,51,37,46,208,99,14,114,116,150,24,150,212,97,238,139,245,35,213,145,27,172,28,138,199,99,229,251,17,253,210,23,78,31,18,150,117,150,156,25,84,118,199,165,225,138,129,191,154,17,237,159,35,54,213,48,30,59,211,33,116,237,92,147,62,140,133,214,39,46,162,24,82,166,247,226,170,177,116,224,150,95,115,224,239,137,233,6,186,251,24,29,188,248,177,245,170,12,18,209,44,98,114,117,60,1,106,254,194,236,159,149,65,184,117,120,116,214,242,224,97,171,190,139,41,40,22,119,36,99,5,179,196,30,144,65,132,38,197,117,186,162,22,206,227,197,236,41,178,253,238,28,119,193,79,223,148,7,146,244,138,86,174,128,170,51,227,112,176,55,203,40,167,55,63,136,32,34,175,55,143,38,182,0,106,4,159,211,179,80,116,168,101,201,125,21,51,82,172,193,86,153,44,0,222,38,173,33,201,130,199,31,14,220,254,182,21,147,187,64,250,95,44,235,242,60,79,243,74,79,75,219,115,202,39,60,38,146,66,209,198,17,114,98,183,196,119,113,242,97,159,229,113,8,85,19,74,128,250,143,146,187,36,37,207,136,148,12,163,69,15,129,35,74,191,43,17,119,89,41,177,44,255,134,68,43,42,160,244,36,61,50,74,89,131,229,209,130,151,117,179,199,161,17,213,98,45,28,78,43,42,47,152,47,200,169,95,120,152,129,65,109,203,52,149,13,10,57,63,79,23,32,210,33,47,61,52,58,23,104,48,96,24,35,85,222,158,71,24,80,109,118,201,24,79,141,172,85,120,141,126,96,60,250,244,144,125,222,150,90,73,195,35,223,244,37,254,136,192,154,164,164,209,98,131,249,177,74,185,239,27,184,133,169,84,3,71,16,180,169,218,76,136,168,160,147,43,24,209,57,166,135,48,62,229,98,236,159,101,111,18,243,232,242,125,170,156,117,219,15,169,70,253,14,26,152,43,181,142,4,11,252,13,10,73,164,173,140,214,104,73,63,203,87,60,132,158,197,71,64,73,166,147,203,235,212,215,154,199,81,80,71,204,52,122,154,117,112,201,8,97,243,236,251,87,185,245,58,185,192,214,176,92,140,87,13,10,143,60,4,213,133,85,164,85,36,201,143,240,145,184,248,164,34,242,224,233,229,167,183,255,105,241,206,252,19,228,47,28,162,118,188,213,132,81,109,38,107,166,131,141,94,156,169,233,133,79,80,199,217,44,174,214,26,172,175,117,138,124,123,229,156,59,170,130,191,50,182,145,172,163,232,235,23,30,8,173,34,195,159,190,88,106,84,230,228,222,44,216,107,49,19,133,70,187,141,165,131,75,44,110,72,56,84,122,27,103,230,81,150,78,67,152,140,128,54,147,16,136,144,75,187,88,156,169,1,231,235,188,9,76,13,168,30,9,25,21,217,228,104,40,173,133,150,253,15,202,57,255,18,166,194,122,53,147,55,249,115,128,158,129,178,233,227,212,59,49,70,242,81,102,103,230,7,255,235,154,200,15,201,90,123,125,77,237,85,31,238,15,53,97,199,13,178,214,154,186,150,103,62,57,227,57,127,28,63,143,229,244,139,171,138,214,224,237,137,1,249,15,108,255,36,232,12,181,220,172,73,133,6,196,208,16,51,228,151,193,36,30,65,59,2,34,39,163,38,77,166,139,195,249,27,53,120,31,162,208,24,71,92,25,159,67,203,167,211,160,213,105,123,69,50,27,173,44,57,75,32,113,54,225,225,107,65,121,73,117,232,144,62,242,178,225,195,63,135,207,114,195,37,193,30,192,185,47,211,137,13,10,205,246,11,82,29,163,37,150,118,59,223,205,202,131,122,220,111,38,241,41,178,60,163,47,156,211,155,51,230,69,118,151,13,243,192,91,141,202,75,254,47,23,230,197,103,139,132,214,148,148,241,219,169,254,4,70,174,106,254,170,31,242,69,192,121,22,199,183,86,158,98,103,196,43,69,148,53,161,209,22,206,198,101,179,17,228,4,23,23,116,192,172,200,221,233,107,13,145,103,200,204,125,153,196,36,5,89,45,116,92,68,40,117,85,0,235,71,25,52,13,47,198,188,33,91,103,130,63,105,250,148,156,8,181,236,152,93,122,168,124,154,193,249,188,200,153,76,108,188,230,2,123,125,30,12,34,168,58,93,230,29,186,5,212,175,104,132,201,95,70,186,127,37,62,11,35,55,227,18,145,110,22,60,175,157,178,236,86,197,66,89,144,254,115,238,83,228,43,59,204,161,207,100,47,2,176,197,171,213,41,181,104,233,173,255,134,91,157,193,144,36,13,10,215,138,210,38,237,136,75,237,60,40,91,76,176,227,146,158,128,92,103,241,49,141,24,101,4,217,32,133,118,75,112,222,106,181,171,105,144,241,129,189,165,15,195,18,98,52,141,152,14,199,102,8,207,8,23,108,37,2,224,101,172,45,142,165,207,158,45,68,226,183,13,10,125,220,123,146,32,71,196,113,223,138,11,32,135,209,16,107,91,216,168,48,236,14,83,34,60,227,201,110,245,110,85,65,25,17,103,134,14,234,88,214,150,236,53,126,197,87,153,67,140,144,21,107,191,43,19,160,213,201,238,147,34,119,70,101,78,215,62,165,185,202,182,29,172,91,198,144,248,156,135,254,202,249,173,3,189,57,228,56,244,59,129,211,158,7,224,66,47,148,232,176,150,171,56,200,139,194,225,160,67,129,29,129,65,193,163,93,211,166,219,228,22,32,232,60,142,211,163,121,205,128,212,249,188,48,65,187,68,185,51,218,202,124,93,68,39,174,148,161,118,130,159,36,181,150,139,113,52,49,203,139,217,245,48,128,131,44,107,120,76,234,155,81,86,135,241,33,152,62,185,217,201,206,139,212,250,59,236,72,175,230,78,100,59,123,216,109,131,131,208,117,33,254,93,9,19,146,190,18,76,204,145,17,54,4,56,36,182,134,152,142,124,131,174,191,64,109,45,168,143,217,82,208,250,147,39,244,173,4,197,95,237,191,191,167,110,202,232,161,118,197,22,71,154,225,70,113,37,183,235,60,158,124,91,16,59,192,196,112,148,99,70,223,39,31,142,225,157,247,227,255,116,120,195,94,224,89,41,127,75,242,26,92,123,149,153,59,230,32,46,137,119,118,149,42,126,208,97,58,92,172,175,167,49,255,198,51,202,182,41,99,21,14,134,237,172,121,96,38,206,2,235,35,91,159,122,84,224,176,197,40,21,103,19,138,97,43,175,228,9,168,24,194,22,218,142,172,94,223,157,30,58,30,53,20,174,80,115,90,17,27,77,42,160,131,78,198,193,30,41,13,88,255,52,15,130,240,224,121,241,199,179,86,111,35,54,234,164,91,247,43,207,136,86,153,136,219,95,101,212,193,229,155,80,243,65,228,90,137,150,86,160,181,34,132,126,213,103,180,156,213,40,79,229,14,95,134,82,205,172,28,7,104,4,242,178,24,95,106,81,237,25,221,73,65,46,101,160,210,219,200,68,183,94,45,247,27,0,151,118,217,249,122,76,111,120,110,255,235,135,163,7,251,107,145,43,182,89,220,43,204,109,80,154,159,189,232,125,232,215,22,4,13,10,133,81,182,204,251,119,67,151,138,217,146,209,77,43,133,202,5,46,135,50,97,56,219,25,108,36,89,63,143,126,205,111,72,111,133,209,102,107,157,226,172,166,199,144,0,68,238,54,157,34,53,36,102,74,39,144,183,115,249,234,38,224,164,205,253,112,153,66,164,66,152,184,36,149,6,235,155,119,188,136,125,192,239,148,125,221,199,203,60,252,107,72,240,96,219,240,50,161,24,132,230,194,38,217,212,71,165,164,88,203,163,37,213,126,20,76,109,194,149,38,39,99,231,187,143,246,160,202,71,62,183,102,28,18,224,232,226,62,163,126,138,179,56,123,158,84,104,111,62,87,118,93,64,103,229,33,188,26,250,229,35,148,34,119,147,199,55,193,146,8,128,63,47,45,169,32,181,83,226,170,249,78,185,146,171,23,227,27,88,193,92,196,170,138,27,68,77,245,179,231,205,147,124,240,62,31,127,172,99,52,39,49,180,88,159,22,147,157,22,232,228,151,167,76,222,86,134,245,41,233,73,94,22,3,215,72,117,40,140,245,50,113,219,147,19,164,81,27,16,79,128,177,121,252,242,19,85,137,112,160,2,233,69,40,27,243,174,81,230,104,221,109,19,217,232,81,82,116,127,86,44,160,183,93,222,200,254,159,227,31,141,5,176,245,158,128,40,136,167,164,241,155,41,149,74,49,16,141,47,4,19,103,222,189,106,161,202,216,86,189,209,66,126,158,254,137,149,111,226,141,80,12,220,106,12,184,13,10,118,144,42,8,208,188,103,5,88,50,67,241,221,128,32,116,155,37,126,223,72,3,188,170,101,63,127,214,216,185,22,144,153,91,165,234,62,233,47,205,54,124,17,96,28,107,138,220,237,206,103,177,108,89,108,93,32,6,147,172,95,161,93,76,198,206,157,247,167,28,138,146,94,153,245,8,83,19,214,15,173,37,193,187,170,210,141,74,194,182,144,98,214,143,57,5,48,169,118,49,154,57,4,206,228,77,201,69,30,68,26,171,71,128,66,84,64,248,196,153,184,20,96,181,211,226,104,151,65,69,17,126,216,67,177,113,187,20,170,132,195,160,132,167,216,224,123,153,121,38,6,117,213,206,101,52,220,23,109,219,96,221,233,15,106,54,116,246,116,98,239,120,25,95,141,255,116,251,88,130,176,121,222,227,31,233,40,22,241,108,225,167,13,7,117,46,162,95,175,80,0,173,247,155,190,125,23,235,27,210,249,191,108,219,182,240,120,202,249,121,134,68,38,128,168,252,65,33,134,111,156,232,108,56,93,227,78,48,216,185,118,138,1,54,217,238,247,154,75,56,238,153,203,185,164,211,35,22,86,76,157,86,153,110,37,149,117,62,167,27,239,104,72,52,253,3,13,56,187,16,14,35,50,176,38,176,70,49,106,83,39,13,10,150,218,178,24,46,153,78,145,38,47,176,61,26,255,186,214,35,241,104,146,40,64,152,132,249,29,186,21,48,48,135,13,10,123,235,44,126,226,222,197,24,117,177,55,51,183,146,144,65,248,210,58,148,144,75,213,77,212,188,155,67,45,208,199,141,216,22,57,244,109,104,111,250,211,154,175,189,27,108,26,55,226,72,206,72,242,62,18,70,77,83,121,180,174,208,213,11,90,65,87,126,110,203,117,39,14,154,211,234,125,15,192,157,171,39,31,177,139,81,220,252,0,105,241,93,114,84,110,108,81,4,159,52,37,173,0,95,136,253,127,2,4,45,171,233,240,151,249,214,160,118,179,13,140,215,119,177,236,18,189,22,63,218,186,89,114,234,166,30,60,135,233,172,0,122,5,43,26,63,254,20,215,212,60,122,13,10,220,137,177,221,76,180,249,199,98,168,74,108,7,1,73,75,45,140,78,78,26,146,69,115,139,228,17,24,5,194,241,83,162,14,217,254,207,45,207,76,143,124,59,175,132,214,4,84,167,64,61,79,95,129,198,64,65,115,167,186,129,187,12,234,236,253,73,61,135,116,101,220,87,53,212,62,49,2,206,197,123,138,88,145,130,252,101,164,112,70,97,169,227,81,252,203,199,49,90,135,230,47,101,210,78,235,156,238,151,156,110,16,219,207,92,22,42,219,146,110,200,204,155,255,227,129,246,184,163,172,13,10,25,209,99,27,234,41,56,115,26,252,153,232,234,163,155,199,93,219,58,57,208,26,216,240,188,24,56,244,214,116,185,190,233,246,247,190,77,156,139,217,126,141,23,30,255,51,12,21,183,102,20,161,255,210,91,59,225,158,74,32,27,204,133,15,146,110,213,22,22,49,140,150,90,210,240,229,111,148,51,177,36,124,109,91,114,237,243,212,8,163,224,103,74,80,155,243,11,232,19,165,230,105,215,43,151,135,148,104,60,168,184,94,52,105,234,203,22,124,48,247,102,109,181,224,129,184,30,233,158,207,188,23,4,185,100,107,26,41,228,164,206,86,84,202,132,9,173,214,1,69,223,197,66,37,189,184,72,94,57,204,152,203,195,243,143,208,167,151,229,223,194,9,148,82,162,65,140,102,54,189,45,95,107,36,52,90,207,166,95,78,125,189,45,13,10,160,193,119,106,73,32,180,70,108,80,155,181,188,125,102,39,148,108,77,203,56,162,112,152,183,181,190,237,194,179,186,24,249,39,7,127,113,227,134,68,89,119,25,101,32,55,98,27,179,80,187,83,105,220,204,7,57,84,2,110,100,56,253,131,147,221,179,99,12,68,115,240,109,159,185,228,34,228,53,86,108,57,107,18,253,205,86,5,223,234,35,33,113,205,142,242,152,120,104,6,233,21,155,132,89,156,38,212,199,216,195,187,6,70,101,205,208,114,226,8,49,144,55,42,168,8,178,38,139,63,236,136,120,182,66,12,168,41,188,249,149,220,32,224,103,238,107,142,68,210,134,157,81,186,58,237,209,118,63,127,141,44,251,142,196,30,110,158,1,41,222,83,67,20,87,150,12,197,29,84,107,16,184,182,206,8,161,194,183,159,186,68,141,249,120,61,129,86,8,161,108,85,229,137,220,216,239,107,4,198,98,50,244,122,71,57,115,163,86,24,0,13,121,184,23,50,88,183,54,92,150,145,221,254,71,177,110,235,8,178,143,136,24,40,185,70,251,93,111,225,14,204,106,252,78,161,247,98,233,11,51,32,64,51,130,228,42,244,136,91,24,58,164,141,181,228,223,201,165,78,11,79,251,247,194,110,177,122,79,19,180,187,147,18,35,68,52,255,240,85,73,231,88,123,160,55,58,203,62,49,65,139,250,244,0,216,147,143,198,70,107,148,39,61,23,53,48,106,185,18,170,177,62,49,218,53,65,193,115,62,42,126,77,165,184,39,103,211,127,48,132,170,122,124,72,140,220,167,171,239,119,209,158,66,180,68,138,187,211,70,233,188,40,138,188,69,64,192,161,207,208,191,70,197,188,116,84,178,94,39,233,144,106,62,108,191,103,139,254,202,209,177,155,78,66,57,138,33,12,213,103,236,53,251,17,93,92,13,240,238,236,229,147,152,32,86,176,225,209,76,41,47,112,179,224,73,152,79,136,129,200,180,119,149,106,211,20,11,74,162,34,86,218,172,13,17,196,18,104,8,181,185,249,34,188,197,242,74,119,255,53,46,44,98,26,57,65,172,7,162,14,85,13,10,105,196,155,27,135,209,22,238,111,47,151,9,24,240,241,165,1,22,106,196,66,63,194,18,228,236,128,57,172,127,156,33,45,134,79,65,140,187,146,148,143,189,88,130,40,16,143,172,26,209,131,112,112,81,35,5,193,16,240,252,63,175,230,225,82,156,43,208,221,232,104,169,235,229,19,125,253,252,92,18,163,208,128,20,191,14,226,123,16,128,2,170,214,182,7,245,197,192,241,177,238,211,197,82,145,156,154,46,151,32,74,129,39,249,123,16,102,96,126,207,180,123,169,94,242,181,31,0,124,41,59,47,106,99,4,26,156,17,32,217,207,205,83,87,34,46,91,2,223,199,60,249,76,249,181,203,0,234,240,115,233,191,37,62,48,224,155,80,52,30,87,191,36,90,116,110,163,27,255,208,176,2,1,195,76,240,136,27,189,16,6,188,155,167,212,32,164,142,83,104,107,89,139,237,179,68,153,36,235,165,141,93,177,177,176,26,226,186,40,29,87,88,201,158,254,56,173,206,24,247,177,130,251,208,208,98,42,110,164,151,164,231,192,12,125,23,41,154,39,101,239,216,222,55,108,33,77,1,162,24,25,69,31,192,74,2,119,236,132,161,81,255,147,144,61,97,199,138,183,136,105,17,227,110,18,82,110,216,85,171,67,246,40,156,24,144,34,38,2,184,239,191,21,120,43,55,74,193,229,128,182,233,99,64,61,109,21,160,81,219,133,88,242,230,28,11,148,118,198,222,93,72,97,88,92,245,21,206,149,23,50,242,13,50,150,159,57,25,47,191,22,144,210,66,172,4,212,126,12,83,212,103,208,254,70,86,185,82,108,15,127,133,35,72,176,67,119,55,203,15,41,236,249,181,74,94,23,24,82,54,221,12,22,52,156,52,150,243,171,165,105,234,32,227,67,246,215,113,33,12,57,220,147,45,198,94,206,249,69,117,198,231,105,2,205,246,200,200,54,31,156,117,122,37,119,218,83,81,135,253,82,102,153,145,124,254,13,10,212,56,194,167,88,114,123,48,107,199,151,149,71,230,139,148,232,126,216,32,97,75,219,198,73,212,105,239,107,78,78,61,210,234,235,95,128,178,47,229,118,206,210,86,73,84,103,199,106,117,245,137,70,0,97,224,63,58,27,6,81,33,165,171,227,226,197,17,72,179,221,201,246,36,201,120,137,170,247,251,132,177,88,192,21,237,165,103,7,70,198,53,157,39,176,194,189,101,20,79,43,136,166,67,49,129,109,169,4,87,43,227,152,224,21,169,146,66,24,179,238,249,81,35,170,191,195,172,130,23,183,180,246,145,33,154,28,157,208,163,237,213,192,78,99,172,189,231,27,66,53,34,83,37,97,244,183,27,112,40,65,92,52,55,227,70,190,114,138,65,85,150,171,116,144,21,193,213,155,216,50,142,57,168,80,203,152,8,91,52,181,127,181,45,209,209,84,249,143,236,73,179,174,191,203,22,114,118,46,77,42,30,207,2,120,127,89,223,30,191,38,37,195,99,27,237,132,155,41,140,109,34,107,228,230,234,42,182,106,40,125,43,169,42,108,156,97,42,95,132,155,60,179,194,95,23,22,75,226,134,246,228,245,231,228,201,235,23,188,104,170,94,240,25,11,100,105,106,87,4,66,225,217,189,209,163,14,118,146,82,78,48,228,180,195,223,132,72,29,206,198,225,14,115,8,230,93,233,217,0,153,243,250,187,63,79,118,107,184,108,201,133,148,109,32,3,226,18,135,118,26,115,134,205,132,97,97,91,87,11,218,1,95,94,250,35,209,142,131,195,37,238,68,78,193,102,161,163,45,152,24,194,166,90,9,45,68,21,108,6,211,253,7,155,146,69,11,138,73,28,187,53,41,221,172,125,149,175,232,234,243,55,119,251,178,101,254,184,164,185,175,242,206,206,255,244,154,251,220,246,196,25,116,151,211,180,72,134,109,112,239,40,216,228,177,126,124,233,95,67,246,75,180,140,74,115,235,132,178,102,80,246,45,62,81,153,214,77,176,181,184,119,2,101,14,208,184,80,253,93,22,200,72,208,150,228,199,230,27,198,59,42,62,207,192,153,205,113,62,18,201,26,101,119,168,141,111,85,211,72,97,124,122,73,137,13,10,134,234,143,226,4,87,4,181,237,82,157,177,40,201,177,158,225,41,229,254,100,152,204,151,8,127,107,222,150,0,124,157,1,206,156,175,117,100,110,90,91,50,191,234,217,54,42,82,34,61,116,105,67,162,208,156,83,108,250,247,142,96,27,194,210,240,183,99,173,114,46,58,122,231,6,157,101,249,242,189,237,114,120,81,29,1,32,245,234,7,29,65,166,159,140,42,45,114,13,59,36,180,190,97,200,63,251,239,250,226,27,5,96,166,253,26,68,229,62,66,224,209,14,14,147,244,33,168,167,225,103,187,101,240,215,241,221,226,128,159,163,205,253,147,28,204,105,177,25,200,50,56,193,192,14,193,0,216,231,171,28,127,176,46,222,151,7,60,138,88,96,55,26,129,50,190,57,30,177,195,151,182,31,147,135,111,235,67,140,40,142,242,227,141,220,209,130,165,207,187,169,148,169,74,27,248,24,49,44,216,35,66,21,252,205,124,36,13,10,21,172,1,168,133,225,23,158,93,125,99,5,220,47,83,75,170,20,31,37,234,106,95,53,100,134,229,250,13,10,227,198,152,13,10,159,94,142,153,231,174,91,149,172,66,151,117,16,151,2,69,79,201,81,228,49,154,228,177,221,201,176,125,9,152,55,44,13,10,149,171,166,152,90,77,190,109,198,51,21,79,170,48,172,230,137,211,106,127,23,1,27,242,156,237,197,138,102,146,168,179,176,165,116,46,108,236,47,105,178,85,188,237,167,98,222,231,47,18,94,186,152,137,28,255,77,136,170,193,65,136,161,141,129,66,73,121,201,7,158,68,137,13,148,238,9,77,76,173,220,28,122,197,246,121,31,171,136,73,204,2,64,165,121,171,216,0,239,227,170,78,226,247,129,25,163,194,128,108,5,194,177,241,121,64,190,115,152,73,130,209,192,6,84,51,169,189,101,142,163,26,200,25,218,154,17,184,116,117,187,86,92,194,148,182,243,2,254,63,119,82,237,155,150,60,82,121,181,241,25,103,98,208,225,46,109,164,111,249,160,202,222,56,118,215,223,105,93,137,101,203,75,71,179,81,250,63,117,152,17,38,147,118,178,195,19,68,3,99,63,222,39,201,176,36,246,186,129,243,225,105,156,246,74,66,102,24,66,139,166,195,38,107,240,22,197,218,165,250,76,200,47,182,220,35,255,45,116,33,96,81,140,211,166,90,219,56,229,63,16,103,7,108,161,98,84,102,224,198,70,112,161,86,74,84,206,20,220,92,87,210,74,18,40,63,188,191,253,15,213,148,172,42,86,238,88,181,82,247,88,104,37,228,251,30,194,63,130,33,113,22,146,200,197,111,66,39,43,135,235,255,56,101,25,31,28,17,148,59,183,109,140,12,252,83,237,69,42,228,148,4,210,200,25,62,204,42,123,184,207,191,36,135,13,10,186,56,210,204,247,134,158,147,99,220,13,10,217,79,172,174,213,146,43,50,77,195,182,254,131,231,179,79,226,154,188,30,173,98,180,159,251,203,129,26,219,181,20,141,90,194,116,62,58,5,131,134,3,111,173,171,111,240,113,188,28,59,128,35,249,8,182,255,72,219,13,10,177,201,198,116,135,195,82,17,212,9,149,225,137,44,139,102,173,108,156,98,3,246,248,181,19,177,17,23,177,13,168,114,90,180,91,68,55,181,168,138,150,175,49,120,216,86,214,1,25,110,129,98,134,138,131,218,100,228,8,253,222,189,20,214,89,24,129,234,101,32,50,207,47,136,179,253,108,4,121,200,248,154,198,141,20,208,26,240,206,175,217,90,209,70,230,143,174,1,160,127,57,231,160,197,228,255,166,214,169,29,113,8,39,202,90,207,231,209,249,70,168,215,182,118,33,214,15,83,65,243,44,18,166,239,176,58,229,172,83,115,163,130,192,68,162,118,246,180,28,23,61,13,10,170,174,12,29,228,195,204,113,236,38,55,34,92,203,251,212,94,171,146,191,57,53,124,87,25,91,65,15,116,40,53,133,177,43,146,100,56,172,114,175,173,170,210,208,250,44,202,114,140,142,134,189,63,231,93,71,184,190,185,106,177,59,84,128,247,163,213,116,30,181,30,62,64,194,31,242,237,125,146,33,217,135,124,125,26,140,236,243,148,228,2,63,207,140,78,253,179,139,131,148,153,255,92,217,106,70,171,79,219,70,243,93,59,72,185,23,87,192,21,147,40,18,14,147,207,31,39,57,233,54,226,137,8,251,25,71,29,58,215,246,241,173,43,209,236,54,73,134,164,17,204,27,84,125,12,161,4,251,193,11,28,167,182,56,166,14,117,72,85,116,3,69,97,219,52,93,218,104,65,81,70,170,198,50,223,163,71,105,182,237,125,125,70,148,233,44,191,244,239,177,107,85,73,89,8,16,46,133,232,39,252,98,60,241,187,230,161,60,191,100,232,120,225,162,161,89,148,139,85,41,183,94,7,23,68,165,240,229,13,241,140,17,11,13,10,241,23,206,127,51,248,201,89,212,201,140,237,90,157,73,42,230,245,109,165,123,15,23,73,93,172,177,48,102,11,206,251,6,79,216,48,157,150,90,190,141,43,233,143,104,152,193,183,163,156,187,227,231,93,160,255,239,108,195,148,92,231,109,163,190,145,85,70,254,138,83,16,19,13,10,224,172,170,154,183,60,126,4,28,0,83,59,75,199,114,70,87,170,100,155,147,136,183,145,170,197,234,191,205,221,234,44,198,122,15,208,174,155,227,125,249,173,64,99,101,56,238,85,168,63,96,233,224,38,198,79,189,139,34,12,235,70,230,116,16,20,74,82,15,206,172,162,82,232,22,84,72,248,77,142,160,131,199,147,173,9,185,11,62,232,59,115,254,252,51,101,199,41,227,199,56,137,75,140,1,194,248,174,224,204,139,17,78,17,117,239,180,76,196,198,206,245,200,117,75,28,199,206,194,0,173,139,241,24,157,116,28,183,91,202,78,136,190,149,158,50,33,106,211,63,103,79,73,171,32,163,84,207,57,105,241,97,26,149,211,147,78,20,136,49,174,124,129,167,235,227,197,36,79,116,62,102,168,46,16,209,108,192,159,129,148,234,122,89,107,197,152,29,131,51,24,171,79,125,191,42,188,229,67,228,16,182,73,209,141,20,111,1,72,97,89,104,61,246,26,63,136,15,155,33,235,250,183,126,144,140,108,252,121,248,155,165,245,17,20,240,191,124,60,206,199,191,15,59,5,124,49,149,207,186,105,8,227,30,13,241,13,246,145,99,201,218,123,171,192,14,154,88,15,167,250,194,2,145,6,21,189,71,155,191,118,251,128,104,99,13,30,194,28,210,146,109,53,30,134,158,22,194,207,30,2,60,240,77,79,198,22,7,218,239,238,237,255,85,147,230,2,52,146,240,0,41,226,174,75,74,44,20,80,149,78,250,39,146,243,43,73,52,167,104,248,146,23,18,69,161,226,240,52,226,185,243,152,51,241,179,49,161,154,56,107,170,207,236,140,146,155,166,182,124,216,146,43,188,157,192,5,236,57,118,87,93,91,5,8,208,113,124,107,241,17,35,234,54,216,253,55,250,119,166,241,245,170,132,212,173,141,37,178,193,29,24,119,166,226,249,183,79,59,88,41,250,239,212,247,32,156,233,120,90,166,253,230,134,114,85,74,111,41,216,191,3,254,16,142,217,13,10,127,88,105,15,172,57,154,138,211,162,104,153,7,43,131,40,116,221,182,41,88,26,81,179,50,92,217,237,253,73,232,144,234,137,89,219,147,125,171,131,199,119,242,164,38,185,103,175,88,136,195,58,54,53,183,141,100,122,214,186,68,30,34,44,149,142,165,141,97,148,95,120,29,126,244,9,119,27,137,178,2,66,173,125,7,194,239,89,44,191,65,60,95,200,158,195,15,201,235,238,75,198,55,9,174,51,182,94,227,9,28,236,190,97,11,132,126,18,197,86,162,121,200,177,20,195,228,96,130,45,51,48,173,253,114,189,105,245,76,8,168,24,72,194,0,42,8,50,108,243,176,155,19,5,73,13,53,174,229,145,121,8,225,96,78,206,117,187,232,17,167,21,174,138,247,234,156,55,27,50,45,4,40,237,244,200,147,253,234,96,126,112,225,182,246,97,73,71,50,97,1,234,239,24,226,155,224,85,125,42,146,207,31,193,80,94,139,67,75,195,104,206,7,204,170,188,7,116,248,166,62,16,115,251,188,235,63,64,82,70,42,169,0,138,30,83,241,136,201,234,227,57,250,186,116,175,214,214,15,71,40,44,217,255,114,31,100,189,81,120,127,60,19,181,166,197,165,247,134,17,113,1,17,245,224,71,30,32,109,114,82,15,29,250,70,95,74,35,199,29,207,153,160,76,238,241,27,14,59,223,195,91,116,97,166,7,83,211,172,38,220,80,165,149,108,145,149,164,245,34,99,136,224,149,61,221,3,175,18,138,152,240,59,223,160,96,44,187,170,32,171,158,204,223,114,85,150,42,51,46,22,212,56,7,98,228,152,253,164,136,92,100,255,95,155,72,13,164,135,197,142,120,148,61,246,38,22,230,226,198,158,236,136,54,223,207,169,235,245,137,56,168,120,243,231,146,232,189,140,93,109,245,87,165,216,32,24,219,174,28,169,198,75,165,175,142,33,190,27,102,128,252,93,178,36,34,34,11,119,110,155,160,191,30,210,183,33,47,139,241,17,236,140,140,119,178,35,192,94,181,229,241,207,171,210,208,55,244,186,15,149,3,226,205,131,244,81,157,24,4,118,99,240,158,48,136,131,245,218,82,40,248,48,69,255,65,33,77,34,115,178,254,13,10,144,23,213,224,85,123,194,161,152,195,93,30,126,129,247,150,84,68,87,96,203,161,211,240,94,164,185,6,88,229,63,223,8,35,189,177,80,30,213,29,167,92,71,57,80,115,216,152,13,30,53,4,227,246,125,179,37,158,78,231,58,135,207,217,111,132,226,33,121,101,115,149,141,54,74,81,230,53,252,85,71,140,156,191,154,234,22,183,216,194,95,33,21,207,228,183,245,152,84,226,73,104,131,59,160,214,77,29,51,42,102,109,250,42,63,215,27,5,162,107,171,125,163,130,144,123,19,222,11,128,135,29,241,132,211,98,43,98,61,126,9,188,50,164,246,234,46,109,164,80,169,6,234,211,109,83,253,236,127,131,225,1,254,243,47,79,174,197,129,176,0,104,109,134,160,211,134,28,30,103,241,138,76,70,71,245,31,151,132,132,217,227,16,11,55,190,157,32,174,132,192,133,70,28,31,191,146,156,102,158,147,102,89,5,12,38,39,172,27,1,152,55,186,167,87,87,245,176,168,46,138,233,207,33,17,147,26,56,191,201,71,68,226,253,227,248,113,3,66,172,97,82,134,228,172,231,242,105,116,58,160,84,99,175,83,125,148,22,35,14,204,168,89,216,201,155,124,110,112,190,127,225,29,182,152,88,155,233,225,25,0,200,233,88,42,78,245,234,148,181,246,40,32,201,13,188,2,42,98,14,197,54,224,108,184,190,117,38,167,137,153,109,14,116,26,173,152,8,128,163,56,0,166,254,146,40,108,205,2,201,203,64,126,179,31,185,93,156,159,74,255,56,179,112,135,172,88,44,31,123,100,167,195,210,32,43,221,98,233,174,179,27,202,133,196,207,50,63,3,218,157,49,139,145,247,143,220,13,38,102,48,247,68,78,208,104,181,92,5,70,28,151,85,35,102,168,44,46,116,60,236,53,61,81,2,143,220,245,64,59,59,116,211,121,184,46,182,156,67,128,237,64,35,158,21,168,107,46,92,134,8,145,226,103,129,204,17,31,181,112,94,59,124,122,241,148,96,6,84,181,250,27,95,197,79,208,186,67,102,110,123,171,210,201,28,133,159,57,62,212,159,113,35,237,251,100,138,61,97,82,242,193,127,126,67,140,13,10,99,137,104,172,6,180,251,63,119,246,79,53,138,224,99,130,11,211,63,2,19,200,92,64,228,217,126,209,0,236,45,161,194,225,234,37,139,241,7,175,103,90,157,153,95,96,191,163,114,34,185,194,179,37,192,5,43,184,83,125,43,39,221,67,161,41,199,232,255,66,117,123,58,201,180,71,112,61,56,33,8,218,82,11,139,59,179,232,199,41,91,119,107,68,237,40,248,99,184,225,248,27,11,209,218,238,138,23,21,37,208,157,38,32,192,77,211,33,157,136,12,46,204,121,40,45,215,177,119,42,156,187,202,112,105,9,174,139,199,121,142,110,199,55,81,137,182,207,206,138,135,88,73,23,110,89,19,184,90,24,251,25,122,51,202,75,91,64,88,96,60,241,250,121,165,104,86,180,61,83,142,158,206,17,125,153,175,167,59,87,227,7,54,79,85,54,68,222,1,237,180,98,52,239,172,19,4,107,110,4,126,204,143,99,148,47,32,9,122,215,172,240,164,92,5,1,169,82,99,222,148,57,168,128,214,181,197,33,77,41,24,13,10,84,215,254,155,46,98,126,244,158,24,155,89,252,199,135,69,232,120,228,91,70,192,166,72,149,93,62,168,201,53,17,61,148,249,46,201,99,246,108,243,207,58,82,107,167,28,223,60,212,202,105,239,171,8,183,56,158,51,144,113,104,146,164,135,43,210,157,193,224,136,154,66,215,255,180,25,14,154,141,5,216,78,185,197,116,27,230,176,39,22,188,117,224,16,111,95,148,189,55,120,190,152,94,3,134,13,39,228,64,136,195,203,42,5,157,235,196,32,220,227,168,244,8,122,149,72,72,94,97,108,64,154,196,0,221,28,65,28,228,182,162,41,208,145,178,83,235,104,240,110,67,81,30,197,170,110,202,77,110,72,24,214,170,32,104,218,26,239,202,55,118,17,191,168,22,181,33,81,130,67,45,86,131,41,77,103,167,193,253,118,197,34,51,8,124,164,73,67,236,114,128,0,94,147,20,95,94,122,229,1,0,193,131,100,225,179,103,65,233,100,124,77,193,246,138,88,236,68,9,89,32,253,207,5,83,47,96,55,23,128,247,132,32,7,126,245,194,77,99,226,96,64,205,223,248,223,214,93,135,29,185,67,245,12,222,132,144,12,19,114,239,51,253,138,185,136,156,130,249,79,97,160,230,132,34,25,160,243,158,199,178,50,203,248,2,196,167,68,243,49,89,67,46,130,112,6,199,202,119,228,128,164,138,155,14,106,135,97,88,138,49,2,227,249,138,119,187,214,42,58,35,21,15,209,64,211,148,23,115,191,124,187,162,51,143,243,123,158,182,64,85,138,35,19,232,130,78,142,98,3,49,86,138,155,118,244,137,113,152,167,9,249,49,63,74,196,8,39,216,195,167,31,42,191,240,43,253,87,211,13,11,20,1,47,181,195,155,133,175,84,13,218,13,10,220,39,168,91,49,105,78,141,123,97,249,217,180,118,87,16,34,217,143,45,118,130,70,85,13,10,135,114,147,243,255,110,217,24,164,152,214,166,0,34,62,26,97,137,12,73,172,251,96,38,88,103,206,148,100,249,195,44,89,233,79,118,65,195,135,63,180,250,110,178,55,248,237,148,87,153,87,39,13,111,214,64,189,149,67,230,131,242,55,44,205,123,96,170,210,105,224,58,114,197,205,183,50,177,40,129,141,65,166,221,210,188,19,159,125,57,17,244,142,27,29,38,61,212,174,142,76,225,166,134,243,160,13,10,44,191,72,151,134,49,205,36,53,102,226,46,104,248,215,57,113,52,163,83,14,163,116,94,79,30,172,180,214,165,253,132,195,1,16,148,243,117,115,247,249,144,35,5,2,12,83,146,103,22,212,120,12,107,13,10,37,123,247,17,173,148,200,63,29,65,160,44,28,125,210,3,163,230,228,177,78,218,47,219,179,107,6,58,62,7,68,149,246,38,176,238,161,70,210,42,195,52,87,244,79,65,103,89,103,109,42,5,102,236,43,114,109,47,5,64,171,242,37,51,159,2,244,6,212,231,166,46,82,51,221,242,13,10,231,200,108,160,205,213,97,243,60,66,38,84,191,45,195,104,92,169,27,185,212,176,154,200,177,90,36,169,159,245,110,40,148,241,31,123,180,114,143,232,240,245,183,153,247,79,71,93,45,1,246,27,126,158,14,84,31,127,235,138,85,116,134,215,223,44,229,9,39,81,93,131,59,202,161,205,155,247,166,80,190,233,224,3,165,149,28,152,237,20,124,76,82,246,79,105,42,178,129,152,78,230,90,71,228,74,74,95,169,61,111,24,210,118,211,176,28,94,95,97,53,172,105,64,82,76,215,19,223,64,119,251,73,67,232,172,146,122,104,72,158,165,42,207,122,133,67,147,205,2,126,181,46,162,220,98,52,239,3,79,61,199,66,214,219,90,103,252,33,210,43,151,20,107,156,38,139,169,124,48,22,28,224,30,220,105,166,161,240,94,251,14,6,242,38,68,225,163,104,240,226,192,198,193,200,50,135,142,6,20,183,75,214,69,245,203,41,60,253,183,97,139,131,127,255,20,161,33,13,10,160,97,200,200,24,103,36,67,5,184,13,170,115,203,37,164,23,34,142,149,89,231,189,82,193,25,176,204,219,124,77,206,126,27,159,126,142,187,203,87,94,91,210,19,189,214,219,136,118,157,172,176,94,88,112,35,47,14,248,47,68,133,89,24,116,35,64,158,239,117,107,166,36,116,147,190,36,203,24,121,181,221,130,46,3,208,173,234,30,219,221,131,211,252,70,117,156,103,155,146,31,6,22,242,114,18,144,63,114,138,180,76,23,132,232,167,220,237,13,245,98,90,125,63,72,162,15,202,52,0,129,132,206,205,20,92,205,152,227,27,121,225,116,207,16,126,143,53,196,12,25,216,107,64,186,238,97,100,53,52,8,128,30,223,117,166,25,255,197,182,250,243,243,169,95,100,121,92,196,12,31,137,99,79,216,193,56,82,210,101,251,206,248,52,200,0,171,70,227,232,22,116,118,178,60,221,138,255,110,47,153,124,153,168,106,156,179,14,248,200,83,21,77,13,137,238,233,185,205,193,180,242,123,218,50,67,42,65,115,181,92,168,217,251,80,172,178,216,134,173,142,88,98,255,213,223,242,36,186,19,200,184,165,74,127,26,159,152,127,187,219,197,163,195,215,98,165,190,48,157,93,146,106,229,9,60,64,170,71,179,177,189,130,135,151,203,185,188,159,236,157,25,238,167,61,42,57,118,72,22,17,58,142,220,108,250,110,96,90,213,120,252,142,48,171,214,0,101,138,73,171,205,90,197,70,85,210,156,80,253,183,32,112,22,157,27,56,159,17,75,124,113,239,149,168,13,130,171,83,122,200,193,101,212,115,113,252,20,42,81,98,80,41,169,144,165,119,235,22,24,72,13,114,109,169,60,152,229,197,242,79,98,42,133,12,221,148,186,218,234,145,212,188,50,205,80,206,105,233,240,14,119,222,168,236,29,55,145,99,152,251,112,146,64,38,5,53,157,240,138,254,123,153,199,108,42,124,112,56,63,40,167,192,0,198,150,244,82,145,187,143,7,71,145,121,129,151,202,255,21,68,199,108,238,168,201,230,215,110,220,189,146,168,109,248,137,72,31,59,191,240,134,84,66,38,79,14,164,13,60,170,105,174,70,122,8,0,63,156,48,255,127,43,119,231,103,88,5,117,57,132,98,213,177,23,29,212,65,216,152,111,51,188,123,218,23,212,19,235,182,183,163,38,66,227,63,32,178,132,191,62,222,208,2,53,47,198,108,111,119,65,165,66,21,95,74,21,156,215,120,190,86,185,73,44,217,81,21,193,160,97,137,162,22,207,210,230,114,89,101,161,61,233,115,118,90,5,17,77,154,90,75,224,97,90,248,191,106,94,175,248,68,104,184,73,149,77,21,190,174,28,221,87,196,53,120,139,51,25,5,192,20,33,181,15,32,177,132,80,106,11,239,116,99,48,188,152,233,200,154,170,143,157,16,47,21,128,67,190,182,166,130,5,154,28,139,140,246,123,47,61,122,244,216,187,224,134,37,76,222,83,118,94,50,38,186,47,149,174,128,99,100,159,159,148,189,149,25,65,29,175,138,2,135,48,115,53,102,129,144,99,136,6,226,148,132,164,255,188,30,70,177,128,14,3,177,98,194,59,29,192,180,192,221,60,122,190,210,240,7,98,151,46,240,110,235,155,205,199,179,243,156,112,190,50,120,157,54,111,7,58,195,40,12,39,61,255,41,121,80,118,113,179,225,231,104,90,154,79,15,211,134,127,150,221,103,91,240,95,37,237,152,106,121,36,155,117,241,130,253,115,205,162,166,166,109,105,62,76,197,175,227,64,36,49,178,200,22,218,20,134,195,75,201,220,164,226,213,28,134,134,136,167,120,124,209,13,10,187,154,202,20,183,24,19,105,222,137,145,60,216,250,181,143,200,69,25,234,42,161,78,84,183,168,206,71,79,33,62,7,207,45,226,232,136,9,61,238,201,55,82,104,22,183,28,150,237,117,250,158,46,220,15,158,110,132,86,156,18,187,142,57,170,237,191,84,102,48,116,85,83,214,8,79,249,82,79,236,106,114,100,248,140,235,126,195,53,142,146,59,57,36,116,227,164,136,101,86,68,49,102,41,136,254,167,104,206,85,90,176,218,72,189,82,106,132,176,203,23,180,88,64,102,193,100,12,16,35,217,31,120,105,239,12,77,112,27,225,33,166,227,200,50,1,4,39,73,7,88,174,215,162,179,13,96,40,242,33,90,164,78,134,216,82,253,198,125,165,204,186,121,238,168,99,186,201,237,194,83,91,102,171,14,84,236,77,68,17,57,15,222,184,209,251,193,116,63,21,195,182,141,201,42,134,89,231,168,146,213,229,56,114,234,81,238,140,167,239,81,16,62,135,194,154,39,20,233,7,199,157,185,207,55,68,23,133,210,247,58,30,229,133,80,17,26,77,155,204,190,191,46,57,205,59,147,220,163,0,250,195,237,26,221,130,21,48,30,87,102,195,12,140,242,150,117,116,108,90,119,191,31,227,205,117,210,92,241,147,222,141,154,240,42,248,247,166,232,248,75,84,128,88,205,211,198,153,142,209,52,99,250,222,115,145,38,216,61,60,226,199,32,31,149,83,130,131,46,50,193,13,203,204,163,88,53,152,91,154,147,248,227,176,32,139,230,233,36,40,120,124,71,211,128,138,15,119,184,241,215,110,107,246,161,127,248,28,219,6,81,128,224,56,9,208,54,56,48,123,215,191,92,237,191,100,144,78,145,143,200,5,172,144,83,121,146,139,129,100,128,246,227,189,238,71,4,44,186,152,83,157,160,225,19,177,165,242,62,175,26,50,16,189,24,86,25,133,230,67,110,171,144,57,93,164,119,199,166,215,136,141,35,119,179,252,65,105,54,131,87,216,128,206,4,30,31,124,135,94,149,102,0,219,125,155,53,209,238,102,190,71,110,157,216,6,76,192,34,48,39,104,41,194,192,160,152,240,81,80,46,130,138,12,197,5,175,216,195,223,41,61,161,80,138,196,210,88,102,190,238,107,189,90,35,14,156,45,205,212,240,104,131,147,99,129,244,118,221,205,134,204,254,21,194,206,60,50,67,225,72,203,230,3,184,81,58,124,231,166,145,13,10,102,169,11,112,137,229,204,212,54,139,239,255,43,207,142,145,139,254,13,10,27,6,154,178,169,20,202,123,185,26,13,10,195,179,192,176,96,250,26,3,22,246,19,94,137,14,229,73,49,88,151,200,70,68,150,204,109,234,15,126,58,244,63,250,76,50,129,21,96,103,88,44,162,85,177,210,232,15,153,154,58,192,64,43,189,23,1,130,76,59,181,36,19,15,91,130,164,82,117,128,123,194,243,160,101,94,162,8,249,104,178,151,249,140,54,145,146,200,172,162,107,235,167,220,69,6,251,209,48,94,46,250,77,190,83,117,40,26,136,238,45,111,200,143,192,167,85,231,41,52,180,181,143,109,211,189,175,113,113,164,163,199,118,87,103,53,36,146,191,169,167,117,133,4,117,13,10,183,243,135,84,104,59,112,233,226,147,203,28,215,178,59,166,43,215,57,122,187,132,215,237,178,46,246,195,245,139,62,234,246,86,227,97,116,126,208,64,32,22,50,83,209,207,63,144,91,94,133,248,63,255,48,171,39,120,202,228,55,129,102,124,15,101,200,253,64,77,107,146,2,169,158,167,106,249,174,18,54,99,21,80,182,107,6,56,71,24,11,109,202,131,46,168,220,74,110,253,182,116,181,162,101,82,167,199,213,76,39,153,199,212,224,60,36,246,97,169,17,3,8,109,227,169,13,10,119,74,105,136,52,118,86,52,76,251,160,96,101,171,34,71,107,176,159,182,143,153,40,192,4,95,39,100,175,100,60,254,240,81,109,135,253,230,219,249,59,174,40,41,177,118,203,80,123,185,152,53,224,27,173,94,85,194,248,121,140,147,250,53,235,63,239,2,207,163,29,61,33,176,48,84,127,134,210,123,148,72,214,142,43,21,90,101,199,66,189,41,153,218,160,195,174,214,68,71,185,204,103,247,175,51,182,58,250,242,95,60,247,239,134,101,127,232,249,82,40,140,164,182,145,211,105,232,241,147,92,218,68,161,128,166,118,117,96,194,237,63,47,204,56,182,189,121,145,212,23,12,124,86,109,105,13,10,138,37,190,3,33,42,128,135,17,8,209,140,206,255,36,102,35,230,83,16,118,49,242,146,39,214,71,84,178,32,141,25,248,78,84,119,153,230,145,202,71,55,128,221,213,106,230,32,205,149,61,81,51,209,53,227,213,31,35,112,120,254,235,183,55,20,84,238,99,60,254,35,138,234,99,249,153,158,50,133,14,108,25,118,135,160,236,78,89,8,210,161,140,83,73,98,126,51,106,181,227,24,91,33,130,40,96,58,75,24,82,6,159,94,232,73,213,113,184,56,125,206,31,143,142,159,233,79,173,239,18,139,168,59,221,36,95,140,28,39,193,31,46,209,168,171,45,109,96,23,38,132,44,238,116,78,231,170,198,182,250,22,204,170,57,219,245,179,177,212,115,57,243,29,250,86,38,113,169,207,125,222,105,21,254,249,241,155,62,6,138,70,77,211,80,163,173,20,109,26,36,22,115,181,17,42,74,135,104,249,118,114,62,110,24,71,144,192,96,69,6,196,101,145,190,242,16,108,64,120,155,115,51,49,168,7,64,213,154,190,211,152,104,248,11,236,194,170,33,196,0,160,189,12,195,38,209,134,255,249,235,55,104,15,30,220,50,172,120,249,5,146,128,208,123,95,242,227,84,254,213,69,18,159,165,250,143,61,67,23,255,33,224,39,96,47,219,37,34,240,73,187,84,95,244,218,96,36,129,48,248,31,78,52,131,115,20,47,49,72,222,208,56,175,186,129,143,38,213,180,159,192,45,233,128,13,137,78,146,57,200,142,224,237,228,49,248,8,54,151,203,11,227,180,151,71,52,115,229,113,71,23,201,20,161,169,38,115,12,36,148,19,254,162,97,94,247,43,219,9,6,147,51,135,168,146,55,15,119,238,191,98,210,108,213,131,238,100,59,2,227,35,130,19,121,192,220,150,100,7,211,106,227,205,246,70,185,93,237,199,215,253,15,40,233,80,120,241,45,252,13,100,0,179,39,183,67,197,72,160,163,81,122,23,90,126,217,99,237,117,107,30,16,122,231,8,126,36,70,186,112,44,212,226,110,45,205,193,168,182,151,16,139,91,94,129,233,240,49,5,242,32,199,45,74,235,197,118,101,136,124,140,121,100,8,159,190,148,36,18,14,253,177,77,118,238,248,198,247,163,11,19,225,174,144,203,157,147,210,225,75,222,71,244,161,208,94,213,177,141,50,170,57,145,27,146,210,76,147,151,106,206,183,239,89,122,117,22,25,35,167,59,44,199,97,120,84,147,208,238,220,8,181,175,233,95,60,0,107,65,67,138,7,133,201,98,176,112,222,43,208,150,203,99,184,71,200,117,57,136,13,10,163,211,252,92,52,94,9,146,215,190,119,198,207,244,148,134,23,253,218,120,76,197,86,82,25,43,14,215,117,18,156,78,164,36,90,65,188,243,135,91,227,25,218,14,226,218,254,250,233,32,205,43,108,108,32,1,118,47,136,192,197,192,80,83,2,92,3,73,219,23,16,67,96,252,225,93,127,58,142,48,237,19,21,90,116,250,249,29,199,123,138,171,221,111,189,90,30,175,37,93,178,9,215,242,185,8,34,41,107,86,3,251,94,44,201,92,188,95,122,96,68,5,139,128,68,173,206,115,172,253,137,97,119,241,247,14,173,47,101,52,220,58,215,85,171,43,168,113,38,214,60,162,233,196,65,223,9,101,189,221,107,228,148,229,141,107,80,87,165,97,209,227,27,211,142,146,203,115,193,70,90,246,185,192,1,247,34,144,89,188,164,16,72,71,209,99,158,18,78,8,47,115,100,181,101,72,191,129,18,208,235,70,27,49,107,36,73,4,159,106,71,109,54,214,183,192,193,18,108,8,242,233,161,36,106,59,91,33,231,200,250,198,226,59,130,227,58,119,131,228,243,31,2,64,233,110,105,201,68,78,125,122,146,134,54,207,208,134,71,93,241,224,162,132,100,129,56,123,178,1,6,85,185,248,26,7,68,18,22,153,180,144,90,174,220,200,75,197,213,171,54,116,96,29,187,182,81,237,231,181,223,5,200,164,99,218,180,31,121,112,109,40,92,79,144,99,153,127,122,200,206,243,92,173,81,251,229,245,187,27,63,166,218,44,58,191,43,62,146,85,129,52,151,40,214,218,13,89,193,239,100,68,83,151,66,238,154,35,165,114,127,32,207,147,119,244,248,77,234,66,6,7,1,90,48,251,20,99,45,8,74,45,209,129,187,2,252,58,132,252,73,155,49,129,86,182,117,185,202,60,202,189,135,253,178,73,124,103,5,250,112,235,164,58,221,182,207,150,27,48,232,246,171,159,132,225,221,141,109,179,49,75,52,183,247,170,59,190,25,213,189,199,94,202,223,216,234,225,158,7,179,135,161,252,88,111,15,48,219,105,89,38,118,75,84,13,137,241,216,84,176,255,134,82,138,217,82,60,175,86,55,30,41,73,140,17,175,178,244,213,32,38,112,200,52,233,48,16,63,3,157,19,52,136,36,22,164,155,249,59,132,253,60,241,32,158,239,125,73,148,200,48,36,54,192,121,68,151,70,28,17,245,184,186,21,43,172,188,192,138,248,161,95,74,77,243,239,251,114,39,202,151,252,33,210,208,53,108,147,57,12,116,156,190,151,80,184,33,241,167,188,250,226,200,188,109,154,39,248,68,216,173,8,131,32,121,171,240,234,216,236,212,234,114,132,109,254,237,2,24,87,243,60,26,206,76,7,190,201,3,152,182,41,129,76,73,141,51,190,179,117,185,165,61,160,249,38,254,110,137,231,3,34,199,44,178,221,191,177,107,19,239,122,79,80,223,120,51,22,88,76,106,194,189,125,144,41,18,73,51,19,59,34,41,191,116,162,40,134,138,179,14,165,195,232,124,120,195,240,150,33,153,72,13,188,173,190,245,59,221,228,88,73,218,133,122,79,216,91,150,104,47,30,222,184,83,132,146,157,238,74,250,248,76,81,160,159,93,87,39,5,103,61,136,80,112,48,63,219,71,220,137,143,135,78,16,58,158,124,30,137,65,21,223,221,173,129,84,156,115,117,212,174,220,206,46,82,193,62,81,48,180,127,32,111,124,90,250,241,249,238,131,218,129,136,215,11,71,50,105,202,40,13,10,106,2,222,133,48,11,147,216,164,246,180,2,251,93,245,143,19,39,71,12,225,28,198,62,206,242,239,170,57,106,102,128,166,116,106,32,56,45,149,41,181,142,124,230,132,179,154,192,15,112,134,188,180,124,34,48,223,3,67,190,217,185,21,42,97,201,130,106,239,158,0,161,69,45,145,48,92,240,84,144,212,188,11,173,201,198,252,191,169,63,173,82,195,168,7,5,161,149,104,144,73,117,87,192,135,62,189,207,97,204,221,34,25,53,74,79,86,33,171,51,177,25,50,6,92,29,153,13,10,155,104,133,131,49,238,120,117,202,200,85,249,133,99,177,78,249,225,6,11,234,144,241,149,175,255,148,114,138,233,53,69,52,56,218,179,81,35,208,226,105,148,117,136,77,218,252,115,7,165,204,6,146,15,53,52,23,40,216,89,101,245,186,134,242,97,207,252,177,226,155,66,159,151,105,112,212,45,16,230,175,108,75,121,43,67,132,18,42,239,36,72,226,42,88,211,170,0,119,67,199,19,36,234,8,208,104,25,254,209,74,193,242,42,79,11,228,120,123,200,115,142,28,239,36,6,119,87,28,101,128,78,211,231,72,215,46,137,201,75,111,49,11,231,72,250,234,49,238,36,104,89,202,247,161,234,23,204,181,178,70,200,126,171,119,30,42,197,211,120,101,1,145,8,21,20,221,194,198,104,120,227,118,108,178,13,196,159,99,15,39,67,167,250,236,190,157,190,158,129,90,60,181,125,173,242,191,245,239,47,206,35,165,98,152,163,13,10,46,5,47,234,239,189,105,129,1,249,219,153,38,19,112,102,147,203,14,250,246,246,12,139,181,231,208,165,11,51,146,185,131,30,243,163,4,168,70,205,74,244,49,233,240,24,252,211,165,177,99,135,85,45,85,218,234,104,61,54,37,116,24,170,160,231,191,138,3,237,123,171,17,77,124,21,17,158,108,113,193,148,107,215,144,60,28,66,225,21,233,84,97,144,81,184,83,191,5,174,49,110,21,230,25,167,222,228,152,247,113,232,9,217,67,89,105,193,5,100,2,114,94,244,12,2,0,224,131,243,236,110,14,194,123,142,211,141,254,50,234,14,94,21,106,195,108,75,185,172,94,209,17,161,22,120,51,151,3,241,185,41,147,69,174,177,242,81,252,239,161,31,179,16,28,196,153,144,125,200,98,180,70,61,85,35,185,178,92,91,105,247,13,10,182,178,156,252,29,241,236,171,130,39,235,62,209,248,130,233,11,18,8,14,224,3,113,77,64,62,196,59,123,84,73,20,70,182,163,221,110,182,65,239,191,239,6,12,69,232,115,231,57,128,37,177,203,112,101,68,31,23,83,2,143,111,140,73,169,104,1,192,213,152,224,152,234,220,150,162,17,23,248,23,182,253,110,105,71,100,47,147,226,36,37,160,14,143,107,89,42,213,11,49,123,105,192,249,64,71,56,106,69,229,235,201,80,79,229,84,81,160,30,178,157,223,154,65,212,186,216,95,200,76,226,128,151,30,131,79,6,206,244,156,140,32,237,44,234,200,137,241,88,203,20,168,192,112,144,4,120,128,76,255,29,22,55,204,136,12,129,170,40,125,131,130,131,127,250,143,65,255,60,157,242,242,44,178,0,68,193,113,228,129,93,13,15,108,34,209,154,82,17,78,120,12,236,215,29,175,99,66,119,130,232,94,70,61,203,51,55,137,244,150,52,14,140,255,136,90,157,154,66,80,17,139,67,156,113,198,190,81,169,51,139,226,146,81,170,121,78,220,103,222,236,99,55,250,99,202,155,3,193,201,247,94,115,58,74,145,134,70,231,188,151,146,72,108,181,164,188,197,248,79,186,189,254,51,140,55,146,37,74,62,234,61,136,144,60,44,71,185,30,7,98,89,220,204,139,211,220,169,14,204,200,50,192,156,69,20,28,98,66,2,107,254,48,144,41,165,98,195,238,15,204,220,212,14,92,242,101,237,156,61,229,130,136,78,14,20,129,157,185,139,58,247,52,177,179,39,106,196,29,67,56,78,190,115,0,61,21,206,57,255,204,4,16,149,131,57,14,71,15,67,27,68,7,249,133,80,225,56,249,108,69,100,180,148,229,72,15,71,200,83,189,210,55,226,115,1,245,94,66,163,190,209,143,173,161,82,87,43,123,70,90,88,29,191,231,219,38,25,54,92,241,109,113,191,143,9,24,98,185,252,240,75,248,208,133,154,118,244,110,123,87,18,242,117,126,220,227,50,211,33,59,138,48,172,44,231,215,121,126,239,111,48,144,73,6,176,128,93,250,124,163,109,50,162,13,152,152,88,73,122,102,206,114,73,19,147,221,121,51,32,3,213,92,9,90,90,181,223,118,28,75,229,192,65,250,132,7,38,61,96,78,83,9,31,123,107,21,73,98,69,219,190,233,106,99,241,15,194,151,141,153,230,87,49,40,104,147,102,254,139,11,173,164,139,80,24,91,134,27,173,3,227,96,15,34,186,212,39,79,37,66,182,53,246,199,148,75,239,195,188,116,27,222,241,26,141,214,89,3,140,180,15,239,46,22,173,26,231,235,237,183,217,186,21,253,207,38,53,83,49,80,90,56,109,215,57,159,185,153,83,93,96,97,234,188,97,221,118,239,62,180,87,68,111,41,208,187,110,194,252,13,10,171,172,32,178,122,60,18,60,39,188,39,167,99,54,208,160,166,212,86,218,7,3,103,77,149,154,74,254,66,142,34,6,165,17,191,200,0,57,236,213,110,117,246,151,134,218,13,10,128,132,216,26,102,100,77,217,139,96,24,104,31,29,112,173,224,155,217,191,61,22,214,141,213,208,160,58,226,109,207,21,82,84,158,69,159,225,144,179,16,168,119,107,44,132,104,193,76,168,177,185,167,175,41,86,80,122,59,112,90,215,90,23,160,238,167,254,8,146,115,53,60,236,208,123,184,86,52,101,236,141,236,160,235,66,244,63,227,102,78,181,243,30,29,19,36,24,85,57,178,141,80,139,205,6,94,213,118,216,129,78,211,253,99,125,87,111,2,121,39,22,35,68,175,176,37,90,145,255,198,22,148,142,78,53,136,103,233,252,118,169,175,250,202,235,255,225,16,128,140,21,50,162,187,176,219,239,63,1,14,69,255,199,63,34,141,40,241,46,152,71,139,39,57,125,143,69,103,129,237,158,25,113,29,242,233,238,203,195,254,97,247,73,63,223,26,89,18,70,104,169,27,229,31,18,47,147,220,164,187,210,45,238,163,57,230,237,163,214,235,238,3,223,149,129,19,225,202,73,200,57,141,44,89,218,103,100,136,46,227,102,63,98,165,90,229,13,10,126,145,180,254,173,27,17,254,13,80,172,204,93,117,241,165,21,240,197,54,22,165,0,241,73,19,129,223,208,226,71,126,64,42,176,207,159,103,213,1,164,66,98,156,133,147,237,93,37,167,46,219,151,70,176,47,43,15,7,89,204,156,220,180,201,216,180,81,156,140,97,126,86,155,67,47,12,246,137,3,114,170,135,156,167,222,70,225,16,217,94,35,13,10,79,14,82,207,101,129,28,84,54,93,244,163,228,13,129,158,47,211,121,180,125,163,35,61,13,239,14,251,206,4,173,139,170,56,136,79,106,105,254,92,55,62,56,174,15,208,36,20,128,242,190,124,205,24,175,133,145,109,39,3,160,73,119,159,231,57,143,196,125,52,132,84,207,3,242,46,179,254,204,6,70,6,149,120,152,181,100,52,100,132,84,69,194,92,12,125,104,92,141,176,66,175,93,88,130,23,67,116,172,233,0,129,198,134,120,155,202,150,172,96,46,180,29,49,123,214,82,41,62,230,40,149,24,117,100,22,97,236,134,162,196,13,10,66,232,240,129,58,134,29,65,160,245,23,142,85,67,101,28,160,233,145,80,70,45,181,238,0,16,240,13,230,213,91,13,127,215,236,91,174,162,78,211,233,13,10,125,106,5,137,118,25,34,185,26,106,145,58,127,237,221,59,104,37,77,137,236,247,103,206,142,39,249,102,66,106,139,79,177,180,8,83,132,253,9,214,62,40,132,5,183,138,100,111,68,200,126,238,34,200,89,107,19,24,128,133,71,159,117,246,61,61,151,162,143,156,131,6,253,32,125,191,211,141,237,240,255,235,125,216,11,42,50,146,223,191,30,214,5,173,241,179,62,133,176,16,48,158,62,192,88,252,217,34,177,50,95,238,113,239,242,219,188,46,104,219,82,213,19,224,36,192,29,71,207,101,123,182,28,151,52,100,154,74,182,60,13,10,244,114,14,195,239,205,130,221,60,166,232,11,182,59,207,27,141,232,16,160,198,197,23,198,59,118,254,104,192,178,134,134,123,225,2,66,79,195,28,73,55,4,139,111,50,61,3,150,24,88,111,194,23,49,0,93,148,158,125,128,42,67,13,248,210,240,206,153,242,162,55,108,41,83,239,196,24,67,85,228,209,47,66,44,158,30,37,196,223,56,222,163,52,219,200,155,84,14,20,198,26,119,105,215,113,21,206,137,104,251,118,178,125,8,99,206,162,73,103,131,17,76,36,212,204,129,109,168,132,217,83,218,63,155,157,58,248,147,139,198,7,191,38,160,113,149,108,160,126,106,85,9,234,47,93,128,229,203,235,152,4,27,25,127,172,118,9,118,238,117,180,112,220,32,170,2,59,163,246,60,40,118,235,40,31,245,23,59,180,144,214,129,86,4,81,122,161,177,250,6,49,64,27,60,26,4,202,16,62,44,164,236,205,131,135,77,156,252,138,188,19,76,192,249,20,29,154,250,86,132,139,242,34,52,32,22,197,86,193,75,52,130,72,45,206,93,11,110,241,171,82,42,161,129,43,221,141,211,57,126,5,50,126,193,39,72,252,72,8,66,155,151,32,46,36,225,222,12,124,13,39,44,4,107,167,59,55,211,9,48,197,222,90,71,217,105,85,203,15,93,237,143,58,217,41,168,180,45,40,57,4,88,245,145,13,10,15,147,97,15,121,237,219,39,7,137,67,223,225,124,113,109,101,249,101,137,118,147,73,243,182,106,183,184,192,4,204,197,158,246,136,31,116,94,199,18,152,101,167,111,156,45,2,157,70,96,204,251,77,95,157,65,43,163,55,42,39,203,23,94,157,101,247,89,87,92,241,74,88,153,168,211,31,240,57,172,2,219,216,57,28,51,151,66,138,192,213,113,124,0,82,0,121,7,133,53,72,19,200,133,155,233,14,14,23,145,79,108,185,198,116,241,233,169,100,134,87,181,78,94,31,82,117,108,79,152,45,247,78,115,246,228,212,7,24,199,29,29,14,36,32,251,116,98,254,201,228,87,192,65,74,150,228,117,198,190,44,16,67,112,150,252,160,201,66,233,149,169,173,167,137,171,99,123,100,135,129,211,45,251,104,230,46,145,194,206,126,19,104,15,141,49,236,248,200,36,136,95,167,97,137,129,205,5,251,51,90,161,17,180,9,197,158,227,55,223,78,95,157,204,146,13,10,95,192,214,32,220,7,242,13,173,99,244,255,94,14,229,162,243,144,175,28,50,18,43,167,120,15,33,2,41,229,165,227,237,151,188,28,60,221,221,69,110,115,156,167,130,237,191,75,129,5,82,54,142,156,115,75,12,120,176,184,227,248,178,221,120,40,98,183,67,24,135,27,177,239,8,120,40,204,23,61,123,4,152,17,252,245,152,184,239,222,77,155,197,68,127,72,72,201,128,41,200,84,243,174,70,27,157,70,221,173,140,230,122,82,31,60,129,26,129,163,150,203,15,128,243,200,216,236,136,48,83,47,183,249,98,79,124,174,15,140,109,248,117,7,51,51,222,178,138,170,144,170,244,134,171,140,147,37,83,206,105,123,136,94,113,236,142,64,199,131,92,213,213,154,44,105,93,185,229,18,22,255,155,119,161,91,13,166,55,23,255,37,176,91,147,158,69,207,127,190,73,14,81,233,52,66,19,179,46,17,92,45,225,77,118,223,213,132,80,136,222,100,91,14,117,4,42,97,216,47,177,117,60,68,90,208,169,86,161,38,62,90,9,107,104,29,59,197,26,159,243,46,186,255,247,236,168,181,157,64,240,147,126,239,243,131,18,174,87,70,44,123,243,177,254,36,210,186,141,254,132,81,82,112,224,144,99,206,60,128,223,73,53,228,9,246,46,180,245,74,241,106,24,109,67,41,151,43,155,223,21,251,8,70,27,104,142,212,153,40,66,146,38,202,217,246,124,157,99,109,19,117,203,183,176,138,86,49,149,107,127,226,156,201,239,168,215,92,158,73,25,200,194,197,79,64,29,46,13,123,251,164,12,80,202,226,20,210,16,198,243,234,88,2,51,159,99,252,76,28,25,149,120,118,23,243,236,44,128,108,228,76,248,226,159,118,96,108,213,131,111,110,90,46,66,60,215,145,190,205,63,17,47,37,101,125,254,217,54,111,196,173,249,11,104,92,206,74,86,152,229,254,22,215,84,43,145,63,188,1,178,136,221,19,244,61,178,177,237,140,203,128,21,157,189,201,13,10,129,50,18,93,248,223,84,124,72,81,202,96,157,31,111,77,100,119,65,38,14,132,91,69,121,55,120,120,39,168,158,55,205,160,107,177,145,102,154,200,75,134,8,234,225,50,209,1,119,243,252,56,73,128,243,166,228,57,176,72,163,141,13,107,156,239,9,243,242,215,50,170,113,189,5,129,105,214,208,248,201,209,70,217,218,4,103,116,2,117,89,168,179,132,63,97,22,180,24,66,126,120,71,106,216,240,248,30,138,107,18,9,128,96,255,125,214,134,80,63,151,45,108,66,253,108,194,156,8,58,195,215,46,55,81,242,29,46,68,165,114,238,200,14,129,238,68,201,15,170,122,250,188,211,236,235,152,253,64,104,246,195,164,222,208,230,206,197,35,201,160,5,77,31,194,168,214,26,74,38,249,188,37,11,143,48,36,22,146,74,178,46,114,34,151,136,139,133,185,193,47,141,253,42,116,76,189,20,63,155,37,20,193,203,233,136,217,203,78,119,217,11,46,253,92,42,82,131,85,163,95,124,74,240,57,199,209,215,86,48,89,103,184,71,212,172,187,129,38,61,73,146,192,1,226,162,98,185,254,226,209,245,2,43,229,177,94,29,143,29,103,188,82,34,115,68,238,145,44,1,140,183,62,95,71,206,213,79,210,2,98,119,119,187,119,170,207,62,230,178,39,6,251,47,169,6,43,238,135,226,44,210,128,46,119,6,50,38,72,218,160,198,36,234,136,84,48,23,95,116,110,31,83,111,154,142,28,97,12,74,118,29,7,36,132,38,219,99,201,49,154,136,163,250,68,156,63,184,172,148,198,0,60,116,94,107,173,113,122,59,46,163,134,45,30,8,81,42,152,229,119,114,166,47,133,241,226,255,186,64,226,238,67,174,193,18,3,218,156,229,175,191,103,52,54,242,219,106,248,91,190,137,216,2,247,169,229,250,37,164,8,219,105,229,31,5,119,221,38,249,76,242,186,47,197,62,221,214,251,235,83,74,241,95,116,246,110,248,209,78,127,247,125,138,93,40,76,130,2,221,90,96,83,206,170,96,107,249,37,153,35,130,94,244,239,250,168,216,120,101,42,76,175,46,228,62,210,107,243,89,4,2,104,108,135,111,134,193,174,149,4,110,82,118,23,205,211,196,41,189,76,195,249,101,77,44,118,221,65,2,71,31,247,70,250,159,163,121,177,109,249,107,254,56,54,212,63,204,11,142,149,18,12,39,55,0,73,172,164,172,49,62,29,80,215,45,24,20,242,86,107,139,41,250,156,156,32,208,72,135,67,114,42,118,100,54,119,103,131,185,57,23,31,255,160,14,4,128,90,139,88,33,77,79,17,79,123,156,60,23,206,116,134,174,162,188,200,149,236,222,128,149,2,189,229,121,129,49,138,147,242,48,22,240,86,164,33,183,51,196,89,14,52,171,8,187,52,141,164,164,143,25,182,190,250,161,221,210,164,154,108,68,4,67,2,131,51,205,212,140,133,205,105,138,218,243,253,134,118,115,158,68,64,13,10,152,181,117,190,2,53,5,118,249,108,250,84,212,24,75,164,117,85,184,209,35,116,184,109,3,141,8,95,127,165,31,244,190,47,245,152,20,8,153,155,72,178,250,243,5,33,46,213,75,46,55,31,90,0,116,207,104,209,176,229,205,39,155,188,139,186,239,105,74,137,166,196,63,81,141,1,187,78,132,2,170,223,52,233,110,155,63,204,171,76,190,162,116,29,63,217,173,247,175,50,56,143,119,113,132,90,249,153,101,166,7,143,77,163,53,239,164,54,190,54,144,62,51,167,67,193,18,192,38,115,9,242,102,221,68,250,153,140,154,19,151,4,228,0,184,157,171,149,46,236,254,42,192,156,130,217,244,151,83,113,204,194,125,163,120,144,236,132,18,49,147,49,77,138,122,112,124,33,127,252,149,26,84,126,229,182,209,183,200,237,133,190,189,157,63,75,155,9,106,120,229,247,223,136,201,49,227,243,150,151,57,116,69,78,89,52,12,165,29,191,234,26,0,222,8,75,100,99,14,38,198,214,163,89,59,130,136,20,226,125,176,24,107,242,168,126,239,38,138,161,177,53,172,9,181,44,254,83,5,28,188,200,140,236,86,87,189,71,246,3,200,225,166,36,145,97,104,79,217,8,74,194,121,245,122,79,155,189,13,10,84,106,135,225,71,182,42,200,96,145,25,105,162,155,138,162,14,58,170,208,7,157,100,230,191,27,15,44,232,240,197,76,144,25,32,126,27,64,51,88,37,60,47,169,58,102,47,99,185,56,11,101,197,23,60,25,141,134,163,208,220,24,0,209,245,55,141,163,156,232,82,62,182,44,106,250,216,160,215,173,22,41,242,206,202,216,43,143,222,56,151,83,3,118,140,125,58,8,185,20,120,237,179,196,90,140,107,119,37,234,133,150,168,237,80,184,53,95,184,82,251,137,102,71,157,18,225,8,98,35,177,230,82,58,101,251,168,29,209,6,254,37,79,115,9,113,135,104,171,0,159,247,113,74,140,54,59,9,221,167,60,211,248,27,249,192,205,59,12,128,108,243,183,187,250,183,62,70,250,202,210,72,14,235,169,122,230,142,201,77,61,121,170,1,236,194,32,103,133,142,255,169,215,183,249,151,171,210,206,90,170,135,129,229,73,158,133,128,196,5,104,28,198,62,234,83,187,71,229,94,204,91,162,167,163,197,71,45,240,52,176,34,244,85,198,15,255,151,27,1,88,58,41,226,17,168,127,113,99,24,123,25,11,12,16,131,214,150,181,134,233,67,143,216,186,164,81,1,165,237,205,27,229,171,154,88,85,17,8,157,218,200,223,27,31,219,229,130,171,217,69,230,127,153,173,196,69,41,136,169,133,158,57,201,14,247,148,197,196,230,41,151,8,91,122,22,160,217,1,7,208,134,16,186,23,90,214,99,119,52,86,98,218,125,164,216,254,248,71,238,93,87,227,172,84,185,40,160,149,124,193,201,68,231,255,20,101,143,228,166,65,205,38,198,17,5,192,241,54,167,89,80,118,75,105,202,23,80,158,60,25,53,29,69,107,34,200,124,85,232,220,196,172,211,225,80,217,54,51,63,243,100,153,173,107,2,182,64,61,224,241,41,1,48,30,203,46,186,16,50,75,167,43,88,32,106,19,184,243,123,13,10,235,18,17,93,12,18,135,156,142,168,162,235,112,232,92,149,67,69,100,186,61,255,72,28,137,114,88,126,255,116,238,187,186,177,79,179,43,138,132,184,252,66,235,236,166,93,37,232,195,44,25,202,89,98,131,43,244,93,253,164,232,113,80,138,236,49,132,149,13,109,190,137,1,156,234,41,228,4,132,195,110,51,215,107,117,98,85,83,26,221,29,178,76,3,178,166,74,71,189,143,186,63,220,177,245,185,111,142,236,182,13,88,52,171,0,26,112,116,4,152,114,13,10,251,110,192,52,69,204,53,181,31,121,135,16,150,24,198,199,140,190,48,65,190,220,105,182,251,18,129,66,206,197,200,104,59,85,138,254,48,36,239,247,161,45,4,239,89,167,46,21,109,241,29,51,171,160,138,142,235,22,37,157,217,82,156,208,3,173,78,244,19,123,111,241,101,66,54,71,61,251,147,245,151,51,26,94,38,199,121,111,82,143,101,201,79,224,123,59,79,77,212,144,52,250,12,193,137,223,205,255,112,194,241,198,211,223,48,174,16,62,42,197,207,242,6,100,171,147,76,229,193,150,147,41,32,113,201,59,213,144,56,62,13,10,25,49,224,77,29,221,24,7,29,175,182,40,245,215,71,46,69,123,248,29,96,100,237,250,141,235,255,145,112,28,80,56,203,48,134,93,97,34,7,106,51,103,50,219,205,176,166,37,84,135,115,208,1,54,72,167,111,7,187,220,156,22,40,77,21,142,199,161,5,174,55,166,34,121,65,156,58,47,54,13,12,122,116,214,253,208,227,109,202,42,139,213,153,69,164,25,101,152,246,144,135,143,132,200,148,133,44,24,17,175,234,75,227,185,246,165,33,158,102,40,198,102,105,219,216,250,154,12,252,45,222,119,22,163,86,252,79,178,113,216,162,205,220,141,70,132,222,68,115,85,188,122,40,125,197,104,82,166,56,197,119,120,38,235,110,183,47,172,204,134,248,11,237,221,13,100,154,136,60,254,239,77,116,117,1,114,169,11,93,216,37,37,146,252,254,25,255,170,216,104,233,149,98,218,234,231,5,20,245,222,41,110,247,181,126,111,25,55,55,171,182,170,49,121,86,88,68,35,129,126,17,102,74,103,56,145,151,173,159,143,119,30,165,149,81,152,201,238,64,160,118,22,57,230,56,206,157,137,13,244,104,100,38,112,35,95,19,115,211,172,107,31,67,181,119,127,192,169,26,150,224,149,232,155,185,253,98,97,77,228,86,206,122,253,107,133,81,18,54,117,115,253,159,203,189,74,79,156,103,110,103,45,98,221,211,74,155,254,131,17,182,23,90,0,60,209,67,192,223,21,228,192,180,140,115,84,4,8,110,72,174,237,107,111,162,31,217,244,11,132,33,93,255,40,127,6,119,144,78,45,223,218,119,74,64,25,223,69,204,135,127,85,62,149,161,198,93,241,214,123,192,198,14,11,186,77,32,92,13,163,218,128,34,159,221,113,133,159,101,173,4,80,107,48,140,43,120,56,57,243,28,254,68,37,38,50,36,240,140,92,126,152,162,201,211,220,142,165,172,25,32,244,227,149,65,50,98,224,131,107,192,25,160,146,160,222,202,16,78,178,223,107,99,57,42,232,226,19,99,121,20,13,229,252,152,176,182,152,96,254,142,49,218,181,197,223,120,7,209,155,234,52,172,20,224,171,198,246,81,156,81,36,123,16,77,231,217,18,197,191,110,241,27,72,252,109,248,69,18,233,245,254,187,72,247,47,241,183,34,189,195,187,46,131,91,46,124,198,50,75,238,132,137,57,150,184,220,45,77,194,121,58,79,105,193,142,99,218,240,74,123,181,192,169,7,110,45,90,52,62,19,76,195,200,156,71,18,144,6,86,255,194,2,225,152,133,38,216,12,127,217,40,31,228,127,186,138,181,208,37,230,58,132,5,31,107,19,22,123,236,21,179,70,33,44,189,5,26,254,122,152,190,58,36,145,243,196,105,113,138,88,231,131,237,145,249,14,39,79,180,151,143,135,25,233,42,153,161,232,241,66,234,126,31,44,70,175,240,162,251,80,244,209,5,19,12,232,234,48,155,14,72,13,200,248,13,80,97,114,182,9,234,75,180,226,187,174,152,216,136,40,20,251,39,62,105,13,169,144,182,13,10,156,218,32,162,65,130,70,189,16,174,103,216,70,160,250,129,90,194,88,88,20,90,221,161,6,166,119,138,17,135,127,229,154,42,190,48,13,125,185,187,171,49,203,91,150,11,126,78,249,29,70,0,136,109,135,149,220,54,28,189,221,222,5,235,213,75,25,65,244,38,247,250,131,153,39,13,47,84,201,152,190,146,209,70,34,114,112,168,232,154,249,12,72,186,252,78,204,202,1,230,50,42,252,22,87,67,71,94,117,47,57,189,174,196,146,151,41,5,16,255,162,100,52,42,13,10,254,41,133,248,93,238,198,108,54,235,74,29,70,104,62,231,197,145,168,155,129,86,154,133,102,175,188,162,104,16,221,176,151,5,119,167,110,200,160,102,98,38,6,176,131,21,219,15,46,108,103,31,50,89,199,54,55,215,115,209,161,128,170,214,106,218,218,42,101,149,181,244,129,229,245,158,81,203,168,118,250,6,210,30,29,103,76,250,180,106,2,210,103,226,2,52,50,77,8,145,231,132,124,19,198,155,252,238,163,172,85,242,234,247,83,114,107,206,176,222,30,236,244,42,218,150,75,249,228,117,149,51,2,194,252,168,4,183,11,119,148,130,220,147,25,180,3,129,224,156,0,150,70,13,10,225,19,193,154,45,201,21,127,161,56,207,14,119,88,247,16,8,231,29,15,117,153,116,77,100,123,9,177,110,60,121,92,86,238,91,209,77,141,99,231,165,18,144,13,103,72,121,117,236,156,234,239,105,87,47,195,194,52,42,197,211,101,232,164,188,244,98,0,107,82,104,236,193,87,84,148,202,217,169,231,169,232,217,175,254,73,175,100,124,1,119,67,236,124,253,94,102,244,228,216,69,166,187,200,54,132,146,116,251,210,112,203,242,99,241,103,223,126,38,186,145,242,28,96,249,98,87,192,117,35,172,55,162,25,48,16,233,118,150,92,189,117,117,30,49,40,23,192,86,78,28,90,224,203,168,189,18,176,17,34,208,112,32,160,133,33,32,104,9,133,168,172,152,123,195,59,232,99,238,197,42,241,52,53,182,228,4,141,149,31,91,206,54,82,110,7,168,102,28,242,83,143,105,209,242,35,188,83,191,88,150,67,125,27,212,111,87,217,105,143,100,47,14,153,199,57,45,142,228,113,52,227,77,206,148,211,146,148,155,65,141,152,33,225,44,175,168,51,115,35,232,70,157,172,36,218,220,106,173,74,13,173,215,255,101,105,75,163,162,121,100,210,141,142,180,17,121,69,143,145,205,63,131,184,241,25,191,94,118,24,77,210,156,196,192,113,140,247,148,93,206,204,153,58,122,120,115,147,99,19,108,236,127,47,180,149,238,168,206,219,62,191,20,55,58,5,135,88,196,66,147,157,54,119,68,53,85,72,81,233,81,155,111,9,195,30,242,107,108,217,151,218,250,17,218,145,250,151,89,241,123,112,121,22,76,91,71,185,156,203,122,135,111,186,177,208,213,209,225,162,104,60,214,145,78,107,59,117,89,57,206,241,201,22,141,48,178,115,140,67,73,101,12,248,108,144,210,84,47,201,185,15,54,164,148,192,53,161,200,109,215,22,1,74,161,110,107,158,199,170,3,177,101,84,190,196,54,81,29,211,9,127,171,31,208,205,73,237,171,150,247,78,143,210,100,0,252,116,140,189,158,225,238,174,226,77,163,13,182,248,115,75,82,129,139,58,94,81,13,10,165,193,78,66,6,8,152,3,62,126,54,203,169,166,64,66,207,148,167,78,75,82,227,122,192,39,192,220,105,186,196,148,76,206,18,231,173,129,174,220,230,66,236,52,202,35,227,255,7,184,205,53,223,241,159,51,200,212,219,181,106,82,83,79,138,130,123,228,122,212,174,220,173,131,178,115,56,64,159,209,16,28,77,255,63,18,211,223,121,173,31,206,101,178,244,25,69,29,208,89,200,139,240,102,65,62,35,222,39,211,98,29,172,45,204,143,159,54,32,218,208,244,177,166,232,201,230,232,173,181,82,225,235,44,75,42,59,115,152,106,213,62,217,237,137,17,248,47,117,13,240,92,210,235,163,225,176,223,32,138,135,251,94,212,76,50,150,184,3,136,28,29,151,118,209,51,80,205,41,195,247,22,240,181,168,184,85,120,18,2,75,167,0,105,190,101,137,170,87,158,173,177,246,87,113,45,242,87,8,67,215,197,255,127,64,9,212,210,50,211,84,125,200,185,46,213,196,219,119,183,98,85,230,97,255,139,22,60,111,56,86,222,86,81,181,151,236,124,120,184,79,12,108,29,110,163,168,34,134,241,211,187,69,247,8,213,100,225,57,232,31,71,60,112,90,178,86,52,99,40,218,166,77,30,168,100,93,193,15,212,73,9,46,6,52,217,215,52,75,42,236,60,117,246,182,205,139,63,56,103,255,60,187,15,85,107,24,110,233,167,194,107,210,209,124,138,119,48,85,217,213,1,59,210,249,55,214,151,167,112,197,123,219,54,217,34,203,145,28,209,78,127,161,65,96,190,25,193,160,82,226,151,177,162,214,130,212,187,201,241,210,73,59,205,124,173,47,167,93,144,76,95,84,121,23,157,175,125,198,164,224,210,105,186,202,44,79,36,48,180,200,207,21,114,251,220,117,13,10,5,220,213,176,159,163,169,205,111,47,42,56,110,43,61,77,142,37,123,212,58,120,59,56,230,59,206,229,3,234,150,255,44,55,49,129,116,74,96,127,12,184,210,129,215,219,26,111,64,118,170,62,44,97,145,75,215,150,239,138,8,115,247,159,150,79,222,40,183,146,186,153,162,12,63,31,94,209,253,24,159,177,134,124,132,220,214,175,67,212,148,32,200,177,243,220,231,219,174,113,222,177,127,228,86,68,219,36,79,68,177,1,28,124,118,142,187,114,84,244,218,202,100,233,186,135,170,124,208,240,196,178,34,143,251,158,189,207,61,222,77,206,211,147,153,255,235,52,136,17,84,125,2,83,32,168,139,72,9,67,163,57,226,205,47,163,96,90,170,232,121,57,177,215,144,20,101,161,135,155,203,76,91,225,161,121,231,227,113,241,186,46,8,68,248,138,251,174,155,120,220,202,71,174,138,237,245,189,61,69,140,125,74,122,8,172,203,248,128,209,241,220,105,198,54,98,141,241,235,220,92,66,255,136,255,139,102,53,31,63,114,215,3,229,47,60,233,30,78,0,117,151,83,165,153,253,216,99,120,142,153,133,132,152,182,107,147,229,8,59,195,80,28,57,169,186,146,139,13,118,60,40,130,111,210,55,233,73,239,11,168,92,202,154,162,12,64,93,182,213,97,45,183,24,247,180,173,49,210,83,174,48,110,77,124,182,21,197,154,230,104,211,71,164,230,15,255,123,16,63,139,208,231,203,219,20,42,118,59,232,138,180,14,239,107,143,194,0,69,141,114,137,48,173,15,148,254,82,172,191,6,87,196,144,124,199,148,39,16,171,31,216,189,20,154,156,157,239,107,141,202,125,185,6,42,167,177,176,17,171,181,170,232,183,120,147,160,35,249,238,238,212,162,15,188,48,249,34,40,42,122,226,241,172,255,100,21,16,19,214,184,172,46,170,229,129,113,161,15,128,188,24,195,187,181,222,30,34,235,230,3,59,248,48,64,98,144,35,215,76,203,171,63,25,35,207,164,166,115,94,29,250,138,27,38,31,191,28,57,126,38,243,186,156,38,41,207,218,132,223,163,209,8,126,187,25,221,167,226,215,110,48,220,46,21,184,130,29,82,145,218,29,253,115,148,14,85,96,168,166,220,145,190,0,117,227,237,141,158,140,172,133,172,32,118,141,134,140,210,220,69,222,173,204,139,89,170,190,110,229,178,248,145,224,215,203,174,130,15,131,71,147,50,191,151,7,72,102,152,254,25,108,114,239,114,181,47,84,49,67,41,252,73,129,113,120,43,241,96,225,17,13,10,25,184,32,143,197,145,239,15,13,167,26,246,87,180,58,124,198,73,168,72,139,117,159,123,105,19,75,79,157,207,121,218,235,193,206,82,204,128,21,243,36,201,212,99,32,244,78,21,81,237,166,216,97,57,223,209,219,129,76,243,138,34,168,159,171,180,247,95,184,150,176,14,118,152,32,247,99,72,110,134,102,130,83,204,70,108,21,41,165,169,36,204,51,124,72,68,136,81,163,129,220,239,99,160,163,2,182,82,3,214,87,26,29,209,251,157,192,195,189,106,239,72,145,73,112,51,16,156,235,90,72,27,254,68,34,73,148,14,197,64,150,241,208,242,67,109,158,96,73,93,13,10,207,249,103,167,65,179,4,103,210,74,198,176,3,34,19,24,102,107,149,30,253,69,50,73,135,177,11,239,74,170,15,241,223,104,135,55,122,127,112,245,85,223,185,255,16,1,198,116,56,161,103,160,11,5,210,195,112,101,101,81,115,167,237,154,227,66,223,161,73,127,177,242,254,214,9,137,1,36,154,8,93,49,182,109,187,106,194,94,241,108,16,107,13,10,111,243,71,205,246,100,52,220,63,0,18,218,173,232,11,148,45,82,44,213,154,244,195,28,28,6,33,87,179,208,0,185,203,134,226,170,123,74,91,243,22,5,138,13,90,20,142,170,44,103,151,127,170,9,102,228,195,69,78,8,223,20,194,73,138,215,110,56,154,246,93,44,19,154,109,134,117,41,140,70,172,235,125,190,105,4,195,115,192,110,95,113,57,155,46,218,11,64,171,150,232,190,153,29,220,57,249,47,29,36,121,127,158,201,242,250,226,86,105,180,55,84,226,73,142,142,165,196,75,23,108,63,179,232,247,167,161,72,18,117,164,97,242,84,154,252,76,199,62,40,65,123,216,197,33,44,19,16,94,171,150,125,170,103,154,232,34,185,183,91,55,42,153,199,232,45,107,216,58,162,186,0,49,77,164,172,81,185,202,163,13,128,80,117,5,190,36,186,208,168,124,93,93,115,54,237,246,12,202,76,236,130,1,210,67,195,147,47,116,209,113,226,64,157,120,154,173,13,4,167,187,34,251,109,195,171,146,174,51,255,234,137,124,72,77,116,16,57,243,140,49,126,163,150,160,251,185,241,90,39,216,127,203,224,7,85,135,153,186,183,50,18,182,229,250,242,8,11,160,116,114,78,172,135,216,129,102,219,193,70,76,245,212,27,153,66,136,81,255,29,153,36,105,68,81,28,244,44,63,146,72,81,62,158,81,89,63,37,61,137,198,4,56,138,215,19,45,106,22,158,157,216,136,224,32,172,31,139,166,6,242,225,235,185,121,119,229,5,216,196,8,83,101,61,143,57,143,113,204,159,143,156,84,12,34,161,230,25,91,165,120,174,114,98,252,132,95,204,247,123,51,243,62,239,38,100,137,175,139,129,166,21,214,161,52,100,188,165,139,236,22,194,63,49,214,120,241,74,147,139,236,49,39,45,172,60,203,27,45,174,87,122,38,190,216,82,252,89,132,49,118,165,252,252,250,13,10,183,251,0,210,48,157,229,92,130,203,144,73,244,79,166,31,30,49,50,5,167,99,23,196,207,82,154,68,86,1,157,151,6,36,18,150,129,244,106,156,215,149,11,139,92,64,97,133,48,64,17,60,129,21,49,158,104,179,127,136,216,100,198,149,125,248,19,179,5,208,158,106,23,22,177,15,38,242,239,92,114,127,199,122,171,186,115,225,43,90,230,65,106,177,159,101,99,206,20,4,107,113,91,212,203,43,30,77,49,95,66,209,15,116,205,237,232,43,205,213,36,161,165,70,9,33,144,132,207,28,218,191,231,44,200,55,84,120,180,22,20,188,24,169,20,144,53,150,214,252,47,54,30,229,25,248,117,56,95,78,203,80,247,5,49,39,78,189,235,20,165,219,217,6,166,8,23,36,96,66,227,121,155,179,172,100,124,218,114,68,183,153,138,228,243,191,190,92,118,127,210,20,46,72,81,138,66,23,89,158,14,194,207,94,134,200,194,112,255,139,2,249,73,238,0,29,106,67,155,203,75,199,215,247,200,22,124,58,224,167,229,150,135,251,139,246,243,123,234,161,100,84,27,142,175,217,46,157,21,46,63,208,244,19,201,156,204,52,252,216,170,69,90,11,85,222,200,70,165,135,75,148,252,149,207,241,187,56,107,42,30,34,205,28,57,20,38,75,109,91,209,116,105,114,133,124,146,53,5,45,119,166,192,221,48,25,248,163,7,251,238,99,163,239,18,176,57,178,36,16,130,118,255,168,64,33,241,172,91,116,92,84,105,11,63,245,135,180,177,113,13,10,195,83,58,103,188,239,197,3,173,241,244,182,43,41,16,179,25,101,227,100,238,201,204,67,124,196,1,129,167,50,12,213,43,233,197,70,184,241,220,130,67,18,33,108,47,216,35,46,43,184,212,14,226,227,20,84,192,151,114,163,135,249,82,14,51,20,86,194,105,245,26,7,142,106,189,159,182,166,139,253,95,85,114,21,176,187,210,34,123,137,89,203,209,189,74,238,171,9,77,209,142,137,28,97,251,0,147,60,13,10,13,118,23,77,22,156,11,100,69,211,76,0,220,158,6,216,94,176,134,193,143,59,226,125,247,52,235,185,207,7,138,255,101,20,67,133,73,203,233,42,12,13,37,239,228,165,39,216,111,21,139,78,157,136,112,199,172,93,108,5,150,67,163,41,128,121,204,32,57,131,36,202,135,39,59,134,237,128,16,87,215,151,217,27,195,207,47,150,198,80,238,21,102,205,60,248,101,108,197,119,211,139,131,2,1,190,113,141,201,164,148,38,129,119,165,1,149,70,238,237,191,16,25,150,190,89,54,49,101,75,99,140,117,166,186,166,72,205,30,122,169,172,30,166,15,76,214,4,7,28,137,220,207,248,179,228,48,165,126,214,222,17,197,131,126,120,149,110,217,145,5,143,54,70,33,155,234,233,78,77,147,129,163,61,72,202,155,143,241,43,84,167,63,248,105,208,238,237,126,9,141,128,21,34,149,230,1,108,221,128,145,115,197,125,31,95,206,144,138,55,1,13,10,212,196,71,26,83,69,29,233,180,54,59,99,67,124,55,76,89,143,84,143,20,93,61,40,143,66,83,31,207,54,169,205,247,37,33,241,192,134,143,206,238,177,133,126,169,131,246,183,92,226,69,216,117,190,173,27,203,136,25,229,70,69,24,224,71,23,183,139,214,227,53,240,173,119,184,50,175,86,130,6,42,30,42,199,124,213,237,213,220,55,46,228,86,201,109,56,191,139,243,72,218,194,180,235,187,36,64,242,206,151,180,179,55,242,226,50,71,227,232,66,59,250,146,55,202,108,235,111,185,63,150,12,173,137,74,150,240,55,17,104,163,50,34,5,45,233,179,190,4,176,34,171,149,192,194,67,72,110,53,25,119,33,252,85,49,29,197,95,135,188,114,208,155,108,148,12,163,110,102,64,174,182,108,57,74,89,73,166,4,231,241,93,206,58,0,139,180,27,14,239,40,64,163,87,243,72,68,59,77,206,6,75,76,21,229,236,82,228,72,201,133,250,161,195,214,82,98,112,177,204,105,16,9,149,154,118,32,201,166,32,38,25,161,155,228,16,255,123,213,53,168,178,100,13,10,170,69,157,253,203,143,43,179,81,18,98,100,151,232,163,151,212,249,224,71,136,50,42,115,141,200,144,124,182,67,21,207,99,201,88,9,233,13,6,239,2,247,42,176,74,166,31,224,46,204,247,233,4,159,249,243,239,34,88,167,86,86,23,138,170,201,243,194,162,108,0,19,65,134,45,82,108,193,78,146,168,27,214,53,2,249,89,6,110,11,205,101,156,185,181,164,86,6,21,61,215,112,57,184,197,213,177,53,101,240,13,149,164,25,55,207,151,8,159,57,56,227,150,89,166,77,195,214,4,109,14,158,246,101,68,202,248,162,6,99,93,244,153,38,163,238,243,253,188,157,204,234,40,134,236,133,95,24,33,196,185,206,29,2,161,154,17,187,190,244,58,125,77,83,103,21,84,138,98,128,47,100,175,48,187,203,234,140,126,85,173,86,200,1,216,165,105,200,24,54,21,167,140,211,147,202,66,193,3,241,85,148,30,132,87,18,195,53,244,172,252,120,7,32,43,146,169,131,17,26,237,36,27,187,133,1,241,85,96,232,242,21,124,41,117,43,220,219,39,64,8,19,114,119,146,0,83,214,215,220,220,98,106,87,74,130,168,163,79,30,119,178,252,140,247,193,167,50,47,34,223,203,69,2,89,235,69,12,82,183,13,243,88,74,124,84,200,19,219,65,227,221,129,37,58,3,176,43,194,82,52,106,240,22,7,22,53,87,151,182,248,33,12,69,61,215,225,231,86,255,8,199,230,165,244,248,118,5,225,223,243,90,19,13,121,20,138,87,183,173,18,217,74,18,159,227,240,85,207,151,78,186,9,162,177,61,238,202,46,2,234,129,138,88,184,30,135,67,0,70,70,199,116,97,16,188,97,184,106,223,45,93,140,69,166,165,70,30,179,68,151,252,205,9,231,17,244,123,250,116,44,115,248,123,37,123,83,243,12,182,141,21,20,36,220,60,33,13,62,138,198,124,36,149,168,35,110,162,215,152,90,94,29,234,198,153,215,183,0,230,211,142,238,46,147,177,145,186,165,168,162,201,22,210,6,198,63,230,52,39,170,175,237,43,87,132,39,111,194,30,239,242,215,14,71,200,84,13,204,195,224,1,52,100,43,112,55,149,205,55,2,99,26,226,169,14,6,58,33,139,97,229,184,155,188,255,248,79,86,126,55,163,26,155,52,151,23,168,205,185,201,55,114,21,186,131,143,247,70,155,196,134,182,78,242,182,217,37,25,192,191,8,38,227,101,41,3,244,14,64,6,137,245,116,157,248,111,227,222,23,142,33,226,14,223,144,83,8,31,101,16,216,241,154,205,2,28,186,72,28,72,77,48,234,211,184,78,208,25,0,135,238,71,138,23,21,75,36,51,70,195,147,143,221,83,64,207,110,71,177,133,230,74,189,244,79,140,188,219,130,148,73,43,145,146,155,254,185,218,43,3,60,58,206,229,84,240,241,167,248,165,109,247,192,106,53,131,193,233,197,202,69,141,64,229,80,253,243,226,242,231,190,131,18,213,254,233,133,67,56,142,220,138,4,202,41,241,184,43,122,180,173,171,186,63,44,51,30,255,53,33,178,185,47,153,196,55,122,184,39,169,137,180,35,117,13,54,173,221,46,40,110,127,59,105,78,41,184,188,64,54,147,198,247,202,181,254,52,241,228,140,141,65,180,120,49,232,195,245,190,94,213,20,46,60,68,172,245,24,12,212,31,218,20,155,31,74,237,54,129,46,66,188,24,66,39,245,3,66,32,247,79,103,131,2,85,225,202,236,18,102,222,250,53,138,135,210,227,180,180,231,239,48,24,21,112,208,178,180,48,114,238,3,17,194,193,87,211,46,226,190,168,234,66,81,181,159,107,97,210,180,253,235,101,77,235,103,170,61,255,74,214,91,114,127,13,107,125,97,82,62,75,68,217,155,165,205,51,84,15,52,13,10,53,221,212,102,171,234,78,114,229,4,252,155,170,229,29,35,28,51,168,206,125,194,151,13,228,193,251,91,9,106,61,156,100,30,247,125,201,3,152,134,131,29,221,1,196,242,30,110,22,142,56,187,221,165,244,48,140,149,156,123,191,54,164,45,4,45,166,134,41,55,235,32,212,250,46,89,39,116,26,88,218,92,191,253,149,83,190,255,189,146,230,214,72,113,216,178,93,144,73,244,231,25,112,168,255,85,87,209,222,131,221,36,40,109,108,62,71,112,238,0,249,161,160,176,6,60,153,153,74,236,117,232,77,111,156,72,132,52,209,243,220,253,13,10,139,238,158,216,37,124,169,126,117,232,177,40,87,71,24,77,109,34,40,239,149,212,160,184,218,37,35,24,171,211,92,131,152,252,101,104,178,148,217,13,10,179,8,167,103,95,159,22,1,64,240,160,140,136,173,12,161,202,44,248,94,77,3,28,250,59,135,99,95,19,152,235,125,188,102,106,37,159,2,219,103,65,209,62,17,178,48,2,93,214,221,100,196,56,64,154,241,9,9,0,88,21,30,77,251,140,14,156,214,89,53,196,204,6,60,198,16,15,222,112,137,110,35,227,102,28,127,193,184,34,139,38,165,89,3,233,151,248,2,7,237,216,134,63,160,116,238,79,242,59,229,133,186,247,8,4,12,159,140,253,235,66,251,142,183,29,76,182,215,117,126,151,62,77,140,157,221,8,39,18,194,63,134,142,17,53,236,217,18,80,187,67,53,149,139,7,193,47,218,117,238,181,107,225,157,22,68,193,247,106,136,17,192,33,18,38,25,247,81,203,191,235,29,61,201,18,153,144,23,250,22,54,114,161,239,117,76,92,183,137,98,186,171,118,236,72,70,27,73,47,168,143,152,151,23,13,232,87,204,131,116,200,186,228,23,212,199,138,86,4,112,36,115,31,74,69,20,95,3,147,162,124,171,97,74,127,247,71,187,194,142,104,128,212,208,28,13,10,108,243,23,161,222,91,181,173,250,75,95,191,224,197,117,152,199,159,37,174,87,187,121,122,72,157,81,248,90,155,156,248,190,166,66,147,248,252,196,59,13,84,132,223,153,219,225,145,82,105,44,231,86,246,251,232,206,88,49,207,75,138,90,244,117,36,226,114,196,92,98,172,191,189,254,126,96,176,91,177,161,166,175,14,146,16,1,32,20,105,179,219,180,158,199,178,58,54,63,166,132,23,183,17,141,206,167,29,74,202,46,54,248,140,109,222,251,112,32,93,243,171,124,116,207,101,207,208,31,248,95,175,153,241,114,104,151,55,51,29,76,108,255,122,41,2,151,114,244,135,251,246,37,241,123,218,216,155,74,192,118,148,130,119,180,237,104,120,64,48,16,22,194,183,173,76,109,2,248,30,136,199,91,122,4,215,36,226,52,227,138,56,38,147,81,88,34,69,227,97,164,44,117,184,37,106,253,86,36,181,88,173,162,25,15,150,13,10,137,107,186,231,168,197,126,118,218,16,220,41,230,155,191,58,168,98,20,192,1,162,123,57,193,209,124,84,141,165,96,30,134,165,207,83,231,177,137,107,240,3,170,233,56,122,186,155,16,46,177,233,0,45,211,117,74,55,143,62,73,242,198,238,207,71,235,27,172,44,252,225,26,192,197,203,6,54,114,211,39,51,86,63,62,30,137,27,96,115,115,155,197,58,170,0,67,252,69,233,14,65,61,251,212,84,141,211,32,182,129,237,112,167,68,58,35,61,121,227,240,56,210,105,117,88,110,92,221,33,21,170,97,71,39,177,246,221,64,36,184,92,204,252,121,209,11,123,106,250,120,157,179,123,208,232,196,35,193,164,168,104,27,95,243,169,250,31,97,164,110,70,196,177,131,109,26,164,26,137,38,74,127,75,28,37,158,75,16,236,223,55,91,210,106,31,65,47,224,31,189,192,51,104,252,175,72,170,14,194,139,27,214,3,166,160,208,218,222,102,209,76,155,114,133,86,146,48,250,183,104,3,53,190,16,67,5,228,183,72,250,153,250,49,242,57,145,96,141,253,210,9,125,162,146,85,17,54,242,85,5,28,159,126,239,63,183,199,253,180,230,81,195,208,58,76,163,87,181,135,36,82,54,244,255,50,82,86,63,107,224,142,248,163,236,9,190,43,242,123,145,32,247,211,120,1,246,153,158,251,28,138,209,160,134,152,204,89,206,174,44,252,219,246,189,143,148,222,201,79,126,191,51,175,5,245,44,133,118,12,99,149,11,69,85,16,198,171,147,152,208,154,194,136,239,160,158,143,99,26,89,176,63,187,199,91,189,175,214,117,255,172,204,248,173,247,30,129,90,74,73,241,75,247,14,66,219,11,115,71,181,40,78,35,76,36,1,14,33,119,219,189,87,100,142,57,143,166,181,69,113,163,123,168,201,137,80,53,148,208,60,110,96,135,26,127,150,69,153,2,33,84,2,186,22,139,141,29,38,133,245,207,134,69,213,225,26,23,105,71,48,39,244,37,100,194,150,108,16,192,222,225,238,27,105,117,133,42,72,112,212,146,131,164,112,230,35,51,117,68,167,205,165,193,111,226,133,91,162,165,72,81,31,180,212,255,46,62,120,209,8,228,199,52,246,78,226,241,44,201,86,44,189,243,99,239,175,82,1,182,115,173,0,88,63,241,8,175,246,182,128,85,165,242,153,69,45,23,110,170,251,146,200,79,17,76,140,34,160,94,173,101,100,163,55,20,32,234,158,100,99,8,222,151,212,7,5,225,99,141,240,135,4,252,144,36,156,188,13,45,62,136,74,69,98,204,39,55,11,26,151,56,157,142,253,35,126,100,74,115,112,184,179,142,209,195,119,245,34,199,95,152,29,135,138,94,135,16,30,98,29,249,216,92,114,7,187,229,168,124,203,96,127,147,162,229,47,102,14,5,200,58,122,108,230,208,26,180,182,42,30,248,218,71,207,151,212,187,160,250,142,255,169,192,246,26,50,90,151,173,166,148,69,242,58,177,254,39,166,108,39,22,57,248,57,32,48,64,212,75,17,236,198,232,5,251,232,136,67,179,76,79,213,45,29,60,108,112,255,237,67,63,192,69,1,252,32,83,106,189,255,164,41,184,220,129,146,178,212,93,217,214,70,4,156,191,64,113,156,61,103,71,115,249,103,111,159,207,50,129,125,203,85,64,42,114,197,109,116,170,76,228,3,86,135,199,48,182,180,74,156,198,20,188,165,163,253,23,193,112,237,148,158,88,142,228,94,137,225,139,7,102,42,99,39,251,158,132,117,196,62,93,161,176,175,7,194,55,116,177,156,158,245,146,129,245,216,132,153,13,97,148,23,13,130,147,168,109,181,42,15,225,126,136,218,130,32,154,0,161,107,210,155,139,47,19,253,96,170,37,252,250,151,69,245,124,130,22,40,60,29,110,161,193,25,203,155,141,87,192,4,25,82,16,255,189,86,57,90,62,194,211,9,142,211,143,56,158,252,3,36,253,14,85,234,51,155,56,146,86,130,41,216,211,226,5,168,33,232,33,159,203,26,119,19,252,243,69,15,139,239,151,108,160,190,202,71,55,106,140,167,61,248,91,52,12,103,239,228,83,77,69,150,23,153,101,38,181,229,211,209,158,23,204,84,73,229,239,43,130,178,196,194,19,31,248,161,159,207,230,161,134,169,132,13,135,45,133,196,6,101,167,160,78,103,238,38,184,188,146,6,195,91,68,200,248,161,175,195,134,125,150,220,109,72,189,69,6,59,226,91,136,46,155,192,208,148,140,24,220,135,14,105,37,129,142,31,225,125,51,98,23,241,116,235,68,129,245,192,237,55,163,190,175,175,77,70,248,87,129,27,103,40,190,196,97,174,100,104,216,122,115,101,114,244,255,149,181,139,4,86,74,157,60,34,117,69,135,223,21,73,90,49,157,130,43,131,132,97,118,75,115,72,60,31,124,185,48,238,204,111,116,36,132,30,225,14,64,135,233,81,32,47,232,138,57,19,117,201,107,236,68,128,50,138,84,116,2,19,247,65,16,91,18,163,159,25,128,143,56,35,80,123,136,17,93,70,140,97,178,18,168,171,174,116,128,227,155,165,35,144,161,137,44,126,197,2,113,21,107,78,128,118,252,58,218,34,38,149,223,55,35,133,218,123,17,122,41,224,76,210,184,13,10,50,15,24,109,97,201,99,251,218,254,146,36,229,55,5,124,73,232,46,64,81,150,170,182,33,181,254,64,17,225,120,42,116,126,249,53,237,139,177,27,218,57,161,65,204,11,164,45,4,174,18,51,131,188,149,161,208,58,133,169,68,0,16,195,185,97,48,100,255,236,167,97,151,225,9,25,186,80,6,243,88,55,237,155,205,125,229,230,217,104,170,203,111,201,17,120,9,31,164,103,239,111,222,183,40,225,114,147,220,137,221,229,165,38,31,170,149,162,176,0,15,199,80,231,7,57,0,212,216,130,71,218,70,70,19,173,194,179,144,58,97,50,217,106,192,225,197,100,56,95,251,246,36,157,234,118,190,162,169,145,96,99,45,210,252,43,153,19,62,159,47,71,15,114,180,93,111,24,180,80,32,246,4,176,108,217,23,75,163,128,93,182,14,185,197,230,169,199,137,172,231,106,233,199,156,27,211,68,52,233,94,80,27,201,104,99,58,249,63,244,136,60,106,89,103,118,37,76,12,116,153,55,16,50,112,134,178,136,107,2,253,62,66,167,37,160,52,89,203,54,238,52,160,148,19,154,245,252,244,135,211,223,230,63,173,32,191,13,251,96,222,237,162,172,202,53,16,233,99,24,157,18,86,234,189,129,37,63,127,249,209,18,99,253,188,29,207,218,61,30,162,229,32,5,206,60,96,92,153,50,49,37,138,113,116,35,246,75,254,235,195,70,132,239,166,118,53,139,155,84,60,32,66,190,249,84,130,159,227,36,106,135,152,69,179,14,186,203,67,216,221,122,32,252,254,223,118,58,210,197,210,13,10,121,139,105,224,135,34,220,230,165,118,46,36,154,206,48,85,182,80,217,225,16,89,158,163,13,229,196,254,114,0,213,168,218,158,31,226,104,99,80,208,223,51,72,119,208,185,246,82,76,85,45,11,109,255,174,18,94,196,193,143,117,71,189,81,193,66,136,228,171,183,248,161,160,4,88,89,108,57,13,10,238,230,250,48,138,193,247,136,250,227,13,127,137,40,175,201,29,77,230,53,45,32,177,157,141,138,177,34,183,55,140,179,121,197,190,126,60,226,146,47,230,103,234,5,123,93,123,63,11,81,199,191,12,133,248,122,194,243,96,216,44,56,150,79,77,171,204,145,4,179,47,15,184,128,34,53,232,232,217,165,153,125,57,34,89,7,76,0,175,44,225,210,191,123,142,144,226,226,172,52,24,92,104,160,59,171,139,38,119,120,41,43,34,114,69,215,255,134,112,120,110,63,116,111,134,185,212,209,113,144,219,133,154,14,20,75,42,97,230,172,146,84,222,93,186,239,32,226,233,219,11,47,246,84,185,150,233,98,245,94,70,93,210,56,189,22,67,206,89,220,43,90,88,177,230,228,174,45,220,45,116,215,154,255,60,52,228,229,147,224,81,253,162,54,183,156,192,219,38,141,42,137,177,135,128,81,34,59,184,243,63,249,155,168,122,72,17,192,179,188,192,17,113,208,167,49,235,115,46,205,135,73,210,121,82,194,120,134,178,82,249,195,209,144,65,159,210,144,9,135,160,162,85,185,117,63,183,170,112,195,116,98,19,76,70,122,44,75,121,32,190,217,249,232,111,143,152,185,109,0,175,139,5,164,189,95,20,194,160,217,20,169,168,65,96,213,84,253,7,24,245,14,203,93,245,231,102,35,6,88,82,218,167,76,154,214,218,7,161,25,223,18,195,87,127,226,118,174,85,29,72,177,197,205,138,80,232,77,236,156,176,132,5,32,215,143,167,249,167,194,7,30,40,205,32,236,118,73,185,145,243,129,140,222,41,92,219,96,133,242,79,207,147,20,126,159,77,208,132,251,211,37,37,50,109,46,161,71,236,213,182,201,217,244,167,22,102,99,173,24,191,35,78,156,185,47,247,33,56,168,164,158,115,229,39,233,166,72,138,76,168,8,174,202,188,148,214,147,205,44,12,53,125,40,95,101,0,111,162,249,25,127,97,251,202,110,240,123,1,62,43,85,138,181,49,210,253,39,12,238,127,168,228,103,250,184,133,233,12,88,132,132,58,160,142,43,191,234,13,10,165,117,100,55,39,186,24,172,196,153,255,52,227,67,134,69,190,42,167,30,164,145,229,70,135,205,48,94,18,187,201,79,174,200,72,49,26,232,22,73,91,1,59,197,7,90,45,42,229,74,122,215,201,16,91,100,53,108,181,31,24,194,194,142,58,131,185,216,26,69,84,219,236,155,234,154,102,12,247,225,186,137,230,212,223,179,238,198,163,222,63,205,237,155,45,97,65,86,237,174,140,253,173,95,240,239,238,49,218,62,106,84,217,76,233,69,58,28,170,217,117,109,145,190,133,49,95,101,20,186,251,200,33,238,129,11,181,216,225,184,240,95,100,243,247,44,75,53,212,36,247,228,220,58,181,129,183,74,222,182,214,41,124,222,122,168,39,137,9,242,105,254,215,155,125,253,57,177,192,51,142,1,213,86,196,219,156,163,168,87,138,206,62,195,215,67,237,75,156,1,69,228,82,94,140,49,95,122,27,152,88,75,151,92,112,240,212,21,112,140,140,204,19,248,72,177,211,106,200,36,155,115,99,143,149,222,12,210,124,126,251,82,190,212,51,158,189,164,129,37,100,215,167,116,22,221,244,204,136,207,181,45,7,162,82,216,147,83,198,130,108,161,131,42,21,50,66,151,155,108,238,120,58,189,230,92,139,64,207,78,167,180,43,141,188,192,224,36,35,221,105,49,8,0,111,106,74,235,240,83,182,102,195,203,99,209,134,31,134,234,172,212,59,185,187,111,44,58,23,41,60,24,147,49,210,83,180,71,117,126,231,203,244,81,139,171,183,58,29,68,135,77,127,6,37,230,160,19,198,8,233,145,180,173,23,169,173,179,103,64,210,94,62,53,180,89,180,34,247,55,11,19,76,223,255,63,59,204,76,50,180,233,235,246,162,71,128,19,246,105,51,161,250,148,3,162,241,22,30,198,50,241,240,78,223,149,237,15,51,218,217,102,93,84,221,157,178,86,78,81,218,123,101,151,140,171,80,214,220,21,104,151,110,131,176,86,235,14,58,103,88,81,139,110,23,233,235,254,73,183,46,177,72,180,114,186,20,75,220,42,201,87,68,201,191,18,88,240,162,228,116,112,171,14,255,144,225,144,164,17,8,145,74,184,193,237,107,17,224,104,23,120,82,24,112,232,12,22,175,42,252,114,60,173,135,25,173,182,45,57,57,211,188,140,193,216,164,224,126,157,115,79,84,236,163,61,147,109,44,57,213,200,5,87,57,195,62,83,53,155,212,14,87,108,17,233,59,75,76,18,43,219,201,177,187,244,66,67,175,79,11,205,189,250,222,104,197,38,181,205,116,226,156,227,247,13,98,186,131,196,137,3,65,17,254,142,77,174,162,240,31,157,147,138,187,83,45,238,172,14,50,159,66,69,63,245,193,93,236,42,234,140,25,131,35,201,232,254,165,91,63,93,196,117,29,46,46,22,182,21,78,127,42,221,70,134,14,156,167,29,193,20,201,157,128,231,234,29,171,81,233,37,222,22,28,237,214,120,238,98,130,175,243,142,60,208,230,89,84,156,151,6,19,32,153,85,163,245,129,225,171,228,133,229,100,2,163,219,13,30,155,138,157,253,5,196,176,183,249,127,198,208,238,208,182,154,214,241,130,177,208,40,173,210,242,68,99,131,75,19,245,193,48,127,145,211,99,137,24,36,232,17,8,229,124,253,82,17,248,100,0,211,233,107,16,127,59,31,232,156,73,8,100,157,4,164,109,195,206,224,222,102,175,3,167,255,159,77,175,236,221,109,244,217,55,132,204,137,155,82,119,132,219,224,113,128,80,252,225,133,189,227,243,157,235,205,214,96,178,72,141,35,171,28,255,135,176,84,109,2,180,142,123,119,36,201,232,123,113,191,52,181,214,100,14,15,110,206,71,177,130,212,28,137,70,31,113,40,73,198,207,219,126,63,94,188,26,205,209,45,101,164,34,186,54,42,143,214,202,172,81,4,204,197,171,95,192,74,70,228,48,154,202,200,61,101,157,221,162,86,204,221,209,191,249,171,54,34,69,12,79,188,137,200,34,20,240,12,66,251,3,17,188,177,183,34,166,145,237,131,156,175,144,36,251,22,113,241,142,70,57,201,109,132,113,140,102,58,67,65,222,192,55,23,92,107,189,40,139,191,90,4,120,41,140,167,38,86,122,155,116,195,42,82,115,57,198,102,162,148,161,127,104,33,203,242,67,209,62,164,177,96,60,41,41,83,48,139,86,102,83,66,62,115,1,160,50,229,213,226,185,63,28,20,52,137,54,51,221,25,80,26,209,39,40,181,161,217,211,102,53,181,137,250,46,21,17,64,181,67,215,197,228,105,175,174,142,128,196,252,29,156,182,195,130,60,193,187,126,228,13,10,236,181,140,188,20,101,121,34,38,177,158,15,231,146,53,17,95,106,58,254,25,249,140,93,182,61,55,45,215,192,65,205,148,15,79,121,242,71,77,156,238,160,51,79,160,74,151,220,151,115,6,72,149,207,17,207,115,241,27,70,132,240,110,72,244,70,159,106,26,235,44,187,197,41,148,223,171,51,25,220,227,160,200,194,239,169,98,116,150,248,204,132,211,223,59,220,79,252,182,22,114,120,15,41,79,69,50,120,174,185,38,46,102,72,104,86,211,123,118,71,20,26,130,224,73,54,78,211,208,63,146,82,132,163,241,250,61,223,76,11,72,179,254,34,231,223,154,186,35,157,51,205,48,15,250,143,212,185,97,146,189,86,143,177,141,50,92,170,142,31,31,212,178,117,39,65,123,3,72,65,253,73,228,167,127,33,112,98,60,200,178,33,1,22,109,128,54,30,177,95,169,2,13,36,246,16,7,176,168,39,77,249,223,205,142,151,200,85,104,231,109,52,173,93,177,119,155,2,240,52,166,156,207,157,78,186,161,136,235,48,23,238,245,178,42,13,10,85,38,150,165,116,144,127,105,80,152,189,138,72,73,213,200,49,31,18,148,71,205,122,60,248,139,129,145,174,192,175,243,13,10,56,169,171,129,53,96,138,120,41,32,122,125,36,47,110,31,167,221,161,159,94,76,40,86,13,66,219,68,5,119,204,12,95,88,3,238,232,151,16,62,202,11,217,68,227,32,172,38,85,59,238,120,82,234,167,51,189,19,223,118,0,86,178,245,189,18,67,190,218,188,60,30,160,83,16,23,215,75,71,225,143,128,26,96,7,77,109,248,73,253,5,50,35,69,69,229,181,225,18,209,231,56,83,65,211,154,137,85,28,128,220,45,234,237,93,93,162,164,190,80,21,210,151,50,78,146,190,100,198,132,40,19,46,110,198,84,221,75,220,198,100,12,104,131,95,248,160,94,9,150,4,184,205,67,211,175,43,47,225,12,138,254,222,197,167,13,10,248,80,157,18,246,98,51,140,191,22,109,148,82,205,54,51,23,88,172,79,76,189,126,221,82,19,154,210,125,197,37,105,135,127,231,9,242,151,68,76,79,49,137,157,25,69,200,27,20,171,222,203,243,29,196,99,164,20,143,4,236,79,185,112,60,21,130,22,192,251,230,92,205,69,0,67,171,253,78,101,191,139,40,204,20,130,82,233,243,231,151,234,11,87,184,114,28,148,203,194,234,96,45,242,197,126,135,147,140,136,122,56,45,38,89,34,100,99,188,125,106,29,168,127,74,52,26,89,190,164,88,23,125,63,24,209,33,53,57,220,14,48,31,110,254,1,17,252,246,146,19,104,190,23,204,187,116,40,18,126,12,5,156,44,90,219,42,63,1,151,240,206,171,119,255,127,60,2,122,142,195,238,118,207,92,152,110,180,124,182,5,97,199,115,179,162,218,71,181,163,83,148,226,147,115,219,213,195,255,76,146,19,168,154,237,119,204,79,63,207,196,158,246,236,117,87,197,33,151,154,84,105,131,193,6,179,98,123,95,210,215,28,197,240,138,50,191,73,51,42,137,197,218,113,175,191,185,76,148,154,145,34,13,10,177,248,133,201,129,66,58,249,63,115,188,28,164,217,45,157,186,227,239,230,167,110,45,227,208,247,79,211,37,88,32,99,110,63,26,107,124,24,83,6,35,193,42,249,12,220,210,192,167,40,82,30,155,99,158,182,52,93,29,232,255,252,59,25,199,46,122,147,130,61,254,49,21,233,231,187,190,178,140,183,61,177,33,174,216,146,13,71,216,204,8,234,46,71,46,57,164,202,213,136,27,92,66,4,242,183,50,175,157,81,137,210,90,191,65,60,199,135,20,203,1,177,216,202,85,101,22,154,145,157,196,129,246,210,230,127,29,73,13,10,235,197,204,98,168,246,44,26,50,62,187,85,237,53,170,92,141,111,139,151,14,147,32,92,39,1,207,72,23,189,169,148,252,22,25,123,70,158,204,95,94,157,223,15,160,86,64,194,229,113,132,149,113,203,210,100,2,177,235,30,128,63,207,66,51,69,0,123,155,82,177,62,59,3,78,140,179,152,75,146,94,191,254,113,158,212,243,159,61,14,51,67,49,106,111,220,38,189,190,168,140,67,102,211,178,248,81,210,178,68,204,68,8,37,26,226,199,115,72,204,233,221,139,185,200,152,0,181,114,211,140,93,28,195,76,116,11,238,187,93,219,13,10,139,178,81,101,95,185,137,132,13,35,32,93,22,49,26,159,204,247,200,95,109,255,234,151,4,73,42,78,122,143,108,11,220,41,116,90,172,42,191,174,186,2,176,231,174,254,185,43,166,58,176,223,132,78,176,157,80,92,61,252,16,88,206,66,205,216,4,59,118,57,132,1,225,219,134,47,249,247,108,5,232,188,98,96,164,68,60,244,148,188,23,85,145,61,81,116,91,244,90,223,47,140,122,149,70,215,239,79,177,30,157,148,228,83,150,50,194,163,150,6,208,68,128,238,69,148,8,215,162,168,105,128,122,76,1,136,28,27,178,28,41,106,64,43,94,110,7,9,61,131,60,61,255,7,95,77,212,38,235,135,177,184,222,22,193,70,222,121,245,47,89,67,1,83,49,238,184,82,128,156,187,142,29,100,96,172,77,23,111,233,111,141,25,246,204,178,42,187,186,162,124,68,151,217,19,18,195,207,181,187,145,59,49,78,67,210,236,106,182,137,123,167,195,76,242,202,166,219,75,214,158,181,223,206,224,170,145,125,105,80,227,106,104,164,194,42,96,220,198,147,121,212,117,68,165,141,100,14,177,13,254,18,15,202,132,59,88,140,168,185,79,120,105,249,118,9,166,254,3,172,134,236,31,124,234,210,236,142,129,151,125,27,148,110,69,157,252,254,254,101,167,191,246,126,102,245,247,138,69,216,223,101,175,1,70,223,116,224,36,252,4,35,40,136,108,193,221,119,121,244,156,219,183,80,52,92,248,60,214,120,166,168,137,117,119,41,157,235,56,173,102,93,196,242,28,225,137,42,24,194,86,243,24,16,125,211,233,36,92,26,211,188,147,206,247,183,191,5,126,51,236,154,63,149,50,81,38,26,163,209,168,52,114,97,231,13,10,70,247,119,58,132,243,212,209,160,223,109,210,42,150,66,147,73,222,13,24,3,16,225,121,85,177,15,191,83,34,14,246,72,61,3,198,80,168,213,193,109,99,218,246,92,33,173,205,108,45,11,93,74,222,178,245,82,106,172,247,207,66,249,168,191,72,50,251,45,79,115,243,213,255,217,132,181,114,35,47,135,189,62,89,19,62,211,210,250,25,247,133,106,216,18,81,92,116,247,216,81,87,64,25,197,50,194,95,142,22,62,89,95,201,200,62,62,130,12,60,191,105,13,166,37,120,169,128,252,8,3,235,109,185,177,233,14,50,86,189,70,80,129,106,190,94,168,108,230,92,46,180,24,208,173,218,95,62,160,78,23,170,140,69,54,204,71,26,194,2,54,230,110,202,54,25,241,97,223,239,164,133,56,108,48,235,184,106,122,217,48,253,13,10,173,242,218,105,220,175,38,192,246,119,32,110,32,48,227,177,91,54,98,192,173,3,219,193,99,110,191,173,31,47,44,55,245,250,152,86,176,25,140,91,29,128,182,156,94,255,217,76,224,113,81,53,198,73,194,107,155,161,38,107,13,10,91,39,12,208,138,112,97,102,192,179,32,145,92,135,178,125,226,29,235,93,126,72,6,246,231,0,183,160,106,78,41,182,41,203,64,118,25,131,233,202,142,52,232,105,171,208,77,218,25,11,254,90,110,232,178,45,126,81,27,132,234,88,74,132,33,31,39,175,137,24,220,90,248,161,255,45,54,11,107,227,202,142,102,186,76,210,206,106,37,231,232,148,6,104,77,168,63,251,204,204,191,208,132,79,227,190,205,125,230,119,100,197,156,2,45,177,22,141,88,95,226,80,115,254,0,227,2,24,209,223,225,21,202,31,198,6,175,203,4,242,160,130,239,145,120,139,107,208,150,132,222,163,31,32,3,74,145,171,157,151,19,102,249,123,80,9,254,251,241,239,13,10,217,65,101,64,129,177,232,240,178,234,73,80,105,161,221,241,29,197,104,87,210,149,51,220,133,121,88,180,157,26,7,121,115,40,25,253,34,228,55,8,75,217,243,196,242,205,164,209,44,161,68,49,147,122,182,58,3,249,192,64,175,29,128,31,54,122,189,202,115,2,225,138,144,80,214,2,111,186,90,90,127,173,68,227,21,147,23,60,223,39,124,215,55,209,206,245,159,233,104,66,82,188,13,221,0,168,14,2,59,136,34,36,148,193,200,192,136,66,48,171,17,209,8,50,37,175,220,219,193,226,77,74,213,250,179,150,210,227,112,228,74,117,113,178,48,102,13,81,13,10,80,118,216,227,95,125,183,44,5,102,223,193,25,238,27,138,195,192,64,105,80,163,196,164,218,54,189,226,151,4,13,10,39,247,7,83,168,126,108,213,147,220,107,233,150,34,97,169,154,229,148,147,64,197,212,92,148,169,170,61,214,54,206,139,73,123,187,129,35,69,124,130,79,68,58,83,179,238,89,92,56,152,63,227,224,125,189,198,172,213,92,174,139,225,8,26,253,72,87,165,245,42,60,146,81,67,80,122,60,55,241,153,44,247,46,208,212,196,141,148,174,108,173,220,59,200,122,195,163,239,3,94,2,24,31,120,68,158,75,6,59,8,53,232,39,100,64,81,85,28,22,3,226,234,181,135,95,40,252,119,190,186,105,35,66,141,85,33,198,152,198,183,241,51,176,246,137,241,5,253,186,195,13,10,142,210,242,159,2,85,221,248,160,55,184,31,4,237,240,4,203,230,57,200,219,15,148,208,197,219,146,211,77,102,194,254,214,108,248,184,149,175,196,230,89,208,131,136,234,68,234,232,60,228,89,229,190,48,103,80,166,130,182,39,128,41,144,3,113,87,51,155,241,66,188,185,192,143,175,220,60,63,177,109,195,84,79,98,198,199,227,62,32,204,79,199,202,33,226,195,246,197,70,205,120,222,227,72,241,164,200,203,84,142,242,12,4,150,120,145,103,113,216,58,204,155,123,34,120,74,216,88,1,52,71,26,60,121,188,134,181,214,208,211,5,195,46,98,4,39,67,81,201,79,157,244,93,155,42,213,181,8,122,137,249,13,106,160,51,228,177,209,190,208,34,243,97,71,199,171,210,183,49,52,223,253,80,144,114,88,230,16,195,178,9,73,225,65,23,43,28,106,118,219,35,140,55,80,33,203,166,100,92,220,38,183,23,66,139,90,155,77,63,50,164,177,226,47,239,243,187,147,253,136,158,29,239,128,135,113,141,94,62,101,15,228,163,51,13,169,195,126,158,180,153,223,90,52,45,139,164,192,160,51,195,52,124,178,90,49,190,20,62,203,249,19,132,242,56,30,50,62,127,211,168,42,49,151,193,137,5,50,0,174,44,134,185,208,26,176,178,137,132,30,167,233,233,162,105,102,224,222,245,77,224,184,93,141,240,132,184,197,144,8,30,68,75,175,30,31,96,103,15,161,42,185,113,89,49,134,36,242,175,27,94,199,221,131,193,7,58,153,57,141,33,67,165,45,16,161,60,32,31,179,86,188,158,144,198,59,176,188,45,76,66,175,74,139,156,140,77,88,161,179,46,5,151,198,59,63,139,62,137,59,211,190,140,96,35,24,56,241,188,120,231,58,108,140,221,94,127,41,7,248,151,252,142,233,155,255,218,115,56,188,239,181,174,249,80,229,84,154,223,210,7,174,177,88,70,181,9,252,87,152,152,131,100,36,152,163,129,27,142,92,222,105,192,89,36,239,174,194,50,250,76,239,48,46,227,37,19,102,236,174,245,125,37,207,163,180,169,230,57,125,153,111,66,28,144,11,235,207,115,176,56,254,123,22,253,13,10,17,114,172,47,64,209,156,224,176,47,206,184,188,71,218,83,68,203,147,60,127,236,149,1,132,247,138,203,50,211,229,226,144,232,75,231,83,185,231,167,191,196,65,108,207,41,208,35,118,12,6,205,222,242,80,88,6,166,94,21,8,153,5,41,36,80,89,175,211,1,219,102,157,65,189,114,191,122,128,169,223,102,184,118,179,85,63,223,77,211,141,21,40,154,247,161,175,188,83,255,255,19,90,99,72,221,120,74,180,42,108,13,106,163,48,176,105,96,126,45,243,203,239,206,121,214,246,62,39,76,158,115,163,62,184,82,70,213,235,185,134,191,169,35,223,104,178,184,207,130,175,108,51,231,133,243,91,37,177,209,214,20,222,133,164,244,81,13,10,223,228,45,117,181,250,84,8,165,154,190,83,133,158,40,179,208,0,235,156,106,125,47,103,201,29,209,76,137,91,168,123,156,181,123,133,30,81,147,252,194,164,67,175,133,254,40,223,111,57,83,127,35,160,88,188,248,29,216,192,76,178,194,80,64,48,15,76,85,151,94,133,109,203,78,33,226,181,72,27,220,192,86,1,148,47,178,91,184,166,182,249,62,44,42,51,205,71,139,68,101,86,87,197,87,235,176,128,23,158,229,217,140,92,235,224,178,91,253,217,82,255,235,37,128,20,215,165,188,75,202,79,26,35,187,167,60,69,75,18,150,4,81,206,23,82,64,27,1,81,203,46,1,213,199,37,149,9,94,174,145,216,211,189,85,165,74,42,234,137,35,159,161,118,250,124,214,241,107,176,115,62,246,206,110,119,118,58,35,170,199,125,168,140,142,250,123,187,41,145,228,114,255,32,117,251,37,167,90,207,167,13,10,4,194,135,100,244,174,76,18,5,27,37,177,32,202,210,227,4,77,163,92,31,148,19,93,189,105,177,13,225,71,50,28,187,220,129,76,233,153,130,172,29,118,206,61,51,48,228,26,179,31,60,118,191,137,185,94,171,129,175,52,100,199,50,213,177,65,29,151,219,54,201,6,53,55,246,71,86,242,5,177,110,215,5,142,44,177,214,148,108,0,161,160,205,169,235,190,146,75,218,108,125,123,96,92,81,74,152,19,57,7,183,147,199,76,168,88,232,45,163,81,145,136,205,151,75,52,218,167,66,101,219,91,200,85,13,95,11,17,115,172,235,135,69,139,206,42,177,249,105,150,200,17,105,154,15,228,169,184,73,211,144,35,114,94,43,30,231,228,38,211,13,10,108,92,117,174,107,206,166,219,65,228,235,32,53,247,249,36,230,185,240,220,208,14,178,187,1,66,34,229,95,227,135,251,245,185,183,192,79,70,136,213,174,53,41,253,172,179,139,94,176,175,92,58,135,76,26,166,177,124,218,141,30,34,238,224,90,61,168,132,73,32,13,61,13,0,45,184,111,108,81,179,55,200,225,159,51,142,123,250,1,225,32,38,18,213,14,33,1,64,148,125,95,53,14,132,247,144,40,108,63,103,154,93,126,67,188,220,51,114,101,194,99,21,39,253,98,213,152,183,202,31,88,53,192,68,24,129,185,127,81,151,144,30,205,196,241,149,188,102,90,132,104,35,210,228,20,23,55,63,134,57,86,123,34,143,231,183,61,120,31,7,163,97,170,73,195,233,216,15,229,178,163,44,76,30,87,93,25,78,132,25,103,176,141,16,64,95,164,78,238,40,71,219,147,114,197,204,147,30,80,70,149,50,241,186,245,119,246,128,186,180,227,11,126,28,255,168,87,74,187,103,151,137,246,154,138,27,172,7,183,198,78,245,206,94,176,14,151,179,111,190,172,169,187,164,161,59,2,147,211,75,219,199,122,209,255,136,229,116,74,240,9,130,59,194,98,81,28,71,36,221,88,94,126,23,217,15,35,15,122,88,97,176,223,196,47,11,78,73,160,78,224,238,77,173,185,8,71,157,239,131,114,243,52,197,61,43,165,216,85,203,57,220,124,149,80,249,208,247,247,126,130,213,165,159,187,243,75,255,233,45,201,230,102,139,104,254,234,164,242,0,83,67,61,103,73,22,43,186,197,208,212,40,220,242,213,141,73,177,39,250,46,103,78,220,125,54,19,177,52,47,77,13,10,189,127,76,91,4,159,191,120,232,4,213,241,101,5,174,126,220,191,77,111,160,141,114,137,15,93,85,25,144,52,87,42,180,176,201,167,231,246,245,164,3,25,136,100,173,241,19,202,255,91,249,212,171,91,22,248,29,15,194,24,143,200,8,117,225,0,52,209,46,48,192,54,79,143,114,121,127,26,237,82,90,39,18,164,13,68,33,11,129,61,245,162,156,132,233,246,213,27,29,96,165,246,249,56,250,171,248,120,210,158,106,178,82,217,93,5,252,26,223,93,76,225,201,229,133,33,145,18,17,43,198,205,92,118,100,17,251,210,39,49,121,75,93,224,162,122,197,125,60,87,146,104,7,70,156,54,3,114,190,82,144,152,195,80,239,226,21,75,135,241,32,90,87,160,176,76,82,6,204,79,166,107,135,147,187,190,73,44,195,39,31,180,249,13,10,40,208,6,110,13,127,99,184,221,1,84,154,5,175,165,72,44,41,86,13,10,189,98,133,104,117,202,193,97,0,8,117,64,22,36,115,73,140,20,8,123,41,184,107,123,250,214,147,232,23,101,206,199,129,243,252,128,233,199,180,16,233,181,91,136,17,65,145,161,112,60,99,141,251,180,105,237,29,216,37,75,20,7,0,58,49,156,231,74,212,25,176,119,241,112,71,160,31,11,192,172,133,7,25,27,247,45,119,217,51,60,157,168,201,218,115,62,251,83,5,244,156,184,199,188,69,19,33,173,215,216,150,57,93,38,157,205,253,208,132,235,58,167,3,56,108,6,151,233,98,146,150,81,22,65,53,192,148,217,187,28,155,148,157,94,235,211,187,23,240,44,152,200,19,204,191,178,60,44,38,33,138,47,76,99,154,139,157,255,44,41,64,96,55,249,25,56,165,225,34,115,16,114,132,40,181,111,72,16,140,222,179,59,211,25,30,202,137,249,71,39,25,131,219,119,107,43,200,151,163,14,236,242,96,30,227,178,166,240,225,53,57,118,34,170,193,242,223,82,60,230,230,188,114,14,19,203,83,12,239,74,185,200,39,59,211,216,21,99,172,138,142,108,68,161,149,17,45,175,130,75,199,167,47,205,196,225,41,164,128,113,123,235,1,8,93,238,101,238,67,68,208,180,30,192,188,223,132,37,102,177,217,245,53,59,31,106,6,63,250,108,219,6,239,99,76,139,213,167,166,63,153,29,23,143,86,234,202,101,61,214,118,133,206,73,233,140,117,84,116,90,74,197,51,33,118,98,210,62,29,105,55,19,93,19,188,34,8,235,141,80,86,13,10,43,170,195,25,223,174,71,139,107,164,202,94,218,32,34,47,14,155,219,8,6,50,14,209,102,91,84,163,71,222,12,66,233,247,120,66,222,77,24,142,126,130,78,178,240,215,173,22,63,5,72,13,10,127,169,156,90,96,59,188,93,188,132,55,116,202,102,232,137,185,69,5,76,14,208,177,164,187,20,50,78,249,1,176,35,194,8,203,149,223,206,146,132,137,120,150,144,204,69,186,185,123,228,73,248,226,245,170,146,118,192,87,19,3,233,120,140,70,231,247,137,85,91,252,220,63,169,237,141,168,173,155,164,139,58,224,148,4,102,67,145,230,58,152,158,241,226,75,180,100,4,58,160,153,228,242,215,150,227,82,235,39,113,6,216,216,27,175,47,133,98,239,70,188,253,30,0,71,232,1,140,189,151,48,33,220,28,29,130,26,240,63,8,63,11,8,138,98,235,207,43,246,197,176,252,250,68,26,173,22,37,253,184,52,249,67,221,71,165,164,46,179,233,165,180,150,65,247,151,194,136,183,153,166,72,151,241,52,96,112,70,27,109,83,94,12,78,208,153,25,156,56,122,49,118,174,220,125,167,231,217,225,24,229,85,101,9,42,54,247,199,74,191,40,23,32,192,20,127,78,79,55,212,148,54,70,108,97,255,18,118,78,48,67,216,166,208,39,231,5,55,22,79,14,121,66,244,172,164,43,178,203,19,97,119,239,113,151,231,111,73,171,64,63,116,28,14,249,2,254,188,71,26,214,198,39,66,67,32,168,195,161,240,76,49,12,81,27,63,145,195,147,125,154,207,69,153,153,193,138,51,242,200,82,236,56,202,128,101,153,199,40,197,67,113,64,24,198,94,44,95,67,15,98,112,175,82,173,113,237,56,129,59,96,68,7,121,69,95,149,41,164,161,98,60,185,245,66,43,146,22,249,205,186,145,59,154,28,217,93,162,37,226,84,232,16,18,22,8,80,32,102,5,9,208,58,3,75,93,126,50,227,219,94,89,98,169,162,119,17,212,195,226,156,216,64,87,247,208,215,232,0,9,71,175,232,150,248,82,50,83,57,29,46,17,255,254,82,51,102,176,92,83,45,86,41,169,7,65,234,179,212,167,49,211,246,212,240,63,249,50,51,221,248,139,177,145,58,186,34,235,154,166,49,30,49,68,56,29,174,41,188,200,99,153,88,238,229,154,204,250,6,243,93,204,198,62,6,9,245,66,243,238,93,251,28,247,24,202,63,50,132,85,114,111,143,101,226,58,205,151,14,64,73,34,89,152,55,27,99,227,90,233,141,197,77,131,41,184,219,9,1,250,166,49,41,237,226,27,21,135,118,152,29,77,9,64,19,192,150,233,205,2,3,21,209,35,192,61,235,162,30,151,228,181,132,180,188,13,10,242,95,93,206,83,194,220,15,62,97,249,155,236,171,64,121,148,120,190,127,90,253,127,104,226,62,245,13,10,214,100,92,150,126,225,18,6,182,231,145,118,148,40,172,220,55,13,100,228,242,179,151,46,14,79,68,34,151,25,147,80,102,61,110,119,47,198,119,122,155,157,226,21,39,61,8,44,206,78,134,120,254,153,72,220,141,91,14,69,156,208,47,22,69,172,86,32,243,87,26,64,180,213,161,125,245,207,244,139,108,132,61,222,171,94,191,88,254,19,215,218,8,232,170,121,2,17,146,72,179,177,81,218,88,49,1,207,128,133,59,1,80,254,5,189,237,191,181,13,10,127,176,246,87,40,201,59,157,244,140,232,175,29,241,250,194,92,29,88,225,173,48,39,74,0,235,84,207,47,22,2,158,26,192,160,145,156,6,85,71,75,154,105,54,174,224,251,116,189,24,95,231,215,11,184,71,134,153,125,52,164,3,38,167,67,86,164,175,174,230,123,107,38,209,193,167,188,255,134,151,181,92,129,108,205,119,49,44,51,42,85,49,93,197,79,155,192,160,241,37,0,224,167,107,57,54,41,42,61,162,221,245,170,140,187,155,93,195,46,218,204,72,39,214,132,210,116,230,91,139,118,251,44,43,25,247,213,96,117,35,250,149,62,52,187,57,3,44,5,177,193,36,67,4,96,108,85,102,13,60,168,96,126,118,78,165,176,61,183,252,171,92,247,120,140,110,96,236,140,68,155,202,253,144,188,171,164,19,43,108,188,207,241,103,132,251,89,179,107,119,207,13,10,158,165,114,228,202,13,10,1,199,37,166,207,46,69,0,205,223,91,172,203,144,148,212,137,37,67,79,4,65,24,207,220,38,150,175,95,192,202,179,136,65,7,237,23,185,189,224,192,16,75,18,146,161,248,201,155,6,252,74,99,96,178,68,128,189,89,223,4,136,100,24,153,176,244,43,19,17,181,130,113,123,167,236,254,225,65,67,101,75,83,113,200,185,178,216,6,133,173,56,216,151,173,30,100,135,92,40,199,2,13,10,132,251,179,163,187,238,22,97,125,203,155,200,34,183,197,156,90,24,192,207,126,128,22,58,223,183,170,3,183,205,232,73,124,22,151,217,15,46,217,15,129,48,149,197,185,22,87,252,41,78,240,227,65,219,51,146,237,134,12,178,224,170,9,41,61,15,153,174,158,181,76,118,28,162,219,30,81,225,206,174,171,39,108,123,217,22,198,133,16,215,45,154,103,70,139,9,179,195,154,120,21,98,143,177,38,205,253,94,255,89,204,129,132,192,211,90,91,89,96,248,36,189,23,84,149,221,62,177,42,78,150,0,140,177,59,140,87,69,48,62,102,207,134,8,255,39,196,112,156,29,133,78,183,150,8,229,47,6,143,236,1,81,167,76,18,94,222,174,165,85,193,152,252,8,2,123,187,184,2,131,94,29,67,80,119,174,75,28,205,191,114,35,84,246,197,114,190,177,55,109,62,52,33,149,250,128,172,151,34,235,47,70,228,77,224,95,90,34,123,115,27,141,74,75,110,222,240,74,242,197,222,194,238,248,255,72,197,177,135,16,173,227,219,250,12,149,101,5,182,218,156,203,124,187,131,77,182,204,117,73,72,133,93,131,54,112,255,13,10,196,42,71,115,254,168,50,43,236,238,4,202,116,172,45,102,133,81,50,209,26,81,82,68,136,197,71,113,181,183,165,18,121,109,125,122,224,249,193,251,201,203,219,160,131,16,116,244,210,0,52,157,12,164,5,55,185,36,150,105,39,102,240,32,172,67,172,1,219,139,42,162,239,169,210,23,50,190,58,49,95,108,170,64,43,178,230,29,64,221,235,222,17,39,109,144,194,198,1,169,53,193,104,190,96,4,100,118,173,237,21,8,125,84,161,76,104,238,203,187,181,144,146,124,30,16,210,145,201,40,83,52,203,12,128,237,189,57,43,222,77,83,94,182,31,142,118,65,245,138,193,223,91,28,90,93,145,227,226,126,5,202,247,236,151,236,240,200,91,100,37,25,122,168,86,82,30,215,1,229,174,184,42,127,82,168,189,125,201,125,91,63,181,201,154,93,248,77,27,175,248,144,114,146,37,9,215,107,198,237,177,92,229,249,235,143,65,84,190,225,232,32,32,36,2,131,189,200,58,142,73,170,154,38,73,183,149,93,92,5,143,40,24,166,59,208,191,231,234,206,212,164,144,99,196,137,166,38,39,122,225,36,111,114,28,153,38,226,162,182,195,16,69,251,205,35,95,60,197,139,196,221,108,87,254,153,142,189,30,159,165,21,70,82,190,58,22,133,188,210,239,170,7,154,50,147,247,129,66,166,71,56,34,250,182,39,146,126,172,205,97,179,233,156,48,119,16,61,45,25,56,43,199,238,21,186,208,253,228,137,96,45,5,90,1,219,188,249,26,86,105,116,85,157,27,71,124,32,148,22,136,112,83,22,156,63,143,89,149,91,228,222,130,182,5,88,204,154,225,86,2,169,63,2,159,107,67,41,224,230,42,3,152,45,179,47,82,41,113,78,250,20,145,167,178,74,239,225,143,235,194,201,61,254,80,179,246,65,181,27,221,51,218,56,135,27,245,36,60,23,80,45,0,174,162,217,233,115,78,128,169,103,136,212,207,91,193,42,66,188,56,97,98,252,136,167,67,94,225,50,0,193,194,198,204,197,210,26,3,148,16,7,180,196,41,27,219,113,20,70,206,175,39,20,129,4,187,36,3,87,213,237,160,234,90,92,226,125,74,131,144,157,117,191,192,93,117,241,13,10,167,74,109,227,125,125,225,92,29,218,58,195,4,93,166,205,72,50,61,144,78,113,107,68,94,94,9,111,203,55,147,83,237,112,207,75,111,172,16,44,118,39,17,7,158,250,241,63,183,76,155,71,175,117,243,246,189,162,164,100,125,42,180,126,202,182,77,166,204,1,71,159,97,142,141,45,13,10,54,69,68,94,135,68,104,60,187,197,96,212,124,152,7,139,132,32,110,144,235,131,155,2,211,124,133,43,142,40,68,99,212,228,216,144,32,60,61,91,32,53,33,16,3,78,173,107,215,244,20,86,184,7,225,219,22,49,169,212,153,229,46,157,152,83,216,103,40,177,162,229,17,244,15,140,161,228,114,74,13,23,236,214,64,181,47,246,198,110,40,105,61,137,118,95,195,145,97,46,88,137,231,116,35,236,133,203,208,160,56,182,186,152,182,7,112,29,192,196,182,107,59,40,199,121,13,10,31,30,184,208,81,220,152,39,109,217,207,239,171,63,101,193,201,40,228,138,6,12,153,43,57,42,67,229,110,170,109,237,137,109,235,206,113,248,36,91,228,104,127,47,27,143,192,244,62,206,141,176,189,13,10,176,129,28,92,231,60,190,51,96,35,160,214,97,104,179,74,149,180,176,167,80,179,191,29,25,126,60,4,44,121,20,250,115,29,120,49,175,121,142,148,41,87,28,187,151,126,98,88,36,78,132,112,30,95,249,29,96,143,152,252,61,104,164,238,91,129,213,255,56,182,193,132,246,17,139,135,95,2,43,76,226,7,220,123,55,225,69,45,253,197,145,163,229,6,174,130,199,231,191,240,1,27,13,10,61,189,97,106,153,63,191,135,143,176,59,108,159,32,85,162,176,149,210,147,97,248,37,60,38,35,101,54,135,254,13,10,185,128,120,246,174,229,252,44,43,222,4,5,234,190,219,58,51,235,127,4,203,104,55,23,98,69,241,144,198,187,188,214,69,34,177,47,231,249,205,207,32,26,26,168,161,154,123,188,74,192,100,180,149,143,68,170,15,141,218,35,131,90,210,138,31,208,234,16,93,226,243,149,56,93,204,251,226,38,29,197,168,154,35,175,96,106,57,133,229,3,135,6,177,254,9,16,64,14,22,191,0,143,37,15,59,222,58,216,6,199,53,73,93,73,159,22,249,146,117,1,4,120,253,33,39,191,124,237,214,181,189,80,95,190,155,208,6,91,74,112,144,201,210,124,213,179,108,58,211,62,27,49,235,109,68,227,117,0,59,81,185,9,218,80,189,24,33,132,24,179,205,34,180,50,120,177,68,190,120,64,110,175,22,199,223,107,108,28,98,56,0,74,171,115,115,107,56,225,104,68,29,193,111,154,92,246,7,147,161,134,51,188,67,215,134,116,209,45,56,204,151,159,124,170,218,110,254,128,124,234,73,156,185,254,97,100,150,104,42,102,224,75,189,172,225,220,17,43,33,86,185,176,178,13,10,88,168,203,67,255,14,237,185,152,5,35,75,154,87,137,118,42,199,214,95,90,49,156,51,244,247,67,140,209,94,6,187,128,167,169,126,151,110,140,236,35,244,198,70,165,130,24,128,168,43,47,29,194,119,103,240,144,153,126,145,72,139,250,21,6,75,112,47,134,79,206,101,5,214,206,248,125,42,13,10,18,181,91,161,137,175,38,152,17,227,184,184,80,200,64,31,57,6,192,128,211,38,24,217,105,138,118,103,50,164,13,10,159,197,169,78,91,221,163,208,40,216,35,214,182,3,182,209,125,208,70,222,24,31,217,137,234,15,128,180,202,98,247,151,62,77,245,224,50,163,31,230,188,143,92,218,103,141,74,114,120,126,184,37,62,165,136,44,51,124,223,154,163,225,231,217,83,109,208,155,4,124,216,150,46,119,63,114,246,65,138,58,239,90,40,155,52,6,193,82,165,12,231,189,75,73,63,255,194,127,106,165,47,121,234,103,227,98,253,146,85,154,164,249,74,47,120,127,108,115,93,250,220,242,240,138,175,152,184,12,83,202,86,7,169,79,37,240,74,166,90,112,167,89,55,132,14,115,5,91,61,101,251,5,76,99,226,228,142,104,72,140,147,21,161,62,233,73,224,62,70,114,60,17,204,117,157,34,44,191,173,46,26,135,202,215,121,178,61,56,247,226,246,96,222,19,136,234,241,207,77,24,153,77,117,198,204,99,241,135,253,185,73,148,12,24,181,55,160,175,177,42,197,246,123,2,131,202,94,254,46,118,76,67,105,16,75,157,59,6,73,13,18,68,196,29,96,133,200,95,17,6,8,46,201,219,132,88,98,48,81,28,5,200,36,18,210,205,243,218,251,244,117,154,119,86,40,135,143,153,116,21,41,107,196,22,172,131,82,166,198,152,134,145,252,184,49,207,149,193,11,174,105,26,219,59,162,145,139,53,146,75,213,195,172,173,139,19,115,151,177,13,10,248,43,71,152,0,254,22,212,114,205,12,219,218,171,79,136,42,6,73,207,86,16,4,184,203,124,163,46,193,41,208,164,21,190,108,185,29,162,182,95,68,232,13,19,136,8,161,39,232,81,167,252,249,39,233,157,170,14,162,214,38,183,122,22,199,46,55,240,88,163,184,130,252,73,85,220,140,182,49,36,52,189,59,206,215,87,128,177,53,144,191,79,232,214,74,207,3,113,249,251,29,54,27,5,2,88,82,170,185,237,161,160,201,151,207,165,128,82,196,84,253,69,30,108,31,25,79,77,54,49,20,227,18,246,220,53,187,175,53,122,50,205,32,13,10,61,217,101,65,85,19,66,89,136,125,103,122,204,68,248,154,164,1,202,39,40,45,247,220,63,47,4,161,8,203,239,37,88,220,206,40,186,194,216,123,141,91,113,129,234,146,127,97,151,119,100,248,130,98,109,74,179,56,217,92,148,119,197,78,156,54,1,42,60,255,190,25,158,200,18,13,10,153,210,215,13,10,33,249,217,160,53,78,78,172,121,71,153,14,138,110,6,1,121,106,175,111,20,231,88,202,188,171,223,189,130,4,168,231,72,163,229,254,186,87,13,54,226,191,71,76,0,131,34,154,99,249,97,20,24,35,33,178,235,225,188,118,221,25,55,36,196,88,140,29,57,209,132,195,50,250,234,244,198,41,242,179,178,244,153,150,228,106,166,201,244,151,66,139,234,82,213,136,118,176,220,7,180,96,36,139,200,92,193,103,115,165,218,195,108,222,139,21,45,150,5,127,78,250,175,139,29,193,0,34,3,133,119,54,128,87,105,155,58,55,23,138,159,31,108,108,198,11,174,130,11,122,221,7,23,145,27,210,58,109,205,173,175,163,36,115,73,26,168,12,254,144,242,167,126,36,206,40,38,255,119,177,139,134,156,51,250,41,47,224,29,100,119,118,80,68,199,209,74,84,139,40,177,54,1,37,198,147,63,5,197,139,8,137,57,5,55,205,209,111,142,150,126,11,56,87,148,73,223,193,224,115,137,183,6,154,168,89,76,81,3,70,93,80,65,204,146,146,104,222,134,63,173,182,146,91,53,13,10,169,74,39,212,33,251,127,204,129,198,179,95,144,111,18,36,107,122,81,64,81,26,151,33,27,169,189,104,49,165,8,233,99,254,139,233,97,51,47,85,120,8,72,143,6,234,215,94,134,214,13,227,250,36,37,174,132,57,236,185,17,43,195,228,215,55,71,193,200,232,122,100,153,25,130,112,73,131,45,176,191,109,168,200,92,154,37,146,172,0,40,9,7,9,0,236,173,82,165,111,27,253,69,106,254,6,101,9,105,78,172,7,87,136,69,107,11,11,221,124,25,45,50,30,159,182,170,220,174,240,15,87,15,34,205,74,83,34,251,206,143,169,143,174,182,129,148,8,149,66,98,112,187,67,25,193,29,166,125,136,85,42,115,115,57,138,236,93,167,201,202,169,243,179,69,129,198,233,104,218,170,178,117,28,192,18,25,157,216,151,180,72,152,108,255,186,228,212,18,191,158,203,244,103,66,113,90,149,105,147,37,22,37,157,59,58,84,49,205,112,40,228,47,199,81,196,52,226,183,20,199,24,32,43,240,44,175,155,138,32,117,222,146,35,34,234,124,250,96,92,131,118,250,149,139,143,190,67,3,30,16,38,251,230,18,106,55,117,246,67,234,103,235,189,151,242,57,251,60,67,85,38,117,205,8,177,156,165,235,245,59,64,215,40,85,107,68,129,199,247,62,199,28,171,15,137,227,77,96,198,155,39,47,173,194,46,142,123,220,98,16,219,9,253,217,19,226,9,244,159,210,142,135,18,184,80,137,4,98,2,80,116,108,163,178,27,2,110,218,230,13,10,40,34,245,158,145,46,98,107,147,224,210,191,179,35,13,253,14,84,233,26,29,186,37,166,9,182,77,65,171,216,151,165,210,23,100,195,81,232,95,158,135,190,171,158,100,81,73,173,50,174,235,179,177,22,16,50,199,1,100,113,21,249,140,28,42,174,206,135,24,98,217,29,50,26,185,15,62,146,59,31,222,224,13,146,127,137,122,169,129,35,115,101,54,226,224,112,15,16,5,61,126,108,88,155,246,96,41,215,148,136,62,174,76,130,40,148,28,233,101,101,181,13,72,136,123,83,20,162,229,83,121,89,99,130,34,166,202,84,199,124,186,189,70,13,172,17,176,99,81,154,228,245,13,147,222,65,118,59,167,207,191,76,119,36,54,14,117,4,120,235,98,137,33,218,160,101,133,131,65,149,142,79,62,181,150,108,109,215,124,5,238,236,223,75,95,108,241,154,181,7,88,155,66,25,55,121,89,189,37,142,201,33,195,79,225,219,0,63,125,15,234,62,47,214,245,221,176,162,214,44,165,162,205,60,122,180,87,223,242,80,148,239,224,74,158,27,156,231,174,63,48,2,107,28,176,57,34,141,48,154,34,137,159,110,155,155,255,146,46,17,113,35,52,121,103,215,198,44,103,14,44,116,87,156,53,152,153,37,96,48,34,193,123,29,206,55,128,49,171,201,180,180,55,199,182,230,70,32,147,46,147,24,151,84,192,29,75,40,11,139,8,105,155,44,169,83,174,72,35,187,158,227,65,51,197,201,91,50,144,225,191,1,7,5,173,133,44,114,190,135,41,30,16,52,176,159,68,169,91,106,47,131,254,232,132,29,207,102,23,112,175,68,208,172,127,156,219,40,9,57,252,93,149,61,82,94,11,65,183,190,24,141,92,121,70,135,51,12,215,112,210,77,156,213,59,137,90,37,48,4,225,138,49,190,78,130,179,132,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen022023l=44600; +} +#endif //_PDF_READER_RESOURCE_FONT_n022023l_H diff --git a/PdfReader/Resources/Fontn022024l.h b/PdfReader/Resources/Fontn022024l.h new file mode 100644 index 0000000000..2c6414f6da --- /dev/null +++ b/PdfReader/Resources/Fontn022024l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_n022024l_H +#define _PDF_READER_RESOURCE_FONT_n022024l_H +namespace PdfReader +{ +static const unsigned char c_arrn022024l[]={128,1,103,6,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,78,105,109,98,117,115,77,111,110,76,45,66,111,108,100,79,98,108,105,32,49,46,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,87,101,100,32,68,101,99,32,50,50,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,49,46,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,40,85,82,87,41,43,43,44,67,111,112,121,114,105,103,104,116,32,49,57,57,57,32,98,121,32,40,85,82,87,41,43,43,32,68,101,115,105,103,110,32,38,32,68,101,118,101,108,111,112,109,101,110,116,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,32,66,111,108,100,32,79,98,108,105,113,117,101,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,78,105,109,98,117,115,32,77,111,110,111,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,66,111,108,100,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,45,49,50,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,49,48,48,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,53,48,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,78,105,109,98,117,115,77,111,110,76,45,66,111,108,100,79,98,108,105,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,54,49,32,45,50,55,56,32,56,52,48,32,56,55,49,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,83,116,97,110,100,97,114,100,69,110,99,111,100,105,110,103,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,48,57,52,56,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,184,192,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,18,62,106,47,157,191,159,63,52,160,133,244,47,230,58,205,147,28,216,70,181,125,48,219,226,214,180,180,43,167,179,132,18,4,207,24,90,174,234,121,123,13,22,223,29,96,6,11,235,232,63,189,212,147,26,241,130,123,68,155,239,46,171,136,121,235,239,229,89,1,32,239,251,143,120,59,224,14,96,47,167,110,83,238,78,32,233,165,81,137,190,228,14,203,132,45,56,56,220,197,79,191,116,35,34,154,214,139,152,224,51,129,59,26,62,70,15,74,155,174,161,135,96,208,93,133,152,75,11,62,22,31,19,13,146,171,144,161,244,116,22,179,242,29,119,151,210,132,66,43,191,63,24,91,255,43,45,225,38,4,109,9,11,228,79,154,93,142,108,128,13,239,211,165,57,68,255,241,117,102,170,182,156,143,94,88,205,126,38,193,5,187,44,168,172,7,182,255,16,67,117,169,142,35,228,239,95,55,3,17,238,170,25,84,22,156,222,193,168,35,181,31,29,169,62,80,166,192,50,99,15,14,210,240,16,152,36,247,174,182,179,133,14,201,209,194,169,190,231,219,216,199,135,247,138,148,2,249,108,127,215,86,249,198,49,81,202,15,116,43,138,30,229,13,18,126,168,96,92,28,31,225,148,131,50,24,233,30,6,38,28,191,21,78,124,228,206,203,185,65,215,101,159,109,164,189,153,141,249,253,24,78,111,108,176,88,60,139,161,138,125,38,201,232,205,167,247,151,132,240,83,36,54,132,105,55,0,164,130,168,242,24,44,145,66,17,79,37,83,60,191,155,162,180,61,131,58,160,252,29,122,149,238,134,205,177,153,33,180,226,123,72,126,46,53,60,139,148,43,253,205,6,151,75,129,21,250,32,41,31,37,113,250,99,85,81,16,185,253,142,225,188,148,103,235,220,212,20,91,55,44,202,215,233,249,52,96,68,159,36,51,26,96,48,41,76,23,43,201,24,177,38,98,113,232,195,158,82,133,13,131,210,167,141,143,210,99,109,62,185,39,114,117,241,68,152,36,95,223,38,45,84,171,34,201,25,135,109,58,180,7,240,127,236,142,35,210,138,203,45,61,65,55,87,237,79,186,242,208,61,186,174,231,3,69,246,38,114,162,56,88,154,3,178,139,3,163,161,171,107,59,151,13,40,210,247,71,250,203,7,190,247,232,203,192,168,71,137,143,0,230,162,115,32,207,81,219,46,20,57,53,241,110,44,109,169,209,235,84,129,246,231,88,82,195,188,124,189,187,222,181,178,122,41,158,26,64,3,176,137,101,106,150,222,38,251,84,211,253,228,11,141,214,77,1,227,48,218,41,72,107,117,40,144,162,224,128,47,200,113,202,134,203,142,180,3,122,114,254,115,80,232,168,123,220,174,175,24,35,51,166,187,146,155,125,32,43,213,228,209,172,158,214,157,21,248,22,227,157,69,8,157,189,158,210,52,3,2,246,57,73,109,96,24,28,0,195,200,64,23,21,133,195,77,151,145,252,240,64,241,40,88,116,54,126,18,91,229,130,8,140,1,220,247,115,119,80,57,35,125,165,51,230,121,254,125,251,155,114,33,176,79,45,105,173,209,158,207,218,11,148,191,83,220,56,159,208,102,110,127,194,146,56,57,149,81,143,183,129,115,36,141,158,231,240,254,121,202,137,173,1,74,25,22,218,38,122,238,60,231,1,5,91,200,140,76,192,5,61,141,126,9,202,7,42,4,241,91,24,113,163,193,17,59,41,223,127,160,193,166,8,141,219,107,47,151,224,61,130,159,109,232,251,28,81,212,227,68,135,48,252,148,175,93,98,182,158,42,251,132,58,226,168,177,45,80,70,231,191,233,251,252,36,4,188,98,50,227,82,178,90,18,142,138,80,29,111,236,240,37,113,158,30,26,215,137,11,64,255,255,176,6,220,212,42,101,64,45,243,125,139,43,145,204,255,27,237,48,184,225,146,181,242,245,61,38,58,222,7,152,242,252,148,209,150,147,115,75,22,171,69,174,13,0,13,238,102,43,32,157,185,60,84,31,218,109,130,42,78,35,73,243,253,25,154,101,75,185,49,204,54,245,107,178,245,236,86,51,152,211,133,69,159,150,79,211,67,217,178,83,219,114,110,157,22,251,36,13,10,132,243,155,221,183,106,167,237,186,236,192,18,76,37,60,220,229,146,39,33,106,12,116,206,248,228,78,167,252,13,218,116,51,163,176,250,146,160,246,160,12,67,222,242,240,121,102,142,211,233,146,144,86,220,17,133,221,120,198,99,9,127,232,21,58,186,100,16,220,232,25,235,105,208,109,160,63,174,71,152,80,83,1,35,93,114,90,178,96,29,147,93,128,218,239,150,0,97,166,196,32,166,150,162,161,9,102,25,248,240,137,76,101,154,97,196,7,102,100,224,255,30,133,66,172,239,51,118,184,226,180,137,117,248,245,70,177,202,76,231,188,158,49,250,184,77,240,97,251,116,82,69,156,108,123,104,97,108,140,60,83,212,215,88,48,228,24,250,140,246,224,242,94,207,48,163,201,4,141,102,53,173,158,159,79,240,74,184,76,44,161,180,218,169,39,141,229,253,41,152,114,177,229,125,215,222,36,120,162,178,27,46,185,104,150,186,83,105,13,10,123,232,160,193,42,142,2,13,236,111,63,199,65,153,143,206,0,112,51,249,149,156,19,40,178,120,92,26,139,38,53,27,199,64,64,179,15,169,156,76,140,123,211,197,42,175,140,125,219,251,13,173,114,216,149,62,37,173,84,175,195,181,63,21,37,164,187,177,46,167,236,215,18,177,164,2,151,66,152,90,45,87,34,55,98,214,216,54,136,69,117,21,217,12,163,255,226,29,144,153,151,158,78,188,121,191,172,112,141,160,173,196,32,198,118,173,89,113,40,138,175,43,141,172,74,116,113,92,252,118,177,230,213,37,1,224,247,118,182,80,101,69,142,99,225,109,194,198,214,206,24,173,200,186,148,19,13,42,144,120,13,10,18,124,155,61,135,142,148,38,206,20,150,127,142,101,228,191,217,244,117,130,239,44,55,195,97,193,0,141,183,254,36,90,109,214,197,191,138,132,204,202,5,205,150,205,26,234,224,114,192,152,86,179,54,86,62,102,65,91,114,125,88,214,46,157,203,115,130,194,27,199,228,80,60,48,52,108,226,188,244,186,162,200,123,112,241,167,19,234,38,253,119,147,177,20,227,183,113,4,213,241,197,238,140,40,43,192,30,89,28,6,137,115,248,83,197,120,129,25,208,207,83,174,33,60,23,112,171,219,28,243,251,248,13,10,62,119,247,219,89,249,48,46,165,91,187,22,233,247,117,208,79,50,66,202,216,142,42,28,236,232,7,219,89,218,236,124,247,232,156,204,247,54,14,198,17,222,204,253,80,67,29,103,251,227,14,128,132,58,178,140,192,227,233,225,55,76,36,193,85,103,69,62,142,146,142,115,5,254,158,234,180,227,200,177,189,146,20,11,176,212,212,15,128,188,231,99,194,91,185,15,53,166,233,7,117,158,87,76,126,157,52,42,44,120,177,183,139,104,205,147,1,7,94,106,166,88,58,78,24,82,139,240,102,188,132,55,82,16,169,115,221,26,96,166,147,180,94,255,108,81,255,137,9,70,173,51,26,192,94,248,11,186,96,132,36,165,130,150,133,72,209,197,100,12,184,40,87,134,253,224,28,248,251,21,197,184,33,197,87,127,122,190,150,131,193,100,186,154,105,25,6,112,154,196,109,102,75,131,58,167,254,90,63,173,182,122,211,189,130,174,67,8,124,231,2,18,180,105,206,160,226,139,252,206,195,4,150,248,3,211,236,31,202,54,108,169,37,186,63,32,190,156,52,216,45,13,114,21,25,158,130,159,77,13,123,78,150,48,135,157,166,140,160,81,97,228,49,179,101,16,128,77,151,171,193,137,28,183,108,162,75,251,122,137,120,53,230,127,44,42,215,208,151,29,187,214,129,78,182,84,47,126,79,163,6,252,151,160,88,64,96,152,197,53,100,239,191,70,137,220,68,143,182,144,128,160,138,84,195,96,43,85,166,129,9,211,173,63,184,62,237,166,221,237,166,221,234,78,164,36,85,62,194,47,189,222,246,82,84,72,143,145,173,78,211,142,241,149,196,24,66,142,234,127,232,80,198,45,186,194,249,227,201,207,200,101,66,21,61,13,92,175,148,199,137,22,12,238,31,192,9,208,206,104,149,26,122,225,182,102,228,171,190,130,161,198,163,233,88,89,53,46,132,0,225,243,60,85,98,106,4,195,129,138,168,169,23,195,245,117,94,46,235,203,159,49,81,226,160,35,57,189,228,87,77,26,101,175,105,6,133,173,141,196,166,64,41,234,91,193,234,115,53,70,208,176,248,135,28,187,86,170,198,209,242,99,124,66,13,10,92,236,226,228,34,157,68,115,175,122,178,58,127,106,51,81,78,187,165,116,83,174,56,214,233,59,216,24,53,7,172,219,149,71,166,252,92,198,140,199,37,117,189,191,39,219,42,42,214,52,101,125,187,30,28,78,239,213,155,1,39,153,139,123,18,38,154,97,171,2,153,13,10,89,231,200,172,154,184,77,7,201,222,48,187,104,75,41,99,116,41,96,74,159,2,217,216,146,62,226,127,78,6,128,186,179,126,62,180,34,13,226,226,113,115,138,5,195,51,63,7,208,68,65,164,199,126,92,176,254,221,6,47,61,12,147,208,38,118,68,245,107,33,177,239,218,211,182,94,140,192,210,204,82,100,89,207,35,145,25,240,218,27,253,216,31,122,47,193,93,232,101,140,234,192,31,167,248,126,96,40,168,242,92,231,17,242,112,104,66,152,30,222,168,198,103,249,139,46,26,68,99,152,238,26,175,49,26,169,17,237,22,223,8,145,147,187,88,97,77,247,191,89,99,17,47,193,76,0,221,24,143,205,111,253,165,18,220,143,215,28,48,13,10,220,134,97,175,65,207,251,127,112,186,112,45,250,221,26,112,28,30,116,171,208,126,128,249,49,76,62,166,6,172,167,87,79,77,29,221,235,75,53,8,199,140,187,55,102,119,219,72,48,67,88,148,166,1,200,179,199,159,219,4,170,4,141,126,14,90,227,165,219,73,4,89,177,66,102,143,132,129,38,46,61,73,234,235,170,134,55,206,2,17,115,92,253,91,242,152,188,34,116,163,85,119,185,91,214,157,197,175,9,159,100,243,193,29,100,214,69,125,157,173,242,45,82,241,74,80,215,208,216,123,45,182,177,225,146,36,247,32,48,136,142,36,65,15,4,200,154,173,126,244,85,116,238,242,3,110,62,158,121,141,2,16,47,99,198,184,187,1,138,145,94,90,246,42,183,188,125,185,180,218,40,9,189,190,37,229,117,22,232,209,136,225,152,104,189,42,224,42,246,9,238,218,53,136,41,104,159,97,216,17,93,202,227,139,205,142,248,97,93,86,42,131,207,254,94,151,226,240,23,224,183,137,87,86,152,105,19,225,191,136,87,134,229,84,60,70,103,31,99,37,240,77,122,120,197,58,241,89,16,233,192,253,39,175,40,223,205,20,157,40,95,68,193,75,111,22,51,218,157,223,230,131,215,19,156,159,91,175,137,161,84,212,108,110,77,103,36,82,164,60,214,165,91,209,242,124,74,63,240,209,74,134,25,63,250,213,156,91,49,173,136,7,218,6,90,129,144,222,99,140,152,75,151,29,88,13,10,124,201,86,27,79,240,57,162,112,95,107,234,75,83,64,54,41,2,70,191,159,209,45,118,109,188,224,221,181,173,66,253,72,184,47,72,65,20,78,91,6,227,216,137,192,199,203,189,178,204,43,53,60,57,44,125,116,4,70,179,106,129,38,80,60,147,21,9,34,217,126,146,108,233,106,32,227,230,152,234,25,114,227,110,218,15,154,167,105,60,83,204,41,148,161,109,182,30,94,67,22,176,248,130,175,187,67,184,174,148,247,242,142,183,234,190,229,249,243,54,79,252,26,169,52,45,23,119,66,119,150,219,11,247,215,186,215,30,226,244,226,9,219,177,82,84,57,25,135,250,103,137,5,242,51,162,65,231,127,38,164,42,30,47,102,24,110,29,4,138,148,190,96,207,191,97,213,197,187,54,29,212,209,201,40,51,202,210,3,198,223,191,194,69,60,136,91,191,70,131,162,52,250,85,139,190,247,28,47,224,240,232,204,213,69,204,49,117,163,27,193,0,221,8,126,115,33,147,44,39,121,195,176,8,175,220,97,17,125,106,22,97,202,50,12,179,71,112,244,209,180,144,114,44,225,159,227,105,141,163,76,227,91,19,69,149,26,217,130,174,198,154,120,39,157,196,82,46,220,187,1,249,204,75,140,197,47,146,103,181,39,254,66,120,133,214,124,182,47,47,199,112,157,228,173,41,199,230,225,170,109,206,153,163,12,162,252,252,108,82,60,144,204,230,6,46,37,165,129,250,219,27,137,44,191,53,235,32,171,196,6,138,115,190,52,136,174,161,43,80,99,91,112,203,102,217,171,121,92,72,122,157,118,194,176,28,207,39,196,223,16,7,173,59,104,227,193,54,125,239,86,242,56,13,178,29,168,26,70,217,24,159,236,239,104,15,21,210,43,48,186,53,150,228,250,179,169,24,143,15,17,186,197,61,245,183,31,69,73,150,201,97,59,62,221,70,77,156,158,152,68,205,53,122,251,133,139,252,40,87,91,163,227,80,232,139,186,42,4,91,224,46,220,13,10,36,188,63,242,31,152,227,24,216,76,242,59,167,41,49,170,39,142,226,26,71,147,117,224,213,1,147,216,248,170,223,226,84,97,156,253,130,90,85,159,150,57,241,152,206,180,145,186,213,82,15,17,153,51,46,160,207,170,43,203,143,170,125,0,249,127,220,107,162,225,31,21,211,0,169,103,106,18,240,228,81,249,45,46,213,71,226,223,13,91,139,189,64,187,90,162,223,102,255,190,104,83,126,130,61,166,124,41,54,29,156,137,193,253,25,29,155,171,145,48,158,255,94,12,87,88,217,234,11,155,25,151,204,16,31,125,179,120,139,217,255,142,1,225,207,27,160,50,236,144,221,89,82,133,135,38,223,51,207,182,160,11,37,73,124,213,20,78,218,244,129,73,15,38,200,2,160,163,210,233,232,17,79,35,179,240,255,35,254,226,77,26,173,188,54,73,46,14,223,171,236,13,79,165,124,3,76,71,210,232,172,181,233,255,94,196,134,218,42,195,237,81,163,179,105,51,213,2,4,75,206,199,202,238,189,56,87,211,131,221,194,143,151,99,34,170,38,49,94,63,215,119,154,80,49,171,65,239,14,251,178,149,175,224,102,231,193,232,8,54,113,229,22,40,236,121,154,84,155,222,72,165,2,248,121,241,54,26,248,193,119,177,34,254,142,172,56,102,141,136,130,164,110,125,32,88,123,213,97,179,68,134,218,211,108,41,21,194,79,196,70,210,187,196,30,37,106,244,234,126,221,40,145,74,1,145,238,65,22,150,31,51,155,184,91,221,56,193,65,118,105,179,69,212,111,107,110,162,227,32,152,18,172,97,208,128,115,29,13,200,150,35,201,162,133,102,167,38,166,102,90,5,199,12,123,210,225,231,87,192,160,59,248,155,232,1,6,62,64,214,182,73,39,156,244,252,206,101,92,198,203,42,45,149,200,70,214,4,136,83,214,84,40,109,92,44,45,142,234,148,254,251,103,98,252,23,205,147,238,31,186,194,223,254,248,119,199,75,218,206,113,99,182,84,152,45,134,75,104,129,57,219,244,124,122,212,243,140,218,180,43,202,83,238,161,77,66,98,218,131,40,183,92,200,163,66,87,12,115,3,192,83,180,197,7,236,46,60,205,44,168,222,245,81,235,204,196,246,251,146,91,162,172,143,124,175,190,208,176,191,174,32,162,126,236,206,218,247,144,235,144,82,252,182,162,84,163,237,81,55,76,146,85,203,68,72,249,158,65,135,112,152,122,25,40,2,118,100,23,219,246,146,159,237,147,123,179,64,86,142,130,98,119,232,220,56,244,220,237,100,78,35,184,242,152,183,80,91,17,179,123,255,136,100,167,24,130,29,81,125,199,175,45,155,170,102,25,94,123,235,42,108,243,13,10,32,203,122,114,129,193,59,30,149,57,103,6,235,61,88,143,147,210,23,45,197,208,22,88,204,42,70,34,143,47,100,87,174,136,78,17,129,89,48,233,13,231,239,102,236,126,86,213,57,164,27,115,144,180,193,59,41,205,84,180,62,4,239,16,118,212,66,171,212,27,173,145,246,189,43,82,54,102,158,95,11,131,55,90,54,61,183,5,172,213,40,128,62,68,91,32,50,244,16,166,170,155,252,193,199,4,217,185,54,77,199,237,159,179,76,60,188,41,28,26,105,72,203,231,43,208,184,96,244,59,212,63,252,171,108,25,13,10,148,85,152,48,120,106,88,235,235,75,136,103,115,162,76,239,84,59,6,185,222,243,6,232,104,223,182,159,128,221,24,176,119,96,110,250,162,136,243,165,252,197,173,61,209,209,163,142,34,232,171,238,80,167,166,197,203,68,7,203,157,195,57,252,4,255,218,214,228,129,133,187,226,227,150,254,28,57,134,15,148,43,197,13,10,164,204,219,2,229,249,97,248,68,29,174,84,53,49,105,207,32,134,116,169,158,174,247,108,153,196,172,138,108,12,116,80,140,126,71,112,46,193,127,144,228,2,71,73,58,201,6,242,136,222,171,96,143,246,165,230,239,162,96,224,72,82,231,219,199,156,173,193,154,232,191,51,189,226,15,123,221,17,198,0,232,54,158,13,160,59,135,124,180,160,143,113,145,2,211,195,242,245,138,180,176,163,175,194,169,16,144,191,106,165,234,116,172,7,207,48,80,60,245,21,161,190,215,213,148,191,236,191,111,165,204,67,97,39,159,96,124,188,122,206,34,36,174,79,219,137,131,151,197,0,99,30,111,43,252,83,127,69,127,134,62,157,142,165,21,52,173,172,215,161,234,8,244,77,138,232,130,237,164,17,176,127,37,171,237,84,252,82,132,63,239,226,254,3,199,188,44,252,201,94,173,165,39,99,21,189,19,131,151,16,47,5,101,41,236,127,62,18,173,214,162,144,204,150,218,201,164,103,135,136,192,99,85,198,35,5,148,133,34,28,95,3,33,83,60,253,0,75,79,215,156,71,146,8,109,100,88,140,42,189,192,52,119,31,208,44,124,66,197,225,76,118,34,207,178,25,52,206,2,17,62,191,231,28,158,54,20,231,47,28,222,189,78,96,78,103,9,78,86,148,18,151,4,162,41,210,5,241,22,180,60,28,118,203,237,64,158,29,33,14,241,164,5,247,15,97,195,11,36,175,192,115,163,165,184,34,235,33,125,180,97,136,118,127,227,58,209,142,155,14,89,69,109,180,211,58,220,15,24,155,164,134,73,232,77,108,9,155,190,199,140,36,244,135,4,198,169,52,221,177,169,110,88,102,243,137,240,59,54,53,117,138,157,255,111,99,155,198,69,97,165,171,23,170,63,27,75,223,176,192,5,157,51,224,73,70,233,165,218,77,227,253,85,16,127,157,169,169,113,221,177,77,168,243,117,114,232,82,181,84,219,106,136,128,111,70,97,176,174,35,66,52,225,91,153,166,196,22,171,33,211,104,223,45,28,166,94,154,63,183,54,218,116,6,136,67,34,13,145,99,27,87,215,176,15,207,95,36,108,169,43,184,56,157,149,27,155,175,80,112,135,34,109,169,181,48,98,119,190,31,82,143,3,220,97,22,129,19,238,86,71,167,44,221,104,108,116,215,46,19,160,119,196,6,235,88,137,76,87,30,201,213,140,115,164,72,44,48,2,42,227,131,218,187,68,21,222,126,117,138,217,246,146,68,234,191,229,46,139,225,225,66,156,26,229,155,49,252,36,165,64,163,27,145,20,171,182,117,140,67,9,110,111,163,231,20,247,194,164,35,166,113,221,66,213,106,83,3,34,143,104,35,213,186,98,225,173,236,2,139,0,196,56,150,156,46,213,193,194,91,158,143,43,90,105,248,156,155,254,139,191,80,196,252,107,239,140,139,183,214,243,180,133,141,197,44,90,138,144,229,177,125,251,171,250,56,234,245,63,81,113,172,110,41,175,154,100,193,61,103,110,219,127,232,85,86,97,191,66,107,113,251,128,249,132,163,119,8,150,94,113,152,19,61,100,186,62,180,101,152,142,113,245,145,14,193,11,14,61,182,129,231,236,186,201,189,153,145,230,190,209,195,199,90,138,13,152,6,118,221,89,43,218,103,154,55,207,238,77,77,242,250,132,224,28,152,80,7,113,205,239,211,229,215,200,254,84,53,227,144,86,192,50,229,244,153,76,142,241,245,121,156,167,13,10,59,51,18,103,155,45,174,179,58,251,137,37,36,104,103,247,16,167,237,120,175,243,41,139,223,213,187,245,244,48,201,193,89,197,109,5,198,94,244,64,79,76,82,85,30,189,124,230,72,173,42,68,182,190,246,209,142,191,235,85,2,150,194,11,218,224,70,40,116,61,127,250,255,203,141,71,62,184,113,182,251,78,217,76,140,187,176,61,214,155,31,91,180,5,13,10,180,240,146,14,136,172,158,173,17,75,197,50,218,182,152,20,245,192,2,0,74,149,156,166,48,189,176,99,190,3,188,13,53,115,42,165,128,35,122,5,94,186,233,160,12,161,13,178,131,246,225,147,153,217,251,155,214,108,134,37,59,208,211,220,115,11,95,200,152,191,165,80,136,92,78,60,189,107,114,244,59,158,42,11,29,54,45,99,1,103,213,38,149,240,119,82,5,42,55,182,85,42,162,144,209,231,48,35,187,102,164,174,21,6,163,201,160,220,224,165,140,234,86,35,104,99,34,168,254,110,136,242,24,2,1,37,37,114,132,241,82,204,238,146,49,52,40,235,101,51,85,67,116,89,225,90,211,116,230,134,172,166,110,115,127,223,183,194,135,190,164,20,32,1,155,105,182,163,13,13,10,12,101,182,212,176,96,138,175,154,180,86,229,100,168,202,45,190,237,126,230,186,156,74,177,6,108,160,60,78,138,204,54,181,141,214,215,204,204,211,205,88,230,208,189,152,76,91,63,237,227,98,151,217,120,122,123,241,106,137,159,5,178,238,205,152,150,148,108,162,163,216,87,216,168,50,87,134,106,237,148,251,117,59,101,168,155,151,101,97,203,5,84,15,249,115,140,224,194,209,132,34,72,130,179,21,193,202,9,134,13,111,4,209,22,183,231,96,94,176,68,150,254,125,242,156,156,79,152,250,253,51,178,27,48,34,40,103,5,73,189,93,137,67,60,5,144,111,72,161,212,195,20,151,40,94,169,167,89,210,123,179,154,253,207,220,156,251,191,125,44,93,224,60,230,111,82,23,115,136,38,227,101,234,46,40,165,61,38,53,163,60,174,184,174,102,41,120,36,216,253,124,247,207,124,81,208,0,220,9,130,240,100,200,195,151,179,133,232,61,44,245,180,30,132,241,38,27,16,27,119,216,92,144,135,18,221,26,220,95,102,130,201,67,112,179,96,210,69,215,101,94,16,100,35,103,172,83,165,44,35,161,216,64,160,7,46,15,150,13,226,3,145,209,54,58,134,242,44,130,85,158,235,1,233,94,124,166,5,82,142,168,26,71,215,169,196,58,44,182,61,131,80,130,158,240,194,96,162,242,15,90,117,150,94,234,188,32,179,155,143,228,84,56,64,103,54,21,45,106,17,143,42,255,106,188,46,151,167,170,219,204,234,153,112,38,22,128,175,135,252,192,42,104,185,217,93,107,4,167,211,232,54,0,215,122,204,224,251,22,35,132,22,149,255,29,210,7,209,250,141,137,65,22,144,174,34,249,158,128,33,224,117,209,255,31,144,247,128,158,177,221,136,115,232,253,162,200,69,29,243,246,197,209,44,185,48,71,43,4,197,94,186,247,9,215,39,182,76,210,73,190,225,31,16,245,9,133,106,31,99,53,31,164,133,11,190,66,200,240,108,21,96,95,211,71,58,171,153,49,123,139,42,37,82,68,59,14,51,29,159,14,157,145,169,238,31,111,103,160,214,93,159,42,193,102,196,243,128,80,146,183,247,229,105,133,90,88,167,22,6,170,236,199,40,55,87,166,156,243,124,214,24,148,234,225,2,9,166,156,211,209,12,63,55,40,120,81,224,182,252,87,132,192,97,140,126,21,93,45,98,43,35,240,13,10,191,214,1,228,54,30,197,154,5,117,246,248,90,125,144,248,56,21,252,52,130,149,75,140,247,25,102,196,127,149,48,94,227,85,60,172,119,206,150,231,195,63,38,150,196,147,137,255,13,10,191,200,101,215,237,175,54,141,215,135,27,167,42,9,116,70,254,141,184,55,137,204,67,179,26,116,233,151,253,126,223,41,140,16,214,28,192,151,110,123,65,167,164,29,131,186,137,13,10,104,230,206,231,215,148,147,54,158,242,216,129,42,28,237,24,128,168,253,71,101,9,117,57,167,207,30,209,225,202,4,191,146,183,20,182,199,31,64,103,51,231,69,44,130,108,90,194,38,220,22,161,138,157,227,221,241,38,188,65,150,66,249,225,253,54,209,98,206,120,50,200,91,85,88,134,61,38,40,85,253,98,103,161,84,33,28,150,115,103,15,203,139,185,53,72,32,101,15,37,172,159,182,230,54,131,50,17,233,212,28,121,76,42,108,33,213,156,83,247,191,95,38,79,12,235,130,99,38,121,189,13,10,13,89,143,105,251,62,152,53,151,1,78,41,134,176,217,246,136,144,138,67,238,172,96,75,207,154,11,60,166,13,10,186,21,95,74,3,86,90,201,249,252,197,97,31,191,5,151,8,68,49,211,125,151,169,21,46,81,126,240,246,172,48,199,175,20,202,73,11,76,118,195,168,200,64,54,17,242,74,39,20,187,249,82,164,239,119,103,81,139,240,182,151,55,182,91,123,106,234,45,104,172,177,248,44,94,150,107,230,171,139,179,138,177,130,55,117,187,53,214,11,30,192,30,26,149,110,117,173,143,246,62,144,215,195,160,151,152,203,26,192,225,35,87,66,117,60,79,15,250,237,157,153,18,214,185,186,49,1,114,161,0,194,232,218,222,217,102,132,202,151,173,75,2,133,118,14,84,27,209,33,73,52,3,172,149,44,159,20,138,75,224,122,133,127,188,250,147,236,96,177,157,137,217,244,55,162,47,185,235,22,89,94,250,231,191,226,251,230,45,50,115,186,184,237,108,133,24,136,100,229,226,41,56,24,186,177,134,77,133,170,237,158,50,203,252,170,104,218,197,181,45,179,189,148,60,112,172,168,28,23,32,172,4,40,254,169,174,163,36,33,49,102,33,85,66,182,137,72,244,18,115,175,62,121,133,8,126,114,126,19,147,79,177,55,130,231,25,28,192,98,131,36,6,168,188,56,197,118,181,217,108,63,241,37,251,146,93,113,242,23,215,230,7,117,192,198,54,96,25,55,183,181,215,187,53,182,174,8,241,116,90,31,123,66,221,63,61,193,89,154,43,137,118,13,10,242,52,208,202,85,125,245,243,190,19,217,231,206,221,44,62,152,39,242,159,70,103,228,165,94,139,172,133,186,207,51,113,111,115,84,234,107,150,119,108,38,191,116,248,198,220,24,129,65,3,207,65,108,130,178,34,103,133,219,134,230,110,221,228,93,168,229,170,115,137,52,208,132,237,63,139,171,69,197,164,105,64,237,211,38,16,110,225,170,108,139,36,13,10,152,241,236,130,132,188,172,2,47,239,190,151,56,133,162,197,254,2,90,68,142,242,236,100,197,122,192,105,152,170,242,79,112,43,112,234,216,98,244,50,116,103,220,85,88,181,33,181,164,117,250,232,89,83,77,45,239,243,107,143,242,137,201,192,85,7,109,190,71,47,131,56,157,116,48,106,166,53,167,211,115,143,9,0,95,167,59,217,3,169,63,169,143,90,218,72,90,100,74,17,91,237,116,167,252,12,144,254,188,226,42,199,206,13,10,216,230,65,67,48,26,103,30,152,13,10,195,53,169,15,167,53,23,45,152,67,246,94,76,15,38,127,73,105,117,100,248,66,206,52,157,218,172,56,107,49,114,34,160,19,101,33,198,236,174,39,107,99,190,178,193,146,125,4,136,97,120,236,62,217,120,61,223,65,78,225,52,216,177,78,146,63,254,30,90,79,30,38,126,117,83,227,176,33,238,39,229,54,189,73,99,198,148,85,49,142,92,29,237,160,187,79,175,129,76,212,153,138,106,74,112,52,239,13,168,198,79,48,239,24,198,171,22,78,98,35,35,62,97,131,65,159,83,168,29,146,33,169,100,60,82,141,164,132,60,136,83,26,65,176,46,113,9,39,179,12,116,142,210,238,201,33,191,28,174,174,13,72,86,243,88,90,35,46,247,182,223,33,68,97,188,96,1,61,67,44,171,139,111,23,20,141,14,251,247,99,214,149,217,76,169,76,66,108,90,178,140,24,184,105,87,156,172,90,114,140,141,201,74,211,55,16,4,13,10,149,169,234,112,233,83,222,159,69,192,163,32,173,166,17,204,214,90,183,239,100,35,231,11,189,193,174,137,140,156,181,2,120,181,172,59,63,121,3,246,245,170,154,99,75,91,209,3,40,124,242,178,90,78,82,231,14,126,118,47,0,191,62,104,221,57,88,138,126,154,56,252,7,42,150,129,44,140,81,126,234,213,111,54,16,88,70,134,206,145,37,5,213,250,129,204,29,233,92,123,156,150,193,199,62,167,105,112,178,195,67,202,134,83,14,125,27,236,86,240,188,67,7,198,164,170,211,38,173,50,150,151,24,119,166,41,72,13,10,250,26,155,96,42,104,32,242,28,101,32,188,156,222,252,1,167,196,141,183,156,175,246,207,204,43,159,11,202,105,212,17,37,71,111,45,55,46,28,139,107,73,157,171,148,62,17,48,167,100,109,209,127,110,186,226,190,31,173,117,120,75,80,6,242,215,19,174,48,164,203,171,205,80,208,218,154,250,76,243,56,3,88,229,117,183,105,198,34,139,56,116,67,13,182,138,160,65,30,17,98,24,113,211,87,226,91,195,153,71,226,87,60,198,139,252,83,44,207,38,6,131,145,220,81,105,40,248,231,50,210,8,229,72,42,211,199,62,37,93,26,232,169,55,0,150,42,86,192,248,58,190,99,8,159,44,156,108,66,22,39,41,215,77,254,132,191,114,2,6,212,45,130,210,2,45,242,56,24,44,211,61,196,188,0,19,192,48,169,41,33,196,249,67,204,143,19,66,243,90,193,221,210,166,255,55,185,44,230,201,83,169,120,142,232,196,202,96,50,140,118,252,55,223,59,92,191,183,190,232,209,160,245,147,78,53,59,50,158,198,155,145,0,196,31,82,160,62,128,191,63,174,81,144,175,99,23,123,204,238,171,43,68,93,255,27,12,250,55,32,32,200,159,254,33,16,129,102,230,203,51,131,89,43,164,4,60,50,56,110,23,171,132,213,154,70,50,48,161,227,189,180,40,243,160,98,76,176,46,218,47,219,207,107,16,107,114,217,163,63,11,242,14,247,228,101,68,137,76,15,149,141,157,33,165,190,170,149,220,156,168,179,175,211,3,152,134,29,65,232,209,240,82,62,207,246,13,195,153,90,223,132,164,100,218,70,17,198,244,86,127,23,79,147,198,137,171,114,205,56,201,33,87,122,13,10,19,114,129,5,92,91,139,189,219,112,45,202,229,83,53,8,18,79,98,198,182,174,148,126,248,136,223,132,64,11,145,241,93,45,34,175,159,54,134,14,142,253,141,49,205,29,80,124,42,147,72,27,82,46,50,248,6,63,129,246,142,206,152,92,53,236,176,216,124,205,162,191,218,73,167,69,27,248,63,79,251,69,219,99,182,113,93,78,17,97,78,11,90,221,63,144,19,121,104,171,179,57,69,165,54,121,196,163,117,198,74,39,231,114,243,162,134,145,197,6,75,19,53,25,170,18,151,9,56,195,188,71,38,13,141,59,30,6,191,106,57,48,21,227,105,109,185,9,234,138,128,239,4,55,89,46,136,16,96,190,129,13,10,249,111,193,19,218,56,107,167,96,245,223,64,250,33,158,20,161,27,166,165,188,125,108,84,171,245,158,113,243,232,235,94,176,47,8,129,148,172,58,2,222,107,137,191,213,118,130,107,20,226,37,52,37,31,99,248,159,76,160,90,182,199,40,116,138,223,253,2,230,178,29,33,151,232,126,13,10,207,28,8,27,101,83,144,131,206,233,90,71,226,109,216,248,72,194,66,37,117,109,155,37,2,229,252,244,130,1,118,245,25,225,254,184,117,73,249,106,0,56,183,151,128,104,116,214,118,49,179,65,220,207,90,132,20,232,101,120,131,157,126,195,41,104,197,126,43,112,56,123,79,27,162,17,151,172,141,241,202,198,23,94,240,166,244,104,101,200,172,187,235,18,171,251,131,211,79,75,82,94,172,193,45,39,51,194,157,243,204,74,40,167,224,48,146,38,9,224,57,133,101,255,165,91,1,24,169,4,164,203,15,237,90,245,133,201,56,168,9,225,87,63,99,216,41,27,207,170,194,187,29,236,86,74,148,211,144,34,54,151,50,59,169,213,138,199,77,40,227,112,50,175,111,36,246,7,108,228,233,25,183,184,86,121,226,40,199,67,34,48,168,93,53,5,214,246,89,190,51,180,105,126,76,11,107,110,226,13,10,81,42,220,58,29,2,118,192,105,228,107,139,104,232,30,72,147,252,249,28,100,184,78,99,30,146,165,43,169,125,174,204,244,195,82,167,120,34,89,101,242,154,202,104,159,116,193,87,90,80,195,254,110,144,190,14,29,177,106,110,71,61,103,158,90,213,244,34,191,176,164,186,240,41,129,176,161,64,163,80,33,210,169,60,69,5,22,168,33,30,98,241,52,84,35,172,72,193,103,231,205,96,147,36,153,37,27,184,219,129,144,192,191,130,144,240,156,25,84,254,241,65,203,213,112,62,145,118,211,71,54,62,167,104,183,1,164,13,199,104,213,83,94,24,96,97,43,132,25,142,255,208,13,10,167,188,9,243,6,122,113,107,36,221,224,77,48,183,63,201,251,120,53,21,198,45,3,145,200,44,248,179,191,11,121,150,45,176,187,182,153,41,95,50,79,105,9,95,26,67,8,61,63,116,54,165,244,150,80,186,251,134,210,214,173,238,44,151,83,223,190,197,18,189,197,30,242,84,158,207,55,110,192,95,107,58,163,9,217,199,155,226,12,53,157,220,224,241,191,79,18,119,222,133,100,162,32,36,226,136,34,231,52,119,12,113,127,112,199,43,195,153,250,245,216,182,128,92,58,124,107,173,233,241,109,55,213,231,237,164,215,87,106,69,169,173,161,233,153,106,153,64,34,183,119,190,13,10,28,109,156,181,139,9,135,49,157,238,118,224,211,112,151,148,192,93,21,173,74,239,36,11,2,205,186,61,213,173,56,174,91,203,156,13,242,52,43,114,119,160,226,65,170,93,196,183,192,181,214,198,106,227,200,28,199,88,217,7,28,119,159,113,79,50,139,239,255,62,190,12,126,126,108,78,235,22,194,117,133,168,178,45,103,145,179,77,78,46,185,200,13,10,217,37,70,155,3,112,109,153,150,2,14,41,142,147,1,144,235,154,48,245,106,98,56,159,180,155,0,209,249,26,106,242,250,134,216,95,171,79,155,137,219,208,118,160,54,64,83,231,26,145,60,136,117,110,48,84,80,196,168,32,200,115,35,228,13,10,97,91,113,88,216,147,18,248,71,38,115,206,35,114,138,174,210,77,4,186,238,33,89,26,238,119,37,142,87,63,118,92,67,45,28,212,34,26,124,229,35,57,183,186,89,161,172,43,172,241,82,251,236,1,88,231,135,109,65,32,19,118,149,168,190,173,181,138,16,7,99,165,237,149,155,156,168,159,72,29,157,158,34,111,123,96,154,89,155,48,166,164,105,75,193,102,238,255,249,84,225,135,213,57,135,134,142,77,159,17,18,56,142,177,43,158,80,23,227,86,104,1,251,39,160,16,18,39,132,157,21,13,10,100,251,182,16,78,198,209,231,195,84,161,186,244,37,197,131,252,71,219,219,149,139,143,94,182,83,181,160,69,254,249,146,121,164,167,109,9,72,18,31,77,55,192,52,49,9,49,21,19,232,35,95,113,121,72,51,125,119,124,8,13,19,48,23,119,171,137,135,179,214,77,14,175,112,254,40,233,87,161,233,42,127,254,147,130,165,112,35,123,61,59,211,121,16,218,46,81,188,240,75,86,108,173,202,34,106,224,184,198,33,5,115,143,38,191,87,237,79,110,240,244,254,22,65,69,219,89,2,134,209,107,44,163,107,63,119,160,180,210,67,71,140,89,203,52,73,75,9,32,158,161,77,79,224,36,243,115,135,122,248,135,147,237,162,147,87,253,144,129,149,161,149,37,7,183,38,19,142,55,123,87,38,210,132,71,86,45,245,142,2,102,59,134,203,253,242,116,13,52,160,207,177,197,20,82,62,161,183,178,6,1,151,19,206,151,148,63,248,110,121,237,127,61,187,89,166,253,150,104,2,100,230,147,240,107,3,233,80,228,162,195,237,35,77,181,12,162,166,85,148,200,144,92,103,74,155,239,31,223,174,138,6,136,80,175,102,44,208,4,41,175,79,65,168,169,93,188,187,161,189,126,43,84,33,161,250,35,124,243,27,197,47,115,106,237,219,24,20,245,162,41,161,232,26,3,22,198,247,13,23,114,67,173,196,129,63,132,41,173,135,77,158,250,11,146,121,151,93,193,91,193,65,221,63,162,197,105,108,106,100,47,222,78,234,110,84,118,77,165,9,16,229,30,116,80,109,95,0,125,27,25,70,172,97,244,181,70,122,233,68,145,146,211,243,115,103,64,112,77,40,223,37,160,24,166,129,194,77,202,24,98,207,25,137,241,23,156,128,237,247,234,151,235,72,183,37,19,162,245,249,65,13,10,211,59,30,103,175,74,155,132,183,3,198,76,145,72,164,86,64,90,107,222,75,239,158,32,211,59,145,185,33,99,37,21,217,183,208,127,191,228,2,209,97,121,233,17,1,175,30,190,153,223,113,88,47,188,193,170,235,161,55,207,55,119,125,181,147,105,235,54,235,139,136,253,108,13,113,184,159,52,253,29,240,13,207,15,29,88,76,18,205,153,139,141,49,121,249,90,227,193,218,72,53,67,189,25,119,216,131,16,183,102,144,213,86,84,107,48,197,115,100,29,27,99,16,211,243,201,232,195,152,202,109,27,4,140,98,157,20,53,132,246,181,17,119,168,202,227,36,112,91,224,117,27,29,118,156,79,122,128,255,232,16,240,118,208,7,224,26,77,141,43,184,14,6,161,221,11,198,167,154,45,177,255,81,39,104,128,53,43,12,162,170,42,115,153,145,139,217,17,80,145,7,40,146,20,158,81,215,8,58,71,28,8,53,165,245,149,127,34,71,75,73,235,198,236,125,106,224,239,92,222,54,52,184,120,84,64,153,197,140,49,37,73,108,222,185,136,116,51,91,241,199,86,184,246,204,123,13,10,164,157,147,192,72,69,26,110,72,55,122,238,242,239,46,221,63,253,29,94,254,132,226,58,170,20,56,132,214,15,6,243,107,61,95,169,80,195,115,113,5,205,128,191,56,60,175,30,28,70,14,233,48,228,36,1,35,179,75,131,48,122,203,13,10,2,163,130,253,39,147,22,201,15,166,156,31,220,23,31,76,127,48,246,69,212,251,136,121,57,144,48,82,26,244,238,92,34,94,108,239,211,241,33,5,80,25,55,133,226,23,122,229,205,124,19,14,37,77,243,155,77,229,58,123,75,75,234,62,116,125,228,87,7,3,35,51,178,30,19,98,28,214,171,145,47,199,1,231,34,215,250,194,110,146,201,215,121,182,214,187,73,18,227,200,73,127,218,80,72,212,200,86,28,165,232,52,117,69,121,134,168,170,37,134,158,131,41,197,175,194,190,120,80,239,18,196,85,83,16,251,244,36,236,85,104,255,233,46,209,234,35,150,5,81,129,86,93,75,17,249,140,114,24,154,190,111,32,73,24,0,70,145,219,20,17,129,147,197,226,145,224,125,53,196,92,234,250,27,60,49,85,196,194,201,169,26,123,170,155,17,13,10,151,160,148,104,39,226,82,220,104,214,161,149,146,136,255,182,62,182,114,31,220,160,62,30,114,192,211,124,167,220,127,61,234,190,21,244,232,4,203,183,245,101,13,10,20,59,223,245,232,109,227,111,159,130,108,79,192,93,86,103,234,74,223,93,8,163,28,212,240,210,252,149,245,236,205,135,74,64,192,132,123,2,207,79,156,75,4,124,39,229,199,2,13,10,35,226,244,80,74,60,47,182,195,16,38,94,202,15,226,137,234,140,159,98,128,75,0,64,22,117,137,240,94,242,17,57,179,33,198,98,181,204,195,20,169,45,172,201,38,100,166,92,201,248,4,167,81,228,234,190,17,169,173,204,8,163,128,131,151,182,139,101,16,254,73,237,72,97,117,83,134,151,156,133,138,67,197,16,83,131,169,72,177,110,240,235,157,121,171,22,47,28,86,224,143,20,227,97,76,198,131,171,56,61,101,95,95,205,182,22,244,95,218,155,62,161,183,164,81,74,247,150,188,221,133,148,33,18,69,130,96,84,23,218,136,249,107,217,189,13,10,68,246,161,3,82,243,27,227,136,97,238,192,61,94,244,52,156,98,103,129,113,188,187,37,199,137,207,166,80,234,118,113,106,217,159,158,244,163,97,70,125,15,75,221,48,91,22,86,200,226,38,188,97,153,62,152,254,49,220,147,108,144,2,246,156,175,137,224,170,211,162,21,104,90,130,39,83,87,252,231,37,135,123,82,126,236,86,167,78,74,163,82,160,127,206,199,182,109,2,90,215,32,199,96,236,93,205,70,203,24,12,122,236,23,26,50,0,194,191,105,127,211,188,247,132,71,5,77,200,195,140,212,67,150,75,39,40,5,84,166,179,168,120,234,147,185,149,186,13,10,203,116,164,233,97,24,178,93,174,47,103,171,226,238,94,88,11,12,11,46,235,138,13,115,9,120,233,114,5,39,120,35,65,31,28,4,190,202,124,43,165,136,99,26,177,2,112,112,139,167,46,176,201,215,100,114,233,15,92,115,57,151,3,29,82,136,192,108,36,73,237,234,130,176,207,101,60,241,220,90,253,100,193,11,189,237,49,162,195,162,199,160,11,247,182,136,199,120,136,214,230,23,93,140,32,153,67,130,234,174,193,77,243,120,61,75,59,201,127,28,195,238,97,19,213,11,187,194,251,27,130,218,252,18,124,70,109,89,9,219,58,124,44,91,49,161,125,213,136,241,91,139,82,17,223,49,79,179,52,196,245,65,47,178,56,8,187,26,123,179,248,87,98,160,136,23,101,176,213,184,204,138,108,168,34,143,41,231,231,59,73,107,115,22,14,232,249,27,93,196,165,12,13,10,9,61,40,192,24,80,51,108,86,161,46,149,192,181,59,57,200,117,248,106,100,111,20,146,65,170,7,15,237,125,106,212,46,255,63,236,126,3,156,54,163,122,163,229,190,196,196,151,177,245,29,7,5,123,244,233,189,6,114,9,133,15,35,166,20,176,94,229,153,61,91,97,35,79,148,86,254,118,116,138,202,216,1,109,194,254,72,235,91,77,199,242,246,152,115,4,118,76,72,167,74,80,98,28,171,195,216,82,141,208,138,173,77,75,85,170,179,160,78,250,142,105,195,245,158,249,46,58,129,200,190,35,190,20,54,117,140,26,195,87,66,108,53,88,235,246,122,201,103,117,81,218,83,99,138,149,241,101,50,14,44,49,222,61,157,173,122,175,201,154,227,212,20,11,214,144,186,152,125,161,97,232,149,28,103,169,167,73,72,195,80,77,27,7,213,199,105,76,76,129,116,20,208,87,147,8,17,112,211,135,190,237,159,203,90,125,9,166,197,6,138,239,15,59,116,227,85,96,210,21,147,236,252,81,185,18,61,160,218,17,67,202,27,230,4,72,9,106,102,57,135,79,53,91,40,37,164,200,97,53,211,117,232,131,19,71,136,97,241,185,170,248,63,57,226,225,138,157,163,238,247,148,76,152,77,229,74,223,66,36,214,31,251,184,95,220,6,124,203,108,55,248,22,135,165,8,103,4,53,102,80,212,135,103,143,162,56,79,72,233,228,3,89,204,110,250,15,87,159,138,24,29,187,138,160,31,255,206,174,158,26,151,102,230,2,170,250,252,66,69,156,92,197,151,9,207,211,199,199,183,35,91,157,159,38,165,11,33,193,19,219,64,31,161,233,148,104,229,191,66,157,223,148,111,239,106,111,38,170,15,117,215,114,98,17,158,48,235,85,41,185,92,140,165,40,175,120,222,134,164,14,213,219,174,15,28,54,98,90,96,66,43,233,230,247,125,86,114,86,94,188,128,227,153,123,21,221,213,144,61,133,243,92,191,118,179,136,132,8,6,5,250,161,193,125,63,220,220,95,101,123,196,171,56,103,233,23,201,140,230,195,80,13,10,118,89,211,34,201,129,227,178,224,96,43,70,98,210,16,110,31,38,13,100,168,148,170,30,211,142,104,26,29,1,100,48,122,248,31,161,156,28,142,210,98,7,93,243,233,120,161,226,95,213,168,149,95,9,235,92,142,199,156,224,35,9,102,236,43,144,25,138,198,150,30,223,74,11,157,124,89,38,209,181,85,98,86,253,21,235,222,80,164,117,106,161,99,183,9,24,230,151,173,155,8,121,58,222,225,165,191,157,46,216,6,159,181,101,11,182,162,21,177,92,128,162,118,78,187,214,85,135,227,104,250,81,15,63,37,11,48,2,249,37,111,166,194,27,20,68,53,5,178,3,199,225,240,224,182,72,45,227,23,189,86,180,70,48,177,166,200,54,162,227,152,236,54,219,146,169,163,24,109,85,32,42,126,232,143,152,31,20,54,140,68,71,161,114,97,156,79,156,158,116,122,210,134,208,31,210,35,181,81,3,193,224,103,44,151,8,4,47,99,186,116,189,208,213,121,149,3,182,66,155,112,201,164,146,84,129,246,52,8,125,189,93,200,105,218,141,87,252,118,1,85,46,219,81,185,145,135,9,187,236,55,101,131,146,162,135,245,7,74,140,1,204,251,73,204,125,131,58,69,1,204,239,180,233,169,130,237,137,13,24,7,203,40,123,157,219,142,126,47,67,242,253,253,209,180,23,75,69,172,75,32,202,252,36,226,95,135,27,96,188,65,146,178,230,67,29,210,75,250,138,63,173,168,148,16,208,187,104,184,101,243,228,59,137,123,164,249,143,47,179,218,44,50,40,34,188,128,165,94,255,164,152,144,241,146,12,184,36,161,109,103,209,154,51,216,205,169,134,200,4,92,200,57,226,14,249,64,119,209,145,246,45,212,168,175,130,194,244,233,90,100,225,175,141,136,45,173,50,3,255,15,134,53,40,219,114,239,32,161,189,248,217,152,170,133,1,27,49,116,192,239,160,202,99,120,212,136,222,48,150,1,64,249,223,133,11,54,189,49,13,26,24,76,244,123,112,215,102,84,163,157,44,93,80,202,86,187,201,161,102,117,72,42,176,29,20,37,255,250,38,76,251,132,155,123,182,166,13,212,221,252,67,149,237,169,247,219,172,31,155,209,103,252,179,226,165,199,94,88,20,130,134,43,101,114,197,171,24,95,19,4,251,201,1,9,33,101,97,197,58,118,107,174,239,66,129,26,107,39,207,231,52,37,168,115,198,242,51,19,206,152,161,85,166,122,245,148,81,184,90,248,175,81,79,30,187,156,139,85,251,191,23,79,170,198,161,21,21,64,229,157,17,24,90,231,48,70,131,131,128,227,132,178,52,167,111,237,116,218,143,226,223,177,111,232,128,5,97,234,168,190,245,32,26,35,195,193,98,241,21,32,126,31,112,140,37,47,12,128,235,192,16,47,161,133,157,29,20,214,55,111,108,163,147,225,183,94,89,233,103,134,228,67,204,250,124,255,165,213,165,50,234,48,29,26,59,17,220,163,233,82,72,137,187,71,49,250,115,227,199,16,109,227,13,10,11,16,59,34,160,63,249,16,49,248,179,5,132,154,18,44,24,20,150,248,107,57,239,192,163,195,240,54,1,251,59,234,100,30,4,154,107,106,91,148,195,210,252,67,37,190,139,96,213,112,118,230,198,179,201,25,208,233,172,154,53,46,98,197,161,139,193,116,244,64,9,23,86,126,90,184,93,163,90,74,0,185,157,178,208,160,67,149,181,50,165,137,131,183,225,217,202,110,193,179,88,224,213,47,251,130,224,162,182,27,56,24,101,201,19,170,84,172,9,188,123,144,220,147,6,129,131,69,155,30,156,167,75,230,39,24,235,26,51,192,56,91,13,181,17,223,156,222,3,0,62,232,160,175,13,10,93,224,5,217,200,209,13,10,150,192,84,161,212,117,104,204,58,24,105,190,72,48,94,90,94,178,125,103,164,233,147,31,40,152,31,196,130,192,81,158,51,27,171,194,176,22,212,78,177,213,104,145,130,53,237,2,52,152,132,222,46,218,68,15,231,185,139,192,45,234,208,234,247,111,95,168,93,42,108,56,75,105,116,200,177,236,222,222,41,14,129,57,117,50,218,28,81,79,227,13,10,52,73,202,51,250,162,13,36,164,125,61,221,196,78,3,7,14,185,68,180,65,73,94,242,174,56,59,210,185,182,86,187,0,21,215,216,14,129,62,51,136,111,186,219,28,224,143,203,236,239,25,52,86,236,158,46,156,224,251,123,142,183,21,52,214,236,86,91,9,80,203,11,157,146,27,74,105,128,246,57,13,79,170,22,207,70,106,2,174,42,85,20,101,65,162,12,90,153,150,197,255,97,69,8,135,181,218,114,170,206,66,131,64,217,136,107,236,189,125,139,7,33,38,152,131,32,31,250,40,209,161,186,50,175,119,152,174,188,6,76,207,13,10,34,252,159,45,69,11,159,13,38,254,2,48,153,169,87,145,199,49,121,186,175,132,110,159,16,2,169,48,197,8,98,213,228,159,39,212,105,246,125,148,133,128,135,126,133,131,196,205,15,212,142,217,133,1,227,246,208,148,170,0,20,80,145,207,51,115,183,173,108,80,80,185,7,98,169,141,33,132,61,29,243,18,147,229,184,165,242,83,145,33,59,211,248,239,120,241,237,145,165,44,80,8,156,52,64,231,133,95,49,92,60,227,197,208,45,162,26,23,16,85,92,190,173,168,212,6,224,246,68,191,194,100,156,107,5,154,224,158,163,206,63,223,85,62,182,41,142,105,104,240,108,31,62,120,163,218,219,248,14,125,254,178,189,123,135,98,0,131,149,182,36,224,204,188,15,171,110,192,39,155,149,28,7,145,182,5,110,167,224,109,211,167,234,193,60,147,144,171,217,142,164,39,44,153,222,26,101,52,91,100,0,84,158,208,200,173,244,235,187,70,240,82,98,226,245,196,250,230,42,39,157,91,230,57,120,93,127,38,168,21,138,119,96,118,18,207,92,249,182,203,53,57,205,37,93,155,148,39,175,6,101,173,99,193,232,223,140,201,60,255,141,178,58,197,61,22,246,31,109,194,113,72,139,0,136,229,39,77,31,63,62,200,248,242,140,133,35,131,69,84,43,164,213,56,255,42,75,8,175,41,100,12,95,167,204,140,216,154,71,160,131,219,147,9,110,168,212,185,146,58,12,6,154,32,224,0,32,220,41,111,88,55,16,39,158,182,244,4,22,45,163,56,49,63,180,219,80,85,240,181,246,221,75,14,205,110,106,228,190,101,244,203,142,198,177,247,13,10,222,73,112,36,86,160,1,49,47,236,86,11,210,187,6,135,214,26,221,14,242,226,120,161,52,82,115,111,119,129,78,39,123,21,58,246,253,79,217,158,154,220,101,38,154,158,249,205,222,169,137,83,137,36,68,225,244,157,58,106,51,117,237,154,203,217,169,241,16,112,53,158,142,141,151,82,127,200,116,5,155,94,163,176,168,47,215,217,38,93,231,21,62,255,65,178,142,57,119,103,233,208,147,34,97,248,57,221,167,179,89,176,61,77,223,40,33,168,57,143,231,34,22,64,224,53,228,158,55,27,85,148,182,26,218,207,165,222,232,56,157,189,160,78,227,73,7,42,229,6,197,25,239,67,205,140,27,201,15,200,119,119,217,191,111,239,38,80,136,14,14,204,23,196,212,141,28,126,49,219,95,69,5,129,238,238,122,246,95,102,92,228,114,218,135,188,144,211,34,192,253,135,143,129,46,189,102,201,234,160,51,213,217,98,47,143,117,73,54,16,47,213,20,137,171,163,123,114,83,101,188,195,220,241,2,48,0,6,27,171,65,135,55,144,28,192,21,0,224,220,178,179,188,25,110,137,209,100,98,45,171,162,109,49,239,198,182,41,81,177,210,110,21,253,27,20,72,215,220,103,80,49,185,12,161,53,228,37,112,176,169,72,227,78,30,215,224,227,6,99,109,71,96,251,85,53,32,117,2,254,150,202,198,185,176,165,45,183,240,76,65,64,234,168,38,176,246,132,150,136,196,163,83,173,118,215,128,208,186,138,170,170,214,212,122,63,215,118,71,201,21,154,249,30,155,116,203,253,56,238,23,136,207,55,221,108,156,183,33,169,118,48,100,147,90,206,42,148,27,101,213,177,28,162,236,6,205,112,14,64,221,169,125,83,115,197,212,211,169,107,218,23,3,194,8,207,162,53,144,158,199,157,252,255,234,40,78,116,59,127,4,136,231,203,104,252,195,230,196,247,164,159,148,93,133,152,137,68,39,72,96,122,207,137,232,210,178,30,118,222,255,18,223,60,111,132,134,140,17,13,10,233,100,181,203,61,222,41,198,113,40,101,136,68,46,97,7,88,21,52,82,82,237,17,116,216,64,199,199,248,146,85,191,153,164,102,214,76,120,15,209,49,68,171,32,116,64,11,64,76,100,226,32,191,70,132,155,215,104,1,251,14,162,142,70,14,137,175,33,1,216,207,145,29,186,20,106,184,233,6,58,38,13,119,173,80,157,244,246,117,110,171,21,106,49,2,45,189,71,99,178,62,23,124,181,183,18,240,56,95,50,143,101,210,56,171,138,14,220,246,214,184,237,163,178,34,218,84,34,192,38,219,113,2,55,95,120,50,62,132,250,134,111,30,46,81,197,19,114,29,102,108,23,164,137,162,224,13,10,197,173,208,174,108,228,212,79,222,253,101,223,67,92,73,69,126,193,65,145,53,28,5,68,63,52,158,65,182,182,235,70,117,192,111,130,187,85,132,82,43,248,243,22,133,72,25,34,172,122,27,213,27,134,36,58,151,220,92,39,15,7,199,43,156,90,128,122,106,167,195,111,63,19,244,76,70,73,31,33,108,177,15,59,93,27,192,232,77,44,201,91,221,166,70,25,216,233,224,242,185,209,179,165,232,169,170,24,212,235,65,135,35,158,16,16,86,107,86,30,246,19,250,88,42,75,102,20,156,27,30,237,237,125,186,214,194,220,236,57,49,95,115,90,210,195,13,251,118,169,228,43,115,145,45,1,141,63,25,242,199,126,183,249,60,226,67,51,9,215,216,2,148,157,158,212,250,127,246,205,231,53,119,201,27,178,176,101,234,56,156,14,33,4,87,152,127,152,20,103,155,61,166,196,218,133,16,205,212,70,46,36,154,163,112,72,50,12,221,72,186,203,111,200,41,111,18,170,49,96,41,122,217,227,108,1,172,120,7,182,153,14,231,214,70,216,173,141,101,87,99,162,214,133,174,86,175,17,0,153,236,119,74,200,109,242,188,140,35,212,4,218,62,4,39,122,20,210,145,198,4,0,22,61,86,66,114,177,5,198,23,37,191,236,27,30,231,245,220,253,122,16,177,78,1,132,151,142,18,62,63,38,89,11,50,136,119,18,67,252,17,164,37,43,13,10,240,45,182,120,235,132,98,22,72,226,91,252,50,233,66,6,201,139,122,74,223,58,246,53,213,181,144,198,6,180,114,153,110,127,253,38,183,240,85,75,151,81,66,71,51,51,160,97,235,247,152,103,52,27,208,106,91,5,118,28,89,80,135,242,3,73,238,234,104,69,200,119,133,231,145,23,195,169,93,71,30,174,157,83,71,151,14,204,71,51,28,246,169,4,60,40,131,244,152,120,123,144,230,148,156,142,243,17,227,201,125,88,230,221,93,235,0,200,140,71,227,145,40,58,154,80,189,0,111,229,161,13,10,58,208,65,32,67,115,147,232,13,10,92,202,89,91,206,27,122,224,94,6,133,220,0,63,172,154,142,93,134,14,44,35,37,165,104,244,34,42,242,251,127,81,70,63,195,5,26,166,67,179,195,6,235,217,134,78,8,211,77,231,169,180,155,182,157,207,105,219,13,10,213,4,7,134,56,3,59,20,60,242,183,48,213,152,121,12,74,242,103,102,148,236,15,250,239,61,60,88,15,71,124,60,93,199,71,134,9,208,67,186,252,110,216,208,107,69,11,212,235,9,20,29,117,121,98,207,174,96,197,173,114,34,251,18,195,77,238,23,160,184,203,185,112,68,180,1,205,99,42,23,151,255,2,47,123,245,210,217,233,30,150,114,47,243,208,181,31,120,248,162,184,52,246,48,76,150,97,7,65,110,220,147,169,30,157,145,67,4,194,152,19,143,190,227,79,139,207,222,115,108,127,87,3,218,238,162,53,50,254,127,183,112,232,194,46,8,127,207,128,237,46,205,169,156,21,71,164,27,118,114,89,31,221,94,38,218,203,51,59,82,77,192,222,141,237,92,230,3,137,118,202,37,75,253,98,177,192,102,5,144,83,237,248,195,164,252,204,41,56,98,84,222,137,89,148,221,112,105,253,26,156,44,127,164,146,4,58,190,158,21,129,16,254,128,169,51,12,224,80,99,205,112,35,170,86,5,190,234,238,235,3,50,41,227,205,44,44,58,103,217,20,73,205,103,87,143,80,198,63,28,83,41,228,33,116,115,174,185,119,57,113,220,105,64,139,72,221,197,152,3,41,161,151,83,26,171,246,169,46,104,197,78,46,25,41,12,29,227,97,251,233,26,108,56,109,74,18,121,200,47,18,140,112,186,186,6,151,51,149,112,135,234,2,26,143,156,105,240,174,121,232,130,118,241,90,123,44,190,103,68,212,28,163,33,65,9,28,201,197,225,184,87,32,86,5,217,159,65,27,78,61,166,166,71,254,20,188,148,192,104,145,25,149,211,241,91,226,24,23,76,105,202,24,52,244,145,118,116,59,206,178,13,10,56,93,210,236,1,191,109,166,140,86,89,230,54,235,165,84,81,150,73,0,121,166,60,73,250,194,218,60,31,255,198,210,31,45,159,56,239,127,86,7,1,187,113,193,192,144,154,85,119,22,26,192,185,230,171,33,242,39,119,183,167,33,179,77,90,111,111,30,137,148,170,137,200,207,154,185,110,129,251,247,128,189,251,76,180,182,248,156,5,98,79,137,184,107,216,219,67,13,10,230,127,9,226,11,237,115,29,18,74,75,178,16,196,111,214,27,36,210,40,119,46,36,124,46,186,60,182,184,172,192,129,77,89,181,208,65,56,246,1,252,226,2,48,186,38,168,254,29,53,27,234,106,119,244,159,244,97,98,14,59,120,180,175,120,37,67,107,45,40,178,155,44,173,14,247,156,7,148,101,76,232,111,247,85,236,244,223,194,53,72,13,10,214,73,102,134,215,197,64,32,202,244,23,245,126,209,0,236,11,48,113,107,161,59,63,154,112,132,50,46,206,94,20,1,99,162,40,174,142,134,202,79,105,157,148,171,221,179,154,76,243,234,80,204,181,140,11,248,47,216,31,163,100,102,168,19,197,110,22,132,112,72,168,97,34,66,251,244,214,108,249,83,61,253,143,247,209,205,88,203,180,11,106,35,97,4,158,14,88,66,69,118,41,227,137,60,61,34,112,247,128,44,109,54,161,99,39,71,75,44,129,252,12,235,78,204,231,190,103,189,140,112,121,153,194,85,115,35,155,218,53,194,205,165,11,221,42,153,20,27,132,201,51,115,96,202,130,224,72,191,13,10,70,2,119,162,129,14,155,233,241,159,18,29,108,50,132,73,72,185,58,152,180,177,104,147,217,120,134,26,126,53,87,157,173,164,219,193,43,74,143,146,86,243,214,194,110,185,215,230,236,193,222,124,137,72,203,230,25,213,236,117,29,27,11,63,23,175,47,17,99,49,64,109,225,6,54,42,177,41,83,19,0,72,171,240,159,143,57,112,204,23,11,49,34,58,108,125,127,164,187,43,207,90,110,238,76,229,11,157,193,198,81,136,246,13,39,144,165,97,220,85,46,96,240,60,83,107,67,159,29,107,124,144,253,93,64,107,121,197,18,223,104,104,193,117,65,48,0,211,143,225,84,44,135,59,82,19,154,167,194,129,2,191,208,228,135,113,212,110,181,243,140,23,78,247,20,11,43,130,175,43,223,253,135,155,40,18,16,213,187,158,207,252,76,184,170,9,137,18,8,163,236,15,61,21,5,20,200,6,190,80,20,136,230,73,35,78,12,39,252,19,242,25,133,83,6,137,135,222,183,155,141,168,53,206,215,88,228,149,123,206,231,198,35,204,186,26,74,249,105,22,244,103,188,21,176,19,212,148,151,222,59,128,181,231,15,241,228,89,168,104,8,157,2,173,67,58,87,226,252,158,71,71,100,239,171,254,53,208,230,146,155,11,47,171,18,156,217,45,213,177,162,219,58,95,69,182,87,219,182,247,249,41,178,250,66,196,131,248,13,10,76,63,184,218,138,1,125,33,81,174,248,129,28,102,2,138,143,202,181,60,236,125,40,90,178,132,190,77,151,202,136,43,147,217,190,172,230,1,246,200,12,158,254,176,67,210,149,233,90,51,53,38,109,63,73,198,192,201,13,235,44,6,118,213,37,18,156,205,97,145,227,54,73,100,250,38,164,135,233,19,106,167,12,150,249,102,143,200,228,32,233,39,15,148,248,252,200,18,195,15,164,0,127,154,186,181,87,42,106,157,2,105,237,218,158,228,192,83,57,243,140,74,81,52,88,198,11,248,196,243,153,224,232,81,80,236,79,251,172,48,38,243,250,210,190,56,127,11,191,205,188,157,40,157,44,175,52,153,247,71,15,117,87,173,89,18,87,147,82,75,199,119,182,64,51,254,228,248,255,134,137,232,24,248,103,34,180,71,245,55,139,55,240,93,83,247,126,161,14,38,192,2,130,165,8,142,234,136,64,220,128,41,74,126,128,109,80,37,184,174,90,77,11,203,48,84,82,173,153,64,131,241,253,254,44,200,163,188,206,117,102,136,179,127,184,87,243,193,149,149,95,49,244,156,17,61,26,20,246,215,92,178,175,248,22,144,7,53,139,15,168,41,149,21,255,31,3,190,244,198,221,111,63,247,13,82,127,137,100,206,178,186,54,68,254,212,23,224,206,85,13,10,21,18,117,158,29,118,22,61,199,76,83,231,244,31,206,68,57,97,137,42,253,111,52,251,197,142,131,71,221,166,79,204,82,201,161,174,13,10,129,127,213,209,209,70,88,18,95,87,157,50,206,22,93,133,49,204,52,254,68,237,205,115,216,91,168,202,212,215,28,245,206,128,81,15,142,67,35,217,29,150,251,251,13,174,254,138,244,213,117,89,169,227,3,85,29,56,166,85,0,242,224,45,76,127,101,244,169,26,166,129,36,29,16,222,20,13,10,112,58,100,30,15,98,51,233,143,217,255,113,105,158,98,203,188,131,157,232,163,26,23,38,14,101,122,132,230,130,157,0,181,74,184,89,119,200,5,59,227,16,73,17,30,86,155,166,251,142,41,40,47,165,191,165,204,174,98,170,124,224,176,238,35,254,127,66,158,86,111,58,172,219,77,19,148,92,150,22,162,228,201,2,198,77,66,186,182,63,37,175,187,70,35,71,90,8,70,227,20,199,167,244,124,245,49,189,63,117,60,215,212,20,213,17,153,211,77,169,66,134,100,122,181,182,22,86,156,246,28,104,232,117,104,168,68,238,160,95,157,34,252,28,81,21,8,87,174,232,134,140,136,179,138,192,4,241,216,109,27,101,54,4,23,114,9,27,53,72,184,38,105,106,248,32,150,117,62,157,110,4,69,148,14,172,90,144,43,48,75,93,229,192,185,222,35,235,41,143,55,116,177,119,83,148,162,108,137,99,189,126,7,32,75,129,117,183,242,197,7,50,39,161,109,202,116,228,187,36,202,99,200,111,166,94,109,81,33,167,41,13,88,161,30,12,123,152,202,126,182,95,214,54,178,14,245,97,86,190,20,3,138,66,213,28,135,61,82,166,86,177,165,125,139,219,222,67,5,61,208,150,223,248,236,34,43,222,101,119,108,44,70,160,214,77,146,125,143,250,180,234,30,158,241,119,167,17,168,31,127,198,102,211,13,10,104,25,150,241,148,228,213,197,51,196,3,169,50,113,6,139,1,153,111,14,37,14,1,194,238,99,253,29,13,10,145,99,191,139,103,15,151,13,10,109,212,22,178,174,187,201,109,235,2,210,126,13,10,131,222,60,135,120,30,218,198,170,165,160,209,253,120,119,34,40,151,148,211,5,107,199,79,92,137,159,100,152,138,37,220,103,195,241,77,168,135,29,105,252,93,140,246,176,231,188,112,227,152,105,66,118,198,155,119,164,128,25,152,155,147,117,83,64,224,0,204,196,250,152,207,202,170,241,89,48,85,19,165,111,137,135,117,140,151,155,95,188,135,148,202,222,135,109,129,228,236,240,73,95,50,154,62,194,146,126,149,154,236,45,38,193,173,50,163,209,17,208,29,12,147,38,36,185,4,218,66,18,61,68,66,28,132,188,113,48,122,209,61,0,65,48,143,171,141,14,230,249,222,116,100,0,170,4,26,124,106,153,167,35,0,169,185,17,253,115,240,207,46,13,65,146,18,50,242,67,236,168,103,39,119,104,144,189,249,209,56,117,43,185,39,182,72,92,27,69,185,65,109,16,120,167,3,75,162,185,251,28,127,156,181,87,52,248,125,78,31,8,29,124,74,102,181,36,178,66,122,186,186,94,145,193,49,137,35,105,154,227,130,6,87,232,154,200,199,83,34,240,64,23,67,156,126,197,62,24,145,40,136,46,118,27,3,99,147,139,127,170,14,100,64,225,182,151,219,38,222,79,194,178,243,225,117,45,0,7,88,151,130,146,218,3,199,253,221,241,43,95,17,96,103,152,164,1,107,117,98,112,193,234,9,95,202,4,239,54,177,167,42,162,125,160,77,45,201,243,8,67,19,120,52,164,179,57,126,184,127,16,118,49,187,171,142,114,79,0,20,32,145,181,88,53,122,7,83,189,216,133,152,135,123,74,80,96,120,41,33,134,168,82,243,110,56,230,6,177,46,173,18,0,47,2,115,16,140,89,77,134,208,66,121,40,36,39,237,212,159,195,50,93,124,222,118,233,229,14,23,195,234,212,141,160,181,179,64,157,241,231,183,17,222,106,201,205,26,72,185,7,224,230,250,184,223,152,120,47,223,72,220,68,67,49,72,66,67,4,105,146,66,206,207,155,180,214,153,17,74,149,13,83,199,216,22,96,24,176,138,181,36,109,131,106,6,51,4,90,108,15,223,115,64,171,115,158,4,171,137,40,255,124,230,72,117,104,43,197,20,38,24,194,33,206,123,108,56,99,60,90,254,201,224,255,76,161,71,67,210,27,228,239,86,48,186,66,56,159,153,58,206,5,234,182,176,108,216,65,58,72,148,163,172,104,90,243,185,232,193,52,151,3,144,175,59,141,58,213,130,235,44,148,139,82,157,31,226,220,35,200,145,159,221,41,162,149,213,8,134,98,185,213,12,36,122,123,4,80,239,12,107,76,133,100,57,61,206,181,161,182,112,210,183,120,118,165,146,121,105,250,231,20,3,199,25,244,32,8,32,18,116,31,229,109,139,248,255,187,47,247,13,10,123,27,126,149,71,139,133,0,235,53,111,37,236,157,133,87,142,35,204,74,209,253,97,204,22,177,141,85,108,14,96,33,204,124,99,23,170,210,82,61,31,20,238,239,118,123,165,152,43,104,59,242,79,224,207,73,60,195,156,113,23,55,159,65,2,138,124,249,169,90,151,15,229,228,71,182,248,21,218,127,13,10,164,85,234,145,81,22,233,66,129,187,215,48,13,10,229,136,115,68,77,48,25,172,178,199,52,225,20,238,254,195,176,95,132,252,153,64,112,223,203,130,153,155,244,33,181,31,116,48,187,203,240,39,92,21,127,244,235,223,211,81,3,253,17,26,2,129,232,213,43,115,189,66,54,11,83,47,70,248,48,195,167,141,68,219,24,210,56,243,33,24,157,127,190,75,227,74,103,120,117,148,212,64,224,18,227,154,67,159,72,38,124,179,131,215,168,191,171,249,8,214,254,134,171,249,28,150,124,26,44,69,148,61,215,254,108,173,228,61,149,188,114,44,137,100,149,255,159,11,94,133,223,214,4,24,120,87,214,204,14,202,26,164,106,197,73,254,14,77,153,169,61,124,224,247,18,219,60,167,138,21,124,30,48,101,25,4,1,225,61,216,75,80,74,32,185,177,129,64,36,82,128,153,220,64,27,107,86,142,255,160,234,249,124,206,155,209,115,172,155,224,209,192,165,110,226,30,160,249,78,14,194,4,70,31,245,147,15,107,1,226,175,15,181,251,54,141,181,174,68,187,152,97,81,80,136,174,171,209,88,225,244,232,97,127,91,104,140,8,81,58,150,41,157,200,143,116,245,103,20,132,75,25,234,116,22,175,233,99,195,160,145,159,137,66,18,73,128,244,156,209,173,172,77,29,73,249,255,206,162,143,246,17,9,1,99,181,224,113,41,185,0,48,66,146,223,97,52,174,235,82,189,123,68,208,221,240,192,109,85,214,88,134,167,141,58,30,15,164,128,234,33,17,157,33,152,150,5,217,116,158,194,80,38,160,64,38,201,28,56,130,210,235,243,65,96,61,216,79,176,193,56,161,39,29,214,194,124,234,45,50,157,229,216,16,247,97,33,44,113,189,146,218,76,159,21,89,38,88,201,216,18,17,185,7,99,234,133,123,83,171,24,183,177,143,32,38,236,232,132,26,36,140,92,201,45,198,182,223,89,227,253,253,4,174,165,202,213,243,96,247,24,96,157,90,192,6,131,190,214,215,67,148,44,241,3,113,204,222,130,202,101,110,195,27,107,199,38,178,21,108,45,86,6,48,79,165,158,248,46,43,210,242,18,198,232,106,158,173,195,24,48,245,222,142,118,103,158,172,169,242,27,72,255,111,65,245,76,192,87,173,44,2,176,48,202,55,97,5,220,131,36,190,230,211,128,248,38,114,83,30,174,142,74,45,217,200,13,10,1,113,106,206,133,9,45,190,198,86,62,127,5,91,119,38,91,117,212,22,225,85,145,51,196,185,17,155,246,156,64,87,50,182,27,198,105,186,107,111,187,234,201,41,140,238,31,206,242,107,65,137,73,144,134,210,219,150,200,175,181,52,235,207,247,73,65,119,37,42,236,224,177,185,104,155,127,40,73,57,35,166,1,109,207,160,238,1,80,37,248,191,196,234,42,41,41,58,124,91,131,66,244,68,219,33,90,158,118,82,112,154,103,177,159,160,189,166,162,137,163,148,57,125,84,58,68,76,228,119,229,67,65,67,95,78,99,249,209,88,216,18,180,52,249,245,236,30,159,142,29,83,66,162,140,155,228,148,180,149,1,198,249,239,52,156,242,192,210,74,98,68,163,101,43,144,121,161,40,155,167,3,29,77,151,222,34,93,246,236,66,168,220,241,62,211,163,117,113,214,0,153,213,223,103,118,155,238,39,161,178,24,25,138,54,101,147,46,254,183,254,33,123,67,20,211,164,215,153,27,239,106,165,255,139,128,25,165,243,13,10,96,159,39,153,128,69,162,7,8,185,102,13,10,232,39,213,172,202,4,233,76,0,73,224,236,87,170,228,192,230,92,204,187,168,82,136,103,161,134,54,137,113,101,125,87,150,193,203,28,13,10,61,44,83,216,226,21,224,13,173,20,83,40,35,137,151,167,27,170,174,115,194,26,252,129,197,183,25,235,16,221,139,158,232,243,236,183,121,163,148,5,116,27,252,7,139,204,153,90,79,194,110,185,217,105,143,6,160,248,63,12,0,84,44,133,183,180,130,123,114,32,176,113,200,129,148,208,51,26,53,49,155,99,138,102,237,215,190,48,232,106,161,191,241,210,155,14,188,175,185,104,198,143,106,197,23,102,183,4,128,241,91,75,224,48,26,198,159,200,69,156,57,191,221,64,21,92,20,31,175,143,177,18,59,109,194,58,116,247,203,134,53,36,185,113,234,234,21,116,198,124,15,215,191,188,190,212,185,148,115,224,125,141,65,72,17,41,253,85,181,119,145,136,107,98,111,11,28,93,205,62,5,0,134,26,39,32,149,177,234,192,150,190,199,242,221,83,177,228,137,29,222,245,65,13,10,99,206,91,247,72,93,254,128,251,150,21,148,168,51,200,28,168,165,129,230,87,119,24,14,86,112,48,124,155,121,202,151,255,56,188,191,6,41,149,189,173,190,93,219,77,13,10,144,165,222,31,53,71,216,207,169,236,20,36,133,171,169,77,89,125,19,135,185,55,57,95,19,110,62,147,75,115,100,157,196,189,88,124,120,80,72,55,59,73,54,231,55,114,74,175,108,64,127,197,123,138,27,227,247,35,250,79,74,104,81,29,249,247,183,28,107,112,101,193,60,21,253,17,255,116,105,118,71,219,41,220,221,176,118,88,39,73,89,232,181,17,169,179,94,68,101,65,211,156,255,225,33,50,154,178,217,76,39,9,224,140,19,137,255,122,250,210,117,99,80,191,44,203,53,243,66,40,196,238,196,238,229,101,105,65,226,232,103,173,29,40,84,117,147,156,105,80,146,155,51,203,251,48,197,12,212,179,43,223,107,178,86,144,243,46,202,190,26,113,147,45,221,111,25,163,182,41,23,61,26,58,36,48,131,150,36,76,133,7,228,114,246,57,85,203,166,147,250,110,24,177,198,30,128,213,254,121,160,38,104,49,69,138,55,228,57,13,68,39,100,148,220,3,206,247,222,68,147,63,29,185,75,177,149,141,140,119,203,101,183,86,175,75,135,177,173,19,198,67,158,79,152,3,189,178,100,214,95,206,148,22,137,11,125,5,78,179,212,76,34,77,82,219,149,216,3,209,207,43,85,124,0,60,69,61,72,227,238,35,178,13,52,62,242,41,129,250,255,126,157,122,67,183,139,33,130,174,210,91,88,37,176,55,148,148,137,70,211,11,48,202,200,39,67,128,173,51,6,93,20,237,74,3,13,10,224,5,51,192,224,114,133,144,239,238,65,92,172,206,99,232,20,160,253,84,191,152,178,92,221,212,18,18,97,127,13,57,136,76,134,37,203,25,5,174,66,218,112,27,3,111,96,104,7,17,238,133,229,244,125,192,86,4,88,144,21,107,20,105,105,66,46,32,248,162,166,108,196,166,246,250,189,6,58,22,143,59,239,17,214,163,105,241,65,139,132,20,61,113,211,12,109,150,95,24,171,79,192,137,135,72,47,131,19,140,221,111,180,34,106,73,8,252,9,31,34,156,98,101,23,31,12,181,35,40,96,128,119,147,32,179,13,75,214,120,96,62,204,145,97,173,140,181,165,1,131,50,135,186,6,124,151,3,96,128,201,201,59,204,18,214,144,19,112,35,2,199,5,218,194,86,215,100,254,111,29,29,87,176,197,142,128,110,180,95,164,45,172,159,103,167,157,242,180,233,227,239,46,119,157,0,167,127,121,35,216,102,13,10,112,37,58,63,88,237,190,29,75,214,185,232,96,110,158,233,12,202,114,93,184,82,33,98,135,73,192,45,221,193,178,155,100,238,13,126,44,70,73,217,114,245,4,127,155,55,110,73,139,122,194,138,198,217,13,30,52,72,60,36,241,116,99,97,182,18,118,241,13,111,195,131,91,71,226,254,241,67,191,149,0,185,184,50,70,57,167,174,120,178,223,136,36,87,196,211,153,229,254,96,90,150,201,246,219,93,226,203,34,199,17,154,236,57,190,61,198,194,8,237,31,230,250,228,225,29,216,144,85,112,236,169,124,67,138,205,94,183,65,253,139,53,85,100,227,105,113,73,101,166,46,134,249,29,248,16,110,68,69,212,217,89,167,185,12,45,204,223,61,246,28,159,4,12,255,199,189,232,196,223,80,80,84,36,43,176,30,152,176,87,198,75,246,96,51,74,122,1,223,178,241,67,96,108,7,47,209,180,106,5,76,158,98,86,118,124,77,138,147,240,97,173,202,253,69,12,72,123,216,230,13,107,2,85,245,136,200,4,223,239,18,139,77,141,204,107,220,252,84,218,85,225,227,219,13,205,216,60,26,148,115,221,246,37,176,78,248,202,191,231,255,121,215,173,236,22,207,184,54,90,184,116,240,218,55,185,199,147,41,27,205,123,43,159,53,65,177,133,16,203,122,222,33,32,118,34,106,176,0,189,235,196,238,34,188,221,156,254,108,20,175,26,228,181,59,162,126,186,60,133,97,106,128,134,94,122,253,95,203,135,245,166,33,103,138,85,131,214,154,116,197,26,97,230,76,74,168,121,36,86,204,157,40,164,174,236,169,254,71,100,249,130,229,38,114,74,112,119,56,36,249,220,187,145,61,135,171,92,69,31,216,88,21,79,60,236,77,104,63,177,161,243,215,34,116,244,61,180,176,169,251,50,225,227,237,197,178,171,77,25,1,15,236,17,227,73,204,150,30,240,22,171,189,54,129,214,184,243,116,157,47,110,25,171,186,46,45,139,194,166,78,146,110,90,84,209,189,134,181,154,84,9,213,137,71,187,1,117,151,119,232,146,69,7,174,238,97,187,227,110,186,188,123,206,212,38,147,82,189,233,218,7,201,176,85,20,82,242,2,122,240,28,19,33,142,154,254,199,198,132,248,168,107,17,212,227,3,225,233,132,117,141,116,135,191,213,150,83,238,134,153,169,124,87,13,10,224,145,79,194,169,69,126,37,26,154,251,169,77,65,87,39,156,38,38,2,91,199,155,24,147,84,61,26,53,200,102,255,91,195,192,33,36,30,13,22,132,203,22,179,136,90,249,210,240,162,13,10,183,91,197,106,237,82,45,78,50,40,106,174,252,200,2,64,45,108,198,11,33,41,186,62,6,167,92,114,38,189,212,107,237,178,181,89,98,181,134,55,143,22,139,169,250,74,9,230,169,16,163,95,87,254,112,128,229,50,144,83,122,131,7,8,80,64,80,215,121,214,214,167,70,232,242,240,174,218,204,59,46,176,52,23,87,144,89,206,237,231,59,59,12,97,31,87,202,77,16,46,173,234,226,180,249,97,18,112,150,154,69,67,179,71,49,105,206,139,34,210,254,98,178,65,246,97,224,118,113,216,194,217,93,84,68,185,5,97,91,165,180,194,204,121,72,137,42,44,106,13,119,39,28,182,242,132,7,234,186,208,32,46,37,216,64,15,0,110,227,242,65,245,190,31,72,236,0,71,117,70,151,23,101,59,122,35,111,135,107,46,221,136,212,51,212,184,237,47,71,247,61,150,74,155,171,3,140,62,65,64,0,199,80,236,190,63,189,57,2,248,210,79,214,202,82,212,71,34,112,83,227,84,156,205,196,159,234,70,236,126,53,120,236,114,71,247,125,250,38,90,0,122,27,136,157,54,229,5,247,191,143,171,59,104,231,109,155,192,14,84,218,189,41,177,179,217,7,116,140,161,52,240,103,35,13,10,111,138,7,156,141,170,129,178,189,33,167,171,25,153,90,68,127,110,238,53,230,216,197,3,204,207,103,155,108,143,207,172,7,195,168,238,194,202,157,81,47,90,247,172,125,162,140,57,31,161,113,21,58,57,202,110,71,12,167,44,129,59,132,46,252,218,182,50,243,163,93,39,142,72,120,106,223,48,198,113,165,0,223,153,59,76,39,215,143,230,103,124,39,165,137,186,123,82,208,28,15,137,174,60,166,148,65,208,207,50,81,61,98,230,83,144,140,0,254,37,162,74,12,77,206,177,255,152,176,164,183,162,245,9,44,173,2,143,194,22,183,30,59,212,153,20,198,85,129,27,70,136,105,133,56,56,201,203,12,174,90,149,105,204,151,137,219,125,82,145,242,9,63,111,2,194,170,254,186,254,143,107,96,39,174,4,63,126,154,6,229,224,199,74,233,193,121,47,136,119,103,15,241,221,189,196,211,50,184,111,98,129,88,246,240,217,118,213,106,18,115,123,33,158,86,21,121,1,105,210,13,10,167,202,166,118,168,241,123,105,37,177,54,189,24,237,35,76,43,150,233,147,52,192,220,4,2,107,87,156,90,164,7,136,19,13,10,168,4,52,14,98,223,156,133,236,153,110,53,196,169,249,244,155,129,213,200,124,34,70,17,162,217,213,24,46,248,93,1,235,42,127,154,47,159,150,212,93,83,138,252,239,174,172,114,226,54,27,186,92,74,193,97,174,18,241,101,45,31,216,66,86,175,26,37,150,228,203,34,125,91,229,116,129,80,241,55,29,170,14,4,167,133,95,241,145,230,194,228,82,31,86,80,128,111,84,69,70,86,20,175,128,30,79,172,231,167,161,73,137,85,27,106,0,73,89,53,237,31,244,23,42,191,94,120,245,160,195,30,166,183,127,185,48,213,141,128,143,71,48,90,106,12,152,124,214,178,217,59,1,126,203,250,87,7,1,81,241,8,85,76,251,188,6,155,157,81,205,55,47,109,187,11,126,247,142,101,4,70,176,231,22,240,154,187,31,240,204,31,129,70,100,41,116,175,197,237,133,229,232,123,201,176,34,193,161,77,114,251,89,59,158,183,228,240,153,133,14,184,171,191,236,17,138,105,173,62,23,142,139,40,188,43,13,10,249,186,58,139,166,196,21,251,85,209,252,161,23,184,55,228,194,101,158,134,57,120,156,195,88,89,225,78,50,15,219,195,153,219,136,251,160,149,173,41,176,251,167,143,236,61,162,83,229,72,114,109,150,172,40,13,152,183,244,93,250,163,27,197,61,47,220,187,173,16,99,173,70,44,68,234,178,170,124,200,50,236,31,92,173,112,226,64,157,251,58,72,125,221,253,59,54,80,76,28,133,173,4,209,180,16,62,187,146,163,248,1,200,175,183,104,87,85,178,102,116,46,114,170,250,63,135,124,71,197,114,188,150,154,24,167,251,128,75,22,67,13,10,94,173,139,47,127,223,159,38,172,146,40,132,144,108,193,235,23,21,134,220,183,146,178,116,178,19,76,4,247,89,157,135,23,176,238,5,122,57,137,167,33,235,202,48,170,133,211,26,185,67,121,112,35,6,92,95,100,70,168,145,29,125,162,118,230,236,180,86,154,158,190,93,111,24,177,41,103,22,218,123,71,219,20,195,46,57,131,61,54,30,204,200,17,82,19,148,204,56,180,125,38,155,107,176,79,11,216,191,251,99,205,11,37,92,150,201,138,13,10,12,70,5,101,201,160,136,144,0,81,251,198,98,52,1,50,69,193,47,164,126,92,101,89,197,193,144,42,58,60,25,53,206,154,120,228,15,205,23,134,61,198,147,238,114,111,183,136,76,123,125,229,166,118,28,105,66,75,249,34,67,119,159,246,169,229,102,174,83,114,173,90,74,77,14,140,237,169,14,161,45,34,87,155,1,95,108,110,157,84,69,251,85,91,69,191,40,12,3,245,4,157,61,179,104,33,113,28,138,125,213,231,162,193,205,226,179,124,128,79,80,254,221,174,170,43,138,2,155,244,123,78,145,125,89,52,24,162,231,33,56,64,231,159,210,209,97,0,216,43,118,149,105,34,251,147,239,92,183,161,106,254,24,204,202,107,200,156,43,100,3,179,161,206,138,188,39,104,216,146,48,5,60,178,193,62,57,50,44,164,228,104,44,225,243,235,156,165,221,100,40,185,186,28,12,87,59,155,172,175,223,138,161,41,205,255,50,26,223,213,20,178,89,106,126,231,54,113,216,207,223,250,96,20,223,113,161,75,207,124,36,111,202,193,25,84,196,105,165,8,91,203,88,101,69,94,120,68,248,164,17,58,234,116,152,45,30,197,224,107,200,139,6,86,170,109,206,111,241,148,145,208,51,27,158,18,211,72,98,47,17,137,116,62,151,76,25,3,4,40,217,34,67,33,6,60,64,69,93,20,32,97,126,224,86,87,46,32,114,171,37,74,244,51,155,201,117,249,94,102,176,147,251,227,206,93,107,213,198,1,167,236,65,190,165,35,73,249,15,88,95,197,46,87,219,159,237,65,198,16,110,21,114,76,141,37,233,169,42,151,96,71,225,76,2,131,152,28,213,50,32,86,12,76,71,121,133,229,255,9,221,87,134,163,214,178,3,55,234,6,228,13,221,21,13,10,237,166,231,65,111,67,155,184,24,226,103,169,112,165,79,189,70,8,142,160,44,30,139,104,157,248,30,213,23,162,55,35,13,242,54,154,207,126,233,206,6,195,226,78,131,165,98,12,228,112,71,199,37,251,111,87,161,38,213,87,129,64,108,103,11,160,221,228,206,219,183,178,140,61,169,40,182,184,40,239,218,0,242,27,220,135,99,138,107,181,155,18,159,80,170,121,255,239,5,205,219,231,243,107,89,151,136,217,184,19,128,87,55,131,219,222,221,208,139,87,170,96,13,10,140,248,162,148,253,218,149,45,109,29,96,152,15,234,221,176,144,81,23,245,80,33,152,24,110,138,87,1,157,233,126,211,54,156,41,210,23,250,44,174,125,148,168,42,205,220,138,50,188,254,191,219,22,125,85,46,168,64,185,232,178,104,155,3,114,73,7,190,26,143,151,186,78,208,224,253,152,37,121,95,220,84,100,164,93,54,119,252,123,20,111,111,92,102,216,122,7,87,223,53,209,94,173,140,173,76,207,233,134,89,182,197,129,29,232,44,245,100,78,0,67,75,203,139,220,218,199,207,197,23,205,196,46,139,117,132,148,182,147,155,236,194,214,66,102,2,241,118,7,254,185,167,24,54,177,13,10,89,128,94,196,48,251,110,252,73,23,80,16,203,154,177,149,62,144,108,246,111,205,228,210,82,166,131,207,186,200,244,30,13,34,30,53,253,169,6,125,236,170,113,218,29,67,147,128,51,146,69,9,13,244,226,29,129,132,91,35,63,100,173,96,221,109,64,70,177,162,87,219,35,230,130,208,102,92,85,47,211,172,110,149,101,167,63,143,145,61,132,216,98,115,197,127,37,20,178,137,191,81,82,135,152,239,76,57,12,178,39,165,103,193,176,22,231,31,2,191,123,240,174,137,73,157,229,61,7,76,74,228,149,88,35,23,165,156,245,148,127,196,105,5,70,72,184,129,117,59,34,246,58,185,54,200,98,236,229,171,250,252,1,224,171,219,76,241,99,38,121,17,34,156,54,221,29,240,66,172,249,50,241,197,135,59,5,145,194,111,87,108,173,204,106,83,173,99,126,177,28,140,46,230,204,132,225,32,64,37,169,40,144,122,89,26,14,8,110,53,76,241,245,131,5,73,83,170,235,207,78,248,156,78,178,195,240,31,64,158,254,243,117,207,216,237,147,45,110,195,74,201,171,107,13,149,132,34,99,37,159,33,223,102,222,93,90,231,113,136,93,133,116,52,155,137,89,116,64,125,228,105,5,140,148,204,93,94,207,148,153,84,240,128,30,91,232,222,219,172,186,126,137,63,154,20,226,17,226,94,185,168,212,38,221,214,146,102,159,120,5,68,23,186,248,220,40,42,171,215,239,177,72,222,148,21,181,99,70,229,90,143,195,229,41,109,115,158,131,118,151,49,196,138,149,49,141,149,235,73,61,0,84,185,213,136,124,53,207,46,76,56,14,80,225,190,102,144,197,246,233,231,1,140,218,17,109,13,138,152,61,67,238,36,100,86,91,248,193,251,86,97,183,88,56,209,193,130,62,174,203,210,237,39,33,252,195,83,81,110,148,245,202,64,19,155,140,105,246,154,191,72,159,211,224,215,6,108,90,114,44,245,202,118,48,115,4,27,174,63,233,255,172,38,31,117,69,123,165,208,245,70,238,197,116,26,119,0,88,178,232,183,105,88,171,229,162,124,222,212,168,209,144,173,124,92,83,181,30,50,193,5,244,119,61,175,37,158,109,27,37,233,93,140,176,1,128,82,59,81,128,117,58,24,231,250,172,124,71,254,156,74,167,25,234,33,110,250,218,236,82,45,29,249,6,50,229,79,140,202,102,150,58,93,183,132,82,223,66,105,69,121,139,15,145,81,169,41,87,21,37,153,94,21,238,38,56,199,75,218,117,232,20,1,97,26,164,72,233,54,20,212,132,26,11,91,228,1,152,164,76,5,141,223,20,8,152,129,103,63,99,38,130,1,193,153,222,80,235,72,42,14,38,135,240,46,217,157,225,175,123,44,64,239,138,228,62,132,247,153,35,190,216,220,166,19,45,118,2,187,30,162,59,16,70,150,40,198,194,99,172,186,251,47,27,154,229,61,15,201,236,220,100,243,185,213,19,97,94,27,174,84,45,212,7,198,104,211,139,207,31,41,12,130,35,4,170,73,37,30,210,82,240,54,80,238,98,40,14,212,225,105,2,202,46,221,178,77,113,228,177,102,23,244,71,198,188,144,125,177,135,160,30,155,233,26,71,36,129,97,54,190,70,238,56,164,207,60,100,168,90,212,78,31,43,174,170,59,86,255,227,247,29,65,164,36,199,217,179,245,209,125,110,44,243,89,81,188,192,255,226,133,175,45,230,244,30,202,22,84,180,207,15,134,153,208,89,145,151,64,34,42,87,51,49,64,172,247,63,218,175,153,103,130,33,36,75,82,69,238,144,209,78,23,39,28,46,34,192,175,207,29,27,3,109,46,105,176,47,206,51,91,198,74,197,84,23,182,245,59,237,253,222,121,0,216,134,23,0,194,130,236,27,201,8,34,253,147,146,93,117,240,237,195,229,160,212,223,137,165,188,75,49,226,146,11,164,0,155,241,162,99,176,247,82,36,120,37,215,159,159,127,141,98,255,179,139,78,245,29,8,199,109,16,163,19,128,58,130,164,187,183,104,129,244,26,72,211,114,60,71,81,96,72,215,165,123,12,18,148,98,193,224,42,196,163,35,12,83,85,113,17,231,69,21,151,203,92,0,90,42,237,224,61,157,99,46,12,159,9,152,61,103,236,36,44,112,253,103,195,132,240,28,213,46,39,182,133,212,187,149,38,68,12,26,195,151,23,46,46,47,87,205,19,175,204,13,119,126,21,23,13,67,17,135,215,191,214,186,231,46,165,124,179,120,249,0,248,61,166,176,237,117,211,34,34,250,139,198,52,222,8,113,105,4,184,209,161,20,233,65,117,5,34,128,118,183,225,211,163,63,176,106,248,81,218,52,73,185,185,215,174,79,157,120,131,158,60,33,17,160,93,29,206,159,36,49,77,134,219,132,47,9,6,179,148,254,164,7,246,69,76,48,221,151,198,192,187,129,165,122,73,150,245,87,206,199,87,62,145,207,245,244,106,60,25,149,193,211,254,23,22,7,120,126,224,72,246,74,23,234,230,175,144,35,233,87,111,180,202,44,238,212,93,145,149,101,16,184,78,7,123,198,45,218,72,119,118,162,162,105,101,209,111,49,209,234,91,15,193,87,1,56,137,22,128,43,132,83,80,16,7,214,206,231,149,50,188,38,195,218,165,162,224,93,138,23,244,79,167,253,76,2,102,94,209,75,147,158,139,133,59,48,56,34,188,27,62,197,45,187,140,136,133,2,7,234,237,233,23,102,59,183,81,224,87,182,144,73,104,202,91,134,133,197,132,193,27,156,152,237,160,199,207,165,49,163,64,159,192,199,102,76,149,75,45,123,124,237,223,155,180,188,223,20,163,65,168,16,255,73,130,217,164,58,219,64,49,77,86,89,253,194,199,144,81,28,192,133,87,227,80,17,239,28,0,5,14,147,130,197,112,215,22,25,128,192,227,83,251,23,133,207,156,182,162,164,230,181,130,32,101,172,132,145,42,49,48,161,168,98,127,152,106,149,71,1,248,164,126,138,157,161,45,39,78,233,94,81,220,190,109,206,98,46,191,243,88,230,61,65,157,237,6,175,255,215,20,118,97,86,123,104,91,50,225,193,127,41,61,121,23,94,209,223,51,209,0,130,227,15,81,205,139,200,92,126,129,125,186,186,14,166,3,65,211,224,171,32,190,194,135,63,211,209,91,186,227,123,75,161,253,50,208,12,19,35,190,106,166,205,133,38,204,178,250,96,24,224,34,27,132,66,225,225,134,244,47,73,231,72,102,107,26,103,221,97,35,105,193,154,254,203,89,143,31,70,29,69,212,172,245,182,251,208,18,64,196,111,227,91,249,249,96,25,251,40,34,174,77,161,172,60,118,143,79,14,111,103,28,72,8,230,193,158,21,241,102,114,217,142,68,86,78,74,238,8,160,139,219,229,255,181,21,3,210,251,231,140,27,7,118,134,56,123,188,177,235,204,20,80,82,222,149,69,28,95,119,230,88,28,82,177,61,23,141,234,67,45,189,240,201,126,159,176,137,197,228,78,38,254,166,171,154,78,160,114,213,156,235,99,51,141,82,116,28,67,246,132,220,188,68,209,7,189,80,48,207,67,144,224,35,34,177,253,237,245,145,23,34,229,156,126,142,147,78,211,132,101,96,244,176,196,3,42,152,0,59,122,209,200,109,127,142,31,33,67,170,231,102,154,131,120,179,143,153,25,67,228,154,253,199,60,165,60,15,233,2,78,172,42,55,161,183,107,222,128,239,38,48,58,94,210,158,254,109,102,77,197,229,23,136,71,108,248,208,168,56,176,196,156,196,186,108,135,155,73,255,56,66,42,55,133,78,115,96,31,127,25,148,95,241,196,109,94,104,87,100,246,83,215,149,213,201,56,20,254,219,12,62,136,230,217,165,164,35,76,146,132,49,132,119,187,82,176,6,18,149,58,154,142,187,34,187,116,236,55,185,227,75,38,113,207,133,235,86,27,178,159,200,78,163,216,184,74,146,205,198,49,11,207,158,86,67,244,180,236,85,143,214,171,79,174,225,170,21,86,56,113,22,200,44,253,159,123,94,54,106,175,189,54,91,30,41,19,82,245,167,124,209,63,79,50,3,143,200,101,190,148,2,146,163,17,77,49,112,32,26,46,26,240,5,225,209,118,236,87,63,51,224,52,63,102,86,121,110,31,2,22,122,205,129,55,140,188,3,241,134,153,181,53,255,99,91,128,188,196,180,73,56,13,168,48,96,251,127,119,3,217,78,25,148,26,207,236,42,233,221,17,171,248,93,164,157,153,243,141,161,231,109,87,41,145,170,137,13,10,139,108,183,249,23,79,20,69,197,146,106,70,102,102,250,142,42,186,174,93,122,22,223,46,145,220,3,240,126,46,75,144,23,49,214,155,127,132,58,164,31,210,167,220,2,156,67,81,14,243,247,214,184,32,114,187,188,77,239,151,43,76,194,254,230,118,153,16,226,81,103,42,248,254,190,1,123,167,109,181,194,27,87,105,182,202,182,19,20,86,82,250,110,87,124,32,227,68,38,194,201,2,197,57,132,242,58,107,86,244,48,32,0,28,57,13,10,111,214,85,2,103,55,143,232,9,75,170,100,139,114,38,136,255,170,223,176,140,243,48,208,150,152,63,110,67,64,133,51,181,234,58,82,15,137,68,62,11,136,25,183,193,24,103,5,1,137,182,89,17,90,154,25,232,245,187,40,242,125,109,238,25,254,99,252,190,160,111,63,29,237,46,129,252,79,73,61,190,6,226,103,66,171,150,29,186,25,93,223,232,110,73,57,13,112,148,0,138,197,33,77,49,196,254,170,36,106,191,26,40,83,101,237,62,101,4,42,217,40,74,184,84,134,67,52,8,185,173,144,242,69,122,59,98,182,253,153,7,63,11,58,17,107,227,187,106,86,142,194,123,171,171,90,90,55,209,161,95,151,233,224,117,225,255,161,169,190,56,191,246,78,54,107,86,83,208,242,144,26,56,220,250,155,122,149,169,166,97,190,244,223,238,145,230,141,214,167,71,199,18,150,52,21,48,159,149,18,167,95,204,182,142,43,83,180,255,229,170,20,196,154,67,70,218,225,147,239,233,82,83,70,55,144,211,7,89,2,20,32,34,113,196,105,174,60,107,214,37,249,60,98,120,59,186,191,66,49,193,201,85,26,100,254,61,19,202,29,195,47,120,245,6,228,45,34,175,99,176,226,252,227,245,201,103,122,99,71,159,75,61,191,147,187,131,19,106,90,39,49,231,56,229,211,201,180,162,24,84,146,3,175,42,31,208,111,140,28,3,222,182,222,97,209,143,40,132,7,148,100,202,172,30,139,199,255,21,170,119,14,229,129,215,181,227,59,46,147,19,7,127,47,211,191,159,118,230,227,89,18,58,98,84,158,81,213,85,64,187,46,224,244,150,210,93,132,216,205,214,235,88,188,35,208,147,16,199,32,71,37,126,249,248,166,4,129,221,125,48,127,118,84,86,133,25,246,1,31,45,150,229,109,31,58,232,86,189,186,95,13,10,19,197,228,95,88,223,159,159,183,87,241,36,5,199,138,113,220,197,252,94,37,130,133,171,16,92,230,77,25,100,219,185,56,17,197,46,218,242,111,43,43,203,152,190,5,150,111,36,91,255,183,132,124,194,198,122,177,150,229,175,191,44,143,18,231,37,54,106,114,184,224,188,172,153,49,116,137,18,60,193,252,77,105,61,251,132,153,14,252,69,168,137,250,122,169,48,38,212,61,177,244,250,133,195,82,97,208,142,77,198,58,6,219,6,189,80,154,219,231,127,67,214,168,51,48,88,54,103,219,151,137,171,136,181,55,58,213,135,204,72,227,141,82,33,131,244,216,183,102,61,28,93,20,122,83,170,112,188,212,244,238,130,77,242,130,78,184,55,105,30,188,127,70,232,118,202,110,225,158,225,195,56,2,59,53,84,114,31,26,168,87,241,164,187,228,255,33,66,225,118,79,39,57,114,225,132,240,142,211,86,88,224,127,110,24,157,235,224,101,38,76,142,148,70,233,4,216,42,238,53,216,226,192,241,6,30,198,253,213,204,24,197,105,223,60,211,192,83,246,24,173,89,182,114,30,70,64,100,201,212,113,47,33,41,69,143,168,19,248,64,129,148,114,79,188,41,123,47,46,30,27,188,199,182,40,107,217,59,193,18,183,226,163,34,181,136,110,103,111,243,98,136,33,142,148,180,131,33,45,196,48,26,61,210,213,92,20,133,60,33,34,126,195,0,196,159,52,80,240,138,47,97,21,29,119,82,112,68,229,147,105,230,22,11,221,246,1,73,116,102,188,55,70,142,48,126,27,194,252,70,135,37,242,157,247,217,190,116,46,106,79,79,70,38,163,6,71,164,78,82,113,174,30,120,19,71,167,226,155,176,82,91,197,255,11,199,238,14,203,51,53,76,26,14,159,218,250,37,90,78,70,220,0,253,95,111,23,37,174,194,181,90,136,254,121,235,158,178,114,196,251,124,79,83,127,233,204,222,186,96,236,235,189,130,8,101,219,209,90,8,198,72,47,164,36,123,166,193,226,27,156,113,240,91,205,55,150,233,74,63,189,158,46,103,196,223,16,161,223,154,171,200,225,78,172,236,151,212,79,17,63,66,129,247,15,109,139,102,42,184,83,64,193,238,113,107,120,192,82,35,96,74,240,27,95,70,199,249,163,208,247,229,156,25,189,140,50,216,211,93,18,127,69,194,130,79,87,178,242,5,184,228,111,148,123,246,147,34,192,47,202,97,30,174,21,99,227,237,76,245,36,32,63,69,225,53,105,157,38,227,3,62,181,220,29,59,166,102,97,136,229,225,41,168,67,249,123,132,163,216,204,252,132,193,87,119,184,215,219,213,227,247,95,8,126,6,136,87,23,63,121,91,100,74,106,79,240,225,39,70,13,21,12,240,34,83,34,221,192,222,47,32,17,55,62,100,153,21,70,57,77,210,126,214,139,129,130,253,126,152,133,204,107,5,7,21,122,138,127,5,236,153,183,68,49,128,252,164,161,116,183,170,177,16,217,234,229,96,110,191,181,111,245,53,130,189,160,18,40,217,91,56,164,216,123,216,174,230,223,158,149,214,75,187,172,53,132,26,71,134,148,83,30,1,67,39,2,12,18,109,4,6,192,70,109,86,182,52,9,231,122,157,175,174,209,85,69,33,113,101,25,136,240,246,239,28,53,125,155,11,222,201,180,163,235,37,103,20,152,203,107,245,213,114,3,11,175,62,182,55,203,237,167,100,247,80,67,28,34,106,169,144,171,123,241,209,89,61,2,67,193,212,218,101,43,100,80,175,51,1,48,195,188,73,0,142,196,9,74,18,161,216,59,95,69,17,65,33,174,241,99,32,158,57,33,51,38,211,95,56,8,36,184,14,128,65,210,233,139,108,126,99,16,103,164,58,5,245,234,246,1,142,218,56,125,142,243,66,163,123,8,186,95,197,200,97,216,191,112,72,12,110,223,130,249,201,115,186,13,10,140,27,163,167,99,150,21,69,43,7,57,0,105,176,120,131,35,67,8,32,150,228,218,59,8,133,150,14,142,198,113,81,58,188,115,58,251,148,115,129,36,47,76,32,126,19,65,145,199,112,127,252,232,51,202,179,155,49,228,182,112,151,18,61,170,50,106,176,6,221,199,125,38,133,247,187,155,18,53,234,234,248,4,51,188,215,66,75,202,216,198,178,97,113,247,70,56,172,43,7,252,219,63,138,175,220,95,80,184,3,192,27,174,245,128,137,176,7,184,170,48,34,114,140,5,123,26,113,52,61,172,196,28,94,172,79,196,67,138,130,84,245,170,147,46,65,91,73,110,201,203,22,186,96,143,222,131,65,157,42,29,223,85,111,232,214,3,96,108,235,36,165,129,40,140,69,13,10,98,236,247,119,85,251,250,152,111,160,176,222,19,52,123,47,144,168,205,183,226,53,220,89,122,234,158,226,135,101,11,72,105,171,88,201,126,165,89,123,234,254,66,83,90,140,106,52,91,151,175,20,182,156,230,54,145,37,81,140,182,247,168,150,130,145,198,166,177,97,96,25,61,90,33,135,2,183,82,58,211,87,16,239,207,76,92,142,154,42,48,217,149,220,235,19,234,231,23,58,35,180,170,174,245,133,116,162,102,48,94,167,172,90,174,128,28,44,23,4,90,14,37,25,93,180,168,95,231,140,248,66,250,126,57,162,3,132,45,47,116,129,96,48,89,67,195,109,69,16,243,253,130,157,209,228,129,214,221,136,161,81,69,169,221,232,138,45,191,39,43,165,22,218,40,228,20,8,214,94,154,62,80,47,97,13,10,35,33,233,113,74,208,108,66,94,150,209,61,80,235,141,79,241,84,193,122,133,78,254,203,156,199,41,39,165,66,184,124,128,196,133,98,29,235,181,48,68,62,154,236,162,63,226,255,159,235,163,42,77,140,150,191,231,151,145,59,8,107,236,196,234,23,221,116,194,139,79,127,202,67,244,49,191,182,136,241,252,218,229,101,170,107,125,20,1,57,32,146,48,123,243,95,181,187,56,55,232,133,247,101,241,196,239,49,72,119,104,87,241,193,132,98,106,156,161,152,146,177,199,2,183,44,249,180,166,152,168,143,59,170,251,162,87,120,116,130,47,75,100,123,62,249,109,165,142,69,137,15,201,160,86,97,99,244,202,67,225,197,226,168,98,167,97,218,49,248,151,197,14,229,208,239,18,64,109,171,114,71,81,60,172,193,190,191,132,2,13,208,202,35,2,243,69,130,16,149,4,33,32,129,32,128,234,251,127,46,148,198,124,136,27,239,5,218,89,126,75,95,199,151,68,26,41,13,10,59,90,235,204,161,185,242,55,242,185,35,53,200,220,16,176,142,41,174,215,66,41,171,186,245,117,171,90,237,185,68,17,197,209,248,55,21,19,158,97,170,154,86,39,109,72,99,61,205,235,127,90,159,255,50,201,149,113,104,238,156,177,106,153,164,107,224,214,192,39,193,250,81,176,204,244,133,183,159,240,101,163,165,116,171,66,17,83,222,57,228,25,214,109,18,67,120,195,131,25,68,150,123,193,113,156,223,144,12,20,126,95,234,231,125,106,13,95,101,205,87,200,96,218,6,216,124,184,125,85,185,115,4,253,119,166,110,40,101,244,112,164,29,134,96,84,31,49,135,205,172,227,70,81,84,120,251,229,5,130,185,206,178,110,148,9,188,41,74,67,180,29,141,46,234,46,51,169,220,232,61,31,174,196,176,175,157,171,103,114,55,176,212,66,224,126,231,156,37,220,235,184,250,169,88,237,137,142,249,145,209,102,52,189,128,219,116,60,7,240,112,129,2,20,28,156,50,73,224,153,153,72,58,173,95,215,224,106,191,165,156,222,216,245,174,106,246,78,197,246,230,194,94,16,27,118,88,11,196,167,118,221,94,144,156,233,44,92,194,50,65,251,114,186,207,94,201,53,80,182,186,48,19,85,76,169,8,140,206,212,90,140,198,0,41,243,167,236,197,59,229,234,251,22,144,89,171,75,115,80,6,104,96,13,193,69,201,42,99,201,60,71,160,12,74,107,176,80,99,13,63,9,187,240,165,111,181,144,234,15,50,100,1,0,151,242,199,85,167,244,117,135,196,108,14,143,72,222,244,186,28,13,23,146,215,58,186,255,5,242,239,167,35,206,209,7,35,31,30,162,221,40,197,235,251,42,44,29,200,130,159,85,122,223,18,12,236,52,169,235,98,227,109,3,23,85,100,153,159,203,246,215,77,35,150,220,198,50,153,136,132,105,236,129,179,202,16,191,28,81,232,25,57,105,89,231,109,30,122,123,113,197,70,233,22,157,136,90,240,74,128,30,5,34,42,239,200,204,183,117,203,246,153,21,105,161,165,34,98,113,39,21,153,24,154,131,242,28,186,179,237,191,53,158,175,204,5,142,173,232,56,141,54,5,50,201,98,7,136,103,180,160,36,252,36,83,226,159,234,149,252,133,154,12,236,151,1,128,121,111,91,72,31,131,117,215,24,68,24,226,111,192,62,189,77,27,201,169,2,188,217,82,160,219,18,150,53,90,47,224,154,101,247,252,52,74,82,226,11,81,145,48,95,255,76,204,151,50,94,47,255,86,51,74,242,163,79,36,116,253,227,103,64,50,56,124,8,252,238,197,47,25,196,247,50,70,221,48,58,249,151,28,168,194,123,111,222,60,210,182,211,38,126,200,45,211,105,190,170,25,192,139,235,46,2,17,60,199,233,62,57,136,203,214,101,123,33,13,111,231,150,240,50,94,204,49,5,244,109,6,54,67,133,230,9,71,91,150,126,82,219,78,67,72,227,157,81,156,234,194,19,87,96,8,147,25,154,1,215,53,156,142,69,76,16,46,198,151,68,176,123,135,254,83,159,4,113,164,116,166,107,166,2,91,18,104,139,77,162,101,97,172,109,7,74,45,60,133,89,160,14,155,142,38,205,100,175,186,246,115,184,58,137,200,126,221,244,98,38,174,65,115,175,9,100,181,220,61,145,126,178,69,98,149,55,130,141,142,176,178,166,173,197,17,210,104,219,2,155,28,66,205,54,230,27,163,36,137,74,228,51,111,63,235,208,139,174,50,52,227,117,28,31,33,107,34,197,35,76,129,76,220,213,165,240,159,92,122,13,10,176,46,106,211,208,46,228,2,95,99,249,19,158,231,13,10,181,245,210,152,92,225,27,56,224,20,58,221,2,94,228,111,12,42,29,179,221,202,161,248,92,6,137,3,69,133,65,206,126,160,56,170,35,140,198,244,0,133,101,157,218,5,201,243,229,158,241,110,75,20,7,119,206,192,107,163,137,6,52,247,102,180,79,69,11,152,195,50,51,129,231,155,74,188,238,247,133,43,197,132,207,163,33,21,193,147,210,7,148,13,10,143,13,209,0,129,6,129,136,251,71,135,123,197,114,9,228,129,137,23,213,214,25,183,167,22,32,249,245,105,79,129,89,241,20,182,187,159,179,87,185,197,6,55,151,206,20,176,220,106,118,62,128,186,241,226,71,133,153,190,239,105,158,159,43,124,3,184,103,165,158,97,90,212,61,221,30,171,197,202,60,212,156,251,137,93,56,238,121,162,146,85,76,212,29,22,6,107,6,176,201,98,230,78,174,236,140,56,105,83,114,21,197,103,254,230,243,86,205,70,16,36,191,4,74,240,96,7,202,108,7,39,23,128,81,234,226,181,235,41,122,222,86,115,174,174,3,26,141,199,191,164,35,139,73,72,178,189,184,167,173,44,137,153,130,91,77,187,126,94,243,75,51,101,220,199,28,108,68,203,122,108,192,27,101,168,23,31,11,220,74,74,118,176,87,154,186,51,196,56,207,127,16,176,158,84,107,162,30,243,251,41,203,56,123,200,233,199,246,35,152,1,191,181,112,82,238,213,199,173,117,237,81,105,14,229,145,77,54,124,206,164,38,157,149,92,39,241,240,246,77,30,79,22,155,219,134,33,145,134,23,67,60,248,45,112,128,207,232,32,228,242,141,197,203,47,156,182,231,137,146,132,7,221,175,196,39,13,125,94,52,228,192,203,211,225,130,43,73,134,145,111,172,159,182,213,223,35,191,239,147,219,45,122,46,137,22,196,35,154,19,241,156,246,56,146,240,69,208,101,188,245,200,64,61,51,90,192,254,65,212,40,111,0,195,216,154,220,36,225,116,32,247,151,238,69,116,156,114,113,139,234,19,194,67,169,30,183,108,33,89,221,133,187,182,167,169,35,58,3,213,219,237,124,247,167,210,4,203,97,164,12,182,87,136,109,24,162,148,112,80,155,198,125,90,252,51,137,71,70,239,189,92,104,228,145,120,143,23,131,185,161,118,171,155,72,53,128,59,155,81,144,152,212,202,82,222,177,140,9,155,186,18,1,133,248,98,84,170,140,94,66,235,154,108,52,73,36,245,188,214,42,228,93,60,73,14,45,230,229,125,59,210,64,127,175,85,73,251,123,218,185,37,45,46,156,170,15,240,183,86,16,70,181,234,113,116,219,19,6,142,89,109,197,45,107,159,239,82,73,131,156,189,67,32,241,24,101,74,144,235,28,157,240,14,7,217,82,108,92,122,30,215,31,178,88,180,122,198,210,99,141,176,117,120,18,162,113,245,226,11,109,206,207,192,176,156,232,217,46,99,113,146,129,246,102,144,108,135,133,135,57,53,254,136,133,37,100,235,223,28,200,35,92,195,245,149,12,183,71,140,211,196,30,238,83,254,2,141,150,58,72,235,89,148,38,251,182,187,222,137,30,141,75,157,230,154,79,183,144,164,249,120,135,73,123,179,100,50,228,159,131,134,45,108,117,86,115,129,210,221,64,148,56,108,1,208,203,180,41,24,123,192,187,62,50,82,61,173,173,219,192,12,57,8,117,251,245,137,58,5,208,104,90,2,164,188,251,11,123,134,213,181,35,27,4,24,113,115,121,65,125,2,127,48,211,113,122,35,1,202,222,223,153,199,55,56,171,242,233,13,22,50,230,2,57,231,90,193,66,27,93,253,9,218,143,15,108,254,60,145,68,151,78,30,243,146,61,82,226,251,150,138,190,59,61,226,120,101,242,217,41,207,132,79,156,214,13,224,225,123,16,222,23,113,51,80,168,89,206,234,67,118,41,250,49,33,252,193,134,12,64,75,234,172,94,102,169,233,21,179,5,252,250,109,79,4,195,13,10,124,181,249,53,198,103,141,60,211,254,175,161,203,110,168,96,61,52,116,217,45,103,4,0,186,9,64,160,144,51,163,220,56,35,64,71,60,87,70,21,97,184,71,125,23,86,153,230,88,47,123,128,165,39,186,63,102,75,55,149,64,75,105,134,126,68,158,106,204,190,42,118,0,107,63,148,172,115,18,117,56,148,67,64,200,55,7,71,216,157,240,0,219,135,13,10,21,228,85,184,32,141,52,103,167,38,219,198,215,35,253,234,181,26,248,96,173,234,31,141,116,96,196,100,135,56,0,203,54,239,86,254,88,224,172,60,101,8,63,246,21,7,57,209,85,38,169,194,108,71,195,136,144,160,115,109,202,101,22,207,30,164,132,109,76,192,91,76,42,6,208,86,141,139,196,13,149,211,219,179,224,87,151,246,151,255,0,18,28,142,118,55,119,23,212,250,250,167,194,45,66,173,4,38,37,70,234,144,140,63,45,236,57,208,221,115,174,63,247,207,30,176,223,247,209,248,145,29,94,26,30,130,181,199,67,217,33,56,202,236,132,119,49,65,109,108,71,104,63,154,2,41,80,87,163,189,51,143,202,11,17,93,170,124,70,49,228,246,12,26,170,184,26,121,106,87,159,241,172,157,250,138,99,225,196,111,32,254,197,194,193,246,130,201,152,90,35,177,245,195,232,219,87,228,221,178,65,242,157,207,125,190,180,32,95,146,130,208,66,185,187,17,215,112,189,133,188,19,180,220,117,61,99,83,195,213,196,182,120,213,5,11,118,142,6,6,104,183,230,248,96,179,141,97,21,117,136,5,218,194,49,157,98,68,186,240,245,47,118,163,5,73,41,227,65,11,71,127,118,82,99,154,81,111,231,243,84,153,251,224,114,255,234,95,20,203,198,50,38,232,43,31,151,33,251,240,66,136,127,221,220,99,215,43,225,182,206,16,53,137,161,127,242,32,176,146,139,160,57,139,43,48,5,236,196,40,55,176,25,205,61,179,254,88,59,241,66,9,244,214,203,24,180,74,151,250,37,154,181,213,213,13,10,107,81,5,98,85,243,157,247,131,225,96,189,189,82,31,98,220,7,134,141,249,65,219,150,228,222,84,221,133,230,137,235,127,208,65,9,113,2,41,3,134,234,66,46,78,58,227,55,125,5,52,140,138,251,127,15,123,204,37,105,22,196,149,55,255,195,221,154,248,26,74,176,112,211,238,35,224,120,129,24,42,158,69,92,245,254,156,115,238,95,100,225,136,135,205,152,121,89,150,123,202,224,64,69,225,24,9,129,42,124,142,118,206,229,164,178,77,157,34,214,71,238,175,200,106,14,23,141,118,189,247,192,242,158,181,238,205,175,135,52,171,74,202,229,217,68,113,210,129,187,179,80,216,122,119,52,42,188,159,4,211,53,229,98,44,115,211,72,86,13,10,149,17,46,119,143,160,189,207,168,135,164,16,11,44,113,234,111,66,171,180,59,112,27,104,30,37,19,189,175,27,33,171,139,174,210,40,139,210,252,248,111,167,106,35,92,144,112,2,197,176,126,186,133,241,96,137,42,184,157,217,47,24,74,144,144,86,138,59,72,120,184,108,150,236,192,212,254,29,108,105,107,97,35,202,85,245,148,94,235,25,66,12,238,142,107,144,13,28,49,210,20,91,1,170,21,43,190,147,237,152,35,29,201,251,89,188,9,241,123,103,138,230,235,19,197,131,12,109,217,133,140,79,191,216,236,176,67,38,156,135,130,151,85,212,48,236,14,71,227,142,55,77,224,25,119,193,200,108,151,40,30,31,149,54,129,204,217,223,120,185,88,164,66,221,238,237,133,129,88,57,221,5,244,174,93,197,150,13,127,30,59,184,146,64,198,74,105,105,16,222,5,188,139,211,67,118,112,191,232,156,237,251,159,34,182,35,76,190,33,249,65,77,58,79,186,62,100,213,164,128,81,142,251,99,89,188,50,165,57,18,224,140,193,200,72,221,185,232,252,35,225,210,135,168,136,47,216,51,184,132,159,0,33,252,206,167,100,188,236,192,89,210,43,113,48,3,24,229,46,101,49,129,1,83,181,211,241,43,130,2,236,213,143,162,13,166,39,97,100,228,67,234,204,52,33,245,125,223,181,125,69,219,237,191,8,8,41,61,242,150,136,30,38,33,159,39,13,10,70,142,166,149,145,213,238,95,174,146,169,19,226,144,95,1,27,205,13,199,183,148,204,139,28,141,22,110,241,21,228,160,243,103,142,158,83,201,54,201,130,94,48,227,237,98,230,137,198,127,108,49,191,40,42,113,79,65,217,136,160,243,90,13,10,1,184,199,208,163,222,186,13,148,125,13,10,124,165,163,33,227,121,131,123,43,1,117,252,108,212,109,45,210,176,198,100,45,221,20,150,121,44,75,29,250,230,1,26,241,101,20,153,2,122,124,209,229,171,79,82,235,170,201,198,0,190,249,38,249,85,201,216,218,26,94,175,70,152,167,31,192,252,112,149,48,54,95,2,90,85,135,71,225,26,64,193,33,161,48,160,19,3,246,104,83,35,134,208,201,165,118,147,124,25,133,71,180,221,79,51,194,82,203,254,157,144,111,201,64,197,110,234,162,66,192,138,94,195,180,79,125,143,66,179,217,79,181,59,90,74,140,156,177,31,107,180,107,21,63,0,182,213,140,166,160,49,76,177,110,75,101,213,183,28,115,156,13,66,89,189,48,162,19,69,171,181,215,133,115,168,251,7,9,148,94,95,83,109,48,104,150,99,179,30,100,48,152,67,40,231,99,9,236,157,11,129,109,255,102,150,211,74,86,79,105,75,46,139,13,10,214,45,84,252,151,210,208,156,169,69,121,117,189,134,73,63,48,107,232,174,98,86,245,143,253,6,177,217,6,106,75,58,210,100,110,73,67,253,166,241,49,99,202,188,255,88,31,139,146,213,243,62,223,81,43,200,13,10,188,44,132,53,82,215,199,220,35,100,189,238,250,223,238,95,132,44,16,9,129,127,17,83,191,9,43,49,145,238,171,162,9,145,54,38,80,82,202,25,146,247,147,168,91,31,225,193,172,214,214,181,171,123,22,156,5,188,101,187,168,168,212,125,1,245,196,176,20,122,151,202,21,108,238,112,211,58,187,94,88,170,36,102,155,36,5,64,253,29,230,103,30,240,103,163,252,194,218,57,51,127,253,135,230,125,52,253,4,36,36,164,179,90,31,137,61,232,151,105,118,250,106,40,243,120,102,95,12,81,35,127,91,131,41,75,158,137,133,35,190,91,208,146,15,20,87,196,128,220,136,185,127,37,16,90,4,174,192,208,156,106,173,145,93,230,178,213,184,240,1,239,104,211,34,191,66,28,152,32,84,131,178,47,123,98,121,126,18,54,222,190,1,150,190,26,66,59,52,218,108,196,26,21,8,221,228,153,181,186,123,224,123,222,34,90,101,120,136,3,62,8,19,75,244,36,197,57,234,38,102,179,193,50,2,181,6,93,222,6,77,100,76,19,165,26,110,9,131,208,66,115,35,8,76,0,188,171,115,32,31,116,204,218,224,46,149,29,228,45,212,64,57,137,22,1,250,180,69,123,75,0,85,81,96,121,16,210,33,56,6,86,177,236,219,145,244,154,150,62,159,144,244,168,70,104,242,218,94,233,122,236,93,170,254,213,209,183,110,201,242,182,99,211,255,16,179,80,251,164,75,196,32,131,136,207,48,132,162,109,42,114,0,160,249,229,147,48,184,115,229,130,97,78,217,98,95,51,177,92,50,229,79,15,38,200,196,178,114,97,44,237,115,183,5,240,129,67,130,24,185,235,230,169,52,164,67,184,102,119,38,253,196,172,42,29,62,37,12,37,124,111,183,245,37,181,119,133,34,98,190,28,17,230,92,153,176,101,250,73,223,22,88,226,36,108,101,121,194,195,212,64,134,120,111,93,245,80,247,92,151,220,212,34,153,211,255,79,227,105,218,252,134,198,255,184,180,187,14,210,85,240,137,144,66,180,165,162,14,52,72,7,6,251,87,198,170,60,102,99,63,201,143,23,38,238,30,217,78,190,128,201,184,11,8,59,235,224,41,102,154,178,169,170,184,105,248,187,171,144,242,230,179,232,17,128,145,252,142,198,228,167,66,224,59,150,151,254,172,59,212,132,248,229,77,83,95,43,191,54,154,53,185,3,54,111,192,125,81,121,125,99,67,31,150,101,64,206,70,224,250,31,79,169,111,216,13,65,207,170,176,86,72,105,146,93,76,102,97,136,57,152,110,194,211,154,63,49,210,123,89,179,248,159,245,13,10,216,124,246,210,70,233,97,129,61,108,218,142,172,176,99,165,112,113,210,123,104,148,240,182,38,27,221,61,186,16,120,25,232,176,6,155,149,172,109,242,130,88,39,254,42,108,0,136,148,213,134,237,218,51,212,228,187,115,161,151,252,14,4,218,141,145,229,229,138,74,142,121,190,56,14,79,136,246,111,175,251,251,146,212,24,119,119,195,172,17,100,28,14,230,187,193,47,158,37,210,224,45,115,200,190,114,19,237,183,101,212,223,58,105,38,234,35,101,195,7,123,94,236,64,95,140,133,34,149,89,0,101,107,231,24,64,107,241,65,231,136,13,50,114,250,104,83,36,127,193,188,120,80,184,140,247,113,103,177,71,201,13,10,43,51,220,160,33,126,246,83,219,173,190,136,211,204,171,164,241,37,215,171,206,94,30,37,92,182,85,16,237,88,239,66,171,227,150,132,110,106,53,175,208,41,105,67,209,195,190,80,31,77,73,105,160,136,204,40,185,227,71,52,67,15,220,154,58,45,93,146,70,230,183,67,69,17,42,1,104,225,180,71,90,34,239,224,40,19,125,58,133,49,177,247,178,144,84,76,162,28,147,105,207,192,204,240,242,35,173,96,72,13,205,125,228,6,211,164,53,212,125,49,3,42,5,223,153,37,114,15,93,117,168,176,253,179,221,196,82,24,27,147,101,148,31,119,79,140,177,47,6,75,60,42,1,4,103,123,119,189,158,212,79,51,98,34,14,108,20,247,31,212,40,96,249,49,112,61,182,155,158,178,37,245,107,229,29,222,211,73,153,60,130,201,172,84,197,143,81,108,236,96,51,149,67,61,124,31,145,172,4,119,201,210,145,206,194,215,64,138,103,132,106,192,142,95,165,127,80,231,221,223,250,251,133,99,53,98,14,49,17,238,95,142,120,51,62,7,8,69,170,181,28,82,164,170,190,26,79,204,210,132,120,112,155,111,183,130,122,160,104,186,32,129,64,154,57,109,171,211,176,183,254,249,173,235,191,33,190,132,92,126,167,234,166,160,138,68,74,19,60,180,14,94,202,136,191,92,239,242,223,24,30,117,73,149,20,203,136,55,114,228,106,106,136,254,223,143,66,168,223,5,63,55,158,137,218,152,93,27,175,149,93,156,33,128,198,31,232,211,137,210,247,131,198,236,71,66,185,126,207,134,219,216,223,53,161,184,179,43,195,186,189,88,111,19,15,199,141,13,10,69,138,146,54,221,56,207,239,27,95,217,157,54,198,76,103,178,38,33,76,210,78,35,109,33,133,168,61,199,193,125,225,250,123,94,244,168,41,115,154,169,158,44,77,242,47,122,151,37,201,143,241,239,73,122,217,223,78,35,160,127,108,14,19,33,124,226,187,206,163,171,238,119,25,209,64,55,183,174,255,90,140,210,161,79,150,39,12,37,117,1,13,223,248,84,79,227,253,183,178,145,148,56,250,46,130,198,16,32,206,79,83,182,188,8,159,53,14,51,220,247,87,206,138,227,15,200,126,47,82,25,131,238,72,74,174,155,23,128,227,3,194,129,118,12,183,1,26,225,69,66,151,116,52,231,212,235,248,71,232,155,157,127,228,128,164,78,86,3,113,236,216,34,128,245,171,71,48,224,103,239,29,210,69,142,103,229,213,166,136,203,89,55,110,70,219,234,127,109,1,164,247,154,27,189,143,116,22,100,121,206,99,215,158,160,33,174,63,151,135,52,211,43,74,240,128,60,25,61,88,75,64,18,122,53,23,255,49,161,138,19,190,148,182,57,182,0,176,21,151,93,191,37,250,99,55,7,119,225,212,170,239,56,29,164,125,47,228,83,178,61,251,236,12,66,122,39,70,81,151,44,211,45,106,236,104,143,2,35,52,176,204,27,30,32,254,90,206,47,245,184,66,138,128,50,48,116,84,91,187,102,233,160,106,160,122,99,95,199,127,152,193,179,163,111,223,182,235,181,152,193,34,216,23,14,164,102,74,83,19,73,108,112,90,209,255,127,140,238,158,76,210,66,172,29,110,95,234,240,86,101,96,95,166,244,246,105,25,199,241,123,196,206,219,115,108,70,232,232,20,177,41,195,88,4,14,168,178,188,216,124,83,125,122,114,234,92,205,50,47,113,51,54,13,10,238,16,140,183,136,174,241,144,119,203,254,222,4,36,215,73,13,10,155,156,9,90,165,32,139,46,177,123,224,11,41,50,209,91,229,123,15,192,51,43,156,7,24,253,222,225,236,152,253,89,45,159,244,82,6,168,197,254,56,147,217,33,227,101,120,96,97,171,62,63,62,236,171,88,238,165,218,255,2,117,143,183,172,189,143,190,219,94,126,210,90,25,205,46,128,48,184,182,6,112,249,25,176,239,13,15,119,212,38,252,34,137,68,70,90,140,193,71,229,254,104,64,7,197,150,31,35,80,171,56,224,49,179,119,136,173,208,117,201,154,77,133,23,57,75,95,0,125,147,191,125,79,110,38,208,202,22,129,142,27,208,21,201,81,206,234,68,74,248,54,243,229,78,90,113,125,21,66,98,226,233,76,19,172,36,102,112,198,230,162,204,245,87,74,187,117,42,112,245,76,54,220,147,138,28,209,147,173,137,139,219,191,251,6,134,7,122,13,118,185,110,224,42,164,94,211,227,241,215,216,114,101,21,213,220,194,150,237,30,170,54,180,54,185,64,77,242,238,30,223,203,7,98,227,201,195,179,169,113,59,72,95,39,110,106,220,40,63,179,26,143,12,142,48,177,44,159,176,27,194,132,143,43,135,231,106,147,74,213,88,63,204,176,190,32,119,191,104,5,231,191,162,179,34,99,117,194,193,197,126,88,248,60,133,204,57,64,104,167,121,134,18,220,71,252,66,15,16,166,19,31,11,181,41,200,199,241,206,114,90,156,45,99,16,129,22,179,244,134,6,107,244,65,190,101,88,13,15,115,87,179,146,3,65,74,210,225,237,197,222,63,139,200,158,53,212,11,191,67,67,221,127,121,79,113,194,59,177,245,68,220,61,247,27,39,30,161,160,73,54,72,28,6,219,165,142,12,20,163,180,199,101,49,30,111,154,82,93,218,112,252,211,106,80,14,149,146,162,208,154,114,79,88,177,189,203,159,107,238,34,2,197,195,75,212,218,180,253,163,113,178,99,198,56,11,170,133,136,112,37,177,179,248,46,224,44,185,223,13,10,53,143,70,145,49,204,106,124,125,16,144,24,73,152,92,192,82,52,205,49,61,165,112,147,194,176,83,57,234,74,51,239,203,174,124,111,234,110,131,182,117,230,40,170,233,238,4,217,58,160,80,2,219,223,172,62,196,57,19,71,65,211,181,131,46,197,155,46,213,76,220,1,13,10,179,242,247,117,207,250,70,167,241,173,20,139,133,18,44,237,128,199,27,218,54,9,214,70,222,79,207,166,238,165,153,154,45,114,83,162,162,147,91,129,144,234,57,253,139,139,35,51,123,59,163,210,183,178,140,151,75,220,186,227,206,35,116,33,67,191,116,78,109,59,250,12,107,13,227,163,41,174,73,151,44,220,42,90,84,207,237,212,195,118,34,58,230,251,17,86,109,52,107,231,28,77,148,46,71,204,5,135,187,29,253,245,212,219,210,192,219,68,177,64,74,163,101,45,44,73,203,0,119,157,252,179,185,114,58,108,212,96,72,177,197,214,253,28,98,100,217,193,206,142,85,183,245,49,76,42,212,118,77,105,13,108,111,103,200,12,135,227,186,24,49,135,110,70,2,194,236,205,250,63,193,245,227,134,48,49,108,244,177,167,140,140,25,1,42,124,66,249,85,115,96,116,117,138,80,148,159,127,229,111,242,12,117,0,127,0,239,137,22,121,8,36,107,99,106,73,157,16,103,190,86,13,213,56,152,44,11,67,45,206,37,21,13,156,245,27,62,43,55,110,66,139,236,19,85,212,45,52,24,253,216,205,207,21,50,19,251,167,124,2,17,174,175,59,181,191,157,138,236,170,43,233,252,34,191,89,171,4,185,184,114,117,112,3,58,49,199,150,248,24,37,145,169,114,235,240,27,15,88,178,124,218,36,220,77,62,190,150,20,181,57,111,63,171,103,96,183,164,122,187,40,198,57,220,118,117,226,127,137,132,187,7,173,55,11,230,49,238,230,198,191,249,3,242,118,70,165,177,43,44,159,143,194,68,110,214,210,154,251,227,77,82,160,181,170,12,210,92,21,230,84,22,3,27,185,31,44,249,168,66,220,182,220,119,86,66,61,253,24,125,98,78,227,252,179,236,163,189,158,100,204,213,41,58,78,214,42,178,94,240,211,244,101,61,148,221,74,18,145,62,207,88,25,177,153,45,34,129,12,246,72,148,157,38,191,75,117,46,29,143,112,171,66,64,205,196,163,7,144,169,143,168,167,184,14,142,186,190,52,63,218,235,164,26,16,208,85,76,37,1,130,208,75,234,205,204,220,251,111,119,155,136,146,111,237,113,22,238,188,159,158,14,105,16,211,179,164,128,120,90,33,23,49,75,240,107,210,34,86,186,170,182,106,44,228,187,13,10,77,88,91,45,82,248,172,55,68,93,120,251,161,134,15,229,148,187,218,18,7,199,44,247,163,125,20,165,234,155,149,3,39,151,113,175,156,116,189,115,117,229,81,114,173,246,216,171,204,82,95,27,177,153,248,37,89,97,208,117,2,12,13,10,198,171,244,190,13,10,230,94,33,35,250,241,201,190,179,56,50,224,141,242,139,14,37,233,220,109,200,184,105,101,153,140,37,156,62,29,208,89,150,192,48,189,32,54,128,88,141,221,104,13,227,252,125,205,107,221,50,158,198,121,89,126,68,8,210,72,214,16,119,139,194,134,142,154,163,255,177,180,11,141,56,145,205,3,231,38,177,234,29,126,110,89,21,125,240,189,216,90,103,179,92,92,230,113,172,89,93,149,251,90,153,6,215,62,36,229,224,76,110,208,137,116,113,99,88,92,122,137,89,106,55,239,170,202,106,126,239,199,148,252,101,128,11,231,159,94,8,36,175,176,196,48,48,179,189,179,66,169,180,240,84,99,102,217,63,43,54,153,141,237,184,90,140,225,134,167,139,179,47,180,132,202,190,134,116,218,250,5,218,189,161,128,251,195,142,170,132,212,227,123,77,23,231,113,122,41,35,58,41,110,149,239,38,176,75,205,224,192,25,111,150,189,222,174,111,235,198,14,158,240,111,161,47,170,22,218,224,23,141,4,82,124,89,108,53,171,49,18,92,241,123,35,174,182,143,132,13,161,70,82,5,228,130,250,161,115,136,246,61,24,200,246,86,186,148,161,168,232,199,75,168,176,187,200,186,69,77,59,66,232,91,188,191,141,34,251,0,139,232,110,157,210,44,149,209,60,240,164,113,194,7,178,37,164,34,98,101,214,140,138,170,23,70,228,238,234,102,127,95,106,234,104,253,204,145,222,138,189,136,51,134,210,161,168,222,123,121,83,93,178,175,248,60,19,175,64,228,111,174,31,146,41,233,160,123,80,75,58,209,163,207,217,36,192,183,176,248,12,89,217,207,205,0,25,177,11,248,0,4,1,21,91,182,33,69,213,97,24,179,222,40,250,90,152,13,10,156,90,161,223,219,124,153,33,215,33,69,253,100,250,98,60,247,248,33,34,158,47,86,66,166,110,245,33,243,215,62,17,23,97,238,224,70,56,235,217,51,243,177,175,207,154,20,205,248,227,154,149,108,27,173,83,60,201,189,176,193,93,254,170,225,64,50,131,144,121,171,85,42,214,71,104,88,38,172,20,81,149,87,108,24,79,205,174,68,252,82,77,116,211,75,91,67,187,152,133,184,227,240,237,19,13,10,112,135,96,233,38,80,248,104,104,33,64,68,121,168,138,177,108,192,250,46,213,187,44,211,188,192,179,187,195,118,68,236,132,107,95,160,141,83,58,75,58,115,13,212,182,233,65,113,82,107,41,183,248,157,5,1,172,205,111,247,13,10,32,69,24,119,253,92,15,13,10,214,145,81,190,13,18,117,2,219,99,132,27,41,233,108,179,205,240,11,162,228,212,60,73,75,226,217,115,25,160,0,157,163,17,44,167,7,19,172,24,86,47,142,31,8,199,135,237,209,52,108,15,67,193,4,93,63,181,198,124,164,148,143,26,75,59,18,13,63,140,240,170,24,167,230,66,197,227,191,56,233,96,242,7,133,154,146,46,77,249,12,57,160,210,19,170,97,179,30,125,56,159,108,110,213,37,161,181,8,137,19,19,79,184,103,2,145,230,36,98,44,30,51,101,232,89,37,245,139,104,204,85,3,138,29,223,227,11,110,28,127,145,19,137,17,98,33,121,189,34,148,170,238,59,70,187,20,18,113,225,30,5,154,190,103,62,29,124,118,87,126,225,234,126,153,28,136,161,145,202,26,152,122,44,237,59,232,199,11,197,249,178,99,183,86,114,30,30,62,42,133,12,70,130,161,106,123,70,16,120,13,10,43,222,217,218,39,60,183,68,60,181,154,109,122,1,89,194,84,1,44,75,98,49,255,242,56,206,78,17,239,249,33,65,54,110,140,37,207,168,200,175,12,128,168,9,173,181,98,51,237,32,93,232,176,12,35,58,29,102,108,8,32,66,68,192,240,210,37,227,140,133,52,79,146,71,225,172,89,212,101,183,65,9,186,24,253,4,73,18,49,90,58,181,140,128,124,34,163,226,240,125,221,76,120,197,31,78,104,241,168,90,26,180,125,24,13,10,227,115,148,49,110,229,19,227,47,139,58,148,22,191,150,72,213,85,103,145,229,212,253,227,209,249,241,228,160,19,92,100,157,227,231,48,137,51,219,186,184,64,245,231,172,168,47,150,38,25,104,141,157,146,252,16,240,26,181,228,97,104,155,22,61,232,83,8,105,167,51,237,237,17,60,27,75,213,6,99,243,78,47,18,237,53,121,124,198,69,127,144,69,111,213,210,79,102,203,192,215,58,92,1,162,24,146,81,143,255,9,163,28,93,13,10,105,40,58,103,31,208,237,13,10,169,189,143,91,144,0,224,222,93,70,231,81,3,82,196,90,102,59,65,141,95,95,249,239,50,8,132,23,224,92,102,134,40,109,209,65,49,110,190,244,139,187,177,26,127,217,123,254,170,228,40,38,62,194,200,82,242,72,147,92,23,73,105,176,67,103,19,118,163,233,254,249,212,119,204,120,83,61,108,110,237,82,73,69,78,93,112,206,59,40,132,221,212,15,158,112,121,172,132,13,10,89,186,210,119,13,10,4,167,70,37,227,252,95,96,158,144,63,235,166,22,85,77,164,36,59,179,137,53,27,85,146,58,113,50,176,70,95,228,189,242,147,71,176,145,227,221,121,14,73,249,171,34,239,196,23,69,130,153,72,121,242,214,203,92,15,203,124,7,93,74,211,92,161,92,80,205,5,181,18,80,40,251,1,177,13,10,148,110,71,144,126,231,223,238,152,22,164,186,172,245,140,108,38,117,134,89,41,39,187,66,247,152,33,92,7,203,184,112,89,0,208,13,10,108,183,113,224,181,3,148,48,127,90,252,14,105,107,174,124,235,39,88,37,207,75,210,114,205,200,62,76,146,193,167,75,164,228,159,54,182,101,242,37,88,229,11,242,80,141,71,208,13,10,61,177,118,208,116,169,122,195,132,191,145,47,21,161,29,121,161,216,52,118,95,75,166,120,192,13,10,205,155,169,242,254,211,186,13,10,130,74,118,185,21,148,252,87,81,118,103,162,138,182,236,179,112,169,201,158,121,166,193,226,106,192,81,47,164,85,17,161,136,222,167,98,172,219,59,76,29,0,35,133,69,205,143,102,132,84,68,185,56,155,51,134,205,26,74,153,40,193,153,188,144,56,149,180,15,122,71,112,17,123,168,137,148,211,176,189,168,41,24,172,76,101,122,69,98,107,207,179,194,45,163,133,93,55,116,247,80,81,179,215,67,175,239,217,215,89,20,12,149,9,215,202,182,132,151,160,159,42,199,133,111,250,11,239,209,62,116,188,197,227,221,142,215,240,181,243,26,212,80,104,40,75,224,137,143,68,101,220,19,191,23,228,173,105,226,184,228,144,236,38,112,225,132,171,129,177,233,102,99,206,223,149,51,37,124,190,203,41,235,242,112,137,246,71,143,23,209,42,185,62,82,31,138,49,195,246,49,209,141,211,80,106,0,1,158,134,97,18,166,35,159,229,187,218,241,94,136,193,254,200,119,168,189,141,29,2,3,143,40,21,154,123,24,252,4,217,21,5,59,132,169,209,168,86,140,68,172,27,37,172,227,219,233,19,65,11,195,64,241,50,0,224,88,146,189,35,239,215,136,139,160,248,161,159,113,176,37,203,160,95,28,82,216,78,122,249,60,255,122,238,230,105,44,8,174,196,74,58,228,70,226,112,72,180,223,241,103,164,209,39,4,147,162,140,132,231,47,140,145,91,217,92,182,125,94,7,172,133,94,240,103,80,34,80,113,118,78,31,133,164,106,98,176,119,143,160,209,110,223,59,183,20,197,160,226,89,174,199,28,109,155,248,8,53,107,206,114,25,172,230,188,135,80,101,137,3,213,139,167,125,120,124,65,48,225,46,254,221,78,173,201,220,246,7,88,202,79,109,24,4,211,110,62,141,204,228,81,82,37,53,190,13,10,19,98,49,178,139,96,202,114,133,217,87,60,241,37,153,26,7,225,185,183,71,176,194,127,129,109,253,211,145,196,70,16,181,142,87,91,65,94,114,46,75,41,131,208,91,25,82,232,120,164,172,22,102,201,237,97,61,228,111,207,20,139,20,222,195,128,177,31,128,97,243,222,56,185,32,21,135,138,80,76,218,18,56,103,157,179,25,17,254,130,160,184,212,139,140,27,114,88,175,221,24,38,25,102,174,66,185,48,121,233,251,166,131,169,87,24,143,9,106,158,33,155,127,237,231,191,213,95,76,229,174,60,87,245,173,115,20,39,138,23,133,142,182,135,102,178,56,60,105,222,98,12,244,80,64,147,110,157,46,19,23,237,74,113,28,163,45,169,52,209,224,13,44,84,121,43,215,114,13,90,84,57,117,142,46,147,7,201,66,85,248,227,59,232,55,244,55,104,200,92,47,240,119,77,254,24,161,243,203,77,133,68,228,170,143,199,42,236,184,1,223,7,95,34,119,61,188,140,122,236,86,53,188,71,80,208,162,57,35,7,218,214,187,245,132,208,101,119,77,252,7,37,212,197,111,186,53,110,218,148,234,149,56,99,159,1,189,248,229,150,63,198,101,192,21,154,49,23,227,69,172,177,235,106,74,54,153,197,76,240,150,191,54,151,130,200,235,246,45,228,35,200,35,91,77,179,255,89,207,19,12,111,156,133,105,18,2,36,65,148,109,112,59,175,247,72,72,207,11,187,22,237,249,61,3,81,222,141,154,114,64,211,66,154,228,241,38,139,227,174,85,57,131,196,21,207,196,50,38,251,92,129,63,23,47,68,9,34,231,60,255,190,66,1,173,214,79,1,195,127,252,54,233,183,70,184,84,102,86,102,73,252,113,187,45,182,248,138,18,65,233,176,114,152,13,19,107,216,186,249,190,48,252,248,110,90,102,230,77,175,152,240,51,121,141,143,12,25,219,74,163,222,115,0,153,107,17,41,44,123,182,123,136,235,61,189,154,156,92,43,159,55,225,61,124,28,141,102,230,223,33,42,178,172,125,222,88,186,88,151,191,58,110,74,96,126,241,172,0,176,98,188,173,13,10,32,218,141,208,85,119,38,73,107,183,197,81,55,243,115,83,28,98,15,247,130,45,13,44,218,142,196,170,43,92,112,160,29,57,190,117,164,14,126,125,212,134,137,5,163,88,70,31,212,81,214,80,166,196,131,103,220,182,13,95,136,68,37,180,196,234,184,71,73,100,104,16,200,41,146,77,238,74,143,219,73,224,132,208,19,3,126,47,159,167,238,252,212,171,140,115,21,121,31,110,119,195,172,116,154,206,98,22,174,85,87,108,43,127,97,56,199,209,9,64,200,5,190,54,196,136,239,165,68,39,105,17,138,251,186,54,254,120,172,178,183,2,236,204,68,165,222,63,32,235,13,10,108,58,62,233,71,232,254,226,19,240,52,173,178,25,91,132,205,250,8,144,99,234,239,94,72,149,131,196,46,148,117,204,93,250,237,59,144,170,196,248,9,207,159,229,42,104,165,47,87,195,41,183,213,177,145,187,77,117,3,136,57,128,17,234,248,17,22,207,130,16,42,243,32,201,42,143,69,35,248,8,210,8,206,254,28,215,196,193,227,106,240,48,40,220,123,207,97,41,232,46,190,50,140,98,232,184,81,119,91,180,219,185,147,20,188,75,12,75,74,6,104,214,232,145,244,181,202,254,227,204,167,9,181,14,251,220,99,166,228,240,182,69,194,65,41,86,126,74,169,118,254,223,40,90,190,193,178,26,148,225,171,225,64,245,79,22,5,160,92,61,67,42,49,111,233,47,116,46,153,13,22,57,98,136,168,18,169,149,17,20,216,203,104,142,233,75,124,73,119,227,152,226,79,13,163,103,70,16,222,107,131,74,223,59,160,211,36,163,149,133,127,31,107,97,50,81,218,114,229,87,224,181,1,86,107,64,166,186,47,195,62,50,125,231,238,110,198,48,99,112,254,137,209,6,139,110,33,211,253,22,198,67,231,94,141,174,249,226,29,76,77,26,213,235,194,11,89,164,236,141,72,113,170,246,26,251,230,18,73,185,167,201,140,177,23,19,247,87,189,124,196,149,233,144,200,244,192,47,22,118,67,34,111,199,188,81,155,106,209,60,16,141,15,207,96,17,82,98,17,40,113,73,23,156,179,163,101,190,171,217,86,152,139,116,39,166,201,158,49,56,207,202,148,11,217,161,0,204,66,41,164,227,147,148,241,49,112,224,32,240,32,29,62,18,253,135,51,219,32,214,66,147,151,22,47,168,12,246,81,141,247,50,147,252,247,19,192,113,143,76,238,137,142,68,88,210,15,202,189,125,241,213,21,22,13,234,142,230,87,186,35,185,207,160,75,119,233,115,94,168,162,134,48,244,181,156,108,12,136,4,84,216,49,99,39,109,21,164,76,84,149,78,13,176,26,185,72,229,212,61,195,217,195,81,136,181,152,95,144,211,131,110,152,57,28,177,88,224,119,223,169,106,198,50,124,255,16,9,139,11,208,37,28,63,141,107,82,163,13,242,5,126,231,231,239,71,109,240,141,169,79,109,114,5,219,70,28,89,165,55,70,41,93,151,36,83,211,82,89,174,88,233,200,74,186,92,231,142,220,157,195,163,187,191,154,132,118,254,211,220,127,176,202,238,164,30,79,145,51,223,15,111,223,202,3,252,13,10,9,41,184,201,170,228,113,48,110,143,93,106,74,207,250,249,202,208,84,186,19,31,149,72,13,156,57,172,88,125,119,42,66,165,235,104,4,225,148,144,52,187,39,151,210,109,175,209,120,105,191,203,110,247,235,200,101,52,207,196,114,133,13,10,56,126,99,13,10,223,31,68,239,48,48,65,74,4,61,26,71,11,66,67,223,143,79,33,103,173,29,65,252,70,79,246,162,221,233,70,164,92,64,178,45,251,208,214,149,228,164,226,60,51,223,53,166,49,49,213,44,234,73,195,139,108,42,247,255,134,97,24,143,173,7,193,185,182,13,10,138,189,140,88,101,74,108,127,21,105,9,87,68,182,181,234,173,235,185,187,132,243,234,137,105,22,153,19,45,85,11,3,95,41,13,152,208,145,45,115,59,73,83,184,76,140,12,227,106,132,163,25,215,62,214,154,218,71,16,226,161,14,13,10,213,146,23,199,22,142,217,219,185,158,82,219,175,144,78,90,178,128,18,43,125,146,148,151,13,10,216,240,197,2,84,11,21,219,58,124,146,190,0,76,210,172,127,182,113,167,96,2,202,212,114,231,94,225,136,207,189,106,82,150,178,181,186,254,162,75,226,61,243,44,55,54,153,243,150,64,206,221,132,111,13,60,23,156,176,46,28,219,238,135,252,13,10,100,132,5,16,211,83,63,123,115,201,92,108,210,92,244,109,83,220,143,117,22,110,42,142,84,187,216,42,245,50,197,25,195,229,61,213,198,84,78,151,55,48,1,33,254,12,99,212,55,60,201,68,253,186,148,55,54,161,4,198,87,192,191,232,76,6,152,82,65,225,28,190,172,172,112,193,55,138,179,11,165,211,165,201,63,4,176,98,111,90,14,5,94,252,30,216,114,9,0,230,212,164,145,76,125,6,48,233,237,14,107,249,138,114,235,147,129,163,217,62,114,0,116,47,182,91,174,40,133,34,18,114,190,236,190,123,36,119,95,68,189,201,163,112,142,132,187,105,23,50,175,31,57,247,36,61,96,12,247,238,155,37,197,162,165,43,15,26,190,14,106,152,69,144,199,228,48,204,252,133,36,250,127,30,32,201,46,225,13,119,99,208,150,181,183,146,212,8,108,141,210,186,254,161,90,209,154,183,84,192,138,47,129,25,205,7,51,195,61,71,234,29,132,121,79,196,122,47,131,67,154,196,166,94,174,117,37,222,135,69,178,151,27,238,129,22,134,7,62,85,177,135,8,148,94,4,69,214,149,222,218,171,86,245,170,31,162,155,70,87,95,153,91,246,4,252,69,174,93,192,67,17,149,44,204,222,60,153,226,250,104,112,79,196,115,8,173,210,252,63,131,203,99,178,184,115,194,19,235,46,15,35,84,141,229,43,57,8,205,49,71,50,19,201,235,100,85,14,225,144,138,179,194,241,52,1,77,243,60,52,83,108,23,216,18,144,106,244,156,117,80,144,78,89,144,46,219,81,83,211,232,110,100,158,55,41,64,233,34,61,50,149,204,222,8,7,201,89,86,91,84,38,202,27,169,89,221,58,100,182,53,122,7,137,222,84,115,186,17,117,214,122,83,217,219,150,141,150,130,254,189,76,42,1,207,40,230,189,126,90,20,17,244,136,249,188,87,29,224,33,0,61,152,141,232,49,163,214,241,229,31,174,204,144,2,155,82,123,239,213,157,168,67,229,139,169,244,208,172,71,215,158,145,197,108,196,140,90,208,7,89,17,223,44,127,116,195,130,111,167,220,171,111,102,244,146,58,25,228,56,157,196,232,240,162,0,72,36,72,42,74,76,185,111,164,49,210,81,165,31,3,82,88,185,13,140,227,101,25,20,179,201,217,85,183,127,54,178,206,3,248,203,221,7,147,241,242,235,113,22,242,64,53,243,51,243,209,166,9,122,26,235,113,5,70,160,156,155,171,238,40,129,235,68,160,156,210,209,146,81,202,128,68,183,140,243,28,109,138,206,131,197,88,0,191,92,59,16,65,166,84,190,118,174,39,32,178,41,0,49,94,13,10,210,233,51,190,153,69,228,126,108,166,183,71,122,148,204,149,130,39,78,92,137,74,236,209,181,68,133,107,104,199,44,87,78,80,96,2,81,149,69,50,189,158,192,13,10,174,20,107,177,4,141,252,13,10,6,255,232,162,242,192,162,128,122,105,84,180,85,190,7,140,40,155,90,242,28,223,45,238,3,104,182,184,133,144,237,248,19,87,195,204,78,227,22,82,60,28,15,110,220,227,57,58,90,202,218,252,86,220,101,101,239,85,75,140,203,222,246,149,67,133,22,91,134,71,175,140,124,242,103,132,93,212,46,42,141,244,147,245,111,83,69,0,199,216,33,73,202,33,198,162,148,78,201,28,23,48,198,61,67,41,229,15,190,66,80,129,22,222,176,33,117,58,187,100,171,117,44,69,224,13,10,214,151,217,156,13,223,240,158,175,170,141,185,24,159,90,231,253,76,252,88,249,9,141,15,103,236,196,137,113,74,125,118,132,232,91,2,192,165,184,213,152,239,50,167,145,55,225,26,18,200,193,76,252,192,189,160,239,250,47,44,35,152,176,205,213,234,252,9,102,177,204,108,176,170,81,242,37,253,37,196,153,73,254,159,120,177,137,254,105,142,79,211,127,117,91,30,154,209,45,128,126,22,203,253,103,30,55,73,77,220,64,118,48,219,119,240,113,86,2,59,91,71,240,164,121,155,150,73,2,140,86,2,22,117,13,10,106,124,137,199,195,204,13,10,47,173,32,17,19,172,177,142,176,186,49,188,233,176,99,26,188,150,165,132,244,212,247,140,13,112,130,247,67,232,153,177,192,18,236,236,49,228,153,150,62,187,189,251,151,217,44,153,229,99,200,233,93,141,55,2,228,237,129,105,137,25,30,204,70,209,85,194,133,189,189,252,123,40,60,41,176,229,200,0,52,93,212,11,204,192,122,189,255,23,62,21,150,23,7,52,163,217,29,137,37,9,224,138,148,143,193,39,226,197,222,82,87,120,178,253,15,192,132,22,38,248,30,37,192,222,116,115,250,98,116,39,239,14,106,32,227,145,36,140,217,207,49,0,32,155,177,115,213,109,175,140,69,42,56,143,48,216,217,97,82,118,228,118,32,172,193,148,49,103,64,74,174,178,254,105,108,54,72,158,33,135,129,135,223,1,180,90,136,143,52,4,94,97,17,74,73,70,226,156,22,162,3,109,119,137,184,228,108,36,55,117,79,177,2,124,189,16,90,138,92,177,182,239,226,182,96,220,201,123,67,199,43,8,198,51,249,104,187,84,153,110,232,69,43,138,217,59,46,115,168,237,70,225,225,115,230,247,196,81,187,204,221,86,232,60,167,174,232,52,208,250,18,164,89,212,114,193,90,83,161,93,215,83,249,60,37,115,30,157,101,56,32,251,62,234,153,87,122,170,134,118,28,185,188,180,176,64,13,10,167,248,255,67,57,196,240,190,56,128,94,47,26,70,133,49,154,173,26,136,37,50,183,223,150,36,131,214,236,154,71,184,174,17,8,69,19,244,152,22,202,175,77,236,170,112,70,0,49,231,255,159,187,193,63,186,60,18,182,58,236,50,133,183,70,127,188,57,156,230,88,32,167,189,2,56,243,20,253,21,177,249,176,210,138,94,240,67,229,178,122,164,179,231,67,79,196,13,10,146,60,91,35,222,190,233,97,58,9,196,142,187,5,184,16,108,155,95,206,255,122,169,56,113,251,144,1,107,215,42,232,197,155,205,95,94,142,145,47,175,24,148,144,111,252,188,192,254,52,166,127,43,9,5,197,103,64,133,129,5,212,142,165,245,226,237,226,156,89,106,203,133,166,12,90,108,5,133,4,129,47,169,15,176,82,17,203,109,230,217,93,0,152,192,203,205,143,211,121,81,222,17,161,103,80,219,19,50,62,180,185,97,164,219,249,59,174,50,50,71,29,101,74,78,59,122,13,10,159,200,118,134,252,34,200,155,6,243,237,93,127,174,93,6,21,179,52,167,254,91,149,203,3,199,72,178,240,45,203,221,37,60,148,66,67,17,88,130,49,142,75,116,218,92,76,90,198,99,189,206,149,128,63,103,65,207,80,67,43,28,85,100,16,125,208,94,224,182,183,173,17,32,128,252,101,196,128,37,61,56,178,165,203,8,107,200,250,46,54,46,53,147,212,240,112,203,22,238,12,253,227,197,12,57,213,104,157,44,245,205,86,87,128,70,65,216,82,94,220,54,235,159,171,129,159,245,73,39,15,22,167,79,110,187,216,169,121,34,174,185,153,130,223,240,93,50,35,34,45,4,252,154,156,56,93,178,70,244,20,73,83,42,27,233,4,26,100,107,205,114,244,211,162,230,130,13,10,131,41,44,125,71,72,65,16,204,98,241,78,92,8,205,66,175,131,247,188,45,100,160,149,110,14,189,112,21,186,122,163,188,236,15,205,88,133,48,138,245,9,174,212,2,241,57,108,122,37,228,126,178,89,32,207,232,143,149,183,255,102,214,213,13,10,158,239,194,214,111,61,19,146,204,18,203,162,99,120,240,90,83,164,196,125,68,184,0,108,106,163,25,49,189,143,68,44,19,160,194,30,72,197,134,138,28,39,90,62,132,173,95,39,162,201,255,225,110,216,234,125,43,55,37,226,252,49,176,125,251,233,191,4,160,125,200,34,134,25,120,80,119,217,145,55,180,247,205,229,122,167,73,12,194,88,194,178,209,196,201,32,243,63,209,85,166,253,27,199,156,38,84,139,230,157,142,47,80,229,47,67,118,15,213,34,252,96,90,179,86,160,225,184,139,210,166,218,212,253,152,30,89,6,61,199,107,234,86,21,146,102,4,37,206,57,80,161,168,174,34,168,35,4,188,30,160,84,42,148,53,40,119,58,85,180,219,160,26,36,171,52,251,69,2,29,151,153,191,41,101,107,45,112,137,130,199,15,104,181,148,37,148,217,231,217,196,184,252,125,22,243,31,167,218,5,32,159,75,50,199,91,46,244,209,203,72,91,248,51,57,180,221,74,59,6,181,97,120,13,171,219,149,144,36,32,77,27,16,194,26,245,181,60,207,17,87,106,91,237,73,65,83,5,30,198,252,137,107,230,150,96,13,238,120,6,31,102,31,160,13,50,2,12,190,238,218,177,142,67,45,199,133,250,200,176,127,71,208,197,172,13,101,83,245,98,142,181,96,144,40,6,212,19,43,186,110,12,34,0,48,96,234,69,212,55,64,38,208,0,158,35,27,231,158,148,130,153,7,108,58,2,13,60,207,138,150,230,245,183,129,2,125,117,73,11,16,234,100,6,118,146,204,23,66,41,95,240,30,23,59,211,217,47,237,179,165,37,110,129,52,27,96,137,25,228,251,144,53,57,3,114,213,96,132,155,240,19,77,181,125,67,226,69,249,114,106,141,59,241,110,220,54,201,148,87,114,156,194,30,176,214,54,179,147,137,13,81,198,150,182,35,76,4,212,167,9,189,216,72,23,76,38,222,58,16,41,13,10,231,227,224,224,13,10,214,127,44,71,192,151,70,93,79,159,183,42,226,205,120,23,129,216,118,204,79,173,143,77,211,36,135,72,28,18,88,178,114,185,69,118,33,104,13,103,160,223,222,112,91,146,222,76,144,39,162,21,156,243,149,209,81,140,31,185,112,250,86,108,62,172,203,229,190,187,198,126,234,38,176,28,140,62,118,60,163,64,32,84,78,179,239,182,21,225,132,40,125,0,91,245,19,216,63,80,89,180,81,24,73,80,188,51,114,92,211,131,146,31,17,1,38,58,248,246,138,229,40,240,184,253,88,178,63,244,227,51,119,255,76,212,43,123,184,98,196,242,76,243,91,120,193,160,106,89,145,9,43,231,13,10,251,231,99,217,136,88,76,168,226,122,69,242,2,234,118,197,187,173,117,235,168,74,142,104,119,1,210,255,166,235,219,139,137,47,224,183,210,246,187,34,169,230,61,1,219,150,244,138,250,83,108,219,54,61,50,148,198,185,18,188,131,147,175,230,205,9,51,194,251,105,195,187,155,2,71,166,156,156,233,44,203,184,106,49,156,186,254,135,29,134,235,27,239,240,87,223,23,64,213,215,137,67,183,30,237,251,93,16,190,169,201,181,245,178,86,66,143,132,131,189,251,116,68,111,1,225,151,4,187,99,255,70,184,154,193,173,30,169,230,184,22,119,64,217,40,36,183,13,16,230,43,249,30,95,25,93,60,91,52,200,158,187,118,221,12,58,232,21,131,230,43,48,250,137,188,145,80,93,221,226,186,73,28,136,178,203,79,225,255,233,105,250,99,156,115,28,223,139,196,244,2,108,149,135,118,131,223,250,76,168,69,207,62,200,23,38,36,130,187,64,39,187,126,91,144,194,197,97,83,82,159,98,252,84,210,181,108,149,28,218,29,174,59,211,201,177,104,188,147,203,117,8,201,91,192,185,104,31,145,102,29,141,32,31,101,87,1,87,46,144,222,7,206,32,178,127,95,145,198,98,22,230,106,137,163,156,13,112,128,93,205,167,120,157,62,75,178,146,225,147,70,71,55,215,37,75,199,11,147,165,201,180,196,155,254,239,61,245,250,45,51,62,239,34,208,103,223,99,94,98,100,209,81,19,121,72,228,76,191,252,232,183,162,248,94,207,128,142,63,79,143,30,174,60,195,223,19,218,62,146,145,25,16,233,43,95,246,65,21,81,128,190,76,119,245,236,12,207,13,10,210,231,57,95,171,166,184,72,179,136,61,45,7,87,63,189,68,107,95,151,24,234,9,209,145,139,171,68,135,184,25,91,84,54,200,23,103,99,85,37,186,117,60,167,66,58,151,131,255,234,88,94,153,50,252,187,246,239,170,237,209,249,241,228,160,19,92,100,232,206,194,131,135,102,120,205,86,143,117,161,22,172,156,117,117,40,98,81,118,163,168,188,139,99,183,185,232,205,6,169,182,13,0,197,194,31,106,29,171,102,199,128,33,16,115,123,62,28,232,171,165,209,64,97,182,4,193,141,127,207,109,202,113,140,89,66,89,189,116,84,114,80,192,212,123,48,227,41,125,187,5,197,15,65,40,184,63,88,250,150,50,30,108,31,227,77,82,150,225,27,251,76,197,80,205,128,161,33,77,130,28,4,190,146,183,174,238,62,244,228,183,14,98,118,53,97,125,84,150,220,50,129,251,71,71,24,229,73,115,3,25,155,220,188,51,24,66,62,12,34,39,121,95,243,73,35,119,44,127,83,230,205,8,17,218,125,44,35,16,24,71,84,30,93,106,36,57,178,49,63,126,207,95,18,215,49,208,222,157,184,189,69,176,142,26,177,41,238,192,212,234,184,236,99,45,14,81,118,173,103,234,129,198,129,185,32,58,73,136,210,45,182,182,5,159,63,216,135,8,137,102,78,31,136,130,101,237,59,49,98,25,223,190,36,167,212,37,76,194,244,152,26,228,43,215,140,115,50,96,25,197,4,237,163,164,211,253,24,26,112,221,80,133,136,60,17,99,124,120,184,43,95,199,142,39,135,139,83,32,140,85,147,165,33,20,216,60,55,2,96,65,248,1,217,80,166,155,249,203,201,183,91,18,129,62,173,214,149,230,92,21,131,37,75,37,209,116,3,250,77,89,245,24,197,114,248,172,144,163,134,201,182,60,182,98,245,13,9,44,223,55,78,92,20,189,146,229,15,244,110,79,239,45,138,158,61,163,103,231,211,243,186,23,64,13,84,69,70,57,146,116,251,200,1,193,30,133,232,209,4,80,172,11,234,122,70,143,27,169,144,180,217,89,41,46,64,187,193,29,37,48,228,46,101,53,103,25,168,92,118,239,204,110,169,163,96,41,65,28,161,34,91,17,68,129,21,193,109,81,12,4,86,236,202,89,142,205,195,237,237,5,21,43,102,157,14,127,243,232,3,114,242,62,9,140,109,2,235,158,90,251,37,99,89,64,91,252,129,204,154,146,117,80,228,153,76,157,238,8,21,175,255,175,45,13,10,95,211,236,228,249,5,123,198,254,4,135,97,247,77,129,5,126,239,43,79,190,211,143,140,246,223,118,89,117,211,204,81,49,9,63,117,124,57,14,30,50,76,21,154,112,71,45,120,78,73,230,204,183,90,243,243,3,249,202,145,226,236,160,102,74,75,77,221,131,37,110,34,117,63,31,191,43,91,30,115,119,147,144,200,197,130,225,17,58,207,219,33,44,26,154,167,83,125,219,25,124,60,54,198,66,101,122,92,114,66,182,210,89,118,189,21,225,172,96,125,177,134,188,47,251,72,11,28,149,177,247,31,175,25,3,200,100,224,54,221,180,42,104,31,35,24,220,33,43,27,227,168,253,120,29,186,105,218,246,57,14,190,41,154,93,87,213,150,226,75,115,124,82,158,72,215,216,174,143,41,216,151,237,221,92,253,151,13,10,117,2,239,233,223,247,168,222,245,72,208,125,252,173,124,247,23,31,20,70,78,209,133,202,28,167,248,18,100,125,130,243,114,103,249,52,11,75,129,56,71,16,153,188,153,71,255,232,131,106,95,202,20,93,36,98,152,250,106,22,162,32,196,149,125,192,158,31,125,184,3,164,136,189,158,35,233,176,106,148,143,70,50,122,1,116,243,133,100,245,170,180,118,195,135,129,189,1,36,0,49,220,186,213,243,234,56,11,209,218,42,87,213,131,58,40,4,243,56,87,65,209,6,47,190,199,242,220,185,144,41,246,113,231,61,32,12,222,60,108,34,229,107,231,122,214,64,224,14,65,139,169,197,181,95,50,3,62,119,19,45,26,63,16,80,80,212,236,226,14,49,80,66,236,103,3,85,82,163,39,229,210,19,67,85,182,88,114,252,112,67,215,150,228,85,44,54,13,10,222,236,213,143,252,230,235,193,66,109,54,4,22,62,135,54,214,88,181,45,14,179,31,97,231,218,36,206,96,131,73,78,16,59,1,56,8,66,88,31,116,89,132,217,92,219,128,165,179,24,101,31,13,150,158,136,182,161,146,216,251,104,51,200,237,193,114,19,70,81,46,48,221,86,56,212,191,164,204,109,106,229,149,70,211,34,97,251,13,169,36,144,200,31,72,106,241,34,47,181,184,168,190,255,0,154,117,51,190,152,174,230,124,117,21,2,232,17,230,216,13,10,206,130,49,110,16,135,46,192,56,243,186,141,178,136,68,230,34,107,247,111,180,221,29,83,62,50,221,152,175,173,8,104,110,215,172,95,34,210,58,195,239,196,202,60,136,7,150,51,41,212,197,229,68,94,72,59,49,254,177,182,101,232,30,250,20,229,0,22,207,106,210,201,144,43,187,9,193,22,156,192,152,124,137,101,225,127,253,166,239,68,32,156,88,14,135,226,20,53,159,242,241,101,143,96,44,33,70,158,134,31,169,58,105,34,251,129,23,62,220,48,135,217,103,194,152,97,181,172,75,139,240,154,128,163,154,113,155,187,239,25,88,51,165,53,183,149,21,93,49,210,197,20,239,119,182,63,175,234,13,62,101,253,61,3,109,52,127,155,19,22,68,23,45,29,5,177,75,88,224,163,208,94,30,179,198,60,181,156,153,33,70,87,102,171,104,3,63,210,104,195,5,164,132,207,94,192,252,87,171,129,135,52,182,250,204,108,83,119,106,39,225,234,171,223,34,188,134,47,239,174,154,90,216,100,175,203,46,16,37,185,46,66,184,247,252,54,15,220,132,56,74,91,133,229,211,220,184,187,90,140,13,10,113,174,244,67,250,190,112,246,31,37,72,93,206,59,93,19,9,95,131,70,61,254,217,209,230,240,118,234,65,246,69,132,21,214,95,165,241,252,126,16,231,27,197,83,128,80,180,31,226,125,63,197,42,1,17,255,17,28,190,164,33,169,99,203,137,19,181,60,201,226,233,245,246,161,32,43,11,31,254,190,138,253,124,142,56,5,198,49,2,142,21,163,188,231,34,124,110,47,85,79,182,216,45,179,4,85,213,116,236,132,253,189,78,88,158,192,147,231,169,242,104,122,48,160,112,157,169,38,170,131,102,14,25,172,51,16,41,59,147,182,183,97,77,124,139,148,20,53,38,139,248,141,125,170,143,65,60,250,164,188,218,222,59,6,224,164,175,182,62,102,205,191,206,63,255,93,166,102,140,124,75,140,9,243,100,112,49,95,159,189,108,65,145,123,75,239,254,133,194,254,135,137,194,108,240,126,174,30,181,245,18,19,236,65,136,164,41,141,106,126,202,157,189,179,83,52,238,114,122,57,62,119,147,146,16,109,233,148,35,191,167,142,174,218,255,66,231,25,239,30,67,0,21,220,74,237,15,102,219,27,199,34,209,206,80,34,237,1,236,97,96,185,198,161,224,89,0,106,99,76,241,200,23,56,170,115,91,27,138,223,59,83,240,56,28,146,29,62,29,177,103,151,217,53,169,13,113,0,218,208,73,50,19,64,152,207,190,246,7,212,147,177,194,133,143,75,191,213,159,215,17,134,30,127,200,211,195,146,117,19,114,9,232,120,181,73,39,235,83,143,188,27,117,112,217,78,199,42,65,124,124,147,185,126,100,255,164,137,254,170,142,68,143,96,189,113,152,235,135,112,12,85,175,32,194,107,48,183,65,23,148,141,58,44,142,99,245,81,223,161,89,126,17,81,253,3,107,69,14,211,101,220,235,98,122,130,118,174,24,107,99,205,253,201,191,238,207,171,73,226,76,252,200,142,51,111,40,114,9,173,124,25,237,102,115,85,37,56,37,130,211,74,28,66,127,202,196,46,234,46,43,178,188,163,184,137,242,249,76,23,136,154,241,123,133,39,250,140,152,219,137,166,47,251,208,231,215,74,248,3,103,46,240,172,26,79,138,183,48,223,170,126,57,39,157,190,160,183,235,21,148,51,9,218,207,154,232,215,234,85,48,191,66,62,139,9,186,245,145,183,252,176,191,50,190,73,252,233,124,246,82,120,179,160,120,230,147,171,64,9,232,153,30,221,102,223,95,101,23,209,203,137,108,35,201,88,38,2,104,183,161,3,67,116,76,131,54,26,125,76,15,88,210,163,177,71,248,106,169,97,5,182,138,42,104,251,132,117,13,10,205,128,126,252,43,67,231,90,175,63,105,17,15,64,7,240,218,217,190,100,197,23,116,169,14,118,245,159,123,162,28,78,33,59,158,3,110,143,217,91,113,73,237,232,39,200,149,167,201,53,208,4,174,170,101,125,142,137,128,139,148,53,23,170,225,59,152,183,250,37,187,44,5,11,43,243,210,170,148,208,54,96,135,14,188,51,19,223,40,176,25,220,135,168,52,175,247,141,210,51,211,41,182,48,122,189,228,143,123,51,19,101,145,175,159,220,21,38,163,178,144,192,116,112,26,147,253,78,45,35,232,12,37,69,42,70,132,79,103,81,177,142,56,60,105,190,81,130,161,202,11,24,41,212,145,178,255,39,99,255,139,216,194,25,169,180,5,80,248,62,60,126,101,123,98,45,240,181,92,18,253,146,198,150,109,181,76,199,206,152,114,211,129,217,243,51,113,97,235,62,246,89,22,77,45,183,179,192,174,92,27,143,187,92,111,50,88,115,195,70,156,66,234,120,73,221,181,74,184,109,164,153,227,135,6,153,163,73,186,31,42,136,43,189,236,42,45,239,235,216,13,10,145,226,15,88,12,53,95,153,210,193,193,118,87,178,33,5,7,166,21,2,107,88,235,17,89,70,139,186,192,107,172,209,132,11,62,158,74,47,237,189,61,185,179,218,106,165,147,88,87,194,243,90,138,7,248,153,52,240,63,26,196,23,155,223,45,234,202,205,55,221,96,89,104,144,213,106,197,222,53,211,70,240,92,203,235,1,175,119,111,108,107,120,199,255,234,119,61,159,176,38,56,162,122,21,114,232,133,6,98,123,223,41,70,27,78,169,117,125,61,196,180,136,28,35,175,218,225,179,230,234,120,144,229,121,26,5,172,155,225,75,254,80,49,165,231,117,159,224,167,122,44,67,60,95,74,189,45,109,210,76,69,90,97,186,75,189,191,184,121,149,76,48,28,135,203,131,166,85,113,171,180,237,13,18,179,130,71,161,34,230,237,37,41,163,233,243,3,204,80,51,79,246,102,51,145,52,116,239,91,57,68,244,49,114,120,23,195,63,153,150,28,143,174,74,159,173,111,127,206,162,202,61,205,127,246,48,225,221,26,43,27,46,119,2,212,91,144,2,46,59,152,111,138,192,42,231,51,125,136,26,174,59,94,213,255,101,137,152,44,3,118,247,224,24,78,38,119,111,73,16,245,118,74,158,135,192,160,17,196,130,104,132,183,51,167,201,64,129,80,47,214,66,249,208,30,242,240,209,59,140,50,2,176,198,80,23,220,82,198,187,137,106,45,93,106,110,183,24,101,149,57,92,23,97,251,163,186,120,83,58,221,227,204,53,203,198,31,94,48,73,35,88,114,33,127,133,134,0,199,217,220,84,70,104,158,47,220,75,193,139,174,13,198,154,107,149,56,137,154,114,235,151,45,167,27,207,32,75,226,161,189,79,59,65,255,78,136,13,10,71,78,120,179,205,151,135,37,94,209,41,255,95,219,25,113,189,225,166,40,243,208,3,28,156,7,114,148,101,58,128,80,105,176,115,124,86,241,60,173,154,119,18,197,168,156,8,54,78,162,167,236,71,69,159,1,235,30,121,177,235,174,223,101,183,77,47,4,17,41,67,233,37,199,115,83,184,91,244,40,77,68,249,224,53,249,142,179,129,4,222,134,44,219,103,88,139,220,122,1,237,70,227,180,2,26,54,92,20,62,184,242,162,137,234,140,184,108,38,14,43,104,7,152,88,205,128,215,208,16,98,199,119,204,85,9,16,44,167,143,53,161,75,55,18,40,217,243,190,121,194,96,187,68,75,241,47,34,158,109,115,79,69,95,71,119,211,68,196,173,244,227,190,167,75,63,171,190,244,255,111,80,129,12,155,162,204,76,235,100,32,69,197,4,117,224,81,157,202,111,128,219,170,132,187,61,82,153,59,124,100,237,165,7,211,250,150,35,55,130,183,70,6,22,252,71,155,204,102,241,250,69,218,80,110,104,65,115,76,4,25,122,253,242,46,73,72,251,228,99,33,242,64,170,153,201,86,123,98,62,222,244,0,25,100,2,41,66,161,4,163,237,77,237,75,7,82,206,135,125,65,50,151,13,10,218,223,106,55,7,229,233,153,235,144,131,115,30,215,13,10,76,77,60,165,22,225,242,162,204,33,231,163,51,91,234,63,41,152,89,135,118,202,60,171,12,73,90,89,95,8,177,77,109,4,112,136,39,26,66,222,12,216,148,250,46,244,3,33,230,85,250,148,147,77,86,222,167,159,176,9,225,128,17,230,79,13,113,43,133,60,19,6,29,155,241,141,36,73,16,45,214,183,109,2,108,180,27,241,136,164,72,215,88,200,214,17,17,236,198,100,161,87,124,144,186,238,242,25,112,225,247,150,236,52,186,117,137,104,192,97,244,211,160,244,198,242,150,127,51,230,173,44,41,98,147,190,238,235,120,36,76,55,190,73,36,248,136,128,109,216,162,98,62,122,254,174,43,63,59,127,178,92,44,165,249,219,169,246,132,127,33,165,210,53,14,9,234,159,207,58,123,52,113,199,15,11,186,47,76,233,106,254,40,134,112,216,135,97,136,174,225,192,185,71,127,100,91,61,77,158,248,31,171,51,175,63,108,209,11,190,121,73,165,30,252,177,137,248,215,189,253,24,203,15,243,127,82,149,246,23,189,33,66,44,8,142,190,154,227,72,89,114,139,248,226,38,15,5,86,255,108,242,102,190,53,51,11,242,24,58,70,176,242,224,43,230,115,82,96,253,142,50,153,75,201,235,182,109,168,23,33,120,192,165,210,164,110,191,129,213,51,220,14,141,133,249,218,0,157,156,235,224,229,18,60,89,67,232,5,186,140,160,63,234,183,235,117,57,51,170,221,136,223,2,183,78,12,62,185,179,194,180,205,1,120,153,131,80,200,122,250,79,139,249,177,212,200,143,20,70,243,189,40,183,247,230,161,35,83,101,4,116,110,205,229,54,12,110,172,121,140,107,142,255,178,130,169,48,128,110,85,158,92,97,71,247,91,58,155,251,111,128,221,103,32,118,249,157,142,187,6,72,1,25,109,193,60,131,127,226,80,109,82,63,219,230,135,28,243,205,40,111,85,60,100,50,187,169,161,230,145,92,196,133,122,94,73,156,49,87,232,83,46,187,27,63,96,90,227,158,82,228,126,141,45,114,173,237,52,117,162,45,97,33,17,33,43,174,57,229,229,60,83,41,65,21,203,1,68,99,121,217,198,94,252,78,151,81,210,81,13,248,168,245,208,89,153,211,33,174,205,246,168,240,198,190,243,173,240,165,240,126,204,118,160,124,90,62,55,67,178,194,150,86,248,98,43,245,7,253,153,77,26,44,191,11,98,82,161,103,104,2,228,26,172,133,143,200,192,95,59,15,155,215,245,101,157,175,38,53,188,101,79,45,78,197,132,4,118,223,91,190,146,201,79,109,254,1,176,83,129,123,209,30,152,41,60,29,130,212,38,24,255,118,183,215,71,124,244,74,85,160,94,98,103,199,128,40,132,151,83,135,115,196,94,124,0,84,101,190,55,6,207,237,161,167,104,227,75,22,82,145,48,21,28,129,194,28,183,155,92,162,97,49,24,220,153,128,16,86,251,32,221,251,119,42,248,246,192,88,210,145,187,96,209,191,14,36,241,9,12,254,16,45,188,252,223,62,190,156,43,233,88,48,188,116,37,79,179,60,94,233,97,23,61,127,25,44,119,233,243,207,86,13,10,106,207,174,33,101,55,143,142,194,7,148,188,47,232,155,229,253,44,196,203,123,198,75,24,14,49,109,108,122,138,236,2,205,59,164,137,234,27,199,41,13,68,63,32,23,219,92,159,86,211,192,31,96,170,195,97,223,187,33,57,29,70,49,225,206,125,202,175,139,113,71,66,77,46,40,4,1,85,46,184,210,142,162,154,46,58,232,212,151,137,155,13,10,154,176,117,114,137,67,227,16,182,241,25,247,244,116,95,191,21,118,121,252,175,236,164,180,137,178,201,137,22,149,114,217,238,164,234,74,38,138,213,92,9,229,249,53,229,129,251,60,59,223,122,25,203,202,78,49,194,241,28,127,148,4,28,23,32,244,175,174,179,66,151,208,212,67,234,21,244,80,71,212,40,225,112,190,131,233,73,167,71,242,176,235,17,20,173,254,88,22,228,198,220,226,225,95,165,192,76,191,195,94,239,178,255,49,231,232,36,154,104,220,24,43,234,92,56,217,76,193,77,79,186,147,123,247,221,109,13,126,151,232,134,218,185,202,188,16,101,21,47,14,234,99,73,13,143,243,252,237,237,124,102,185,75,67,33,100,250,206,236,213,55,232,221,125,118,79,156,114,51,0,246,119,203,249,98,245,18,224,194,189,146,106,237,206,206,210,3,33,155,68,198,163,62,184,31,104,168,8,116,105,47,11,164,117,225,81,115,92,2,243,124,127,130,123,124,24,165,15,64,60,96,178,107,160,117,152,162,52,0,121,236,121,135,15,220,241,208,161,15,149,180,145,122,233,186,65,79,187,160,13,213,97,255,247,227,102,154,132,13,86,55,166,112,185,199,96,63,149,11,225,148,16,218,153,40,15,131,109,49,101,120,98,126,212,6,14,138,173,17,151,81,66,188,147,30,251,181,83,33,100,17,210,163,238,8,158,4,53,210,86,207,108,39,19,79,151,66,107,227,253,138,106,233,160,183,182,183,214,96,228,189,190,139,175,94,168,216,31,66,73,240,63,165,58,74,216,196,159,167,154,92,52,111,109,115,56,74,243,77,107,165,115,54,80,121,75,132,11,188,18,194,209,230,147,230,162,222,159,245,179,23,70,131,129,68,189,172,126,203,87,132,127,38,193,128,123,238,162,41,167,239,3,50,146,223,87,124,79,168,223,113,37,201,95,190,185,211,201,166,122,149,234,144,249,117,169,60,207,246,104,74,64,118,54,125,109,241,63,64,54,115,193,48,152,239,85,225,197,149,115,73,84,140,226,23,117,199,66,141,211,57,4,255,196,170,226,73,203,101,192,92,42,198,254,100,63,183,90,47,74,162,121,57,32,19,81,58,106,144,142,214,188,43,181,197,106,56,166,154,90,90,13,10,160,126,132,174,88,149,162,13,10,221,162,202,41,33,69,209,46,212,38,72,9,47,157,126,121,238,108,236,151,142,26,53,72,94,243,34,46,62,157,212,249,194,77,15,167,81,137,48,138,208,56,25,180,37,40,64,175,212,78,135,228,244,87,252,123,142,246,124,173,40,193,36,43,235,227,118,11,90,144,227,117,46,210,15,163,180,71,229,119,214,178,196,144,235,118,245,179,87,192,166,24,18,8,168,249,149,73,162,128,155,124,79,254,55,226,41,227,224,29,94,123,214,124,111,130,17,79,169,67,106,121,191,13,61,111,184,143,39,39,146,103,11,15,107,34,209,76,95,33,147,217,237,127,18,246,241,199,243,54,245,151,210,241,11,89,65,99,83,80,238,107,70,35,83,194,242,17,208,24,16,73,21,86,218,225,104,83,3,80,233,148,33,181,9,16,90,110,85,11,207,158,40,67,96,91,149,168,156,147,171,36,185,217,183,237,58,153,101,182,252,162,26,185,92,86,11,2,231,99,32,47,124,85,70,20,25,152,78,219,20,77,14,187,239,100,54,170,163,198,137,89,176,134,155,88,229,188,188,84,67,108,35,138,201,58,175,136,46,91,192,20,224,63,94,174,182,113,172,60,192,144,235,203,251,42,172,105,24,108,243,103,70,245,53,115,106,44,139,215,3,170,187,122,184,201,223,99,215,49,145,185,142,228,39,148,115,220,162,152,196,26,111,103,152,62,249,27,46,86,239,89,185,51,89,212,5,180,47,90,48,172,129,23,207,123,229,47,1,2,33,55,68,30,250,8,84,155,202,219,46,251,144,173,76,205,147,166,2,42,132,36,168,110,212,164,140,33,51,38,115,123,217,104,230,39,246,248,168,232,6,103,107,252,214,166,81,126,98,59,132,32,74,93,141,250,70,234,230,171,232,152,112,255,59,177,156,100,82,255,163,165,171,208,224,205,65,143,253,47,242,33,130,123,211,19,215,83,166,52,52,234,27,249,130,42,169,215,242,232,57,233,160,222,187,234,173,211,164,234,71,70,220,178,129,75,152,165,47,160,13,180,193,199,27,215,104,112,73,181,250,234,245,100,149,7,194,48,53,19,241,179,166,244,247,222,120,59,204,248,90,234,98,139,26,253,143,71,48,118,233,81,149,209,232,175,100,160,93,5,166,97,226,178,247,119,121,20,73,5,162,197,96,29,240,238,240,200,129,43,141,154,81,101,72,147,150,172,157,229,77,113,82,80,163,172,206,255,86,89,177,245,26,215,167,35,157,154,139,199,99,26,53,223,36,78,156,241,163,208,128,222,143,223,9,5,45,175,178,0,185,7,232,218,91,178,64,78,250,177,78,93,53,0,119,16,243,105,211,220,233,101,77,3,50,187,25,165,188,155,207,16,194,174,138,18,217,120,49,191,208,192,104,129,190,248,202,200,169,189,235,66,162,100,89,50,84,173,141,114,250,151,241,137,144,26,133,120,48,207,82,207,19,127,203,109,70,185,185,52,185,142,82,162,81,176,41,66,45,218,238,226,106,170,137,165,126,59,192,196,14,149,188,220,157,154,163,106,52,128,85,32,166,71,161,221,93,225,72,215,213,13,201,234,215,13,146,60,156,120,219,144,248,186,2,214,140,60,236,159,95,215,113,195,49,64,185,59,130,236,6,60,141,167,217,100,68,190,180,253,31,148,56,192,11,28,116,125,136,51,221,13,10,30,18,254,32,54,191,56,180,174,168,248,112,139,211,227,226,137,66,90,187,231,166,206,13,10,155,58,78,182,214,207,2,26,3,164,11,50,166,251,39,247,20,171,40,177,168,208,167,190,56,227,88,92,251,223,70,172,9,6,176,101,101,153,153,131,49,186,235,36,233,78,255,195,213,107,55,166,243,54,149,200,71,180,94,174,74,190,144,113,40,152,126,123,198,28,156,44,188,53,184,237,182,196,208,0,4,211,109,208,95,224,1,254,37,160,68,187,50,81,23,255,205,58,227,7,104,64,41,194,158,208,206,218,115,77,27,150,133,218,76,218,121,197,83,238,251,126,38,211,227,28,170,27,129,94,49,208,113,139,25,11,230,145,171,255,150,195,200,154,211,171,134,105,166,145,33,73,229,158,235,86,110,201,81,19,137,95,23,213,174,2,30,30,226,133,208,196,158,5,65,83,148,78,99,224,25,251,187,8,99,218,206,52,27,83,205,91,151,111,123,97,237,8,47,100,35,220,182,49,73,77,46,109,70,133,188,234,121,245,220,212,219,158,78,50,60,75,173,196,250,183,68,135,208,89,53,27,127,48,30,140,12,234,145,99,135,23,137,239,156,113,210,54,111,101,238,149,168,78,252,115,143,174,207,209,247,43,255,18,171,250,159,81,175,166,224,180,13,108,112,0,94,96,170,249,42,104,236,19,108,65,105,244,41,199,5,213,26,168,108,132,31,166,138,76,68,233,43,206,182,96,87,50,211,85,220,153,93,90,158,228,192,120,192,187,248,13,224,53,26,248,186,53,13,36,197,25,28,209,9,74,115,153,203,148,97,50,70,156,48,52,198,177,37,200,237,213,47,143,210,64,165,161,78,148,84,49,161,184,80,91,148,54,226,224,127,25,226,190,67,182,167,235,97,109,186,249,90,115,53,119,138,71,155,46,101,158,98,59,192,182,219,143,74,187,22,242,105,207,53,80,222,107,165,143,43,229,195,233,205,161,56,127,13,10,251,58,31,82,51,6,117,68,12,137,227,41,179,37,58,20,60,75,241,254,36,133,181,228,2,178,193,30,206,56,174,137,135,193,159,172,189,72,185,32,158,55,129,251,44,196,139,15,187,62,91,56,199,57,16,216,201,69,176,89,195,110,38,33,25,86,230,118,89,188,19,172,16,13,10,232,191,188,41,122,140,76,137,133,251,95,180,34,114,55,82,133,110,57,213,113,53,87,228,235,63,20,197,225,95,130,45,34,4,239,20,169,28,106,184,19,108,108,203,249,4,190,171,114,13,170,172,87,117,164,173,39,54,41,134,235,120,217,149,183,235,112,145,53,25,240,176,210,149,145,98,79,21,146,133,136,12,161,139,24,50,64,65,12,189,14,154,41,63,34,32,198,255,194,137,102,140,168,32,204,110,63,140,110,36,196,55,40,14,6,115,121,190,187,125,205,123,254,231,58,128,77,224,72,102,193,2,72,138,114,29,197,193,159,100,193,123,27,166,245,67,253,2,74,43,221,242,180,61,39,24,91,115,85,236,226,250,123,159,54,125,93,86,207,64,232,200,97,3,155,112,38,180,101,212,13,10,194,100,189,244,212,59,181,158,69,26,21,47,2,25,128,223,114,172,137,202,83,255,248,221,42,120,73,135,123,216,255,14,214,84,37,76,233,3,121,37,211,192,116,125,35,222,222,243,63,149,16,166,115,12,149,55,80,58,70,18,199,107,54,105,142,75,177,41,122,63,247,44,170,152,123,253,15,184,1,84,79,165,176,71,83,120,15,174,234,117,165,103,234,24,9,143,42,232,79,34,98,32,223,70,66,167,11,111,5,87,119,45,123,161,241,59,239,124,233,217,193,243,37,79,55,59,160,252,252,68,192,6,63,207,243,194,215,180,139,28,221,237,143,120,161,236,124,6,105,92,232,137,103,11,105,33,249,141,152,101,71,251,117,255,63,175,190,9,13,10,45,51,196,26,31,95,236,221,44,33,229,239,128,141,124,212,167,25,91,119,21,118,101,33,192,8,21,245,36,231,93,27,85,72,22,250,218,8,182,194,70,209,182,108,222,196,191,25,9,212,13,72,213,162,91,11,22,21,82,63,186,193,238,196,159,64,77,215,34,71,178,192,124,239,180,5,250,170,39,57,115,232,113,75,19,174,94,118,61,98,208,119,241,95,187,21,3,13,123,64,98,39,83,53,152,123,197,237,155,206,36,115,186,172,201,254,57,234,101,213,167,255,14,55,103,18,60,105,35,142,175,102,57,117,35,61,214,233,132,92,203,242,223,147,153,40,92,141,234,97,117,242,33,82,87,240,2,36,3,9,43,167,219,204,251,210,194,218,135,120,243,131,57,82,181,157,32,25,209,27,99,199,251,13,19,68,255,12,91,142,138,85,99,99,153,243,97,27,6,46,128,62,57,175,59,74,106,54,149,105,185,216,117,127,208,84,204,13,107,98,238,41,205,108,242,252,188,106,141,87,162,249,198,165,4,186,180,16,4,223,82,146,218,250,236,101,162,134,27,67,45,196,26,54,129,54,17,123,116,101,83,119,127,31,160,247,178,227,250,242,83,160,191,64,211,146,180,224,70,207,105,122,191,77,139,50,104,228,242,100,132,57,173,233,210,228,85,36,243,192,224,82,7,107,243,84,0,203,221,22,231,15,136,35,157,234,116,205,39,99,50,117,204,237,228,156,107,124,35,127,183,189,32,27,61,250,155,119,148,85,89,97,65,77,128,253,92,50,3,42,51,16,182,179,45,70,166,231,68,147,79,157,104,12,95,253,129,243,49,153,29,28,153,126,179,228,206,36,25,22,23,77,168,191,181,6,176,255,145,140,97,23,87,106,111,205,244,189,157,217,12,155,82,115,51,28,91,240,126,88,151,233,240,42,163,41,108,192,92,244,126,72,181,88,134,184,130,111,40,34,20,12,200,79,84,184,185,214,71,125,152,147,238,116,254,115,227,146,151,191,65,78,1,121,189,178,81,102,232,131,109,73,178,173,214,39,74,255,51,200,35,97,25,121,104,253,250,204,164,155,133,119,45,233,161,72,224,23,168,255,198,42,56,163,11,229,133,5,19,7,23,39,243,186,52,221,100,76,224,139,243,253,42,85,8,9,115,13,10,92,53,145,214,12,59,14,62,210,78,175,87,129,125,76,132,164,102,197,240,55,148,230,174,179,225,132,106,178,233,58,93,204,62,248,53,102,74,224,19,70,73,55,69,17,128,171,185,29,84,204,129,150,124,248,94,230,185,215,92,20,167,127,115,127,166,180,20,237,102,127,202,186,130,222,214,101,59,141,102,73,207,229,123,70,114,196,78,15,11,254,90,214,48,196,140,207,84,155,124,210,222,174,156,85,39,208,71,131,236,83,25,187,158,247,215,80,216,123,163,198,185,184,25,84,92,162,66,212,31,118,252,211,223,47,136,66,250,87,20,175,249,229,19,155,210,144,138,0,61,92,14,98,99,162,187,228,16,92,81,0,135,219,14,205,124,75,87,204,58,246,77,186,170,197,222,33,188,171,138,88,0,50,37,239,230,123,231,249,166,112,158,238,37,211,89,252,26,235,201,105,19,15,48,80,192,235,182,216,183,72,89,173,84,134,95,64,8,99,215,105,233,29,185,237,235,67,133,37,167,199,202,166,139,13,25,132,117,164,73,245,248,123,94,187,73,94,187,208,220,232,123,191,53,64,134,121,48,43,77,198,109,137,63,75,65,88,225,181,48,84,171,155,25,124,110,203,7,121,43,169,200,197,185,201,0,175,197,160,92,201,195,27,80,120,66,122,28,125,116,68,155,158,184,97,123,63,0,152,239,243,197,134,116,77,189,39,90,17,125,13,10,161,74,4,44,81,183,80,97,48,222,89,105,77,185,228,93,72,243,154,49,65,27,101,101,18,163,45,60,217,102,134,128,106,115,202,127,70,220,249,164,135,44,3,52,200,159,252,41,72,162,189,152,187,47,0,58,133,131,76,4,152,119,164,114,159,60,240,1,177,56,88,20,161,123,175,32,160,239,117,112,141,223,15,75,101,109,65,34,227,13,121,77,160,72,216,59,32,26,37,44,146,200,201,40,9,204,48,39,21,13,10,214,94,204,148,203,20,105,197,219,86,150,90,66,179,103,202,39,1,91,22,26,203,35,24,104,107,195,69,30,3,162,153,246,125,224,173,189,231,243,56,7,33,53,101,207,170,183,165,173,4,164,66,253,60,183,16,166,212,183,138,98,195,24,129,95,242,217,225,75,147,87,232,187,209,63,170,190,157,158,164,60,12,57,191,73,118,255,3,209,87,59,21,113,227,1,60,254,217,191,170,12,66,1,126,207,37,215,193,45,112,65,14,122,13,121,227,125,93,80,93,17,218,150,150,226,177,19,1,158,16,53,90,255,73,103,197,110,168,109,67,98,168,155,66,204,1,243,171,240,222,165,240,41,239,12,47,211,243,59,253,88,227,26,101,32,64,172,97,121,88,95,155,176,62,11,248,241,233,77,169,50,64,245,99,127,166,33,104,123,180,183,237,195,162,245,248,159,209,67,68,18,51,58,169,185,123,208,193,211,98,40,90,182,67,244,38,247,93,216,84,241,22,160,216,187,220,219,128,206,81,60,196,86,80,148,91,84,111,114,202,105,221,157,39,7,235,123,91,221,149,1,254,186,195,196,71,104,82,161,210,29,108,236,154,37,228,209,103,29,205,187,182,123,111,176,42,120,218,171,181,95,20,14,236,21,126,185,16,117,225,245,207,188,42,168,216,211,254,153,15,71,66,155,197,115,182,82,208,218,103,57,9,243,107,241,88,82,167,255,217,145,217,39,233,154,108,149,111,51,64,138,143,94,220,109,123,32,14,246,61,206,178,207,184,218,148,117,211,69,40,35,143,77,90,122,172,185,5,230,167,105,102,42,49,221,173,78,117,121,95,17,243,51,43,238,3,155,234,126,185,169,41,90,147,232,240,90,9,120,216,129,115,194,244,138,122,64,61,170,244,124,4,68,172,73,227,84,74,42,163,25,23,109,81,145,27,73,218,12,3,79,62,156,51,132,249,6,61,68,158,173,222,96,73,30,210,44,59,181,192,186,195,31,197,100,187,117,207,117,89,124,151,123,217,171,249,5,153,59,222,198,134,114,139,28,59,206,93,15,99,2,179,224,52,229,86,228,63,190,24,81,178,209,55,207,115,138,39,127,196,206,63,40,156,27,106,202,130,249,116,1,234,200,14,169,167,104,44,220,154,88,138,177,0,200,68,139,96,172,11,54,15,26,240,58,181,82,85,54,195,67,81,220,125,17,105,25,62,113,250,18,137,46,231,154,158,65,85,47,93,238,224,94,155,113,69,135,40,136,82,222,121,77,22,197,113,164,214,28,42,65,223,177,197,224,192,230,226,233,220,78,199,146,127,183,107,82,236,11,213,129,246,152,41,105,200,221,36,0,55,116,40,252,117,112,16,173,3,156,195,201,23,66,26,126,32,210,97,3,75,159,134,198,151,35,233,130,58,38,72,214,72,135,158,19,186,170,152,188,89,228,81,128,236,217,7,128,76,1,50,177,79,90,144,112,88,105,168,195,176,107,26,96,48,56,54,64,41,243,128,30,247,76,143,121,143,113,43,235,42,235,85,169,23,228,225,89,7,225,96,112,160,249,181,41,40,146,160,80,130,184,204,90,81,170,203,52,226,39,250,139,56,156,8,36,91,218,63,3,87,15,4,193,160,100,98,76,137,41,147,142,150,107,205,152,28,17,247,5,9,188,101,190,125,61,24,37,169,24,167,60,156,52,121,205,147,36,204,96,78,11,56,189,215,123,235,128,45,79,224,198,199,93,193,73,79,104,22,221,82,15,41,92,26,35,208,12,142,193,110,69,217,211,170,158,91,108,19,139,118,105,190,52,246,43,114,80,251,1,96,52,252,61,69,159,172,73,27,180,7,80,31,153,255,105,21,241,123,160,88,127,23,209,159,5,228,1,26,130,96,198,217,234,16,207,232,77,180,205,172,111,92,184,248,168,193,157,113,168,181,28,128,63,236,170,94,120,208,144,14,113,126,109,176,241,109,181,227,253,118,107,34,16,51,214,76,70,149,18,115,153,202,158,85,89,55,75,190,113,124,119,39,70,255,2,190,13,156,218,2,22,162,2,72,154,165,135,45,32,14,156,150,167,12,111,55,9,38,76,64,71,132,122,96,99,83,252,62,171,9,149,203,228,220,146,9,205,83,210,248,105,232,251,73,149,45,37,7,194,141,151,138,68,72,72,207,125,64,32,14,86,161,221,14,202,61,210,205,134,26,184,2,158,143,237,30,46,168,164,180,87,81,74,12,17,140,108,100,179,255,222,175,217,250,63,191,146,220,19,45,196,172,177,221,8,46,213,239,16,225,200,91,212,96,26,62,242,166,181,8,61,237,85,245,217,210,197,117,208,235,168,151,0,180,128,109,188,198,229,210,162,173,38,199,44,181,80,46,175,146,206,2,235,7,105,181,82,247,179,114,237,193,209,78,188,18,84,85,69,213,94,27,224,202,206,134,14,169,80,200,145,244,122,6,110,51,79,218,58,250,95,204,229,203,88,161,33,199,13,10,100,110,143,207,59,107,61,43,221,189,59,177,55,171,75,27,48,86,52,52,57,67,45,244,170,8,155,112,180,117,17,207,236,143,246,188,62,151,179,32,248,190,230,251,73,152,29,213,180,17,32,126,231,244,188,170,93,23,233,174,48,251,121,202,136,124,4,32,200,2,76,177,68,81,55,226,67,212,47,203,254,169,111,98,89,221,208,93,51,91,57,14,210,88,13,200,45,13,10,186,238,94,102,157,83,126,118,110,126,193,108,81,42,139,71,170,230,56,13,137,148,200,125,0,223,237,159,93,133,35,42,132,227,211,203,62,165,179,7,193,108,187,47,150,46,255,161,108,174,24,162,182,248,177,239,4,32,224,75,30,134,88,243,104,183,217,77,148,154,234,39,172,166,173,66,144,7,54,60,232,112,205,231,87,61,202,184,233,129,61,219,49,129,99,69,37,116,65,24,34,8,144,164,193,114,73,206,122,227,20,169,173,205,227,137,148,159,20,100,151,107,74,129,158,135,183,88,138,170,244,238,26,80,28,3,161,199,233,40,195,180,64,30,190,178,235,94,197,182,93,6,214,28,17,131,26,80,229,145,36,238,127,218,24,252,73,202,250,42,228,7,175,82,109,26,148,163,5,150,229,170,145,231,153,30,244,192,92,176,255,52,142,134,148,44,112,108,252,216,121,181,39,200,229,240,12,205,54,32,242,225,17,131,23,23,44,14,244,205,160,114,250,249,149,208,216,219,11,131,92,201,223,25,33,250,66,188,210,97,61,56,177,73,169,255,196,81,78,114,123,69,60,124,141,237,236,244,94,30,108,21,183,242,213,232,65,178,142,115,230,41,142,214,69,170,145,51,122,7,2,24,121,201,195,200,6,24,55,34,66,240,198,212,32,110,87,252,182,14,66,109,172,201,235,232,49,156,205,195,166,171,125,7,75,133,251,250,169,75,33,53,121,13,10,232,47,179,164,137,59,68,242,65,78,63,159,61,168,90,131,8,65,127,25,123,146,129,12,45,108,128,178,251,141,114,90,105,165,223,110,25,124,216,42,119,223,172,125,130,237,144,58,73,232,29,39,230,37,106,114,104,88,166,244,126,239,252,172,131,174,209,112,226,32,89,196,26,174,65,156,19,151,67,6,119,177,227,141,77,16,234,29,115,213,155,131,109,193,160,50,245,255,60,95,203,55,177,81,202,51,222,111,237,185,182,115,36,112,150,94,193,149,71,225,207,42,113,122,29,133,138,12,111,240,90,116,252,201,181,18,228,245,4,233,222,43,218,146,42,37,78,216,16,176,202,13,10,53,44,62,109,179,224,142,192,175,216,35,145,105,127,56,24,189,80,169,204,3,170,26,214,42,157,219,228,47,90,183,244,188,193,78,94,244,106,35,117,15,139,9,149,156,11,74,253,215,159,123,253,143,155,160,221,233,42,230,49,172,82,12,103,100,84,101,112,71,237,24,160,114,50,68,233,170,207,99,148,199,209,223,226,12,82,239,222,216,50,177,170,228,221,2,21,39,31,196,110,245,185,13,226,81,79,177,24,57,106,122,96,105,187,73,185,91,178,64,97,109,65,21,155,231,43,95,179,125,79,32,55,195,154,65,99,24,3,121,229,233,26,220,152,112,3,176,161,205,103,108,203,140,246,228,79,82,60,59,116,213,67,213,94,179,204,70,84,99,68,7,32,190,8,238,63,133,166,11,147,152,103,61,126,73,0,196,88,57,121,136,124,110,34,211,242,124,13,176,53,154,115,5,181,70,82,116,208,159,123,203,59,123,4,137,59,44,156,181,118,232,229,112,180,158,252,64,156,229,5,69,72,255,177,177,157,211,9,128,41,149,131,96,176,217,54,183,177,7,206,4,102,72,186,67,123,239,169,190,246,123,140,189,222,203,130,205,156,75,27,205,199,252,106,242,96,117,243,203,41,36,223,172,245,241,196,22,13,31,150,242,215,89,43,87,237,177,202,210,14,249,57,83,113,214,170,193,121,30,152,191,75,200,75,253,129,185,42,92,43,64,219,254,227,213,14,233,38,157,246,50,166,140,159,110,247,93,105,147,158,118,74,27,79,82,126,73,147,9,122,27,242,140,110,86,144,171,158,50,199,59,41,208,39,94,16,249,85,155,167,249,107,247,199,1,105,76,225,49,51,230,251,162,39,108,18,91,131,244,58,132,207,62,138,186,74,134,177,128,246,104,66,38,126,112,245,199,148,48,54,137,150,42,224,103,41,14,44,248,126,63,221,119,78,209,115,249,31,161,251,176,246,235,163,239,26,52,232,38,96,73,97,210,203,71,180,11,38,13,121,185,178,253,29,229,132,234,121,50,157,200,236,117,232,77,188,217,11,136,140,89,232,247,229,233,15,78,44,247,173,140,197,214,172,106,66,187,13,10,186,39,35,110,228,214,142,153,74,31,165,229,236,21,165,92,21,176,48,98,151,166,55,214,105,110,25,51,216,192,233,196,232,26,70,37,244,39,170,71,183,232,85,59,88,13,10,69,193,104,94,96,38,126,86,62,154,55,133,169,193,110,50,223,166,106,85,255,204,200,235,206,57,86,193,233,119,139,100,37,142,9,105,95,174,8,107,73,62,61,47,204,76,246,144,78,42,178,43,75,166,49,197,5,39,165,104,1,115,123,252,216,129,191,4,153,27,118,119,102,47,11,198,112,155,152,30,109,217,223,169,12,211,103,46,160,14,0,191,38,73,22,60,61,32,198,186,234,243,250,44,245,108,220,94,204,36,98,137,54,189,197,163,9,16,206,231,175,185,126,221,79,26,56,250,183,250,58,92,173,49,187,184,33,234,16,59,103,249,157,11,116,215,193,87,163,81,20,75,157,117,91,54,226,80,253,169,109,104,107,244,214,157,123,111,214,191,88,8,247,21,252,57,61,225,91,134,166,228,177,232,120,173,131,17,94,144,237,160,83,84,252,28,188,23,52,160,36,96,124,8,31,194,41,173,53,119,0,48,215,125,209,100,200,226,85,62,151,69,237,64,217,188,229,66,117,54,121,58,240,19,102,90,57,76,249,102,242,83,87,19,237,44,74,63,248,22,245,12,43,201,201,220,191,229,50,35,208,106,0,146,104,218,89,107,248,148,206,149,128,239,35,244,238,231,219,136,119,112,112,159,126,168,144,158,247,68,186,14,168,82,103,230,37,115,219,165,28,37,247,117,40,135,13,10,211,23,241,237,99,178,128,47,197,77,129,209,73,162,18,23,98,220,202,118,14,94,165,231,172,50,161,212,129,145,214,60,191,30,4,155,120,223,167,187,43,34,55,169,213,47,113,72,89,245,234,108,146,212,76,23,182,78,253,80,126,44,152,32,87,92,169,186,70,2,111,188,194,94,251,202,132,154,188,74,156,56,85,32,229,215,214,74,120,125,253,35,34,155,250,202,7,133,170,33,159,49,13,111,2,16,228,170,253,95,117,3,62,213,96,241,35,150,68,118,151,43,219,42,128,135,223,97,208,255,71,254,245,114,0,154,129,128,156,112,33,214,45,186,83,246,182,162,107,151,109,83,148,239,241,9,179,175,88,140,248,222,180,75,176,7,99,82,100,35,216,7,120,54,213,227,188,225,3,120,206,149,207,20,216,115,44,202,182,145,221,209,63,154,0,210,133,242,214,63,168,231,177,97,54,177,168,237,251,68,164,98,37,77,230,211,165,236,113,11,145,132,194,191,139,35,235,26,173,194,212,11,203,83,130,45,210,159,78,92,176,69,62,134,60,17,170,115,225,187,252,40,227,54,189,181,156,227,232,128,101,234,157,139,121,153,20,97,188,58,13,92,151,254,186,176,96,121,247,161,222,251,130,188,161,47,40,50,156,6,58,183,38,171,124,106,45,172,218,198,225,218,70,229,130,133,1,86,149,164,178,6,217,224,164,223,112,147,3,58,158,66,221,9,124,106,192,173,135,253,244,43,141,69,57,54,115,20,72,221,211,135,13,10,73,12,212,143,206,148,43,174,106,136,204,15,133,37,120,142,34,34,57,163,132,118,148,96,96,168,254,182,149,150,19,178,138,1,9,2,147,169,245,137,95,123,80,153,133,227,100,62,228,119,82,235,173,54,77,84,67,126,242,206,108,63,232,106,77,43,225,40,18,87,123,18,109,241,50,204,125,96,45,197,236,108,238,211,4,26,242,8,182,155,126,152,204,173,72,178,230,217,154,182,7,187,179,58,25,234,13,10,217,65,107,49,225,69,211,147,158,4,233,180,175,188,194,80,76,130,216,121,222,229,68,85,192,245,208,28,2,141,70,72,189,61,59,156,210,3,101,55,118,65,2,0,125,240,53,169,237,150,96,18,63,174,218,37,90,115,133,173,171,95,19,227,253,196,144,80,61,155,99,28,83,127,28,68,71,164,253,79,227,241,203,178,66,112,84,49,169,133,138,12,96,250,138,131,108,48,116,151,105,128,83,205,140,98,242,26,173,3,171,6,172,169,32,188,173,135,246,138,252,69,57,243,157,157,103,89,183,192,78,21,237,229,155,188,192,79,82,138,39,122,146,113,82,236,137,64,145,146,242,229,38,247,153,33,164,231,111,236,226,55,63,51,117,195,192,163,106,225,214,243,189,27,112,88,106,185,70,31,101,223,193,197,101,75,91,90,236,95,146,214,56,122,17,187,40,184,29,35,102,254,70,58,94,160,248,25,138,31,216,223,224,136,154,40,30,16,22,215,33,136,2,61,233,192,36,71,100,228,128,184,1,248,51,129,54,11,255,122,53,9,86,9,166,230,17,116,176,39,76,43,114,147,80,159,156,78,78,236,41,14,44,83,140,2,173,184,119,200,178,31,98,192,112,245,140,234,139,180,54,211,179,71,6,222,106,111,232,218,233,49,202,175,186,99,74,202,25,72,218,68,194,206,244,216,190,107,25,77,60,65,208,197,132,200,47,111,72,198,125,222,172,73,177,122,105,46,201,65,137,90,194,3,49,13,229,20,243,37,199,231,13,110,16,72,255,215,243,22,130,218,148,111,203,170,47,90,80,83,95,13,10,255,61,192,238,223,103,253,249,137,142,117,155,146,155,68,117,147,237,193,251,140,91,119,6,46,25,191,191,47,182,196,184,183,214,149,226,76,246,71,6,8,171,99,80,2,175,195,141,117,85,146,160,199,35,115,13,10,4,42,197,220,75,116,67,109,191,94,184,218,199,158,169,230,183,242,30,216,49,243,59,107,140,49,65,201,129,52,226,166,154,248,252,117,114,188,8,170,14,190,157,235,4,238,154,167,148,210,175,185,188,14,151,198,15,147,167,167,45,21,85,109,54,202,11,88,198,15,196,43,106,220,168,70,88,68,125,161,100,251,85,138,225,200,86,244,195,170,111,211,12,38,126,233,168,102,132,38,163,215,66,230,184,225,48,197,35,225,216,52,12,205,61,63,116,27,228,156,227,147,91,36,170,32,68,59,96,73,208,177,54,163,108,31,19,23,96,72,214,157,65,80,175,140,239,212,88,250,120,162,133,154,138,47,124,88,189,187,146,25,26,125,252,26,60,237,193,47,249,27,38,182,130,141,56,120,74,95,130,153,115,233,209,3,115,154,29,140,180,54,110,220,21,30,57,108,65,95,165,28,116,14,13,129,193,142,202,132,121,143,128,179,83,68,242,197,199,219,218,49,157,109,80,130,31,35,109,29,103,137,48,207,161,130,89,169,116,150,223,97,174,126,171,28,6,171,231,133,205,136,114,89,167,240,142,121,145,95,249,108,215,129,217,20,53,245,181,228,218,20,12,44,108,1,54,220,166,197,124,125,240,31,158,135,251,176,237,245,95,128,220,227,165,68,183,153,40,0,216,150,111,7,225,41,122,249,49,20,169,239,167,235,33,186,242,88,48,85,119,14,255,103,181,210,31,100,197,194,161,27,65,71,158,49,71,98,189,100,9,220,90,115,168,179,38,100,181,86,145,160,27,222,111,149,213,241,193,6,92,129,177,41,69,229,182,61,126,132,91,58,193,241,111,118,3,69,248,134,234,247,176,145,196,197,108,240,208,194,169,54,15,124,78,84,102,48,185,58,42,170,216,11,76,163,93,70,53,0,149,40,110,248,64,18,60,236,19,220,18,224,100,139,105,209,122,67,174,254,121,106,2,223,231,222,62,181,32,181,226,71,175,70,243,30,232,80,125,235,23,116,171,114,129,163,43,208,253,110,100,57,254,230,233,74,73,168,86,126,104,211,21,108,179,66,18,234,134,182,233,127,40,102,77,173,172,245,23,62,100,199,211,146,55,208,116,75,49,95,171,123,107,133,166,162,149,90,143,69,235,255,189,135,155,218,95,124,179,40,92,114,65,80,2,120,237,69,116,228,100,173,179,211,240,127,90,99,86,8,115,171,166,231,249,243,245,175,197,128,208,111,224,37,75,206,164,218,138,244,223,173,147,185,34,93,99,107,12,173,122,68,102,211,14,108,55,139,93,46,21,229,74,13,38,134,249,113,184,163,160,75,212,18,234,77,89,120,75,247,59,123,130,21,126,57,128,86,164,143,211,145,103,116,32,221,92,133,195,174,209,71,9,135,31,163,25,181,103,120,137,2,46,27,59,158,39,23,45,238,93,249,170,96,76,152,48,124,87,110,41,43,189,23,131,107,239,6,139,227,65,54,83,142,167,122,212,160,0,137,79,216,37,30,153,80,252,196,27,112,194,190,147,104,21,0,86,188,212,27,173,185,29,137,77,162,249,141,89,155,242,36,18,15,197,165,112,40,200,221,85,20,140,120,138,36,248,254,177,157,162,55,252,164,147,169,160,227,19,227,123,174,32,90,0,130,156,159,125,11,121,3,105,246,207,91,28,84,244,239,227,145,120,81,233,246,122,41,221,38,77,43,160,177,189,176,93,233,198,137,75,48,207,141,91,45,55,169,96,178,75,20,172,82,233,52,33,218,93,63,46,68,132,216,112,243,51,206,149,68,169,245,120,237,238,70,222,147,18,91,214,94,5,132,61,71,92,100,178,252,3,108,105,158,236,217,161,181,75,92,168,195,124,2,54,93,254,122,254,145,130,4,246,228,9,210,78,249,46,138,242,45,19,37,248,75,211,23,22,173,208,13,83,35,211,77,161,119,177,221,55,123,119,165,13,10,8,216,111,19,0,0,57,186,78,21,1,237,171,109,219,0,115,186,120,67,226,47,73,249,60,128,187,125,126,9,161,44,14,156,42,240,80,250,57,168,62,207,135,230,6,114,37,122,98,175,111,54,134,170,23,176,242,70,252,241,161,9,204,47,122,42,116,236,214,40,73,199,65,212,93,146,190,179,134,75,99,119,246,72,88,90,114,146,242,152,204,60,68,181,117,93,217,7,225,195,161,47,108,21,41,38,211,4,85,195,199,78,21,1,237,168,229,194,149,124,100,197,135,16,143,24,219,62,204,105,138,150,244,200,57,237,199,73,95,80,179,36,76,89,237,42,49,53,9,226,97,50,236,41,6,112,146,193,37,120,113,81,4,223,244,204,14,48,236,29,166,193,57,97,185,248,182,138,136,101,252,171,40,157,92,186,144,77,136,145,170,127,236,123,213,124,180,24,60,239,85,173,124,189,167,1,210,207,13,10,56,120,197,42,119,225,226,44,252,180,191,143,245,227,224,131,63,77,222,89,242,232,166,220,94,185,182,37,240,90,101,117,68,92,249,130,103,228,66,6,29,42,217,155,82,204,120,157,29,143,105,136,67,60,92,13,29,75,79,81,15,140,115,246,187,168,233,41,54,46,191,56,210,108,155,232,174,202,236,51,242,104,226,114,93,63,81,205,50,124,72,210,171,197,46,38,91,230,58,42,47,200,116,84,174,66,0,62,181,162,141,108,165,218,45,126,138,187,185,232,67,155,104,62,142,99,31,46,109,161,244,184,92,4,216,187,177,115,15,44,170,9,31,27,30,239,49,224,143,164,223,154,155,158,184,198,66,28,213,188,192,246,222,214,127,209,150,23,33,58,128,209,128,36,171,121,244,8,247,207,227,104,68,131,129,156,133,160,97,197,59,79,232,83,227,130,163,167,119,143,164,113,161,150,242,78,18,75,20,54,41,146,106,36,98,0,55,229,247,62,226,147,1,149,226,236,244,236,213,52,97,181,183,60,104,101,120,212,129,36,200,135,142,13,10,226,205,44,182,84,207,152,234,61,35,141,203,55,174,123,193,139,208,210,27,50,60,149,159,232,42,153,132,37,117,243,91,182,242,134,245,179,87,132,19,147,142,241,205,237,241,70,152,120,242,141,15,158,213,49,0,201,145,89,143,122,234,218,118,30,137,105,152,164,43,16,253,24,109,212,148,233,202,87,94,152,65,56,70,157,152,212,250,180,93,189,30,227,194,246,27,135,123,157,163,102,13,10,172,216,119,77,186,8,188,49,174,142,115,207,189,60,255,243,74,196,4,125,240,119,109,13,176,35,6,2,74,223,124,158,254,1,145,40,242,72,141,34,136,58,78,255,243,181,175,159,199,85,47,112,167,137,85,212,133,74,50,179,40,29,221,165,220,241,95,145,91,144,189,88,76,64,231,191,226,118,151,255,156,106,152,112,211,41,166,58,69,211,91,125,92,135,6,12,163,150,13,10,204,174,50,59,235,226,47,144,159,113,217,206,143,78,89,248,118,152,149,76,197,70,139,159,163,30,236,154,23,35,102,93,230,73,212,157,31,77,142,107,150,196,191,131,224,40,6,212,217,189,225,44,26,89,143,128,30,33,105,175,174,244,140,182,184,213,4,15,43,230,144,29,200,28,105,23,118,180,83,33,168,149,153,57,169,11,96,153,68,110,140,213,5,118,254,218,60,8,9,41,76,140,179,9,234,137,80,117,210,238,242,160,242,176,25,227,242,229,148,27,88,99,0,72,104,216,27,115,60,255,253,255,24,181,77,245,236,180,211,35,13,13,130,240,145,40,62,197,170,70,192,96,84,19,102,63,70,236,237,138,62,152,51,75,156,42,180,48,244,53,247,146,23,104,116,223,137,242,241,103,92,93,53,15,162,23,36,160,210,241,154,107,36,248,111,133,141,13,10,246,147,77,143,184,64,22,207,255,37,139,161,89,53,162,97,45,79,160,109,197,87,149,52,199,25,51,36,178,130,168,245,166,122,140,119,238,227,94,207,47,199,0,90,61,141,93,110,212,164,225,157,56,88,72,168,185,90,166,69,69,115,129,93,1,130,244,201,58,63,172,231,45,124,44,51,206,225,148,153,209,35,42,223,183,66,230,33,42,108,147,102,107,193,218,195,164,39,92,18,40,171,152,185,119,152,80,234,41,30,221,167,187,241,75,94,44,104,170,38,241,184,119,146,13,10,255,156,163,7,136,52,135,152,180,66,59,57,79,173,147,91,53,227,213,231,18,119,236,50,177,66,163,134,169,111,236,225,79,185,109,59,49,251,54,179,100,64,167,28,45,131,197,218,56,201,254,223,56,20,143,124,213,135,72,187,38,18,190,75,72,149,176,46,142,176,154,91,14,117,72,205,230,201,57,206,136,128,235,137,177,155,62,38,243,84,203,33,173,42,49,248,219,107,73,104,63,199,253,120,80,168,31,75,128,27,185,241,8,104,132,53,162,184,255,97,118,7,197,112,222,252,233,196,88,106,189,93,167,205,42,129,201,60,158,83,195,236,199,157,99,123,227,208,217,248,176,176,130,20,175,41,183,197,37,198,65,91,137,224,117,156,92,99,137,191,0,208,30,136,77,159,248,107,27,211,91,165,214,121,232,15,147,210,89,232,133,136,197,239,94,129,216,154,41,180,129,78,244,165,76,179,119,80,24,47,80,102,45,184,251,194,122,3,255,179,208,188,235,165,204,166,60,69,75,18,150,4,81,206,23,8,40,239,235,102,188,83,151,194,240,96,52,114,207,16,161,143,50,26,74,85,238,197,29,213,166,58,77,227,118,172,101,248,88,203,226,13,10,213,99,149,199,177,18,60,218,169,66,197,88,207,149,250,247,12,87,203,204,114,74,161,28,183,241,65,224,219,140,251,23,61,81,143,13,161,190,228,97,66,160,93,229,16,134,119,245,177,77,172,183,151,130,178,1,11,247,197,128,109,189,214,120,17,204,19,108,12,13,10,248,105,216,221,157,240,236,226,155,88,28,85,198,3,57,148,142,4,77,163,64,204,112,77,209,143,136,132,166,211,200,81,230,17,61,119,116,45,109,192,83,101,221,197,128,107,155,235,165,49,3,122,174,174,35,175,240,177,151,55,68,62,129,5,213,124,44,36,107,9,34,43,37,146,109,83,104,230,39,40,172,177,185,143,245,30,177,254,106,19,142,102,3,97,202,248,243,7,77,225,43,113,55,219,72,25,188,162,179,148,9,99,108,143,248,54,140,7,204,70,84,81,129,142,126,114,111,2,201,220,128,62,30,83,250,4,222,38,204,89,178,75,93,134,205,22,161,171,126,167,48,58,248,203,178,173,124,227,2,86,5,44,212,195,176,134,68,109,181,189,134,119,166,200,253,193,59,252,120,36,35,233,105,76,122,96,80,26,222,147,163,200,103,165,148,192,76,192,251,22,38,253,226,132,181,102,234,30,79,111,123,121,244,242,47,233,197,134,210,93,139,64,192,164,20,123,122,43,226,74,131,175,166,95,42,223,248,22,214,86,25,5,45,129,201,204,135,190,115,114,51,170,9,22,185,204,65,115,110,164,99,15,77,16,192,134,122,174,5,159,34,236,188,56,104,237,209,31,76,201,125,196,69,129,197,46,245,165,135,157,164,14,53,98,129,188,14,30,114,192,94,15,3,154,103,159,12,19,149,94,111,87,127,182,231,140,148,129,14,188,156,117,217,81,154,120,104,212,116,179,45,138,44,98,215,232,38,48,5,147,37,169,205,51,210,202,53,208,54,155,212,92,214,241,125,131,194,195,1,114,27,211,201,195,76,104,176,231,9,223,229,11,66,138,79,5,23,134,171,100,247,7,221,78,77,138,7,94,6,87,34,213,182,142,94,144,149,197,24,76,215,192,18,70,207,196,24,247,89,20,240,160,27,8,143,255,250,223,133,200,73,156,177,64,143,115,150,176,217,75,11,93,254,132,233,166,25,197,94,135,36,13,10,129,175,22,238,137,57,132,254,51,31,21,245,151,205,60,148,21,83,63,155,83,86,62,71,141,140,106,21,158,66,138,128,109,51,244,97,111,253,129,3,173,34,26,25,132,85,71,9,123,217,241,178,52,193,254,220,220,250,13,143,254,195,86,19,5,21,197,197,17,254,92,91,168,210,95,246,30,99,104,116,28,196,102,89,44,217,32,105,110,150,76,252,11,222,28,94,11,31,186,218,21,184,113,216,238,26,217,75,196,164,44,186,106,240,82,106,6,29,21,53,216,243,251,76,252,242,73,173,249,103,46,115,164,175,90,227,82,177,145,1,93,227,49,219,255,42,136,152,57,196,14,164,211,21,129,54,4,244,79,111,81,20,77,0,20,251,105,251,197,212,214,77,148,134,183,40,93,117,51,167,70,80,57,32,33,47,30,226,139,97,185,180,79,121,225,93,204,81,251,254,220,185,27,158,171,24,191,148,37,37,223,21,230,118,68,189,77,5,41,254,68,51,49,117,237,144,156,6,214,236,53,40,15,241,53,75,220,251,80,146,149,255,49,35,226,165,49,8,121,118,14,110,122,245,176,214,253,68,193,79,130,202,76,168,159,196,23,113,116,94,18,144,172,134,144,157,205,137,74,54,11,156,84,153,57,82,44,126,84,171,146,209,207,11,91,220,76,248,233,200,185,253,73,181,242,70,182,187,81,251,184,129,235,106,17,132,178,56,58,207,169,200,144,125,215,60,139,233,162,0,229,85,246,116,199,61,231,13,156,23,30,179,162,19,63,200,5,140,26,68,173,248,177,67,172,180,59,57,77,20,46,237,159,190,167,176,204,59,233,96,224,56,78,241,220,244,9,74,34,224,179,180,183,59,136,236,14,81,131,178,153,111,217,6,185,191,61,18,168,24,200,23,177,106,251,153,191,124,13,225,145,238,248,174,237,144,250,19,127,210,171,132,220,157,39,228,151,147,94,193,190,71,213,178,85,94,152,209,88,6,135,255,130,203,240,185,183,111,224,115,98,12,227,58,36,80,9,92,232,89,168,158,104,169,77,150,253,156,138,224,123,185,208,96,138,103,193,125,193,92,162,115,192,19,200,22,21,14,237,131,208,63,80,46,125,191,32,139,119,72,17,122,213,155,36,24,124,96,228,164,79,172,92,157,83,202,17,162,245,66,109,46,80,55,39,39,197,118,4,38,71,72,95,63,6,167,121,193,26,57,142,185,20,64,199,77,133,102,84,135,16,66,169,118,205,84,248,243,231,113,172,53,34,106,139,221,184,120,132,161,215,58,136,128,25,225,24,69,73,93,111,53,78,36,175,35,169,205,175,238,186,125,81,124,175,216,156,122,55,150,238,252,32,118,70,126,91,46,244,162,68,210,105,250,215,65,178,75,77,222,164,213,35,116,174,86,85,69,127,163,15,75,139,27,34,17,13,10,104,187,144,17,245,94,223,245,71,131,130,207,195,255,23,195,229,42,55,107,226,149,211,84,121,32,18,124,150,36,124,156,45,6,158,169,241,13,10,65,210,6,228,91,34,137,1,216,236,71,242,97,84,76,75,209,151,70,146,236,81,149,131,154,99,141,228,145,2,41,15,208,159,131,26,27,91,99,152,238,140,35,55,177,139,164,126,41,211,162,40,204,60,241,68,125,242,222,49,96,178,242,234,17,235,211,67,13,68,209,118,193,58,90,135,108,107,241,55,101,251,47,74,169,231,224,173,49,26,58,131,46,125,78,195,208,74,21,76,4,197,11,221,126,8,195,41,192,198,130,197,102,105,253,112,77,167,180,196,165,106,80,245,15,96,173,198,163,15,49,84,39,6,248,9,47,223,64,96,53,22,123,218,254,249,129,17,227,157,61,139,225,63,5,126,68,86,44,27,3,49,21,200,196,173,202,186,144,183,247,38,91,114,103,149,44,81,100,230,138,68,52,183,104,65,120,161,174,70,231,191,16,227,68,171,153,121,148,97,171,174,158,61,78,66,77,224,189,153,166,108,211,176,250,207,60,105,72,192,8,96,246,77,200,31,113,174,225,34,69,120,122,130,224,64,240,253,11,93,208,117,71,85,116,247,166,13,21,124,239,48,208,64,12,205,181,218,39,96,74,151,92,45,182,0,213,90,203,215,193,110,50,157,92,124,141,7,61,70,114,62,41,239,130,72,145,131,49,7,110,196,88,168,95,152,203,176,252,13,10,120,99,14,153,219,122,176,241,120,198,41,187,114,108,81,24,37,203,114,37,20,202,54,125,205,208,103,167,49,200,237,114,50,78,92,247,21,161,38,2,246,164,159,146,31,6,50,23,95,97,94,29,147,187,34,86,132,181,15,57,178,109,101,160,17,14,158,164,95,171,81,118,63,183,133,229,5,148,43,75,14,13,141,226,19,86,213,140,93,135,239,105,69,125,212,121,68,179,78,75,41,41,60,213,53,247,194,90,118,43,242,66,51,47,18,149,93,170,11,4,175,155,15,26,228,187,203,45,74,191,22,55,64,56,86,109,65,158,113,216,185,217,26,175,139,40,56,195,246,157,120,2,217,16,1,131,126,234,105,190,71,245,149,248,100,238,3,254,34,112,224,85,86,104,12,113,154,15,51,226,73,83,247,187,227,13,3,195,31,136,18,90,136,138,159,196,116,6,87,140,121,221,105,154,158,115,174,193,121,151,55,78,201,78,159,1,71,0,120,6,64,125,242,19,237,249,250,228,87,243,150,228,3,146,145,194,62,13,10,84,230,208,124,40,101,35,116,163,103,64,76,58,140,80,167,78,170,76,238,174,169,138,5,236,34,0,3,168,15,53,101,173,5,16,13,10,57,124,137,222,222,98,155,169,175,103,205,241,96,139,8,186,1,246,83,68,189,68,181,216,166,85,225,251,210,82,27,15,172,22,11,251,70,40,41,108,111,113,45,152,239,239,210,140,190,38,49,220,77,83,189,145,84,131,88,108,150,25,199,166,101,234,36,56,119,180,211,76,85,13,71,58,54,249,193,221,171,168,154,124,114,122,38,37,247,108,195,216,115,78,254,145,63,4,191,106,154,186,67,90,179,44,226,111,33,36,153,203,76,78,151,218,96,43,75,81,195,91,35,127,147,62,245,30,9,27,234,203,142,13,10,194,117,177,67,57,225,50,153,55,67,120,255,179,160,242,86,145,221,127,43,238,165,237,185,189,21,42,220,134,208,31,163,233,172,238,242,238,196,91,208,22,226,85,220,88,223,42,156,92,214,74,7,180,188,65,11,55,161,55,33,13,207,33,76,48,39,209,135,103,38,86,125,156,80,146,111,244,85,3,145,7,154,2,199,180,8,124,17,8,197,9,216,143,86,223,206,122,197,151,136,234,20,164,47,198,148,25,136,42,134,156,98,84,97,136,67,121,15,152,113,67,166,186,0,96,130,151,57,203,226,19,227,1,148,242,29,1,45,206,211,4,71,8,71,237,12,43,143,89,127,15,213,112,235,4,65,195,161,83,132,48,157,216,63,46,239,211,210,118,9,221,9,12,5,87,57,26,4,187,249,17,13,10,253,208,13,213,132,190,187,203,66,80,23,77,117,3,216,97,11,236,160,174,149,170,186,52,163,13,10,187,126,206,246,142,16,118,106,218,200,26,40,20,5,27,79,72,68,120,198,107,57,52,132,54,104,118,112,24,95,23,23,248,77,160,98,212,143,224,119,44,152,103,19,238,201,251,90,242,223,141,218,141,189,118,170,203,137,130,23,97,247,111,112,188,52,201,55,118,111,22,240,14,88,152,234,21,49,232,180,180,255,101,234,1,137,168,234,183,58,3,8,158,32,94,121,26,101,83,74,201,145,19,249,117,234,82,35,180,56,136,65,227,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizen022024l=51771; +} +#endif //_PDF_READER_RESOURCE_FONT_n022024l_H diff --git a/PdfReader/Resources/Fonts/d050000l.pfb b/PdfReader/Resources/Fonts/d050000l.pfb new file mode 100644 index 0000000000..4a3c386d29 Binary files /dev/null and b/PdfReader/Resources/Fonts/d050000l.pfb differ diff --git a/PdfReader/Resources/Fonts/n019003l.afm b/PdfReader/Resources/Fonts/n019003l.afm new file mode 100644 index 0000000000..36133a4290 --- /dev/null +++ b/PdfReader/Resources/Fonts/n019003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-Regu +FullName Nimbus Sans L Regular +FamilyName Nimbus Sans L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -151 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -174 -285 1001 953 +CapHeight 729 +XHeight 524 +Descender -218 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 191 0 191 0 ; +C 33 ; WX 278 ; N exclam ; B 124 0 208 729 ; +C 34 ; WX 355 ; N quotedbl ; B 52 464 305 709 ; +C 35 ; WX 556 ; N numbersign ; B 14 -20 542 697 ; +C 36 ; WX 556 ; N dollar ; B 26 -126 518 770 ; +C 37 ; WX 889 ; N percent ; B 29 -20 859 709 ; +C 38 ; WX 667 ; N ampersand ; B 52 -23 637 709 ; +C 39 ; WX 221 ; N quoteright ; B 64 497 157 729 ; +C 40 ; WX 333 ; N parenleft ; B 73 -212 291 729 ; +C 41 ; WX 333 ; N parenright ; B 38 -212 256 729 ; +C 42 ; WX 389 ; N asterisk ; B 40 441 343 729 ; +C 43 ; WX 584 ; N plus ; B 50 -10 534 474 ; +C 44 ; WX 278 ; N comma ; B 87 -147 192 104 ; +C 45 ; WX 333 ; N hyphen ; B 46 240 284 312 ; +C 46 ; WX 278 ; N period ; B 87 0 191 104 ; +C 47 ; WX 278 ; N slash ; B -8 -20 284 729 ; +C 48 ; WX 556 ; N zero ; B 43 -23 507 709 ; +C 49 ; WX 556 ; N one ; B 102 0 347 709 ; +C 50 ; WX 556 ; N two ; B 34 0 511 709 ; +C 51 ; WX 556 ; N three ; B 32 -23 506 709 ; +C 52 ; WX 556 ; N four ; B 28 0 520 709 ; +C 53 ; WX 556 ; N five ; B 35 -23 513 709 ; +C 54 ; WX 556 ; N six ; B 43 -23 513 709 ; +C 55 ; WX 556 ; N seven ; B 46 0 520 709 ; +C 56 ; WX 556 ; N eight ; B 37 -23 513 709 ; +C 57 ; WX 556 ; N nine ; B 38 -23 509 709 ; +C 58 ; WX 278 ; N colon ; B 110 0 214 524 ; +C 59 ; WX 278 ; N semicolon ; B 110 -147 215 524 ; +C 60 ; WX 584 ; N less ; B 45 -9 534 474 ; +C 61 ; WX 584 ; N equal ; B 50 111 534 353 ; +C 62 ; WX 584 ; N greater ; B 50 -9 539 474 ; +C 63 ; WX 556 ; N question ; B 77 0 509 741 ; +C 64 ; WX 1015 ; N at ; B 34 -142 951 741 ; +C 65 ; WX 667 ; N A ; B 17 0 653 729 ; +C 66 ; WX 667 ; N B ; B 79 0 623 729 ; +C 67 ; WX 722 ; N C ; B 48 -23 677 741 ; +C 68 ; WX 722 ; N D ; B 89 0 667 729 ; +C 69 ; WX 667 ; N E ; B 90 0 613 729 ; +C 70 ; WX 611 ; N F ; B 90 0 579 729 ; +C 71 ; WX 778 ; N G ; B 44 -23 709 741 ; +C 72 ; WX 722 ; N H ; B 83 0 644 729 ; +C 73 ; WX 278 ; N I ; B 100 0 194 729 ; +C 74 ; WX 500 ; N J ; B 17 -23 426 729 ; +C 75 ; WX 667 ; N K ; B 79 0 658 729 ; +C 76 ; WX 556 ; N L ; B 80 0 533 729 ; +C 77 ; WX 833 ; N M ; B 75 0 761 729 ; +C 78 ; WX 722 ; N N ; B 76 0 646 729 ; +C 79 ; WX 778 ; N O ; B 38 -23 742 741 ; +C 80 ; WX 667 ; N P ; B 91 0 617 729 ; +C 81 ; WX 778 ; N Q ; B 38 -59 742 741 ; +C 82 ; WX 722 ; N R ; B 93 0 679 729 ; +C 83 ; WX 667 ; N S ; B 48 -23 621 741 ; +C 84 ; WX 611 ; N T ; B 21 0 593 729 ; +C 85 ; WX 722 ; N U ; B 85 -23 645 729 ; +C 86 ; WX 667 ; N V ; B 30 0 645 729 ; +C 87 ; WX 944 ; N W ; B 22 0 929 729 ; +C 88 ; WX 667 ; N X ; B 22 0 649 729 ; +C 89 ; WX 667 ; N Y ; B 13 0 661 729 ; +C 90 ; WX 611 ; N Z ; B 28 0 583 729 ; +C 91 ; WX 278 ; N bracketleft ; B 64 -212 250 729 ; +C 92 ; WX 278 ; N backslash ; B -8 -20 284 729 ; +C 93 ; WX 278 ; N bracketright ; B 23 -212 209 729 ; +C 94 ; WX 469 ; N asciicircum ; B 44 329 425 709 ; +C 95 ; WX 556 ; N underscore ; B -22 -176 578 -126 ; +C 96 ; WX 222 ; N quoteleft ; B 65 477 158 709 ; +C 97 ; WX 556 ; N a ; B 42 -23 535 539 ; +C 98 ; WX 556 ; N b ; B 54 -23 523 729 ; +C 99 ; WX 500 ; N c ; B 31 -23 477 539 ; +C 100 ; WX 556 ; N d ; B 26 -23 495 729 ; +C 101 ; WX 556 ; N e ; B 40 -23 513 539 ; +C 102 ; WX 278 ; N f ; B 18 0 258 732 ; +C 103 ; WX 556 ; N g ; B 29 -218 489 539 ; +C 104 ; WX 556 ; N h ; B 70 0 486 729 ; +C 105 ; WX 222 ; N i ; B 66 0 150 729 ; +C 106 ; WX 222 ; N j ; B -18 -218 153 729 ; +C 107 ; WX 500 ; N k ; B 58 0 502 729 ; +C 108 ; WX 222 ; N l ; B 68 0 152 729 ; +C 109 ; WX 833 ; N m ; B 70 0 762 539 ; +C 110 ; WX 556 ; N n ; B 70 0 487 539 ; +C 111 ; WX 556 ; N o ; B 36 -23 510 539 ; +C 112 ; WX 556 ; N p ; B 54 -218 523 539 ; +C 113 ; WX 556 ; N q ; B 26 -218 495 539 ; +C 114 ; WX 333 ; N r ; B 69 0 321 539 ; +C 115 ; WX 500 ; N s ; B 34 -23 459 539 ; +C 116 ; WX 278 ; N t ; B 14 -23 254 668 ; +C 117 ; WX 556 ; N u ; B 65 -23 482 524 ; +C 118 ; WX 500 ; N v ; B 10 0 486 524 ; +C 119 ; WX 722 ; N w ; B 6 0 708 524 ; +C 120 ; WX 500 ; N x ; B 17 0 473 524 ; +C 121 ; WX 500 ; N y ; B 20 -218 478 524 ; +C 122 ; WX 500 ; N z ; B 31 0 457 524 ; +C 123 ; WX 334 ; N braceleft ; B 43 -212 276 729 ; +C 124 ; WX 260 ; N bar ; B 100 -212 160 729 ; +C 125 ; WX 334 ; N braceright ; B 29 -212 262 729 ; +C 126 ; WX 584 ; N asciitilde ; B 75 268 508 438 ; +C 161 ; WX 333 ; N exclamdown ; B 121 -205 205 524 ; +C 162 ; WX 556 ; N cent ; B 52 -120 510 628 ; +C 163 ; WX 556 ; N sterling ; B 26 -23 535 729 ; +C 164 ; WX 167 ; N fraction ; B -174 -20 336 709 ; +C 165 ; WX 556 ; N yen ; B 11 0 545 709 ; +C 166 ; WX 556 ; N florin ; B 11 -212 542 738 ; +C 167 ; WX 556 ; N section ; B 43 -213 506 729 ; +C 168 ; WX 556 ; N currency ; B 67 133 489 551 ; +C 169 ; WX 191 ; N quotesingle ; B 48 464 142 709 ; +C 170 ; WX 333 ; N quotedblleft ; B 48 477 299 709 ; +C 171 ; WX 556 ; N guillemotleft ; B 98 106 455 438 ; +C 172 ; WX 333 ; N guilsinglleft ; B 91 106 243 438 ; +C 173 ; WX 333 ; N guilsinglright ; B 85 106 239 438 ; +C 174 ; WX 500 ; N fi ; B 12 0 436 732 ; +C 175 ; WX 500 ; N fl ; B 17 0 430 732 ; +C 177 ; WX 556 ; N endash ; B -5 240 561 312 ; +C 178 ; WX 556 ; N dagger ; B 38 -177 513 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 38 -177 513 709 ; +C 180 ; WX 278 ; N periodcentered ; B 87 302 211 427 ; +C 182 ; WX 537 ; N paragraph ; B 48 -177 522 729 ; +C 183 ; WX 350 ; N bullet ; B 50 220 300 470 ; +C 184 ; WX 222 ; N quotesinglbase ; B 64 -128 158 104 ; +C 185 ; WX 333 ; N quotedblbase ; B 47 -128 300 104 ; +C 186 ; WX 333 ; N quotedblright ; B 49 477 302 709 ; +C 187 ; WX 556 ; N guillemotright ; B 98 106 451 438 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ; +C 189 ; WX 1000 ; N perthousand ; B 9 -22 993 738 ; +C 191 ; WX 611 ; N questiondown ; B 95 -217 528 524 ; +C 193 ; WX 333 ; N grave ; B 22 592 231 740 ; +C 194 ; WX 333 ; N acute ; B 92 592 301 740 ; +C 195 ; WX 333 ; N circumflex ; B 20 591 307 741 ; +C 196 ; WX 333 ; N tilde ; B 5 613 319 717 ; +C 197 ; WX 333 ; N macron ; B 28 631 302 701 ; +C 198 ; WX 333 ; N breve ; B 15 597 316 732 ; +C 199 ; WX 333 ; N dotaccent ; B 115 612 219 716 ; +C 200 ; WX 333 ; N dieresis ; B 30 612 296 715 ; +C 202 ; WX 333 ; N ring ; B 79 579 255 754 ; +C 203 ; WX 333 ; N cedilla ; B 39 -214 287 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -35 590 348 740 ; +C 206 ; WX 333 ; N ogonek ; B 57 -205 265 0 ; +C 207 ; WX 333 ; N caron ; B 19 591 306 741 ; +C 208 ; WX 1000 ; N emdash ; B -9 240 1001 312 ; +C 225 ; WX 1000 ; N AE ; B 11 0 950 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 37 303 333 742 ; +C 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ; +C 233 ; WX 778 ; N Oslash ; B 30 -23 744 755 ; +C 234 ; WX 1000 ; N OE ; B 43 -20 959 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 40 303 324 742 ; +C 241 ; WX 889 ; N ae ; B 34 -23 845 539 ; +C 245 ; WX 278 ; N dotlessi ; B 94 0 178 524 ; +C 248 ; WX 222 ; N lslash ; B 0 0 212 729 ; +C 249 ; WX 611 ; N oslash ; B 18 -30 529 539 ; +C 250 ; WX 944 ; N oe ; B 40 -23 899 539 ; +C 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ; +C -1 ; WX 722 ; N Udieresis ; B 85 -23 645 914 ; +C -1 ; WX 722 ; N Uacute ; B 85 -23 645 939 ; +C -1 ; WX 667 ; N Scedilla ; B 45 -214 621 741 ; +C -1 ; WX 611 ; N Tcaron ; B 21 0 593 940 ; +C -1 ; WX 667 ; N Scaron ; B 48 -23 621 940 ; +C -1 ; WX 722 ; N Rcaron ; B 93 0 679 940 ; +C -1 ; WX 722 ; N Racute ; B 93 0 679 939 ; +C -1 ; WX 667 ; N Sacute ; B 48 -23 621 939 ; +C -1 ; WX 778 ; N Otilde ; B 38 -23 742 916 ; +C -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 38 -23 742 939 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 85 -23 645 939 ; +C -1 ; WX 666 ; N Yacute ; B 13 0 661 939 ; +C -1 ; WX 722 ; N Eth ; B 20 0 667 729 ; +C -1 ; WX 722 ; N Dcroat ; B 20 0 667 729 ; +C -1 ; WX 611 ; N Zacute ; B 28 0 583 939 ; +C -1 ; WX 722 ; N Uring ; B 85 -23 645 953 ; +C -1 ; WX 556 ; N gbreve ; B 29 -218 489 732 ; +C -1 ; WX 556 ; N eogonek ; B 40 -204 514 539 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -23 513 716 ; +C -1 ; WX 556 ; N ecaron ; B 40 -23 513 741 ; +C -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ; +C -1 ; WX 666 ; N Thorn ; B 91 0 616 729 ; +C -1 ; WX 556 ; N eacute ; B 40 -23 513 740 ; +C -1 ; WX 556 ; N edieresis ; B 40 -23 513 715 ; +C -1 ; WX 635 ; N dcaron ; B 26 -23 648 729 ; +C -1 ; WX 500 ; N ccedilla ; B 31 -214 477 539 ; +C -1 ; WX 500 ; N ccaron ; B 31 -23 477 741 ; +C -1 ; WX 500 ; N cacute ; B 31 -23 477 740 ; +C -1 ; WX 556 ; N aogonek ; B 43 -205 596 539 ; +C -1 ; WX 556 ; N aring ; B 42 -23 535 754 ; +C -1 ; WX 556 ; N atilde ; B 42 -23 535 717 ; +C -1 ; WX 556 ; N abreve ; B 42 -23 535 732 ; +C -1 ; WX 556 ; N egrave ; B 40 -23 513 740 ; +C -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ; +C -1 ; WX 556 ; N aacute ; B 42 -23 535 740 ; +C -1 ; WX 556 ; N adieresis ; B 42 -23 535 715 ; +C -1 ; WX 722 ; N Uogonek ; B 85 -205 645 729 ; +C -1 ; WX 556 ; N ugrave ; B 65 -23 482 740 ; +C -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ; +C -1 ; WX 556 ; N udieresis ; B 65 -23 482 715 ; +C -1 ; WX 308 ; N tcaron ; B 14 -23 321 800 ; +C -1 ; WX 500 ; N scommaaccent ; B 34 -285 459 539 ; +C -1 ; WX 611 ; N Zcaron ; B 28 0 583 940 ; +C -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ; +C -1 ; WX 722 ; N Ucircumflex ; B 85 -23 645 940 ; +C -1 ; WX 556 ; N acircumflex ; B 42 -23 535 741 ; +C -1 ; WX 611 ; N Zdotaccent ; B 28 0 583 915 ; +C -1 ; WX 500 ; N scaron ; B 34 -23 459 741 ; +C -1 ; WX 667 ; N Amacron ; B 17 0 653 900 ; +C -1 ; WX 500 ; N sacute ; B 34 -23 459 740 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 21 -285 593 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 13 0 661 914 ; +C -1 ; WX 555 ; N thorn ; B 54 -218 522 714 ; +C -1 ; WX 667 ; N Emacron ; B 90 0 613 900 ; +C -1 ; WX 778 ; N Ograve ; B 38 -23 742 939 ; +C -1 ; WX 778 ; N Oacute ; B 38 -23 742 939 ; +C -1 ; WX 778 ; N Odieresis ; B 38 -23 742 914 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 646 916 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 940 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 939 ; +C -1 ; WX 556 ; N Lcaron ; B 80 0 533 729 ; +C -1 ; WX 556 ; N Lacute ; B 70 0 533 939 ; +C -1 ; WX 278 ; N Idotaccent ; B 92 0 196 915 ; +C -1 ; WX 333 ; N racute ; B 69 0 331 740 ; +C -1 ; WX 278 ; N Icircumflex ; B -1 0 286 940 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 36 -23 526 740 ; +C -1 ; WX 556 ; N otilde ; B 36 -23 510 717 ; +C -1 ; WX 556 ; N Euro ; B 2 -23 543 709 ; +C -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ; +C -1 ; WX 351 ; N onesuperior ; B 61 284 222 709 ; +C -1 ; WX 351 ; N twosuperior ; B 19 284 326 709 ; +C -1 ; WX 351 ; N threesuperior ; B 16 270 322 709 ; +C -1 ; WX 278 ; N Igrave ; B 1 0 210 939 ; +C -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ; +C -1 ; WX 278 ; N Imacron ; B 20 0 274 900 ; +C -1 ; WX 278 ; N Iogonek ; B 66 -204 234 729 ; +C -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -23 709 931 ; +C -1 ; WX 722 ; N Umacron ; B 85 -23 645 900 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 79 -285 658 729 ; +C -1 ; WX 556 ; N ograve ; B 36 -23 510 740 ; +C -1 ; WX 667 ; N Scommaaccent ; B 48 -285 621 741 ; +C -1 ; WX 667 ; N Eogonek ; B 90 -205 652 729 ; +C -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ; +C -1 ; WX 667 ; N Edotaccent ; B 90 0 613 915 ; +C -1 ; WX 222 ; N iogonek ; B 25 -204 190 729 ; +C -1 ; WX 556 ; N gcommaaccent ; B 29 -218 489 817 ; +C -1 ; WX 556 ; N odieresis ; B 36 -23 510 715 ; +C -1 ; WX 556 ; N ntilde ; B 70 0 487 717 ; +C -1 ; WX 556 ; N ncaron ; B 70 0 487 741 ; +C -1 ; WX 667 ; N Ecaron ; B 90 0 613 940 ; +C -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ; +C -1 ; WX 500 ; N scedilla ; B 34 -214 459 539 ; +C -1 ; WX 333 ; N rcaron ; B 48 0 335 741 ; +C -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ; +C -1 ; WX 667 ; N Eacute ; B 90 0 613 939 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -285 709 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 93 -285 679 729 ; +C -1 ; WX 667 ; N Edieresis ; B 90 0 613 914 ; +C -1 ; WX 556 ; N nacute ; B 70 0 487 740 ; +C -1 ; WX 556 ; N uogonek ; B 65 -204 521 524 ; +C -1 ; WX 556 ; N umacron ; B 65 -23 482 701 ; +C -1 ; WX 722 ; N Dcaron ; B 89 0 667 940 ; +C -1 ; WX 292 ; N lcaron ; B 68 0 305 729 ; +C -1 ; WX 722 ; N Ccaron ; B 48 -23 677 940 ; +C -1 ; WX 722 ; N Cacute ; B 48 -23 677 939 ; +C -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ; +C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; +C -1 ; WX 667 ; N Aogonek ; B 17 -205 692 729 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 267 ; +C -1 ; WX 584 ; N multiply ; B 95 34 488 427 ; +C -1 ; WX 584 ; N divide ; B 50 0 534 472 ; +C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; +C -1 ; WX 1000 ; N trademark ; B 63 292 938 729 ; +C -1 ; WX 333 ; N rcommaaccent ; B 65 -285 321 539 ; +C -1 ; WX 222 ; N lacute ; B 63 0 272 939 ; +C -1 ; WX 556 ; N omacron ; B 36 -23 510 701 ; +C -1 ; WX 667 ; N Atilde ; B 17 0 653 916 ; +C -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ; +C -1 ; WX 278 ; N igrave ; B -5 0 204 740 ; +C -1 ; WX 556 ; N ncommaaccent ; B 70 -285 487 539 ; +C -1 ; WX 222 ; N lcommaaccent ; B 63 -285 163 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 -11 534 623 ; +C -1 ; WX 869 ; N onehalf ; B 61 -20 844 709 ; +C -1 ; WX 869 ; N onequarter ; B 61 -20 849 709 ; +C -1 ; WX 869 ; N threequarters ; B 16 -20 849 709 ; +C -1 ; WX 278 ; N iacute ; B 65 0 274 740 ; +C -1 ; WX 667 ; N Abreve ; B 17 0 653 931 ; +C -1 ; WX 500 ; N kcommaaccent ; B 58 -285 502 729 ; +C -1 ; WX 778 ; N Omacron ; B 38 -23 742 900 ; +C -1 ; WX 222 ; N imacron ; B -16 0 231 701 ; +C -1 ; WX 556 ; N emacron ; B 40 -23 513 701 ; +C -1 ; WX 556 ; N amacron ; B 42 -23 535 701 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -285 254 668 ; +C -1 ; WX 500 ; N ydieresis ; B 20 -218 478 715 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 457 716 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 457 741 ; +C -1 ; WX 500 ; N zacute ; B 31 0 457 740 ; +C -1 ; WX 500 ; N yacute ; B 20 -218 478 740 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 65 -23 530 740 ; +C -1 ; WX 556 ; N eth ; B 36 -23 510 743 ; +C -1 ; WX 556 ; N uring ; B 65 -23 482 754 ; +C -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ; +C -1 ; WX 333 ; N commaaccent ; B 116 -285 216 -60 ; +C -1 ; WX 737 ; N copyright ; B -13 -22 751 742 ; +C -1 ; WX 737 ; N registered ; B -13 -22 751 742 ; +C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; +C -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 711 ; N Delta ; B 10 0 701 729 ; +C -1 ; WX 548 ; N notequal ; B 32 -25 516 486 ; +C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; +C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; +C -1 ; WX 667 ; N Aacute ; B 17 0 653 939 ; +C -1 ; WX 584 ; N lessequal ; B 45 -11 534 639 ; +C -1 ; WX 584 ; N greaterequal ; B 45 -11 534 639 ; +C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; +C -1 ; WX 711 ; N summation ; B 17 -97 694 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -285 646 729 ; +C -1 ; WX 556 ; N dcroat ; B 26 -23 557 729 ; +C -1 ; WX 260 ; N brokenbar ; B 100 -212 160 729 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 80 -285 533 729 ; +C -1 ; WX 667 ; N Adieresis ; B 17 0 653 914 ; +C -1 ; WX 556 ; N mu ; B 65 -220 544 524 ; +C -1 ; WX 278 ; N .notdef ; B 191 0 191 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -36 +KPX A Ccedilla -36 +KPX A G -35 +KPX A O -33 +KPX A Odieresis -33 +KPX A Q -32 +KPX A T -93 +KPX A U -37 +KPX A Uacute -37 +KPX A Ucircumflex -37 +KPX A Udieresis -37 +KPX A Ugrave -37 +KPX A V -75 +KPX A W -51 +KPX A Y -99 +KPX A a -4 +KPX A b 4 +KPX A c -11 +KPX A ccedilla -10 +KPX A comma 5 +KPX A d -8 +KPX A e -16 +KPX A g -10 +KPX A guillemotleft -44 +KPX A guilsinglleft -40 +KPX A hyphen -3 +KPX A o -13 +KPX A period 5 +KPX A q -8 +KPX A quotedblright -56 +KPX A quoteright -65 +KPX A t -16 +KPX A u -12 +KPX A v -31 +KPX A w -21 +KPX A y -34 +KPX Aacute C -36 +KPX Aacute G -35 +KPX Aacute O -33 +KPX Aacute Q -32 +KPX Aacute T -93 +KPX Aacute U -37 +KPX Aacute V -75 +KPX Aacute W -51 +KPX Aacute Y -99 +KPX Aacute a -4 +KPX Aacute b 4 +KPX Aacute c -11 +KPX Aacute comma 5 +KPX Aacute d -8 +KPX Aacute e -16 +KPX Aacute g -10 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen -3 +KPX Aacute o -13 +KPX Aacute period 5 +KPX Aacute q -8 +KPX Aacute quoteright -65 +KPX Aacute t -16 +KPX Aacute u -12 +KPX Aacute v -31 +KPX Aacute w -21 +KPX Aacute y -34 +KPX Acircumflex C -36 +KPX Acircumflex G -35 +KPX Acircumflex O -33 +KPX Acircumflex Q -32 +KPX Acircumflex T -93 +KPX Acircumflex U -37 +KPX Acircumflex V -75 +KPX Acircumflex W -51 +KPX Acircumflex Y -99 +KPX Acircumflex comma 5 +KPX Acircumflex period 5 +KPX Adieresis C -36 +KPX Adieresis G -35 +KPX Adieresis O -33 +KPX Adieresis Q -32 +KPX Adieresis T -93 +KPX Adieresis U -37 +KPX Adieresis V -75 +KPX Adieresis W -51 +KPX Adieresis Y -99 +KPX Adieresis a -4 +KPX Adieresis b 4 +KPX Adieresis c -11 +KPX Adieresis comma 5 +KPX Adieresis d -8 +KPX Adieresis g -10 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen -3 +KPX Adieresis o -13 +KPX Adieresis period 5 +KPX Adieresis q -8 +KPX Adieresis quotedblright -56 +KPX Adieresis quoteright -65 +KPX Adieresis t -16 +KPX Adieresis u -12 +KPX Adieresis v -31 +KPX Adieresis w -21 +KPX Adieresis y -34 +KPX Agrave C -36 +KPX Agrave G -35 +KPX Agrave O -33 +KPX Agrave Q -32 +KPX Agrave T -93 +KPX Agrave U -37 +KPX Agrave V -75 +KPX Agrave W -51 +KPX Agrave Y -99 +KPX Agrave comma 5 +KPX Agrave period 5 +KPX Aring C -36 +KPX Aring G -35 +KPX Aring O -33 +KPX Aring Q -32 +KPX Aring T -93 +KPX Aring U -37 +KPX Aring V -75 +KPX Aring W -51 +KPX Aring Y -99 +KPX Aring a -4 +KPX Aring b 4 +KPX Aring c -11 +KPX Aring comma 5 +KPX Aring d -8 +KPX Aring e -16 +KPX Aring g -10 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -40 +KPX Aring hyphen -3 +KPX Aring o -13 +KPX Aring period 5 +KPX Aring q -8 +KPX Aring quotedblright -56 +KPX Aring quoteright -65 +KPX Aring t -16 +KPX Aring u -12 +KPX Aring v -31 +KPX Aring w -21 +KPX Aring y -34 +KPX Atilde C -36 +KPX Atilde G -35 +KPX Atilde O -33 +KPX Atilde Q -32 +KPX Atilde T -93 +KPX Atilde U -37 +KPX Atilde V -75 +KPX Atilde W -51 +KPX Atilde Y -99 +KPX Atilde comma 5 +KPX Atilde period 5 +KPX B A -21 +KPX B AE -21 +KPX B Aacute -21 +KPX B Acircumflex -21 +KPX B Adieresis -21 +KPX B Aring -21 +KPX B Atilde -21 +KPX B O -7 +KPX B OE -5 +KPX B Oacute -7 +KPX B Ocircumflex -7 +KPX B Odieresis -7 +KPX B Ograve -7 +KPX B Oslash -1 +KPX B V -41 +KPX B W -25 +KPX B Y -44 +KPX C A -32 +KPX C AE -33 +KPX C Aacute -32 +KPX C Adieresis -32 +KPX C Aring -32 +KPX C H -12 +KPX C K -10 +KPX C O -8 +KPX C Oacute -8 +KPX C Odieresis -8 +KPX Ccedilla A -31 +KPX D A -42 +KPX D Aacute -42 +KPX D Acircumflex -42 +KPX D Adieresis -42 +KPX D Agrave -42 +KPX D Aring -42 +KPX D Atilde -42 +KPX D J -5 +KPX D T -45 +KPX D V -51 +KPX D W -29 +KPX D X -53 +KPX D Y -63 +KPX F A -69 +KPX F Aacute -69 +KPX F Acircumflex -69 +KPX F Adieresis -69 +KPX F Agrave -69 +KPX F Aring -69 +KPX F Atilde -69 +KPX F J -51 +KPX F O -22 +KPX F Odieresis -22 +KPX F a -33 +KPX F aacute -33 +KPX F adieresis -33 +KPX F ae -29 +KPX F aring -33 +KPX F comma -108 +KPX F e -24 +KPX F eacute -24 +KPX F hyphen -14 +KPX F i -10 +KPX F j -12 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -23 +KPX F oslash -21 +KPX F period -108 +KPX F r -35 +KPX F u -33 +KPX G A -6 +KPX G AE -3 +KPX G Aacute -6 +KPX G Acircumflex -6 +KPX G Adieresis -6 +KPX G Agrave -6 +KPX G Aring -6 +KPX G Atilde -6 +KPX G T -44 +KPX G V -50 +KPX G W -28 +KPX G Y -62 +KPX J A -32 +KPX J AE -31 +KPX J Adieresis -32 +KPX J Aring -32 +KPX K C -51 +KPX K G -51 +KPX K O -48 +KPX K OE -45 +KPX K Oacute -48 +KPX K Odieresis -48 +KPX K S -38 +KPX K T 20 +KPX K a -11 +KPX K adieresis -11 +KPX K ae -7 +KPX K aring -11 +KPX K e -32 +KPX K hyphen -47 +KPX K o -29 +KPX K oacute -29 +KPX K odieresis -29 +KPX K u -19 +KPX K udieresis -19 +KPX K y -62 +KPX L A 17 +KPX L AE 20 +KPX L Aacute 17 +KPX L Adieresis 17 +KPX L Aring 17 +KPX L C -41 +KPX L Ccedilla -37 +KPX L G -42 +KPX L O -41 +KPX L Oacute -41 +KPX L Ocircumflex -41 +KPX L Odieresis -41 +KPX L Ograve -41 +KPX L Otilde -41 +KPX L S -19 +KPX L T -105 +KPX L U -35 +KPX L Udieresis -35 +KPX L V -105 +KPX L W -68 +KPX L Y -121 +KPX L hyphen -125 +KPX L quotedblright -141 +KPX L quoteright -149 +KPX L u -7 +KPX L udieresis -7 +KPX L y -56 +KPX N A -9 +KPX N AE -6 +KPX N Aacute -9 +KPX N Adieresis -9 +KPX N Aring -9 +KPX N C -3 +KPX N Ccedilla -3 +KPX N G -2 +KPX N O 0 +KPX N Oacute 0 +KPX N Odieresis 0 +KPX N a -5 +KPX N aacute -5 +KPX N adieresis -5 +KPX N ae -2 +KPX N aring -5 +KPX N comma -7 +KPX N e 0 +KPX N eacute 0 +KPX N o 2 +KPX N oacute 2 +KPX N odieresis 2 +KPX N oslash 4 +KPX N period -7 +KPX N u 0 +KPX N udieresis 0 +KPX O A -35 +KPX O AE -39 +KPX O Aacute -35 +KPX O Adieresis -35 +KPX O Aring -35 +KPX O T -42 +KPX O V -45 +KPX O W -23 +KPX O X -46 +KPX O Y -59 +KPX Oacute A -35 +KPX Oacute T -42 +KPX Oacute V -45 +KPX Oacute W -23 +KPX Oacute Y -59 +KPX Ocircumflex T -42 +KPX Ocircumflex V -45 +KPX Ocircumflex Y -59 +KPX Odieresis A -35 +KPX Odieresis T -42 +KPX Odieresis V -45 +KPX Odieresis W -23 +KPX Odieresis X -46 +KPX Odieresis Y -59 +KPX Ograve T -42 +KPX Ograve V -45 +KPX Ograve Y -59 +KPX Oslash A -33 +KPX Otilde T -42 +KPX Otilde V -45 +KPX Otilde Y -59 +KPX P A -78 +KPX P AE -86 +KPX P Aacute -78 +KPX P Adieresis -78 +KPX P Aring -78 +KPX P J -78 +KPX P a -28 +KPX P aacute -28 +KPX P adieresis -28 +KPX P ae -24 +KPX P aring -28 +KPX P comma -135 +KPX P e -31 +KPX P eacute -31 +KPX P hyphen -40 +KPX P o -27 +KPX P oacute -27 +KPX P odieresis -27 +KPX P oe -28 +KPX P oslash -27 +KPX P period -135 +KPX R C -16 +KPX R Ccedilla -16 +KPX R G -15 +KPX R O -13 +KPX R OE -11 +KPX R Oacute -13 +KPX R Odieresis -13 +KPX R T -23 +KPX R U -17 +KPX R Udieresis -17 +KPX R V -39 +KPX R W -27 +KPX R Y -43 +KPX R a -15 +KPX R aacute -15 +KPX R adieresis -15 +KPX R ae -12 +KPX R aring -15 +KPX R e -12 +KPX R eacute -12 +KPX R hyphen -2 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe -11 +KPX R u -9 +KPX R uacute -9 +KPX R udieresis -9 +KPX R y -8 +KPX S A -22 +KPX S AE -22 +KPX S Aacute -22 +KPX S Adieresis -22 +KPX S Aring -22 +KPX S T -28 +KPX S V -42 +KPX S W -28 +KPX S Y -48 +KPX S t -3 +KPX T A -95 +KPX T AE -97 +KPX T Aacute -95 +KPX T Acircumflex -95 +KPX T Adieresis -95 +KPX T Agrave -95 +KPX T Aring -95 +KPX T Atilde -95 +KPX T C -44 +KPX T G -45 +KPX T J -100 +KPX T O -42 +KPX T OE -35 +KPX T Oacute -42 +KPX T Ocircumflex -42 +KPX T Odieresis -42 +KPX T Ograve -42 +KPX T Oslash -41 +KPX T Otilde -42 +KPX T S -24 +KPX T V 12 +KPX T W 16 +KPX T Y 20 +KPX T a -100 +KPX T ae -97 +KPX T c -90 +KPX T colon -133 +KPX T comma -100 +KPX T e -95 +KPX T g -89 +KPX T guillemotleft -121 +KPX T guilsinglleft -117 +KPX T hyphen -77 +KPX T i -3 +KPX T j -5 +KPX T o -92 +KPX T oslash -87 +KPX T period -100 +KPX T r -92 +KPX T s -92 +KPX T semicolon -129 +KPX T u -91 +KPX T v -95 +KPX T w -93 +KPX T y -100 +KPX U A -36 +KPX U AE -39 +KPX U Aacute -36 +KPX U Acircumflex -36 +KPX U Adieresis -36 +KPX U Aring -36 +KPX U Atilde -36 +KPX U comma -27 +KPX U m -4 +KPX U n -4 +KPX U p 3 +KPX U period -25 +KPX U r -4 +KPX Uacute A -36 +KPX Uacute comma -27 +KPX Uacute m -4 +KPX Uacute n -4 +KPX Uacute p 3 +KPX Uacute period -25 +KPX Uacute r -4 +KPX Ucircumflex A -36 +KPX Udieresis A -36 +KPX Udieresis b 3 +KPX Udieresis comma -27 +KPX Udieresis m -4 +KPX Udieresis n -4 +KPX Udieresis p 3 +KPX Udieresis period -25 +KPX Udieresis r -4 +KPX Ugrave A -36 +KPX V A -71 +KPX V AE -78 +KPX V Aacute -71 +KPX V Acircumflex -71 +KPX V Adieresis -71 +KPX V Agrave -71 +KPX V Aring -71 +KPX V Atilde -71 +KPX V C -43 +KPX V G -42 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Oslash -33 +KPX V Otilde -40 +KPX V S -35 +KPX V T 15 +KPX V a -59 +KPX V ae -55 +KPX V colon -66 +KPX V comma -89 +KPX V e -57 +KPX V g -50 +KPX V guillemotleft -83 +KPX V guilsinglleft -80 +KPX V hyphen -38 +KPX V i -5 +KPX V o -54 +KPX V oslash -50 +KPX V period -89 +KPX V r -42 +KPX V semicolon -66 +KPX V u -41 +KPX V y -20 +KPX W A -50 +KPX W AE -56 +KPX W Aacute -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W C -23 +KPX W G -22 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Oslash -13 +KPX W Otilde -20 +KPX W S -24 +KPX W T 19 +KPX W a -38 +KPX W ae -34 +KPX W colon -52 +KPX W comma -56 +KPX W e -32 +KPX W g -25 +KPX W guillemotleft -58 +KPX W guilsinglleft -54 +KPX W hyphen -13 +KPX W i -1 +KPX W o -29 +KPX W oslash -25 +KPX W period -56 +KPX W r -28 +KPX W semicolon -53 +KPX W u -28 +KPX W y -6 +KPX X C -48 +KPX X O -45 +KPX X Odieresis -45 +KPX X Q -44 +KPX X a -15 +KPX X e -36 +KPX X hyphen -51 +KPX X o -33 +KPX X u -24 +KPX X y -61 +KPX Y A -96 +KPX Y AE -103 +KPX Y Aacute -96 +KPX Y Acircumflex -96 +KPX Y Adieresis -96 +KPX Y Agrave -96 +KPX Y Aring -96 +KPX Y Atilde -96 +KPX Y C -58 +KPX Y G -58 +KPX Y O -56 +KPX Y Oacute -56 +KPX Y Ocircumflex -56 +KPX Y Odieresis -56 +KPX Y Ograve -56 +KPX Y Oslash -54 +KPX Y Otilde -56 +KPX Y S -41 +KPX Y T 23 +KPX Y a -88 +KPX Y ae -84 +KPX Y colon -87 +KPX Y comma -111 +KPX Y e -89 +KPX Y g -83 +KPX Y guillemotleft -123 +KPX Y guilsinglleft -119 +KPX Y hyphen -84 +KPX Y i 3 +KPX Y o -86 +KPX Y oslash -82 +KPX Y p -54 +KPX Y period -111 +KPX Y semicolon -88 +KPX Y u -63 +KPX Y v -36 +KPX Z v -33 +KPX Z y -38 +KPX a j -4 +KPX a quoteright -23 +KPX a v -21 +KPX a w -13 +KPX a y -26 +KPX aacute v -21 +KPX aacute w -13 +KPX aacute y -26 +KPX adieresis v -21 +KPX adieresis w -13 +KPX adieresis y -26 +KPX ae v -16 +KPX ae w -10 +KPX ae y -20 +KPX agrave v -21 +KPX agrave w -13 +KPX agrave y -26 +KPX aring v -21 +KPX aring w -13 +KPX aring y -26 +KPX b v -11 +KPX b w -3 +KPX b y -15 +KPX c h 1 +KPX c k 7 +KPX comma one -100 +KPX comma quotedblright -41 +KPX comma quoteright -50 +KPX e quoteright -18 +KPX e t -10 +KPX e v -15 +KPX e w -9 +KPX e x -27 +KPX e y -19 +KPX eacute v -15 +KPX eacute w -9 +KPX eacute y -19 +KPX ecircumflex v -15 +KPX ecircumflex w -9 +KPX ecircumflex y -19 +KPX eight four 1 +KPX eight one -48 +KPX eight seven -33 +KPX f a -9 +KPX f aacute -9 +KPX f adieresis -9 +KPX f ae -5 +KPX f aring -9 +KPX f e -15 +KPX f eacute -15 +KPX f f 22 +KPX f i -2 +KPX f j -4 +KPX f l -3 +KPX f o -10 +KPX f oacute -10 +KPX f odieresis -10 +KPX f oe -12 +KPX f oslash -9 +KPX f quoteright 0 +KPX f s 0 +KPX f t 24 +KPX five four 1 +KPX five one -76 +KPX five seven -26 +KPX four four 5 +KPX four one -84 +KPX four seven -56 +KPX g a -5 +KPX g adieresis -5 +KPX g ae -1 +KPX g aring -5 +KPX g e 0 +KPX g eacute 0 +KPX g l 0 +KPX g oacute 3 +KPX g odieresis 3 +KPX g r 0 +KPX guillemotright A -50 +KPX guillemotright AE -54 +KPX guillemotright Aacute -50 +KPX guillemotright Adieresis -50 +KPX guillemotright Aring -50 +KPX guillemotright T -126 +KPX guillemotright V -93 +KPX guillemotright W -66 +KPX guillemotright Y -133 +KPX guilsinglright A -44 +KPX guilsinglright AE -48 +KPX guilsinglright Aacute -44 +KPX guilsinglright Adieresis -44 +KPX guilsinglright Aring -44 +KPX guilsinglright T -121 +KPX guilsinglright V -88 +KPX guilsinglright W -60 +KPX guilsinglright Y -128 +KPX h quoteright -15 +KPX h y -18 +KPX hyphen A -7 +KPX hyphen AE -11 +KPX hyphen Aacute -7 +KPX hyphen Adieresis -7 +KPX hyphen Aring -7 +KPX hyphen T -80 +KPX hyphen V -46 +KPX hyphen W -19 +KPX hyphen Y -92 +KPX i T -7 +KPX i j -3 +KPX k a -2 +KPX k aacute -2 +KPX k adieresis -2 +KPX k ae 2 +KPX k aring -2 +KPX k comma 0 +KPX k e -21 +KPX k eacute -21 +KPX k g -16 +KPX k hyphen -41 +KPX k o -19 +KPX k oacute -19 +KPX k odieresis -19 +KPX k period 0 +KPX k s -3 +KPX k u -11 +KPX k udieresis -6 +KPX l v 0 +KPX l y -5 +KPX m p 5 +KPX m v -13 +KPX m w -7 +KPX m y -18 +KPX n T -96 +KPX n p 5 +KPX n quoteright -14 +KPX n v -13 +KPX n w -7 +KPX n y -18 +KPX nine four -3 +KPX nine one -43 +KPX nine seven -37 +KPX o T -99 +KPX o quoteright -21 +KPX o t -10 +KPX o v -18 +KPX o w -10 +KPX o x -27 +KPX o y -22 +KPX oacute v -18 +KPX oacute w -10 +KPX oacute y -22 +KPX ocircumflex t -10 +KPX odieresis t -10 +KPX odieresis v -18 +KPX odieresis w -10 +KPX odieresis x -27 +KPX odieresis y -22 +KPX ograve v -18 +KPX ograve w -10 +KPX ograve y -22 +KPX one comma -74 +KPX one eight -65 +KPX one five -67 +KPX one four -81 +KPX one nine -65 +KPX one one -118 +KPX one period -74 +KPX one seven -90 +KPX one six -62 +KPX one three -67 +KPX one two -69 +KPX one zero -62 +KPX p t -4 +KPX p y -16 +KPX period one -101 +KPX period quotedblright -41 +KPX period quoteright -51 +KPX q c 8 +KPX q u 4 +KPX quotedblbase A 30 +KPX quotedblbase AE 30 +KPX quotedblbase T -75 +KPX quotedblbase V -69 +KPX quotedblbase W -34 +KPX quotedblbase Y -91 +KPX quotedblleft A -52 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -52 +KPX quotedblleft Adieresis -52 +KPX quotedblleft Aring -52 +KPX quotedblleft T 9 +KPX quotedblleft V 15 +KPX quotedblleft W 27 +KPX quotedblleft Y 5 +KPX quotedblright A -53 +KPX quotedblright AE -66 +KPX quotedblright Aacute -53 +KPX quotedblright Adieresis -53 +KPX quotedblright Aring -53 +KPX quotedblright T 11 +KPX quotedblright V 15 +KPX quotedblright W 26 +KPX quotedblright Y 7 +KPX quoteleft A -67 +KPX quoteleft AE -79 +KPX quoteleft Aacute -67 +KPX quoteleft Adieresis -67 +KPX quoteleft Aring -67 +KPX quoteleft T -5 +KPX quoteleft V 0 +KPX quoteleft W 12 +KPX quoteleft Y -9 +KPX quoteright A -72 +KPX quoteright AE -85 +KPX quoteright Aacute -72 +KPX quoteright Adieresis -72 +KPX quoteright Aring -72 +KPX quoteright comma -60 +KPX quoteright d -20 +KPX quoteright o -26 +KPX quoteright period -60 +KPX quoteright r -18 +KPX quoteright s -18 +KPX quoteright t -7 +KPX quoteright v -2 +KPX quoteright w 2 +KPX quoteright y -6 +KPX r a -5 +KPX r aacute -5 +KPX r acircumflex -5 +KPX r adieresis -5 +KPX r ae -1 +KPX r agrave -5 +KPX r aring -5 +KPX r c -6 +KPX r ccedilla -9 +KPX r colon -22 +KPX r comma -69 +KPX r d -1 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f 26 +KPX r g -4 +KPX r h 0 +KPX r hyphen -47 +KPX r i 1 +KPX r j 0 +KPX r k 6 +KPX r l 1 +KPX r m 0 +KPX r n 0 +KPX r o -6 +KPX r oacute -6 +KPX r ocircumflex -6 +KPX r odieresis -6 +KPX r oe -8 +KPX r ograve -6 +KPX r oslash -6 +KPX r p 8 +KPX r period -69 +KPX r q -3 +KPX r quoteright 1 +KPX r r 0 +KPX r s 4 +KPX r semicolon -22 +KPX r t 28 +KPX r u 2 +KPX r v 29 +KPX r w 31 +KPX r x 20 +KPX r y 24 +KPX r z 9 +KPX s quoteright -22 +KPX s t -3 +KPX seven colon -77 +KPX seven comma -119 +KPX seven eight -28 +KPX seven five -30 +KPX seven four -93 +KPX seven one -53 +KPX seven period -119 +KPX seven seven -4 +KPX seven six -40 +KPX seven three -23 +KPX seven two -28 +KPX six four 1 +KPX six one -43 +KPX six seven -30 +KPX t S -8 +KPX t a -1 +KPX t aacute -1 +KPX t adieresis -1 +KPX t ae 2 +KPX t aring -1 +KPX t colon -28 +KPX t e -14 +KPX t eacute -14 +KPX t h -3 +KPX t o -12 +KPX t oacute -12 +KPX t odieresis -12 +KPX t quoteright -1 +KPX t semicolon -28 +KPX three four -2 +KPX three one -49 +KPX three seven -33 +KPX two four -37 +KPX two one -36 +KPX two seven -25 +KPX u quoteright -8 +KPX v a -18 +KPX v aacute -18 +KPX v acircumflex -18 +KPX v adieresis -18 +KPX v ae -14 +KPX v agrave -18 +KPX v aring -18 +KPX v atilde -18 +KPX v c -16 +KPX v colon -23 +KPX v comma -69 +KPX v e -21 +KPX v eacute -21 +KPX v ecircumflex -21 +KPX v egrave -21 +KPX v g -14 +KPX v hyphen -12 +KPX v l 0 +KPX v o -17 +KPX v oacute -17 +KPX v odieresis -17 +KPX v ograve -17 +KPX v oslash -17 +KPX v period -69 +KPX v s -9 +KPX v semicolon -23 +KPX w a -15 +KPX w aacute -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w ae -11 +KPX w agrave -15 +KPX w aring -15 +KPX w atilde -15 +KPX w c -7 +KPX w colon -23 +KPX w comma -50 +KPX w e -12 +KPX w eacute -12 +KPX w ecircumflex -12 +KPX w egrave -12 +KPX w g -6 +KPX w hyphen -1 +KPX w l 0 +KPX w o -9 +KPX w oacute -9 +KPX w odieresis -9 +KPX w ograve -9 +KPX w oslash -6 +KPX w period -50 +KPX w s -5 +KPX w semicolon -23 +KPX x a -17 +KPX x c -23 +KPX x e -28 +KPX x eacute -28 +KPX x o -25 +KPX x q -20 +KPX y a -22 +KPX y aacute -22 +KPX y acircumflex -22 +KPX y adieresis -22 +KPX y ae -18 +KPX y agrave -22 +KPX y aring -22 +KPX y atilde -22 +KPX y c -19 +KPX y colon -27 +KPX y comma -70 +KPX y e -24 +KPX y eacute -24 +KPX y ecircumflex -24 +KPX y egrave -24 +KPX y g -17 +KPX y hyphen -14 +KPX y l -4 +KPX y o -20 +KPX y oacute -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y oslash -19 +KPX y period -70 +KPX y s -12 +KPX y semicolon -27 +KPX zero four -2 +KPX zero one -46 +KPX zero seven -39 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n019003l.pfb b/PdfReader/Resources/Fonts/n019003l.pfb new file mode 100644 index 0000000000..000b21e122 Binary files /dev/null and b/PdfReader/Resources/Fonts/n019003l.pfb differ diff --git a/PdfReader/Resources/Fonts/n019004l.afm b/PdfReader/Resources/Fonts/n019004l.afm new file mode 100644 index 0000000000..fe41636b63 --- /dev/null +++ b/PdfReader/Resources/Fonts/n019004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-Bold +FullName Nimbus Sans L Bold +FamilyName Nimbus Sans L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -155 +UnderlineThickness 69 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -173 -307 1003 949 +CapHeight 729 +XHeight 540 +Descender -217 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 214 0 214 0 ; +C 33 ; WX 333 ; N exclam ; B 112 0 262 726 ; +C 34 ; WX 474 ; N quotedbl ; B 50 470 424 729 ; +C 35 ; WX 556 ; N numbersign ; B 3 -32 553 697 ; +C 36 ; WX 556 ; N dollar ; B 22 -126 527 763 ; +C 37 ; WX 889 ; N percent ; B 22 -20 863 709 ; +C 38 ; WX 722 ; N ampersand ; B 55 -23 694 723 ; +C 39 ; WX 278 ; N quoteright ; B 66 469 201 729 ; +C 40 ; WX 333 ; N parenleft ; B 40 -200 303 729 ; +C 41 ; WX 333 ; N parenright ; B 22 -200 285 729 ; +C 42 ; WX 389 ; N asterisk ; B 23 407 357 729 ; +C 43 ; WX 584 ; N plus ; B 50 -10 533 473 ; +C 44 ; WX 278 ; N comma ; B 64 -174 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 26 207 298 342 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B 2 -14 275 714 ; +C 48 ; WX 556 ; N zero ; B 29 -23 517 724 ; +C 49 ; WX 556 ; N one ; B 68 0 378 709 ; +C 50 ; WX 556 ; N two ; B 30 0 515 724 ; +C 51 ; WX 556 ; N three ; B 29 -23 516 724 ; +C 52 ; WX 556 ; N four ; B 24 0 522 709 ; +C 53 ; WX 556 ; N five ; B 27 -23 517 709 ; +C 54 ; WX 556 ; N six ; B 32 -23 519 724 ; +C 55 ; WX 556 ; N seven ; B 29 0 528 709 ; +C 56 ; WX 556 ; N eight ; B 22 -23 525 724 ; +C 57 ; WX 556 ; N nine ; B 28 -24 516 724 ; +C 58 ; WX 333 ; N colon ; B 113 0 263 520 ; +C 59 ; WX 333 ; N semicolon ; B 113 -174 263 520 ; +C 60 ; WX 584 ; N less ; B 40 -10 529 474 ; +C 61 ; WX 584 ; N equal ; B 50 52 534 411 ; +C 62 ; WX 584 ; N greater ; B 40 -10 529 474 ; +C 63 ; WX 611 ; N question ; B 64 0 556 744 ; +C 64 ; WX 975 ; N at ; B 27 -138 947 745 ; +C 65 ; WX 722 ; N A ; B 26 0 703 729 ; +C 66 ; WX 722 ; N B ; B 82 0 666 729 ; +C 67 ; WX 722 ; N C ; B 44 -23 685 741 ; +C 68 ; WX 722 ; N D ; B 77 0 681 729 ; +C 69 ; WX 667 ; N E ; B 79 0 624 729 ; +C 70 ; WX 611 ; N F ; B 74 0 586 729 ; +C 71 ; WX 778 ; N G ; B 42 -23 711 741 ; +C 72 ; WX 722 ; N H ; B 68 0 657 729 ; +C 73 ; WX 278 ; N I ; B 63 0 213 729 ; +C 74 ; WX 556 ; N J ; B 24 -23 486 729 ; +C 75 ; WX 722 ; N K ; B 74 0 717 729 ; +C 76 ; WX 611 ; N L ; B 80 0 579 729 ; +C 77 ; WX 833 ; N M ; B 66 0 776 729 ; +C 78 ; WX 722 ; N N ; B 68 0 661 729 ; +C 79 ; WX 778 ; N O ; B 40 -23 742 741 ; +C 80 ; WX 667 ; N P ; B 76 0 633 729 ; +C 81 ; WX 778 ; N Q ; B 43 -54 745 741 ; +C 82 ; WX 722 ; N R ; B 80 0 677 729 ; +C 83 ; WX 667 ; N S ; B 32 -23 633 741 ; +C 84 ; WX 611 ; N T ; B 14 0 598 729 ; +C 85 ; WX 722 ; N U ; B 76 -23 654 729 ; +C 86 ; WX 667 ; N V ; B 24 0 647 729 ; +C 87 ; WX 944 ; N W ; B 13 0 932 729 ; +C 88 ; WX 667 ; N X ; B 22 0 653 729 ; +C 89 ; WX 667 ; N Y ; B 27 0 650 729 ; +C 90 ; WX 611 ; N Z ; B 30 0 578 729 ; +C 91 ; WX 333 ; N bracketleft ; B 66 -200 308 729 ; +C 92 ; WX 278 ; N backslash ; B -12 -14 289 714 ; +C 93 ; WX 333 ; N bracketright ; B 18 -200 260 729 ; +C 94 ; WX 584 ; N asciicircum ; B 61 270 522 695 ; +C 95 ; WX 556 ; N underscore ; B -22 -189 578 -120 ; +C 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ; +C 97 ; WX 556 ; N a ; B 28 -23 524 549 ; +C 98 ; WX 611 ; N b ; B 59 -23 575 729 ; +C 99 ; WX 556 ; N c ; B 34 -23 522 549 ; +C 100 ; WX 611 ; N d ; B 29 -23 545 729 ; +C 101 ; WX 556 ; N e ; B 22 -23 525 549 ; +C 102 ; WX 333 ; N f ; B 14 0 313 729 ; +C 103 ; WX 611 ; N g ; B 34 -218 541 549 ; +C 104 ; WX 611 ; N h ; B 67 0 541 729 ; +C 105 ; WX 278 ; N i ; B 67 0 207 729 ; +C 106 ; WX 278 ; N j ; B 4 -218 210 729 ; +C 107 ; WX 556 ; N k ; B 59 0 548 729 ; +C 108 ; WX 278 ; N l ; B 67 0 207 729 ; +C 109 ; WX 889 ; N m ; B 60 0 824 549 ; +C 110 ; WX 611 ; N n ; B 63 0 546 549 ; +C 111 ; WX 611 ; N o ; B 35 -23 569 549 ; +C 112 ; WX 611 ; N p ; B 58 -218 574 549 ; +C 113 ; WX 611 ; N q ; B 28 -218 544 549 ; +C 114 ; WX 389 ; N r ; B 63 0 370 549 ; +C 115 ; WX 556 ; N s ; B 29 -23 520 549 ; +C 116 ; WX 333 ; N t ; B 14 -23 301 674 ; +C 117 ; WX 611 ; N u ; B 58 -23 541 540 ; +C 118 ; WX 556 ; N v ; B 14 0 536 540 ; +C 119 ; WX 778 ; N w ; B 5 0 766 540 ; +C 120 ; WX 556 ; N x ; B 16 0 535 540 ; +C 121 ; WX 556 ; N y ; B 9 -219 538 540 ; +C 122 ; WX 500 ; N z ; B 21 0 468 540 ; +C 123 ; WX 389 ; N braceleft ; B 37 -200 317 729 ; +C 124 ; WX 280 ; N bar ; B 100 -200 180 729 ; +C 125 ; WX 389 ; N braceright ; B 72 -200 352 729 ; +C 126 ; WX 584 ; N asciitilde ; B 60 142 519 314 ; +C 161 ; WX 333 ; N exclamdown ; B 66 -186 216 540 ; +C 162 ; WX 556 ; N cent ; B 36 -124 522 634 ; +C 163 ; WX 556 ; N sterling ; B 31 -23 537 715 ; +C 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ; +C 165 ; WX 556 ; N yen ; B 5 0 552 704 ; +C 166 ; WX 556 ; N florin ; B 21 -220 535 744 ; +C 167 ; WX 556 ; N section ; B 33 -201 518 723 ; +C 168 ; WX 556 ; N currency ; B 26 100 530 604 ; +C 169 ; WX 238 ; N quotesingle ; B 50 470 188 729 ; +C 170 ; WX 500 ; N quotedblleft ; B 71 469 433 729 ; +C 171 ; WX 556 ; N guillemotleft ; B 88 72 468 481 ; +C 172 ; WX 333 ; N guilsinglleft ; B 83 72 250 481 ; +C 173 ; WX 333 ; N guilsinglright ; B 80 72 247 481 ; +C 174 ; WX 611 ; N fi ; B 9 0 548 729 ; +C 175 ; WX 611 ; N fl ; B 12 0 546 729 ; +C 177 ; WX 556 ; N endash ; B -9 207 557 311 ; +C 178 ; WX 556 ; N dagger ; B 31 -194 523 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 28 -194 520 709 ; +C 180 ; WX 278 ; N periodcentered ; B 64 169 188 292 ; +C 182 ; WX 556 ; N paragraph ; B 19 -191 529 729 ; +C 183 ; WX 350 ; N bullet ; B 50 175 300 425 ; +C 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ; +C 185 ; WX 500 ; N quotedblbase ; B 72 -135 432 125 ; +C 186 ; WX 500 ; N quotedblright ; B 73 469 440 729 ; +C 187 ; WX 556 ; N guillemotright ; B 88 72 462 481 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 189 ; WX 1000 ; N perthousand ; B 11 -22 990 739 ; +C 191 ; WX 611 ; N questiondown ; B 51 -204 544 540 ; +C 193 ; WX 333 ; N grave ; B 17 607 213 757 ; +C 194 ; WX 333 ; N acute ; B 121 607 317 757 ; +C 195 ; WX 333 ; N circumflex ; B 8 607 326 757 ; +C 196 ; WX 333 ; N tilde ; B -9 621 345 749 ; +C 197 ; WX 333 ; N macron ; B 16 640 315 719 ; +C 198 ; WX 333 ; N breve ; B 35 605 299 748 ; +C 199 ; WX 333 ; N dotaccent ; B 112 621 222 743 ; +C 200 ; WX 333 ; N dieresis ; B 18 621 314 743 ; +C 202 ; WX 333 ; N ring ; B 77 590 257 770 ; +C 203 ; WX 333 ; N cedilla ; B 27 -220 294 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -44 610 340 757 ; +C 206 ; WX 333 ; N ogonek ; B 45 -234 268 0 ; +C 207 ; WX 333 ; N caron ; B 9 607 327 757 ; +C 208 ; WX 1000 ; N emdash ; B -7 207 1003 311 ; +C 225 ; WX 1000 ; N AE ; B 1 0 966 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 31 262 329 729 ; +C 232 ; WX 611 ; N Lslash ; B 0 0 597 729 ; +C 233 ; WX 778 ; N Oslash ; B 31 -39 755 749 ; +C 234 ; WX 1000 ; N OE ; B 28 -23 970 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 23 262 343 729 ; +C 241 ; WX 889 ; N ae ; B 27 -24 857 549 ; +C 245 ; WX 278 ; N dotlessi ; B 67 0 207 540 ; +C 248 ; WX 278 ; N lslash ; B 0 0 252 729 ; +C 249 ; WX 611 ; N oslash ; B 11 -38 598 557 ; +C 250 ; WX 944 ; N oe ; B 23 -23 920 549 ; +C 251 ; WX 611 ; N germandbls ; B 67 -17 575 729 ; +C -1 ; WX 722 ; N Udieresis ; B 76 -23 654 922 ; +C -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Scedilla ; B 32 -220 633 741 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ; +C -1 ; WX 722 ; N Rcaron ; B 80 0 677 936 ; +C -1 ; WX 722 ; N Racute ; B 80 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 32 -23 633 936 ; +C -1 ; WX 778 ; N Otilde ; B 40 -23 742 928 ; +C -1 ; WX 611 ; N ucircumflex ; B 58 -23 541 757 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 40 -23 742 936 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Yacute ; B 27 0 650 936 ; +C -1 ; WX 722 ; N Eth ; B 0 0 681 729 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 681 729 ; +C -1 ; WX 611 ; N Zacute ; B 30 0 578 936 ; +C -1 ; WX 722 ; N Uring ; B 76 -23 654 949 ; +C -1 ; WX 611 ; N gbreve ; B 34 -218 541 748 ; +C -1 ; WX 556 ; N eogonek ; B 21 -234 525 549 ; +C -1 ; WX 556 ; N edotaccent ; B 22 -23 525 743 ; +C -1 ; WX 556 ; N ecaron ; B 22 -23 525 757 ; +C -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 633 729 ; +C -1 ; WX 556 ; N eacute ; B 22 -23 525 757 ; +C -1 ; WX 556 ; N edieresis ; B 22 -23 525 743 ; +C -1 ; WX 707 ; N dcaron ; B 29 -23 720 729 ; +C -1 ; WX 556 ; N ccedilla ; B 34 -220 522 549 ; +C -1 ; WX 556 ; N ccaron ; B 34 -23 522 757 ; +C -1 ; WX 556 ; N cacute ; B 34 -23 522 757 ; +C -1 ; WX 556 ; N aogonek ; B 28 -233 548 549 ; +C -1 ; WX 556 ; N aring ; B 28 -23 524 770 ; +C -1 ; WX 556 ; N atilde ; B 28 -23 524 749 ; +C -1 ; WX 556 ; N abreve ; B 28 -23 524 748 ; +C -1 ; WX 556 ; N egrave ; B 22 -23 525 757 ; +C -1 ; WX 556 ; N agrave ; B 28 -23 524 757 ; +C -1 ; WX 556 ; N aacute ; B 28 -23 524 757 ; +C -1 ; WX 556 ; N adieresis ; B 28 -23 524 743 ; +C -1 ; WX 722 ; N Uogonek ; B 76 -234 654 729 ; +C -1 ; WX 611 ; N ugrave ; B 58 -23 541 757 ; +C -1 ; WX 611 ; N uacute ; B 58 -23 541 757 ; +C -1 ; WX 611 ; N udieresis ; B 58 -23 541 743 ; +C -1 ; WX 385 ; N tcaron ; B 14 -23 398 829 ; +C -1 ; WX 556 ; N scommaaccent ; B 29 -307 520 549 ; +C -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ; +C -1 ; WX 556 ; N ecircumflex ; B 22 -23 525 757 ; +C -1 ; WX 722 ; N Ucircumflex ; B 76 -23 654 936 ; +C -1 ; WX 556 ; N acircumflex ; B 28 -23 524 757 ; +C -1 ; WX 611 ; N Zdotaccent ; B 30 0 578 922 ; +C -1 ; WX 556 ; N scaron ; B 29 -23 520 757 ; +C -1 ; WX 722 ; N Amacron ; B 26 0 703 898 ; +C -1 ; WX 556 ; N sacute ; B 29 -23 520 757 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -307 598 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 27 0 650 922 ; +C -1 ; WX 611 ; N thorn ; B 58 -218 574 729 ; +C -1 ; WX 667 ; N Emacron ; B 79 0 624 898 ; +C -1 ; WX 778 ; N Ograve ; B 40 -23 742 936 ; +C -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ; +C -1 ; WX 778 ; N Odieresis ; B 40 -23 742 922 ; +C -1 ; WX 722 ; N Ntilde ; B 68 0 661 928 ; +C -1 ; WX 722 ; N Ncaron ; B 68 0 661 936 ; +C -1 ; WX 722 ; N Nacute ; B 68 0 661 936 ; +C -1 ; WX 611 ; N Lcaron ; B 80 0 579 729 ; +C -1 ; WX 611 ; N Lacute ; B 80 0 579 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 63 0 213 922 ; +C -1 ; WX 389 ; N racute ; B 63 0 370 757 ; +C -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 35 -23 569 757 ; +C -1 ; WX 611 ; N otilde ; B 35 -23 569 749 ; +C -1 ; WX 556 ; N Euro ; B 6 -23 546 724 ; +C -1 ; WX 611 ; N ocircumflex ; B 35 -23 569 757 ; +C -1 ; WX 351 ; N onesuperior ; B 40 284 242 709 ; +C -1 ; WX 351 ; N twosuperior ; B 16 284 328 718 ; +C -1 ; WX 351 ; N threesuperior ; B 15 271 329 718 ; +C -1 ; WX 278 ; N Igrave ; B -10 0 213 936 ; +C -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ; +C -1 ; WX 278 ; N Imacron ; B 2 0 274 898 ; +C -1 ; WX 278 ; N Iogonek ; B 34 -233 237 729 ; +C -1 ; WX 278 ; N Idieresis ; B -9 0 287 922 ; +C -1 ; WX 778 ; N Gbreve ; B 42 -23 711 927 ; +C -1 ; WX 722 ; N Umacron ; B 76 -23 654 898 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 717 729 ; +C -1 ; WX 611 ; N ograve ; B 35 -23 569 757 ; +C -1 ; WX 667 ; N Scommaaccent ; B 32 -307 633 741 ; +C -1 ; WX 667 ; N Eogonek ; B 79 -233 648 729 ; +C -1 ; WX 611 ; N oacute ; B 35 -23 569 757 ; +C -1 ; WX 667 ; N Edotaccent ; B 79 0 624 922 ; +C -1 ; WX 278 ; N iogonek ; B 34 -233 231 729 ; +C -1 ; WX 611 ; N gcommaaccent ; B 34 -218 541 853 ; +C -1 ; WX 611 ; N odieresis ; B 35 -23 569 743 ; +C -1 ; WX 611 ; N ntilde ; B 63 0 546 749 ; +C -1 ; WX 611 ; N ncaron ; B 63 0 546 757 ; +C -1 ; WX 667 ; N Ecaron ; B 79 0 624 936 ; +C -1 ; WX 667 ; N Ecircumflex ; B 79 0 624 936 ; +C -1 ; WX 556 ; N scedilla ; B 29 -220 520 549 ; +C -1 ; WX 389 ; N rcaron ; B 54 0 372 757 ; +C -1 ; WX 667 ; N Egrave ; B 79 0 624 936 ; +C -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 42 -307 711 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 677 729 ; +C -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ; +C -1 ; WX 611 ; N nacute ; B 63 0 546 757 ; +C -1 ; WX 611 ; N uogonek ; B 58 -233 564 540 ; +C -1 ; WX 611 ; N umacron ; B 58 -23 541 719 ; +C -1 ; WX 722 ; N Dcaron ; B 77 0 681 936 ; +C -1 ; WX 369 ; N lcaron ; B 67 0 382 729 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -23 685 936 ; +C -1 ; WX 722 ; N Cacute ; B 44 -23 685 936 ; +C -1 ; WX 722 ; N Ccedilla ; B 44 -220 685 741 ; +C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; +C -1 ; WX 722 ; N Aogonek ; B 26 -233 723 729 ; +C -1 ; WX 584 ; N minus ; B 40 172 544 291 ; +C -1 ; WX 584 ; N multiply ; B 79 18 505 444 ; +C -1 ; WX 584 ; N divide ; B 50 -11 534 474 ; +C -1 ; WX 722 ; N Aring ; B 26 0 703 949 ; +C -1 ; WX 1000 ; N trademark ; B 71 273 929 729 ; +C -1 ; WX 389 ; N rcommaaccent ; B 63 -307 370 549 ; +C -1 ; WX 278 ; N lacute ; B 67 0 278 936 ; +C -1 ; WX 611 ; N omacron ; B 35 -23 569 719 ; +C -1 ; WX 722 ; N Atilde ; B 26 0 703 928 ; +C -1 ; WX 278 ; N icircumflex ; B -19 0 299 757 ; +C -1 ; WX 278 ; N igrave ; B -10 0 207 757 ; +C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 546 549 ; +C -1 ; WX 278 ; N lcommaaccent ; B 67 -307 207 729 ; +C -1 ; WX 584 ; N plusminus ; B 56 -16 527 608 ; +C -1 ; WX 869 ; N onehalf ; B 40 -20 846 715 ; +C -1 ; WX 869 ; N onequarter ; B 40 -20 850 715 ; +C -1 ; WX 869 ; N threequarters ; B 15 -20 850 718 ; +C -1 ; WX 278 ; N iacute ; B 67 0 290 757 ; +C -1 ; WX 722 ; N Abreve ; B 26 0 703 927 ; +C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 548 729 ; +C -1 ; WX 778 ; N Omacron ; B 40 -23 742 898 ; +C -1 ; WX 278 ; N imacron ; B 7 0 266 719 ; +C -1 ; WX 556 ; N emacron ; B 22 -23 525 719 ; +C -1 ; WX 556 ; N amacron ; B 28 -23 524 719 ; +C -1 ; WX 333 ; N tcommaaccent ; B 14 -307 301 674 ; +C -1 ; WX 556 ; N ydieresis ; B 9 -219 538 743 ; +C -1 ; WX 500 ; N zdotaccent ; B 21 0 468 743 ; +C -1 ; WX 500 ; N zcaron ; B 21 0 468 757 ; +C -1 ; WX 500 ; N zacute ; B 21 0 468 757 ; +C -1 ; WX 556 ; N yacute ; B 9 -219 538 757 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 58 -23 559 757 ; +C -1 ; WX 611 ; N eth ; B 35 -23 569 744 ; +C -1 ; WX 611 ; N uring ; B 58 -23 541 770 ; +C -1 ; WX 778 ; N Ocircumflex ; B 40 -23 742 936 ; +C -1 ; WX 333 ; N commaaccent ; B 112 -307 234 -60 ; +C -1 ; WX 737 ; N copyright ; B -14 -22 751 743 ; +C -1 ; WX 737 ; N registered ; B -14 -22 751 743 ; +C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; +C -1 ; WX 278 ; N idieresis ; B -9 0 287 743 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; +C -1 ; WX 548 ; N notequal ; B 50 -69 534 528 ; +C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; +C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; +C -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ; +C -1 ; WX 584 ; N lessequal ; B 45 -10 534 639 ; +C -1 ; WX 584 ; N greaterequal ; B 45 -10 534 639 ; +C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; +C -1 ; WX 711 ; N summation ; B 17 -96 694 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 661 729 ; +C -1 ; WX 611 ; N dcroat ; B 29 -23 605 729 ; +C -1 ; WX 280 ; N brokenbar ; B 100 -200 180 729 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 80 -307 579 729 ; +C -1 ; WX 722 ; N Adieresis ; B 26 0 703 922 ; +C -1 ; WX 611 ; N mu ; B 58 -220 573 540 ; +C -1 ; WX 278 ; N .notdef ; B 214 0 214 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -33 +KPX A Ccedilla -33 +KPX A G -35 +KPX A O -34 +KPX A Odieresis -34 +KPX A Q -35 +KPX A T -81 +KPX A U -32 +KPX A Uacute -32 +KPX A Ucircumflex -32 +KPX A Udieresis -32 +KPX A Ugrave -32 +KPX A V -66 +KPX A W -51 +KPX A Y -90 +KPX A a -1 +KPX A b -1 +KPX A c -14 +KPX A ccedilla -14 +KPX A comma 19 +KPX A d -13 +KPX A e -9 +KPX A g -14 +KPX A guillemotleft -43 +KPX A guilsinglleft -40 +KPX A hyphen 7 +KPX A o -16 +KPX A period 19 +KPX A q -12 +KPX A quotedblright -65 +KPX A quoteright -61 +KPX A t -18 +KPX A u -12 +KPX A v -37 +KPX A w -23 +KPX A y -35 +KPX Aacute C -33 +KPX Aacute G -35 +KPX Aacute O -34 +KPX Aacute Q -35 +KPX Aacute T -81 +KPX Aacute U -32 +KPX Aacute V -66 +KPX Aacute W -51 +KPX Aacute Y -90 +KPX Aacute a -1 +KPX Aacute b -1 +KPX Aacute c -14 +KPX Aacute comma 19 +KPX Aacute d -13 +KPX Aacute e -9 +KPX Aacute g -14 +KPX Aacute guillemotleft -43 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen 7 +KPX Aacute o -16 +KPX Aacute period 19 +KPX Aacute q -12 +KPX Aacute quoteright -61 +KPX Aacute t -18 +KPX Aacute u -12 +KPX Aacute v -37 +KPX Aacute w -23 +KPX Aacute y -35 +KPX Acircumflex C -33 +KPX Acircumflex G -35 +KPX Acircumflex O -34 +KPX Acircumflex Q -35 +KPX Acircumflex T -81 +KPX Acircumflex U -32 +KPX Acircumflex V -66 +KPX Acircumflex W -51 +KPX Acircumflex Y -90 +KPX Acircumflex comma 19 +KPX Acircumflex period 19 +KPX Adieresis C -33 +KPX Adieresis G -35 +KPX Adieresis O -34 +KPX Adieresis Q -35 +KPX Adieresis T -81 +KPX Adieresis U -32 +KPX Adieresis V -66 +KPX Adieresis W -51 +KPX Adieresis Y -90 +KPX Adieresis a -1 +KPX Adieresis b -1 +KPX Adieresis c -14 +KPX Adieresis comma 19 +KPX Adieresis d -13 +KPX Adieresis g -14 +KPX Adieresis guillemotleft -43 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen 7 +KPX Adieresis o -16 +KPX Adieresis period 19 +KPX Adieresis q -12 +KPX Adieresis quotedblright -65 +KPX Adieresis quoteright -61 +KPX Adieresis t -18 +KPX Adieresis u -12 +KPX Adieresis v -37 +KPX Adieresis w -23 +KPX Adieresis y -35 +KPX Agrave C -33 +KPX Agrave G -35 +KPX Agrave O -34 +KPX Agrave Q -35 +KPX Agrave T -81 +KPX Agrave U -32 +KPX Agrave V -66 +KPX Agrave W -51 +KPX Agrave Y -90 +KPX Agrave comma 19 +KPX Agrave period 19 +KPX Aring C -33 +KPX Aring G -35 +KPX Aring O -34 +KPX Aring Q -35 +KPX Aring T -81 +KPX Aring U -32 +KPX Aring V -66 +KPX Aring W -51 +KPX Aring Y -90 +KPX Aring a -1 +KPX Aring b -1 +KPX Aring c -14 +KPX Aring comma 19 +KPX Aring d -13 +KPX Aring e -9 +KPX Aring g -14 +KPX Aring guillemotleft -43 +KPX Aring guilsinglleft -40 +KPX Aring hyphen 7 +KPX Aring o -16 +KPX Aring period 19 +KPX Aring q -12 +KPX Aring quotedblright -65 +KPX Aring quoteright -61 +KPX Aring t -18 +KPX Aring u -12 +KPX Aring v -37 +KPX Aring w -23 +KPX Aring y -35 +KPX Atilde C -33 +KPX Atilde G -35 +KPX Atilde O -34 +KPX Atilde Q -35 +KPX Atilde T -81 +KPX Atilde U -32 +KPX Atilde V -66 +KPX Atilde W -51 +KPX Atilde Y -90 +KPX Atilde comma 19 +KPX Atilde period 19 +KPX B A -32 +KPX B AE -20 +KPX B Aacute -32 +KPX B Acircumflex -32 +KPX B Adieresis -32 +KPX B Aring -32 +KPX B Atilde -32 +KPX B O -11 +KPX B OE -2 +KPX B Oacute -11 +KPX B Ocircumflex -11 +KPX B Odieresis -11 +KPX B Ograve -11 +KPX B Oslash -5 +KPX B V -39 +KPX B W -27 +KPX B Y -51 +KPX C A -29 +KPX C AE -17 +KPX C Aacute -29 +KPX C Adieresis -29 +KPX C Aring -29 +KPX C H 5 +KPX C K 2 +KPX C O -6 +KPX C Oacute -6 +KPX C Odieresis -6 +KPX Ccedilla A -28 +KPX D A -37 +KPX D Aacute -37 +KPX D Acircumflex -37 +KPX D Adieresis -37 +KPX D Agrave -37 +KPX D Aring -37 +KPX D Atilde -37 +KPX D J 2 +KPX D T -17 +KPX D V -35 +KPX D W -20 +KPX D X -35 +KPX D Y -56 +KPX F A -63 +KPX F Aacute -63 +KPX F Acircumflex -63 +KPX F Adieresis -63 +KPX F Agrave -63 +KPX F Aring -63 +KPX F Atilde -63 +KPX F J -25 +KPX F O -16 +KPX F Odieresis -16 +KPX F a -15 +KPX F aacute -15 +KPX F adieresis -15 +KPX F ae -17 +KPX F aring -15 +KPX F comma -76 +KPX F e -7 +KPX F eacute -7 +KPX F hyphen 11 +KPX F i -7 +KPX F j -9 +KPX F o -14 +KPX F oacute -14 +KPX F odieresis -14 +KPX F oe -8 +KPX F oslash -15 +KPX F period -75 +KPX F r -27 +KPX F u -24 +KPX G A -8 +KPX G AE 4 +KPX G Aacute -8 +KPX G Acircumflex -8 +KPX G Adieresis -8 +KPX G Agrave -8 +KPX G Aring -8 +KPX G Atilde -8 +KPX G T -17 +KPX G V -36 +KPX G W -20 +KPX G Y -56 +KPX J A -32 +KPX J AE -20 +KPX J Adieresis -32 +KPX J Aring -32 +KPX K C -53 +KPX K G -55 +KPX K O -54 +KPX K OE -44 +KPX K Oacute -54 +KPX K Odieresis -54 +KPX K S -30 +KPX K T 13 +KPX K a -3 +KPX K adieresis -3 +KPX K ae 0 +KPX K aring -3 +KPX K e -25 +KPX K hyphen -44 +KPX K o -33 +KPX K oacute -33 +KPX K odieresis -33 +KPX K u -23 +KPX K udieresis -23 +KPX K y -65 +KPX L A 9 +KPX L AE 21 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -26 +KPX L Ccedilla -26 +KPX L G -30 +KPX L O -29 +KPX L Oacute -29 +KPX L Ocircumflex -29 +KPX L Odieresis -29 +KPX L Ograve -29 +KPX L Otilde -29 +KPX L S -2 +KPX L T -95 +KPX L U -24 +KPX L Udieresis -24 +KPX L V -90 +KPX L W -68 +KPX L Y -112 +KPX L hyphen -12 +KPX L quotedblright -141 +KPX L quoteright -138 +KPX L u -7 +KPX L udieresis -7 +KPX L y -55 +KPX N A -5 +KPX N AE 7 +KPX N Aacute -5 +KPX N Adieresis -5 +KPX N Aring -5 +KPX N C 9 +KPX N Ccedilla 9 +KPX N G 8 +KPX N O 8 +KPX N Oacute 8 +KPX N Odieresis 8 +KPX N a 13 +KPX N aacute 13 +KPX N adieresis 13 +KPX N ae 13 +KPX N aring 13 +KPX N comma 15 +KPX N e 18 +KPX N eacute 18 +KPX N o 11 +KPX N oacute 11 +KPX N odieresis 11 +KPX N oslash 11 +KPX N period 16 +KPX N u 12 +KPX N udieresis 12 +KPX O A -37 +KPX O AE -26 +KPX O Aacute -37 +KPX O Adieresis -37 +KPX O Aring -37 +KPX O T -20 +KPX O V -36 +KPX O W -21 +KPX O X -36 +KPX O Y -59 +KPX Oacute A -37 +KPX Oacute T -20 +KPX Oacute V -36 +KPX Oacute W -21 +KPX Oacute Y -59 +KPX Ocircumflex T -20 +KPX Ocircumflex V -36 +KPX Ocircumflex Y -59 +KPX Odieresis A -37 +KPX Odieresis T -20 +KPX Odieresis V -36 +KPX Odieresis W -21 +KPX Odieresis X -36 +KPX Odieresis Y -59 +KPX Ograve T -20 +KPX Ograve V -36 +KPX Ograve Y -59 +KPX Oslash A -32 +KPX Otilde T -20 +KPX Otilde V -36 +KPX Otilde Y -59 +KPX P A -65 +KPX P AE -54 +KPX P Aacute -65 +KPX P Adieresis -65 +KPX P Aring -65 +KPX P J -44 +KPX P a -7 +KPX P aacute -7 +KPX P adieresis -7 +KPX P ae -8 +KPX P aring -7 +KPX P comma -94 +KPX P e -8 +KPX P eacute -8 +KPX P hyphen 0 +KPX P o -14 +KPX P oacute -14 +KPX P odieresis -14 +KPX P oe -8 +KPX P oslash -17 +KPX P period -94 +KPX R C -5 +KPX R Ccedilla -5 +KPX R G -6 +KPX R O -6 +KPX R OE 3 +KPX R Oacute -6 +KPX R Odieresis -6 +KPX R T 0 +KPX R U -4 +KPX R Udieresis -4 +KPX R V -26 +KPX R W -17 +KPX R Y -37 +KPX R a 0 +KPX R aacute 0 +KPX R adieresis 0 +KPX R ae 0 +KPX R aring 0 +KPX R e 2 +KPX R eacute 2 +KPX R hyphen 15 +KPX R o -4 +KPX R oacute -4 +KPX R odieresis -4 +KPX R oe 1 +KPX R u 0 +KPX R uacute 0 +KPX R udieresis 0 +KPX R y 5 +KPX S A -20 +KPX S AE -8 +KPX S Aacute -20 +KPX S Adieresis -20 +KPX S Aring -20 +KPX S T -5 +KPX S V -31 +KPX S W -17 +KPX S Y -43 +KPX S t 1 +KPX T A -87 +KPX T AE -75 +KPX T Aacute -87 +KPX T Acircumflex -87 +KPX T Adieresis -87 +KPX T Agrave -87 +KPX T Aring -87 +KPX T Atilde -87 +KPX T C -20 +KPX T G -22 +KPX T J -87 +KPX T O -22 +KPX T OE -11 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -23 +KPX T Otilde -22 +KPX T S 3 +KPX T V 18 +KPX T W 24 +KPX T Y 16 +KPX T a -73 +KPX T ae -73 +KPX T c -74 +KPX T colon -97 +KPX T comma -67 +KPX T e -69 +KPX T g -75 +KPX T guillemotleft -101 +KPX T guilsinglleft -98 +KPX T hyphen -48 +KPX T i -1 +KPX T j -3 +KPX T o -76 +KPX T oslash -73 +KPX T period -67 +KPX T r -71 +KPX T s -74 +KPX T semicolon -98 +KPX T u -72 +KPX T v -82 +KPX T w -77 +KPX T y -80 +KPX U A -34 +KPX U AE -22 +KPX U Aacute -34 +KPX U Acircumflex -34 +KPX U Adieresis -34 +KPX U Aring -34 +KPX U Atilde -34 +KPX U comma -7 +KPX U m 6 +KPX U n 5 +KPX U p 7 +KPX U period -4 +KPX U r 5 +KPX Uacute A -34 +KPX Uacute comma -7 +KPX Uacute m 6 +KPX Uacute n 5 +KPX Uacute p 7 +KPX Uacute period -4 +KPX Uacute r 5 +KPX Ucircumflex A -34 +KPX Udieresis A -34 +KPX Udieresis b 6 +KPX Udieresis comma -7 +KPX Udieresis m 6 +KPX Udieresis n 5 +KPX Udieresis p 7 +KPX Udieresis period -4 +KPX Udieresis r 5 +KPX Ugrave A -34 +KPX V A -71 +KPX V AE -59 +KPX V Aacute -71 +KPX V Acircumflex -71 +KPX V Adieresis -71 +KPX V Agrave -71 +KPX V Aring -71 +KPX V Atilde -71 +KPX V C -36 +KPX V G -38 +KPX V O -37 +KPX V Oacute -37 +KPX V Ocircumflex -37 +KPX V Odieresis -37 +KPX V Ograve -37 +KPX V Oslash -31 +KPX V Otilde -37 +KPX V S -21 +KPX V T 21 +KPX V a -47 +KPX V ae -48 +KPX V colon -65 +KPX V comma -69 +KPX V e -43 +KPX V g -49 +KPX V guillemotleft -74 +KPX V guilsinglleft -72 +KPX V hyphen -21 +KPX V i -5 +KPX V o -50 +KPX V oslash -48 +KPX V period -69 +KPX V r -34 +KPX V semicolon -67 +KPX V u -34 +KPX V y -10 +KPX W A -54 +KPX W AE -43 +KPX W Aacute -54 +KPX W Acircumflex -54 +KPX W Adieresis -54 +KPX W Agrave -54 +KPX W Aring -54 +KPX W Atilde -54 +KPX W C -20 +KPX W G -22 +KPX W O -21 +KPX W Oacute -21 +KPX W Ocircumflex -21 +KPX W Odieresis -21 +KPX W Ograve -21 +KPX W Oslash -15 +KPX W Otilde -21 +KPX W S -12 +KPX W T 25 +KPX W a -29 +KPX W ae -29 +KPX W colon -53 +KPX W comma -45 +KPX W e -24 +KPX W g -30 +KPX W guillemotleft -55 +KPX W guilsinglleft -53 +KPX W hyphen -3 +KPX W i -1 +KPX W o -31 +KPX W oslash -29 +KPX W period -45 +KPX W r -24 +KPX W semicolon -54 +KPX W u -23 +KPX W y 0 +KPX X C -34 +KPX X O -35 +KPX X Odieresis -35 +KPX X Q -37 +KPX X a -5 +KPX X e -25 +KPX X hyphen -27 +KPX X o -32 +KPX X u -25 +KPX X y -40 +KPX Y A -86 +KPX Y AE -74 +KPX Y Aacute -86 +KPX Y Acircumflex -86 +KPX Y Adieresis -86 +KPX Y Agrave -86 +KPX Y Aring -86 +KPX Y Atilde -86 +KPX Y C -52 +KPX Y G -54 +KPX Y O -54 +KPX Y Oacute -54 +KPX Y Ocircumflex -54 +KPX Y Odieresis -54 +KPX Y Ograve -54 +KPX Y Oslash -47 +KPX Y Otilde -54 +KPX Y S -29 +KPX Y T 22 +KPX Y a -66 +KPX Y ae -67 +KPX Y colon -81 +KPX Y comma -78 +KPX Y e -63 +KPX Y g -68 +KPX Y guillemotleft -98 +KPX Y guilsinglleft -96 +KPX Y hyphen -50 +KPX Y i -3 +KPX Y o -70 +KPX Y oslash -67 +KPX Y p -45 +KPX Y period -78 +KPX Y semicolon -83 +KPX Y u -48 +KPX Y v -27 +KPX Z v -11 +KPX Z y -9 +KPX a j -1 +KPX a quoteright -11 +KPX a v -19 +KPX a w -5 +KPX a y -17 +KPX aacute v -19 +KPX aacute w -5 +KPX aacute y -17 +KPX adieresis v -19 +KPX adieresis w -5 +KPX adieresis y -17 +KPX ae v -21 +KPX ae w -7 +KPX ae y -19 +KPX agrave v -19 +KPX agrave w -5 +KPX agrave y -17 +KPX aring v -19 +KPX aring w -5 +KPX aring y -17 +KPX b v -20 +KPX b w -7 +KPX b y -20 +KPX c h 0 +KPX c k 3 +KPX comma one -73 +KPX comma quotedblright -33 +KPX comma quoteright -30 +KPX e quoteright -12 +KPX e t -4 +KPX e v -19 +KPX e w -6 +KPX e x -21 +KPX e y -17 +KPX eacute v -19 +KPX eacute w -6 +KPX eacute y -17 +KPX ecircumflex v -19 +KPX ecircumflex w -6 +KPX ecircumflex y -17 +KPX eight four 10 +KPX eight one -23 +KPX eight seven -6 +KPX f a 1 +KPX f aacute 1 +KPX f adieresis 1 +KPX f ae 0 +KPX f aring 1 +KPX f e -3 +KPX f eacute -3 +KPX f f 21 +KPX f i -3 +KPX f j -6 +KPX f l -3 +KPX f o -9 +KPX f oacute -9 +KPX f odieresis -9 +KPX f oe -3 +KPX f oslash -9 +KPX f quoteright 10 +KPX f s -1 +KPX f t 21 +KPX five four 6 +KPX five one -29 +KPX five seven -10 +KPX four four 9 +KPX four one -50 +KPX four seven -28 +KPX g a 3 +KPX g adieresis 3 +KPX g ae 3 +KPX g aring 3 +KPX g e 8 +KPX g eacute 8 +KPX g l 0 +KPX g oacute 1 +KPX g odieresis 1 +KPX g r 1 +KPX guillemotright A -51 +KPX guillemotright AE -39 +KPX guillemotright Aacute -51 +KPX guillemotright Adieresis -51 +KPX guillemotright Aring -51 +KPX guillemotright T -108 +KPX guillemotright V -78 +KPX guillemotright W -60 +KPX guillemotright Y -111 +KPX guilsinglright A -46 +KPX guilsinglright AE -35 +KPX guilsinglright Aacute -46 +KPX guilsinglright Adieresis -46 +KPX guilsinglright Aring -46 +KPX guilsinglright T -104 +KPX guilsinglright V -74 +KPX guilsinglright W -56 +KPX guilsinglright Y -107 +KPX h quoteright -14 +KPX h y -21 +KPX hyphen A -1 +KPX hyphen AE 10 +KPX hyphen Aacute -1 +KPX hyphen Adieresis -1 +KPX hyphen Aring -1 +KPX hyphen T -57 +KPX hyphen V -27 +KPX hyphen W -9 +KPX hyphen Y -64 +KPX i T -4 +KPX i j -2 +KPX k a -2 +KPX k aacute -2 +KPX k adieresis -2 +KPX k ae 1 +KPX k aring -2 +KPX k comma 7 +KPX k e -15 +KPX k eacute -15 +KPX k g -21 +KPX k hyphen -25 +KPX k o -22 +KPX k oacute -22 +KPX k odieresis -22 +KPX k period 6 +KPX k s -10 +KPX k u -1 +KPX k udieresis -1 +KPX l v -5 +KPX l y -2 +KPX m p 6 +KPX m v -19 +KPX m w -6 +KPX m y -18 +KPX n T -80 +KPX n p 5 +KPX n quoteright -12 +KPX n v -20 +KPX n w -7 +KPX n y -19 +KPX nine four 4 +KPX nine one -21 +KPX nine seven -17 +KPX o T -84 +KPX o quoteright -17 +KPX o t -8 +KPX o v -23 +KPX o w -10 +KPX o x -25 +KPX o y -22 +KPX oacute v -23 +KPX oacute w -10 +KPX oacute y -22 +KPX ocircumflex t -8 +KPX odieresis t -8 +KPX odieresis v -23 +KPX odieresis w -10 +KPX odieresis x -25 +KPX odieresis y -22 +KPX ograve v -23 +KPX ograve w -10 +KPX ograve y -22 +KPX one comma -42 +KPX one eight -37 +KPX one five -43 +KPX one four -56 +KPX one nine -39 +KPX one one -85 +KPX one period -42 +KPX one seven -65 +KPX one six -37 +KPX one three -44 +KPX one two -47 +KPX one zero -34 +KPX p t -5 +KPX p y -20 +KPX period one -73 +KPX period quotedblright -32 +KPX period quoteright -29 +KPX q c 4 +KPX q u 4 +KPX quotedblbase A 12 +KPX quotedblbase AE 24 +KPX quotedblbase T -75 +KPX quotedblbase V -73 +KPX quotedblbase W -51 +KPX quotedblbase Y -92 +KPX quotedblleft A -68 +KPX quotedblleft AE -57 +KPX quotedblleft Aacute -68 +KPX quotedblleft Adieresis -68 +KPX quotedblleft Aring -68 +KPX quotedblleft T -2 +KPX quotedblleft V 6 +KPX quotedblleft W 16 +KPX quotedblleft Y -9 +KPX quotedblright A -69 +KPX quotedblright AE -57 +KPX quotedblright Aacute -69 +KPX quotedblright Adieresis -69 +KPX quotedblright Aring -69 +KPX quotedblright T 1 +KPX quotedblright V 7 +KPX quotedblright W 17 +KPX quotedblright Y -7 +KPX quoteleft A -73 +KPX quoteleft AE -62 +KPX quoteleft Aacute -73 +KPX quoteleft Adieresis -73 +KPX quoteleft Aring -73 +KPX quoteleft T -7 +KPX quoteleft V 2 +KPX quoteleft W 11 +KPX quoteleft Y -13 +KPX quoteright A -77 +KPX quoteright AE -66 +KPX quoteright Aacute -77 +KPX quoteright Adieresis -77 +KPX quoteright Aring -77 +KPX quoteright comma -46 +KPX quoteright d -27 +KPX quoteright o -30 +KPX quoteright period -45 +KPX quoteright r -15 +KPX quoteright s -22 +KPX quoteright t -4 +KPX quoteright v -5 +KPX quoteright w 1 +KPX quoteright y -3 +KPX r a 6 +KPX r aacute 6 +KPX r acircumflex 6 +KPX r adieresis 6 +KPX r ae 4 +KPX r agrave 6 +KPX r aring 6 +KPX r c 0 +KPX r ccedilla 0 +KPX r colon -27 +KPX r comma -57 +KPX r d 0 +KPX r e 4 +KPX r eacute 4 +KPX r ecircumflex 4 +KPX r egrave 4 +KPX r f 22 +KPX r g -2 +KPX r h -4 +KPX r hyphen -35 +KPX r i -4 +KPX r j -6 +KPX r k 0 +KPX r l -4 +KPX r m -1 +KPX r n -2 +KPX r o -1 +KPX r oacute -1 +KPX r ocircumflex -1 +KPX r odieresis -1 +KPX r oe 5 +KPX r ograve -1 +KPX r oslash -4 +KPX r p 0 +KPX r period -57 +KPX r q 1 +KPX r quoteright 14 +KPX r r -2 +KPX r s 3 +KPX r semicolon -27 +KPX r t 22 +KPX r u 0 +KPX r v 21 +KPX r w 26 +KPX r x 17 +KPX r y 23 +KPX r z 9 +KPX s quoteright -12 +KPX s t -1 +KPX seven colon -63 +KPX seven comma -88 +KPX seven eight -3 +KPX seven five -21 +KPX seven four -62 +KPX seven one -14 +KPX seven period -87 +KPX seven seven 9 +KPX seven six -13 +KPX seven three 0 +KPX seven two -4 +KPX six four 7 +KPX six one -21 +KPX six seven -3 +KPX t S 0 +KPX t a 6 +KPX t aacute 6 +KPX t adieresis 6 +KPX t ae 7 +KPX t aring 6 +KPX t colon -25 +KPX t e -3 +KPX t eacute -3 +KPX t h 2 +KPX t o -10 +KPX t oacute -10 +KPX t odieresis -10 +KPX t quoteright 4 +KPX t semicolon -25 +KPX three four 6 +KPX three one -27 +KPX three seven -10 +KPX two four -9 +KPX two one -16 +KPX two seven -3 +KPX u quoteright -2 +KPX v a -15 +KPX v aacute -15 +KPX v acircumflex -15 +KPX v adieresis -15 +KPX v ae -16 +KPX v agrave -15 +KPX v aring -15 +KPX v atilde -15 +KPX v c -20 +KPX v colon -32 +KPX v comma -51 +KPX v e -15 +KPX v eacute -15 +KPX v ecircumflex -15 +KPX v egrave -15 +KPX v g -21 +KPX v hyphen 0 +KPX v l -5 +KPX v o -22 +KPX v oacute -22 +KPX v odieresis -22 +KPX v ograve -22 +KPX v oslash -20 +KPX v period -50 +KPX v s -17 +KPX v semicolon -34 +KPX w a -7 +KPX w aacute -7 +KPX w acircumflex -7 +KPX w adieresis -7 +KPX w ae -8 +KPX w agrave -7 +KPX w aring -7 +KPX w atilde -7 +KPX w c -8 +KPX w colon -27 +KPX w comma -33 +KPX w e -3 +KPX w eacute -3 +KPX w ecircumflex -3 +KPX w egrave -3 +KPX w g -9 +KPX w hyphen 11 +KPX w l -1 +KPX w o -10 +KPX w oacute -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w oslash -8 +KPX w period -32 +KPX w s -9 +KPX w semicolon -29 +KPX x a -9 +KPX x c -22 +KPX x e -17 +KPX x eacute -17 +KPX x o -24 +KPX x q -20 +KPX y a -14 +KPX y aacute -14 +KPX y acircumflex -14 +KPX y adieresis -14 +KPX y ae -15 +KPX y agrave -14 +KPX y aring -14 +KPX y atilde -14 +KPX y c -21 +KPX y colon -31 +KPX y comma -51 +KPX y e -16 +KPX y eacute -16 +KPX y ecircumflex -16 +KPX y egrave -16 +KPX y g -21 +KPX y hyphen 0 +KPX y l -4 +KPX y o -22 +KPX y oacute -22 +KPX y odieresis -22 +KPX y ograve -22 +KPX y oslash -20 +KPX y period -50 +KPX y s -16 +KPX y semicolon -33 +KPX zero four 5 +KPX zero one -19 +KPX zero seven -10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n019004l.pfb b/PdfReader/Resources/Fonts/n019004l.pfb new file mode 100644 index 0000000000..a977eb7e18 Binary files /dev/null and b/PdfReader/Resources/Fonts/n019004l.pfb differ diff --git a/PdfReader/Resources/Fonts/n019023l.afm b/PdfReader/Resources/Fonts/n019023l.afm new file mode 100644 index 0000000000..0172d80828 --- /dev/null +++ b/PdfReader/Resources/Fonts/n019023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-ReguItal +FullName Nimbus Sans L Regular Italic +FamilyName Nimbus Sans L +Weight Regular +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -151 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -178 -284 1108 953 +CapHeight 729 +XHeight 524 +Descender -213 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 213 0 213 0 ; +C 33 ; WX 278 ; N exclam ; B 124 0 363 729 ; +C 34 ; WX 355 ; N quotedbl ; B 177 464 455 709 ; +C 35 ; WX 556 ; N numbersign ; B 54 -20 649 697 ; +C 36 ; WX 556 ; N dollar ; B 69 -126 613 770 ; +C 37 ; WX 889 ; N percent ; B 134 -20 895 709 ; +C 38 ; WX 667 ; N ampersand ; B 83 -23 644 709 ; +C 39 ; WX 222 ; N quoteright ; B 166 477 309 708 ; +C 40 ; WX 333 ; N parenleft ; B 113 -213 446 729 ; +C 41 ; WX 333 ; N parenright ; B -7 -213 325 729 ; +C 42 ; WX 389 ; N asterisk ; B 169 438 471 729 ; +C 43 ; WX 584 ; N plus ; B 92 -11 591 473 ; +C 44 ; WX 278 ; N comma ; B 55 -150 214 103 ; +C 45 ; WX 333 ; N hyphen ; B 97 240 351 312 ; +C 46 ; WX 278 ; N period ; B 87 0 213 103 ; +C 47 ; WX 278 ; N slash ; B -12 -20 434 729 ; +C 48 ; WX 556 ; N zero ; B 98 -23 598 709 ; +C 49 ; WX 556 ; N one ; B 208 0 498 709 ; +C 50 ; WX 556 ; N two ; B 34 0 620 709 ; +C 51 ; WX 556 ; N three ; B 71 -23 599 709 ; +C 52 ; WX 556 ; N four ; B 63 0 573 709 ; +C 53 ; WX 556 ; N five ; B 70 -23 629 709 ; +C 54 ; WX 556 ; N six ; B 93 -23 611 709 ; +C 55 ; WX 556 ; N seven ; B 137 0 671 709 ; +C 56 ; WX 556 ; N eight ; B 74 -23 604 709 ; +C 57 ; WX 556 ; N nine ; B 83 -23 599 709 ; +C 58 ; WX 278 ; N colon ; B 110 0 326 524 ; +C 59 ; WX 278 ; N semicolon ; B 78 -150 325 524 ; +C 60 ; WX 584 ; N less ; B 87 -9 635 474 ; +C 61 ; WX 584 ; N equal ; B 74 111 609 355 ; +C 62 ; WX 584 ; N greater ; B 48 -9 596 474 ; +C 63 ; WX 556 ; N question ; B 184 0 630 741 ; +C 64 ; WX 1015 ; N at ; B 80 -142 1036 741 ; +C 65 ; WX 667 ; N A ; B 17 0 653 729 ; +C 66 ; WX 667 ; N B ; B 79 0 711 729 ; +C 67 ; WX 722 ; N C ; B 112 -23 770 741 ; +C 68 ; WX 722 ; N D ; B 89 0 759 729 ; +C 69 ; WX 667 ; N E ; B 90 0 751 729 ; +C 70 ; WX 611 ; N F ; B 90 0 734 729 ; +C 71 ; WX 778 ; N G ; B 109 -23 809 741 ; +C 72 ; WX 722 ; N H ; B 83 0 799 729 ; +C 73 ; WX 278 ; N I ; B 100 0 349 729 ; +C 74 ; WX 500 ; N J ; B 47 -23 581 729 ; +C 75 ; WX 667 ; N K ; B 79 0 813 729 ; +C 76 ; WX 556 ; N L ; B 80 0 551 729 ; +C 77 ; WX 833 ; N M ; B 75 0 916 729 ; +C 78 ; WX 722 ; N N ; B 76 0 801 729 ; +C 79 ; WX 778 ; N O ; B 104 -23 828 741 ; +C 80 ; WX 667 ; N P ; B 91 0 733 729 ; +C 81 ; WX 778 ; N Q ; B 104 -59 828 741 ; +C 82 ; WX 722 ; N R ; B 93 0 770 729 ; +C 83 ; WX 667 ; N S ; B 89 -23 714 741 ; +C 84 ; WX 611 ; N T ; B 158 0 748 729 ; +C 85 ; WX 722 ; N U ; B 124 -23 800 729 ; +C 86 ; WX 667 ; N V ; B 185 0 800 729 ; +C 87 ; WX 944 ; N W ; B 177 0 1084 729 ; +C 88 ; WX 667 ; N X ; B 22 0 794 729 ; +C 89 ; WX 667 ; N Y ; B 168 0 816 729 ; +C 90 ; WX 611 ; N Z ; B 28 0 737 729 ; +C 91 ; WX 278 ; N bracketleft ; B 19 -213 405 729 ; +C 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ; +C 93 ; WX 278 ; N bracketright ; B -23 -213 364 729 ; +C 94 ; WX 469 ; N asciicircum ; B 115 329 496 709 ; +C 95 ; WX 556 ; N underscore ; B -59 -176 551 -126 ; +C 96 ; WX 222 ; N quoteleft ; B 163 477 308 709 ; +C 97 ; WX 556 ; N a ; B 65 -23 568 539 ; +C 98 ; WX 556 ; N b ; B 54 -23 588 729 ; +C 99 ; WX 500 ; N c ; B 76 -23 554 539 ; +C 100 ; WX 556 ; N d ; B 73 -23 650 729 ; +C 101 ; WX 556 ; N e ; B 84 -23 580 539 ; +C 102 ; WX 278 ; N f ; B 89 0 413 732 ; +C 103 ; WX 556 ; N g ; B 32 -218 601 539 ; +C 104 ; WX 556 ; N h ; B 70 0 574 729 ; +C 105 ; WX 222 ; N i ; B 66 0 305 729 ; +C 106 ; WX 222 ; N j ; B -65 -218 308 729 ; +C 107 ; WX 500 ; N k ; B 58 0 584 729 ; +C 108 ; WX 222 ; N l ; B 68 0 307 729 ; +C 109 ; WX 833 ; N m ; B 71 0 852 539 ; +C 110 ; WX 556 ; N n ; B 70 0 574 539 ; +C 111 ; WX 556 ; N o ; B 80 -23 576 539 ; +C 112 ; WX 556 ; N p ; B 7 -213 586 539 ; +C 113 ; WX 556 ; N q ; B 71 -213 607 539 ; +C 114 ; WX 333 ; N r ; B 69 0 436 539 ; +C 115 ; WX 500 ; N s ; B 61 -23 520 539 ; +C 116 ; WX 278 ; N t ; B 97 -23 366 668 ; +C 117 ; WX 556 ; N u ; B 88 -23 594 524 ; +C 118 ; WX 500 ; N v ; B 122 0 598 524 ; +C 119 ; WX 722 ; N w ; B 118 0 820 524 ; +C 120 ; WX 500 ; N x ; B 17 0 583 524 ; +C 121 ; WX 500 ; N y ; B 8 -218 590 524 ; +C 122 ; WX 500 ; N z ; B 31 0 557 524 ; +C 123 ; WX 334 ; N braceleft ; B 91 -213 431 729 ; +C 124 ; WX 260 ; N bar ; B 54 -212 315 729 ; +C 125 ; WX 334 ; N braceright ; B -16 -213 324 729 ; +C 126 ; WX 584 ; N asciitilde ; B 137 268 594 438 ; +C 161 ; WX 333 ; N exclamdown ; B 76 -205 317 524 ; +C 162 ; WX 556 ; N cent ; B 96 -120 585 628 ; +C 163 ; WX 556 ; N sterling ; B 44 -23 628 729 ; +C 164 ; WX 167 ; N fraction ; B -178 -20 486 709 ; +C 165 ; WX 556 ; N yen ; B 100 0 696 709 ; +C 166 ; WX 556 ; N florin ; B -32 -212 696 738 ; +C 167 ; WX 556 ; N section ; B 63 -213 589 729 ; +C 168 ; WX 556 ; N currency ; B 110 133 593 556 ; +C 169 ; WX 191 ; N quotesingle ; B 173 464 292 709 ; +C 170 ; WX 333 ; N quotedblleft ; B 146 477 449 709 ; +C 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ; +C 172 ; WX 333 ; N guilsinglleft ; B 140 106 336 438 ; +C 173 ; WX 333 ; N guilsinglright ; B 109 106 307 438 ; +C 174 ; WX 500 ; N fi ; B 83 0 591 732 ; +C 175 ; WX 500 ; N fl ; B 88 0 585 732 ; +C 177 ; WX 556 ; N endash ; B 46 240 628 312 ; +C 178 ; WX 556 ; N dagger ; B 127 -177 620 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 51 -177 620 709 ; +C 180 ; WX 278 ; N periodcentered ; B 166 192 293 295 ; +C 182 ; WX 537 ; N paragraph ; B 145 -178 677 729 ; +C 183 ; WX 350 ; N bullet ; B 120 220 376 470 ; +C 184 ; WX 222 ; N quotesinglbase ; B 37 -128 180 103 ; +C 185 ; WX 333 ; N quotedblbase ; B 20 -128 322 103 ; +C 186 ; WX 333 ; N quotedblright ; B 150 477 452 708 ; +C 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 907 103 ; +C 189 ; WX 1000 ; N perthousand ; B 93 -20 1024 738 ; +C 191 ; WX 611 ; N questiondown ; B 86 -217 531 524 ; +C 193 ; WX 333 ; N grave ; B 179 592 357 740 ; +C 194 ; WX 333 ; N acute ; B 218 592 458 740 ; +C 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ; +C 196 ; WX 333 ; N tilde ; B 130 611 471 719 ; +C 197 ; WX 333 ; N macron ; B 160 627 450 696 ; +C 198 ; WX 333 ; N breve ; B 165 594 471 729 ; +C 199 ; WX 333 ; N dotaccent ; B 244 612 370 715 ; +C 200 ; WX 333 ; N dieresis ; B 159 612 446 715 ; +C 202 ; WX 333 ; N ring ; B 216 579 396 754 ; +C 203 ; WX 333 ; N cedilla ; B 1 -214 264 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 91 590 505 740 ; +C 206 ; WX 333 ; N ogonek ; B 35 -205 246 0 ; +C 207 ; WX 333 ; N caron ; B 176 592 463 740 ; +C 208 ; WX 1000 ; N emdash ; B 42 240 1068 312 ; +C 225 ; WX 1000 ; N AE ; B 11 0 1087 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 107 303 441 742 ; +C 232 ; WX 556 ; N Lslash ; B 75 0 570 729 ; +C 233 ; WX 778 ; N Oslash ; B 32 -24 867 741 ; +C 234 ; WX 1000 ; N OE ; B 101 -23 1108 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 114 303 452 742 ; +C 241 ; WX 889 ; N ae ; B 59 -23 915 539 ; +C 245 ; WX 278 ; N dotlessi ; B 94 0 290 527 ; +C 248 ; WX 222 ; N lslash ; B 62 0 312 729 ; +C 249 ; WX 611 ; N oslash ; B 19 -30 639 541 ; +C 250 ; WX 944 ; N oe ; B 85 -23 966 539 ; +C 251 ; WX 611 ; N germandbls ; B 126 -23 655 729 ; +C -1 ; WX 722 ; N Udieresis ; B 124 -23 800 914 ; +C -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ; +C -1 ; WX 667 ; N Scedilla ; B 89 -214 714 741 ; +C -1 ; WX 611 ; N Tcaron ; B 158 0 748 939 ; +C -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ; +C -1 ; WX 722 ; N Rcaron ; B 93 0 770 939 ; +C -1 ; WX 722 ; N Racute ; B 93 0 770 939 ; +C -1 ; WX 667 ; N Sacute ; B 89 -23 714 939 ; +C -1 ; WX 778 ; N Otilde ; B 104 -23 828 918 ; +C -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 104 -23 841 939 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 124 -23 806 939 ; +C -1 ; WX 667 ; N Yacute ; B 168 0 816 939 ; +C -1 ; WX 722 ; N Eth ; B 89 0 759 729 ; +C -1 ; WX 722 ; N Dcroat ; B 89 0 759 729 ; +C -1 ; WX 611 ; N Zacute ; B 28 0 737 939 ; +C -1 ; WX 722 ; N Uring ; B 124 -23 800 953 ; +C -1 ; WX 556 ; N gbreve ; B 32 -218 601 729 ; +C -1 ; WX 556 ; N eogonek ; B 84 -205 580 539 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -23 580 715 ; +C -1 ; WX 556 ; N ecaron ; B 84 -23 580 740 ; +C -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ; +C -1 ; WX 667 ; N Thorn ; B 91 0 708 729 ; +C -1 ; WX 556 ; N eacute ; B 84 -23 580 740 ; +C -1 ; WX 556 ; N edieresis ; B 84 -23 580 715 ; +C -1 ; WX 650 ; N dcaron ; B 73 -23 810 729 ; +C -1 ; WX 500 ; N ccedilla ; B 76 -214 554 539 ; +C -1 ; WX 500 ; N ccaron ; B 76 -23 563 740 ; +C -1 ; WX 500 ; N cacute ; B 76 -23 575 740 ; +C -1 ; WX 556 ; N aogonek ; B 65 -205 571 539 ; +C -1 ; WX 556 ; N aring ; B 65 -23 568 754 ; +C -1 ; WX 556 ; N atilde ; B 65 -23 583 719 ; +C -1 ; WX 556 ; N abreve ; B 65 -23 582 729 ; +C -1 ; WX 556 ; N egrave ; B 84 -23 580 740 ; +C -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ; +C -1 ; WX 556 ; N aacute ; B 65 -23 570 740 ; +C -1 ; WX 556 ; N adieresis ; B 65 -23 568 715 ; +C -1 ; WX 722 ; N Uogonek ; B 124 -205 800 729 ; +C -1 ; WX 556 ; N ugrave ; B 88 -23 594 740 ; +C -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ; +C -1 ; WX 556 ; N udieresis ; B 88 -23 594 715 ; +C -1 ; WX 319 ; N tcaron ; B 97 -23 492 801 ; +C -1 ; WX 500 ; N scommaaccent ; B 61 -284 520 539 ; +C -1 ; WX 611 ; N Zcaron ; B 28 0 737 939 ; +C -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ; +C -1 ; WX 722 ; N Ucircumflex ; B 124 -23 800 940 ; +C -1 ; WX 556 ; N acircumflex ; B 65 -23 568 741 ; +C -1 ; WX 611 ; N Zdotaccent ; B 28 0 737 914 ; +C -1 ; WX 500 ; N scaron ; B 61 -23 547 740 ; +C -1 ; WX 667 ; N Amacron ; B 17 0 663 895 ; +C -1 ; WX 500 ; N sacute ; B 61 -23 545 740 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 158 -284 748 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 168 0 816 914 ; +C -1 ; WX 556 ; N thorn ; B 7 -213 586 729 ; +C -1 ; WX 667 ; N Emacron ; B 90 0 751 895 ; +C -1 ; WX 778 ; N Ograve ; B 104 -23 828 939 ; +C -1 ; WX 778 ; N Oacute ; B 104 -23 828 939 ; +C -1 ; WX 778 ; N Odieresis ; B 104 -23 828 914 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 801 918 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 801 939 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 801 939 ; +C -1 ; WX 556 ; N Lcaron ; B 80 0 551 729 ; +C -1 ; WX 556 ; N Lacute ; B 80 0 551 939 ; +C -1 ; WX 278 ; N Idotaccent ; B 100 0 389 914 ; +C -1 ; WX 333 ; N racute ; B 69 0 498 740 ; +C -1 ; WX 278 ; N Icircumflex ; B 100 0 454 940 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 80 -23 683 740 ; +C -1 ; WX 556 ; N otilde ; B 80 -23 583 719 ; +C -1 ; WX 556 ; N Euro ; B 12 -22 636 709 ; +C -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ; +C -1 ; WX 390 ; N onesuperior ; B 205 284 393 709 ; +C -1 ; WX 390 ; N twosuperior ; B 100 284 468 709 ; +C -1 ; WX 390 ; N threesuperior ; B 123 270 455 709 ; +C -1 ; WX 278 ; N Igrave ; B 100 0 378 939 ; +C -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ; +C -1 ; WX 278 ; N Imacron ; B 100 0 458 895 ; +C -1 ; WX 278 ; N Iogonek ; B 28 -205 349 729 ; +C -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ; +C -1 ; WX 778 ; N Gbreve ; B 109 -23 809 928 ; +C -1 ; WX 722 ; N Umacron ; B 124 -23 800 895 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 79 -284 813 729 ; +C -1 ; WX 556 ; N ograve ; B 80 -23 576 740 ; +C -1 ; WX 667 ; N Scommaaccent ; B 89 -284 714 741 ; +C -1 ; WX 667 ; N Eogonek ; B 90 -205 751 729 ; +C -1 ; WX 556 ; N oacute ; B 80 -23 576 740 ; +C -1 ; WX 667 ; N Edotaccent ; B 90 0 751 914 ; +C -1 ; WX 222 ; N iogonek ; B 0 -205 305 729 ; +C -1 ; WX 527 ; N gcommaaccent ; B 3 -218 572 813 ; +C -1 ; WX 556 ; N odieresis ; B 80 -23 576 715 ; +C -1 ; WX 556 ; N ntilde ; B 70 0 589 719 ; +C -1 ; WX 556 ; N ncaron ; B 70 0 578 740 ; +C -1 ; WX 667 ; N Ecaron ; B 90 0 751 939 ; +C -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ; +C -1 ; WX 500 ; N scedilla ; B 61 -214 521 539 ; +C -1 ; WX 333 ; N rcaron ; B 69 0 486 740 ; +C -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ; +C -1 ; WX 667 ; N Eacute ; B 90 0 751 939 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 109 -284 809 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 93 -284 770 729 ; +C -1 ; WX 667 ; N Edieresis ; B 90 0 751 914 ; +C -1 ; WX 556 ; N nacute ; B 70 0 580 740 ; +C -1 ; WX 556 ; N uogonek ; B 88 -205 594 524 ; +C -1 ; WX 556 ; N umacron ; B 88 -23 594 696 ; +C -1 ; WX 722 ; N Dcaron ; B 89 0 759 939 ; +C -1 ; WX 307 ; N lcaron ; B 68 0 467 729 ; +C -1 ; WX 722 ; N Ccaron ; B 112 -23 770 939 ; +C -1 ; WX 722 ; N Cacute ; B 112 -23 770 939 ; +C -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ; +C -1 ; WX 606 ; N degree ; B 291 383 594 686 ; +C -1 ; WX 667 ; N Aogonek ; B 17 -205 663 729 ; +C -1 ; WX 584 ; N minus ; B 81 197 601 269 ; +C -1 ; WX 584 ; N multiply ; B 113 34 568 427 ; +C -1 ; WX 584 ; N divide ; B 92 0 591 462 ; +C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; +C -1 ; WX 1000 ; N trademark ; B 208 292 1096 729 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -284 436 539 ; +C -1 ; WX 222 ; N lacute ; B 68 0 463 939 ; +C -1 ; WX 556 ; N omacron ; B 80 -23 576 696 ; +C -1 ; WX 667 ; N Atilde ; B 17 0 680 918 ; +C -1 ; WX 278 ; N icircumflex ; B 94 0 406 741 ; +C -1 ; WX 278 ; N igrave ; B 94 0 330 740 ; +C -1 ; WX 556 ; N ncommaaccent ; B 70 -284 574 539 ; +C -1 ; WX 222 ; N lcommaaccent ; B -1 -284 307 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 0 625 633 ; +C -1 ; WX 947 ; N onehalf ; B 202 -20 965 709 ; +C -1 ; WX 947 ; N onequarter ; B 205 -20 938 709 ; +C -1 ; WX 947 ; N threequarters ; B 123 -20 938 709 ; +C -1 ; WX 278 ; N iacute ; B 94 0 431 740 ; +C -1 ; WX 667 ; N Abreve ; B 17 0 683 928 ; +C -1 ; WX 500 ; N kcommaaccent ; B 58 -284 584 729 ; +C -1 ; WX 778 ; N Omacron ; B 104 -23 828 895 ; +C -1 ; WX 222 ; N imacron ; B 66 0 373 696 ; +C -1 ; WX 556 ; N emacron ; B 84 -23 580 696 ; +C -1 ; WX 556 ; N amacron ; B 65 -23 568 696 ; +C -1 ; WX 278 ; N tcommaaccent ; B 55 -284 366 668 ; +C -1 ; WX 500 ; N ydieresis ; B 8 -218 590 715 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 557 715 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 557 740 ; +C -1 ; WX 500 ; N zacute ; B 31 0 557 740 ; +C -1 ; WX 500 ; N yacute ; B 8 -218 590 740 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 88 -23 683 740 ; +C -1 ; WX 556 ; N eth ; B 80 -23 576 743 ; +C -1 ; WX 556 ; N uring ; B 88 -23 594 754 ; +C -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ; +C -1 ; WX 333 ; N commaaccent ; B 57 -284 205 -60 ; +C -1 ; WX 737 ; N copyright ; B 55 -22 836 742 ; +C -1 ; WX 737 ; N registered ; B 55 -22 836 742 ; +C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; +C -1 ; WX 278 ; N idieresis ; B 94 0 419 708 ; +C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; +C -1 ; WX 712 ; N Delta ; B 10 0 701 729 ; +C -1 ; WX 584 ; N notequal ; B 74 2 609 480 ; +C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; +C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; +C -1 ; WX 667 ; N Aacute ; B 17 0 667 939 ; +C -1 ; WX 584 ; N lessequal ; B 45 0 659 584 ; +C -1 ; WX 584 ; N greaterequal ; B 56 0 626 584 ; +C -1 ; WX 584 ; N logicalnot ; B 99 86 619 377 ; +C -1 ; WX 711 ; N summation ; B -18 -97 760 762 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -284 801 729 ; +C -1 ; WX 556 ; N dcroat ; B 73 -23 695 729 ; +C -1 ; WX 260 ; N brokenbar ; B 54 -212 315 729 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 80 -284 551 729 ; +C -1 ; WX 667 ; N Adieresis ; B 17 0 662 914 ; +C -1 ; WX 556 ; N mu ; B 18 -220 593 524 ; +C -1 ; WX 278 ; N .notdef ; B 213 0 213 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -41 +KPX A Ccedilla -41 +KPX A G -41 +KPX A O -37 +KPX A Odieresis -37 +KPX A Q -38 +KPX A T -103 +KPX A U -42 +KPX A Uacute -42 +KPX A Ucircumflex -42 +KPX A Udieresis -42 +KPX A Ugrave -42 +KPX A V -81 +KPX A W -57 +KPX A Y -104 +KPX A a -16 +KPX A b -5 +KPX A c -16 +KPX A ccedilla -16 +KPX A comma -4 +KPX A d -14 +KPX A e -22 +KPX A g -17 +KPX A guillemotleft -51 +KPX A guilsinglleft -47 +KPX A hyphen -8 +KPX A o -19 +KPX A period -2 +KPX A q -15 +KPX A quotedblright -60 +KPX A quoteright -68 +KPX A t -22 +KPX A u -18 +KPX A v -40 +KPX A w -29 +KPX A y -44 +KPX Aacute C -42 +KPX Aacute G -42 +KPX Aacute O -38 +KPX Aacute Q -39 +KPX Aacute T -103 +KPX Aacute U -43 +KPX Aacute V -81 +KPX Aacute W -57 +KPX Aacute Y -104 +KPX Aacute a -16 +KPX Aacute b -6 +KPX Aacute c -17 +KPX Aacute comma -4 +KPX Aacute d -15 +KPX Aacute e -23 +KPX Aacute g -17 +KPX Aacute guillemotleft -51 +KPX Aacute guilsinglleft -48 +KPX Aacute hyphen -9 +KPX Aacute o -20 +KPX Aacute period -3 +KPX Aacute q -16 +KPX Aacute quoteright -68 +KPX Aacute t -23 +KPX Aacute u -20 +KPX Aacute v -40 +KPX Aacute w -29 +KPX Aacute y -44 +KPX Acircumflex C -41 +KPX Acircumflex G -41 +KPX Acircumflex O -37 +KPX Acircumflex Q -38 +KPX Acircumflex T -103 +KPX Acircumflex U -42 +KPX Acircumflex V -81 +KPX Acircumflex W -57 +KPX Acircumflex Y -104 +KPX Acircumflex comma -4 +KPX Acircumflex period -2 +KPX Adieresis C -42 +KPX Adieresis G -41 +KPX Adieresis O -38 +KPX Adieresis Q -39 +KPX Adieresis T -103 +KPX Adieresis U -43 +KPX Adieresis V -81 +KPX Adieresis W -57 +KPX Adieresis Y -104 +KPX Adieresis a -16 +KPX Adieresis b -5 +KPX Adieresis c -17 +KPX Adieresis comma -4 +KPX Adieresis d -14 +KPX Adieresis g -17 +KPX Adieresis guillemotleft -51 +KPX Adieresis guilsinglleft -48 +KPX Adieresis hyphen -8 +KPX Adieresis o -19 +KPX Adieresis period -3 +KPX Adieresis q -15 +KPX Adieresis quotedblright -60 +KPX Adieresis quoteright -68 +KPX Adieresis t -22 +KPX Adieresis u -19 +KPX Adieresis v -40 +KPX Adieresis w -29 +KPX Adieresis y -44 +KPX Agrave C -41 +KPX Agrave G -41 +KPX Agrave O -37 +KPX Agrave Q -38 +KPX Agrave T -103 +KPX Agrave U -42 +KPX Agrave V -81 +KPX Agrave W -57 +KPX Agrave Y -104 +KPX Agrave comma -4 +KPX Agrave period -2 +KPX Aring C -41 +KPX Aring G -41 +KPX Aring O -37 +KPX Aring Q -38 +KPX Aring T -103 +KPX Aring U -42 +KPX Aring V -81 +KPX Aring W -57 +KPX Aring Y -104 +KPX Aring a -16 +KPX Aring b -5 +KPX Aring c -16 +KPX Aring comma -4 +KPX Aring d -14 +KPX Aring e -22 +KPX Aring g -17 +KPX Aring guillemotleft -51 +KPX Aring guilsinglleft -47 +KPX Aring hyphen -8 +KPX Aring o -19 +KPX Aring period -2 +KPX Aring q -15 +KPX Aring quotedblright -60 +KPX Aring quoteright -68 +KPX Aring t -22 +KPX Aring u -18 +KPX Aring v -40 +KPX Aring w -29 +KPX Aring y -44 +KPX Atilde C -43 +KPX Atilde G -42 +KPX Atilde O -39 +KPX Atilde Q -40 +KPX Atilde T -103 +KPX Atilde U -44 +KPX Atilde V -81 +KPX Atilde W -57 +KPX Atilde Y -104 +KPX Atilde comma -4 +KPX Atilde period -4 +KPX B A -28 +KPX B AE -29 +KPX B Aacute -28 +KPX B Acircumflex -28 +KPX B Adieresis -28 +KPX B Aring -28 +KPX B Atilde -28 +KPX B O -14 +KPX B OE -11 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -2 +KPX B V -49 +KPX B W -27 +KPX B Y -56 +KPX C A -43 +KPX C AE -44 +KPX C Aacute -43 +KPX C Adieresis -43 +KPX C Aring -43 +KPX C H -22 +KPX C K -20 +KPX C O -18 +KPX C Oacute -18 +KPX C Odieresis -18 +KPX Ccedilla A -44 +KPX D A -50 +KPX D Aacute -50 +KPX D Acircumflex -50 +KPX D Adieresis -50 +KPX D Agrave -50 +KPX D Aring -50 +KPX D Atilde -50 +KPX D J -13 +KPX D T -56 +KPX D V -54 +KPX D W -31 +KPX D X -58 +KPX D Y -74 +KPX F A -78 +KPX F Aacute -78 +KPX F Acircumflex -78 +KPX F Adieresis -78 +KPX F Agrave -78 +KPX F Aring -78 +KPX F Atilde -78 +KPX F J -59 +KPX F O -30 +KPX F Odieresis -30 +KPX F a -45 +KPX F aacute -45 +KPX F adieresis -45 +KPX F ae -41 +KPX F aring -45 +KPX F comma -113 +KPX F e -33 +KPX F eacute -33 +KPX F hyphen -20 +KPX F i -19 +KPX F j -19 +KPX F o -30 +KPX F oacute -30 +KPX F odieresis -30 +KPX F oe -33 +KPX F oslash -30 +KPX F period -113 +KPX F r -44 +KPX F u -42 +KPX G A -14 +KPX G AE -11 +KPX G Aacute -14 +KPX G Acircumflex -14 +KPX G Adieresis -14 +KPX G Agrave -14 +KPX G Aring -14 +KPX G Atilde -14 +KPX G T -53 +KPX G V -53 +KPX G W -31 +KPX G Y -72 +KPX J A -39 +KPX J AE -39 +KPX J Adieresis -39 +KPX J Aring -39 +KPX K C -56 +KPX K G -57 +KPX K O -53 +KPX K OE -49 +KPX K Oacute -53 +KPX K Odieresis -53 +KPX K S -48 +KPX K T 14 +KPX K a -23 +KPX K adieresis -23 +KPX K ae -20 +KPX K aring -23 +KPX K e -46 +KPX K hyphen -53 +KPX K o -42 +KPX K oacute -42 +KPX K odieresis -42 +KPX K u -32 +KPX K udieresis -32 +KPX K y -76 +KPX L A 8 +KPX L AE 11 +KPX L Aacute 8 +KPX L Adieresis 8 +KPX L Aring 8 +KPX L C -52 +KPX L Ccedilla -51 +KPX L G -53 +KPX L O -51 +KPX L Oacute -51 +KPX L Ocircumflex -51 +KPX L Odieresis -51 +KPX L Ograve -51 +KPX L Otilde -51 +KPX L S -28 +KPX L T -112 +KPX L U -46 +KPX L Udieresis -46 +KPX L V -115 +KPX L W -77 +KPX L Y -128 +KPX L hyphen -140 +KPX L quotedblright -145 +KPX L quoteright -153 +KPX L u -17 +KPX L udieresis -17 +KPX L y -68 +KPX N A -19 +KPX N AE -16 +KPX N Aacute -19 +KPX N Adieresis -19 +KPX N Aring -19 +KPX N C -15 +KPX N Ccedilla -14 +KPX N G -14 +KPX N O -11 +KPX N Oacute -11 +KPX N Odieresis -11 +KPX N a -17 +KPX N aacute -17 +KPX N adieresis -17 +KPX N ae -13 +KPX N aring -17 +KPX N comma -15 +KPX N e -11 +KPX N eacute -11 +KPX N o -8 +KPX N oacute -8 +KPX N odieresis -8 +KPX N oslash -4 +KPX N period -15 +KPX N u -8 +KPX N udieresis -9 +KPX O A -43 +KPX O AE -47 +KPX O Aacute -43 +KPX O Adieresis -43 +KPX O Aring -43 +KPX O T -54 +KPX O V -48 +KPX O W -25 +KPX O X -52 +KPX O Y -71 +KPX Oacute A -43 +KPX Oacute T -54 +KPX Oacute V -48 +KPX Oacute W -25 +KPX Oacute Y -71 +KPX Ocircumflex T -54 +KPX Ocircumflex V -48 +KPX Ocircumflex Y -71 +KPX Odieresis A -43 +KPX Odieresis T -54 +KPX Odieresis V -48 +KPX Odieresis W -25 +KPX Odieresis X -52 +KPX Odieresis Y -71 +KPX Ograve T -54 +KPX Ograve V -48 +KPX Ograve Y -71 +KPX Oslash A -47 +KPX Otilde T -54 +KPX Otilde V -48 +KPX Otilde Y -71 +KPX P A -86 +KPX P AE -93 +KPX P Aacute -86 +KPX P Adieresis -86 +KPX P Aring -86 +KPX P J -85 +KPX P a -39 +KPX P aacute -39 +KPX P adieresis -39 +KPX P ae -35 +KPX P aring -39 +KPX P comma -138 +KPX P e -38 +KPX P eacute -38 +KPX P hyphen -45 +KPX P o -34 +KPX P oacute -34 +KPX P odieresis -34 +KPX P oe -38 +KPX P oslash -35 +KPX P period -138 +KPX R C -21 +KPX R Ccedilla -21 +KPX R G -21 +KPX R O -17 +KPX R OE -14 +KPX R Oacute -17 +KPX R Odieresis -17 +KPX R T -33 +KPX R U -21 +KPX R Udieresis -21 +KPX R V -49 +KPX R W -27 +KPX R Y -54 +KPX R a -21 +KPX R aacute -21 +KPX R adieresis -21 +KPX R ae -17 +KPX R aring -21 +KPX R e -16 +KPX R eacute -16 +KPX R hyphen -4 +KPX R o -13 +KPX R oacute -13 +KPX R odieresis -13 +KPX R oe -16 +KPX R u -13 +KPX R uacute -14 +KPX R udieresis -14 +KPX R y -16 +KPX S A -31 +KPX S AE -31 +KPX S Aacute -31 +KPX S Adieresis -31 +KPX S Aring -31 +KPX S T -38 +KPX S V -52 +KPX S W -31 +KPX S Y -58 +KPX S t -11 +KPX T A -104 +KPX T AE -106 +KPX T Aacute -104 +KPX T Acircumflex -104 +KPX T Adieresis -104 +KPX T Agrave -104 +KPX T Aring -104 +KPX T Atilde -104 +KPX T C -53 +KPX T G -55 +KPX T J -108 +KPX T O -50 +KPX T OE -44 +KPX T Oacute -50 +KPX T Ocircumflex -50 +KPX T Odieresis -50 +KPX T Ograve -50 +KPX T Oslash -42 +KPX T Otilde -50 +KPX T S -32 +KPX T V 2 +KPX T W 7 +KPX T Y 10 +KPX T a -107 +KPX T ae -104 +KPX T c -96 +KPX T colon -152 +KPX T comma -105 +KPX T e -102 +KPX T g -94 +KPX T guillemotleft -126 +KPX T guilsinglleft -123 +KPX T hyphen -82 +KPX T i -12 +KPX T j -12 +KPX T o -99 +KPX T oslash -94 +KPX T period -105 +KPX T r -98 +KPX T s -98 +KPX T semicolon -140 +KPX T u -98 +KPX T v -106 +KPX T w -103 +KPX T y -110 +KPX U A -45 +KPX U AE -48 +KPX U Aacute -45 +KPX U Acircumflex -45 +KPX U Adieresis -45 +KPX U Aring -45 +KPX U Atilde -45 +KPX U comma -35 +KPX U m -17 +KPX U n -16 +KPX U p -8 +KPX U period -32 +KPX U r -16 +KPX Uacute A -45 +KPX Uacute comma -35 +KPX Uacute m -17 +KPX Uacute n -16 +KPX Uacute p -8 +KPX Uacute period -32 +KPX Uacute r -16 +KPX Ucircumflex A -45 +KPX Udieresis A -44 +KPX Udieresis b -8 +KPX Udieresis comma -35 +KPX Udieresis m -17 +KPX Udieresis n -16 +KPX Udieresis p -8 +KPX Udieresis period -32 +KPX Udieresis r -16 +KPX Ugrave A -45 +KPX V A -77 +KPX V AE -84 +KPX V Aacute -77 +KPX V Acircumflex -77 +KPX V Adieresis -77 +KPX V Agrave -77 +KPX V Aring -77 +KPX V Atilde -77 +KPX V C -50 +KPX V G -50 +KPX V O -46 +KPX V Oacute -46 +KPX V Ocircumflex -46 +KPX V Odieresis -46 +KPX V Ograve -46 +KPX V Oslash -34 +KPX V Otilde -46 +KPX V S -44 +KPX V T 7 +KPX V a -71 +KPX V ae -66 +KPX V colon -76 +KPX V comma -94 +KPX V e -64 +KPX V g -57 +KPX V guillemotleft -88 +KPX V guilsinglleft -84 +KPX V hyphen -44 +KPX V i -14 +KPX V o -61 +KPX V oslash -57 +KPX V period -94 +KPX V r -51 +KPX V semicolon -75 +KPX V u -52 +KPX V y -28 +KPX W A -56 +KPX W AE -62 +KPX W Aacute -56 +KPX W Acircumflex -56 +KPX W Adieresis -56 +KPX W Agrave -56 +KPX W Aring -56 +KPX W Atilde -56 +KPX W C -30 +KPX W G -30 +KPX W O -26 +KPX W Oacute -26 +KPX W Ocircumflex -26 +KPX W Odieresis -26 +KPX W Ograve -26 +KPX W Oslash -14 +KPX W Otilde -26 +KPX W S -31 +KPX W T 11 +KPX W a -46 +KPX W ae -42 +KPX W colon -62 +KPX W comma -62 +KPX W e -39 +KPX W g -32 +KPX W guillemotleft -63 +KPX W guilsinglleft -60 +KPX W hyphen -19 +KPX W i -10 +KPX W o -36 +KPX W oslash -32 +KPX W period -62 +KPX W r -36 +KPX W semicolon -62 +KPX W u -36 +KPX W y -15 +KPX X C -53 +KPX X O -50 +KPX X Odieresis -50 +KPX X Q -51 +KPX X a -27 +KPX X e -51 +KPX X hyphen -57 +KPX X o -46 +KPX X u -36 +KPX X y -67 +KPX Y A -102 +KPX Y AE -108 +KPX Y Aacute -102 +KPX Y Acircumflex -102 +KPX Y Adieresis -102 +KPX Y Agrave -102 +KPX Y Aring -102 +KPX Y Atilde -102 +KPX Y C -68 +KPX Y G -69 +KPX Y O -64 +KPX Y Oacute -64 +KPX Y Ocircumflex -64 +KPX Y Odieresis -64 +KPX Y Ograve -64 +KPX Y Oslash -55 +KPX Y Otilde -64 +KPX Y S -49 +KPX Y T 15 +KPX Y a -100 +KPX Y ae -95 +KPX Y colon -97 +KPX Y comma -117 +KPX Y e -97 +KPX Y g -89 +KPX Y guillemotleft -128 +KPX Y guilsinglleft -124 +KPX Y hyphen -89 +KPX Y i -6 +KPX Y o -93 +KPX Y oslash -89 +KPX Y p -63 +KPX Y period -117 +KPX Y semicolon -97 +KPX Y u -73 +KPX Y v -48 +KPX Z v -44 +KPX Z y -44 +KPX a j -10 +KPX a quoteright -23 +KPX a v -26 +KPX a w -16 +KPX a y -33 +KPX aacute v -26 +KPX aacute w -16 +KPX aacute y -33 +KPX adieresis v -26 +KPX adieresis w -16 +KPX adieresis y -33 +KPX ae v -26 +KPX ae w -15 +KPX ae y -32 +KPX agrave v -26 +KPX agrave w -16 +KPX agrave y -33 +KPX aring v -26 +KPX aring w -16 +KPX aring y -33 +KPX b v -21 +KPX b w -10 +KPX b y -28 +KPX c h -7 +KPX c k -1 +KPX comma one -105 +KPX comma quotedblright -47 +KPX comma quoteright -55 +KPX e quoteright -20 +KPX e t -16 +KPX e v -26 +KPX e w -16 +KPX e x -35 +KPX e y -33 +KPX eacute v -26 +KPX eacute w -16 +KPX eacute y -33 +KPX ecircumflex v -26 +KPX ecircumflex w -16 +KPX ecircumflex y -33 +KPX eight four -6 +KPX eight one -55 +KPX eight seven -43 +KPX f a -20 +KPX f aacute -20 +KPX f adieresis -20 +KPX f ae -15 +KPX f aring -20 +KPX f e -21 +KPX f eacute -21 +KPX f f 12 +KPX f i -10 +KPX f j -11 +KPX f l -12 +KPX f o -18 +KPX f oacute -18 +KPX f odieresis -18 +KPX f oe -20 +KPX f oslash -16 +KPX f quoteright -8 +KPX f s -8 +KPX f t 16 +KPX five four -7 +KPX five one -83 +KPX five seven -32 +KPX four four -3 +KPX four one -88 +KPX four seven -65 +KPX g a -17 +KPX g adieresis -17 +KPX g ae -13 +KPX g aring -17 +KPX g e -11 +KPX g eacute -11 +KPX g l -8 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r -9 +KPX guillemotright A -58 +KPX guillemotright AE -62 +KPX guillemotright Aacute -58 +KPX guillemotright Adieresis -58 +KPX guillemotright Aring -58 +KPX guillemotright T -132 +KPX guillemotright V -96 +KPX guillemotright W -68 +KPX guillemotright Y -137 +KPX guilsinglright A -52 +KPX guilsinglright AE -56 +KPX guilsinglright Aacute -52 +KPX guilsinglright Adieresis -52 +KPX guilsinglright Aring -52 +KPX guilsinglright T -126 +KPX guilsinglright V -90 +KPX guilsinglright W -62 +KPX guilsinglright Y -131 +KPX h quoteright -19 +KPX h y -31 +KPX hyphen A -12 +KPX hyphen AE -17 +KPX hyphen Aacute -12 +KPX hyphen Adieresis -12 +KPX hyphen Aring -12 +KPX hyphen T -86 +KPX hyphen V -51 +KPX hyphen W -24 +KPX hyphen Y -97 +KPX i T -16 +KPX i j -10 +KPX k a -14 +KPX k aacute -14 +KPX k adieresis -14 +KPX k ae -12 +KPX k aring -14 +KPX k comma -13 +KPX k e -33 +KPX k eacute -33 +KPX k g -26 +KPX k hyphen -49 +KPX k o -30 +KPX k oacute -30 +KPX k odieresis -30 +KPX k period -13 +KPX k s -14 +KPX k u -22 +KPX k udieresis -16 +KPX l v -11 +KPX l y -15 +KPX m p -3 +KPX m v -24 +KPX m w -14 +KPX m y -30 +KPX n T -103 +KPX n p -3 +KPX n quoteright -19 +KPX n v -24 +KPX n w -14 +KPX n y -31 +KPX nine four -12 +KPX nine one -55 +KPX nine seven -50 +KPX o T -106 +KPX o quoteright -23 +KPX o t -17 +KPX o v -27 +KPX o w -16 +KPX o x -35 +KPX o y -34 +KPX oacute v -27 +KPX oacute w -16 +KPX oacute y -34 +KPX ocircumflex t -17 +KPX odieresis t -17 +KPX odieresis v -27 +KPX odieresis w -16 +KPX odieresis x -35 +KPX odieresis y -34 +KPX ograve v -27 +KPX ograve w -16 +KPX ograve y -34 +KPX one comma -82 +KPX one eight -73 +KPX one five -72 +KPX one four -88 +KPX one nine -71 +KPX one one -125 +KPX one period -82 +KPX one seven -98 +KPX one six -71 +KPX one three -75 +KPX one two -78 +KPX one zero -71 +KPX p t -10 +KPX p y -28 +KPX period one -106 +KPX period quotedblright -48 +KPX period quoteright -56 +KPX q c -2 +KPX q u -5 +KPX quotedblbase A 21 +KPX quotedblbase AE 21 +KPX quotedblbase T -80 +KPX quotedblbase V -74 +KPX quotedblbase W -39 +KPX quotedblbase Y -96 +KPX quotedblleft A -58 +KPX quotedblleft AE -70 +KPX quotedblleft Aacute -58 +KPX quotedblleft Adieresis -58 +KPX quotedblleft Aring -58 +KPX quotedblleft T 1 +KPX quotedblleft V 10 +KPX quotedblleft W 22 +KPX quotedblleft Y -1 +KPX quotedblright A -60 +KPX quotedblright AE -72 +KPX quotedblright Aacute -60 +KPX quotedblright Adieresis -60 +KPX quotedblright Aring -60 +KPX quotedblright T 2 +KPX quotedblright V 9 +KPX quotedblright W 21 +KPX quotedblright Y -2 +KPX quoteleft A -74 +KPX quoteleft AE -86 +KPX quoteleft Aacute -74 +KPX quoteleft Adieresis -74 +KPX quoteleft Aring -74 +KPX quoteleft T -14 +KPX quoteleft V -5 +KPX quoteleft W 6 +KPX quoteleft Y -17 +KPX quoteright A -76 +KPX quoteright AE -88 +KPX quoteright Aacute -76 +KPX quoteright Adieresis -76 +KPX quoteright Aring -76 +KPX quoteright comma -68 +KPX quoteright d -25 +KPX quoteright o -31 +KPX quoteright period -68 +KPX quoteright r -24 +KPX quoteright s -23 +KPX quoteright t -14 +KPX quoteright v -10 +KPX quoteright w -5 +KPX quoteright y -14 +KPX r a -16 +KPX r aacute -16 +KPX r acircumflex -16 +KPX r adieresis -16 +KPX r ae -11 +KPX r agrave -16 +KPX r aring -16 +KPX r c -11 +KPX r ccedilla -11 +KPX r colon -31 +KPX r comma -77 +KPX r d -8 +KPX r e -17 +KPX r eacute -17 +KPX r ecircumflex -17 +KPX r egrave -17 +KPX r f 17 +KPX r g -8 +KPX r h -8 +KPX r hyphen -54 +KPX r i -6 +KPX r j -6 +KPX r k -2 +KPX r l -7 +KPX r m -9 +KPX r n -8 +KPX r o -14 +KPX r oacute -14 +KPX r ocircumflex -14 +KPX r odieresis -14 +KPX r oe -16 +KPX r ograve -14 +KPX r oslash -14 +KPX r p 0 +KPX r period -77 +KPX r q -10 +KPX r quoteright -6 +KPX r r -8 +KPX r s -4 +KPX r semicolon -30 +KPX r t 21 +KPX r u -7 +KPX r v 18 +KPX r w 21 +KPX r x 9 +KPX r y 15 +KPX r z 0 +KPX s quoteright -24 +KPX s t -15 +KPX seven colon -84 +KPX seven comma -123 +KPX seven eight -34 +KPX seven five -37 +KPX seven four -95 +KPX seven one -58 +KPX seven period -123 +KPX seven seven -11 +KPX seven six -44 +KPX seven three -29 +KPX seven two -31 +KPX six four -7 +KPX six one -52 +KPX six seven -40 +KPX t S -17 +KPX t a -10 +KPX t aacute -10 +KPX t adieresis -10 +KPX t ae -7 +KPX t aring -10 +KPX t colon -37 +KPX t e -22 +KPX t eacute -22 +KPX t h -14 +KPX t o -19 +KPX t oacute -19 +KPX t odieresis -19 +KPX t quoteright -7 +KPX t semicolon -36 +KPX three four -9 +KPX three one -57 +KPX three seven -45 +KPX two four -43 +KPX two one -45 +KPX two seven -38 +KPX u quoteright -14 +KPX v a -30 +KPX v aacute -30 +KPX v acircumflex -30 +KPX v adieresis -30 +KPX v ae -25 +KPX v agrave -30 +KPX v aring -30 +KPX v atilde -30 +KPX v c -22 +KPX v colon -32 +KPX v comma -76 +KPX v e -29 +KPX v eacute -29 +KPX v ecircumflex -29 +KPX v egrave -29 +KPX v g -20 +KPX v hyphen -19 +KPX v l -8 +KPX v o -25 +KPX v oacute -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v oslash -25 +KPX v period -76 +KPX v s -17 +KPX v semicolon -31 +KPX w a -26 +KPX w aacute -26 +KPX w acircumflex -26 +KPX w adieresis -26 +KPX w ae -22 +KPX w agrave -26 +KPX w aring -26 +KPX w atilde -26 +KPX w c -14 +KPX w colon -32 +KPX w comma -57 +KPX w e -20 +KPX w eacute -20 +KPX w ecircumflex -20 +KPX w egrave -20 +KPX w g -13 +KPX w hyphen -8 +KPX w l -8 +KPX w o -17 +KPX w oacute -17 +KPX w odieresis -17 +KPX w ograve -17 +KPX w oslash -14 +KPX w period -57 +KPX w s -14 +KPX w semicolon -31 +KPX x a -30 +KPX x c -30 +KPX x e -36 +KPX x eacute -36 +KPX x o -33 +KPX x q -28 +KPX y a -36 +KPX y aacute -36 +KPX y acircumflex -36 +KPX y adieresis -36 +KPX y ae -31 +KPX y agrave -36 +KPX y aring -36 +KPX y atilde -36 +KPX y c -28 +KPX y colon -40 +KPX y comma -80 +KPX y e -35 +KPX y eacute -35 +KPX y ecircumflex -35 +KPX y egrave -35 +KPX y g -26 +KPX y hyphen -24 +KPX y l -14 +KPX y o -31 +KPX y oacute -31 +KPX y odieresis -31 +KPX y ograve -31 +KPX y oslash -30 +KPX y period -80 +KPX y s -23 +KPX y semicolon -40 +KPX zero four -11 +KPX zero one -56 +KPX zero seven -50 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n019023l.pfb b/PdfReader/Resources/Fonts/n019023l.pfb new file mode 100644 index 0000000000..5058a38567 Binary files /dev/null and b/PdfReader/Resources/Fonts/n019023l.pfb differ diff --git a/PdfReader/Resources/Fonts/n019024l.afm b/PdfReader/Resources/Fonts/n019024l.afm new file mode 100644 index 0000000000..9433a322e2 --- /dev/null +++ b/PdfReader/Resources/Fonts/n019024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusSanL-BoldItal +FullName Nimbus Sans L Bold Italic +FamilyName Nimbus Sans L +Weight Bold +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -111 +UnderlineThickness 69 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -177 -309 1107 953 +CapHeight 729 +XHeight 540 +Descender -217 +Ascender 729 +StartCharMetrics 316 +C 32 ; WX 278 ; N space ; B 245 0 245 0 ; +C 33 ; WX 333 ; N exclam ; B 112 0 417 726 ; +C 34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ; +C 35 ; WX 556 ; N numbersign ; B 33 -32 660 697 ; +C 36 ; WX 556 ; N dollar ; B 59 -126 628 763 ; +C 37 ; WX 889 ; N percent ; B 129 -20 903 709 ; +C 38 ; WX 722 ; N ampersand ; B 89 -23 720 723 ; +C 39 ; WX 278 ; N quoteright ; B 165 469 356 729 ; +C 40 ; WX 333 ; N parenleft ; B 84 -200 458 729 ; +C 41 ; WX 333 ; N parenright ; B -21 -200 356 729 ; +C 42 ; WX 389 ; N asterisk ; B 145 407 478 729 ; +C 43 ; WX 584 ; N plus ; B 87 -10 596 473 ; +C 44 ; WX 278 ; N comma ; B 27 -174 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 70 207 371 342 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -1 -14 427 714 ; +C 48 ; WX 556 ; N zero ; B 81 -23 614 724 ; +C 49 ; WX 556 ; N one ; B 172 0 529 709 ; +C 50 ; WX 556 ; N two ; B 30 0 628 724 ; +C 51 ; WX 556 ; N three ; B 67 -23 613 724 ; +C 52 ; WX 556 ; N four ; B 57 0 599 709 ; +C 53 ; WX 556 ; N five ; B 59 -23 641 709 ; +C 54 ; WX 556 ; N six ; B 85 -23 625 724 ; +C 55 ; WX 556 ; N seven ; B 131 0 679 709 ; +C 56 ; WX 556 ; N eight ; B 60 -23 620 724 ; +C 57 ; WX 556 ; N nine ; B 68 -23 611 724 ; +C 58 ; WX 333 ; N colon ; B 113 0 374 520 ; +C 59 ; WX 333 ; N semicolon ; B 76 -174 374 520 ; +C 60 ; WX 584 ; N less ; B 77 -10 630 474 ; +C 61 ; WX 584 ; N equal ; B 61 52 622 412 ; +C 62 ; WX 584 ; N greater ; B 38 -10 591 474 ; +C 63 ; WX 611 ; N question ; B 168 0 672 744 ; +C 64 ; WX 975 ; N at ; B 73 -137 1032 745 ; +C 65 ; WX 722 ; N A ; B 26 0 703 729 ; +C 66 ; WX 722 ; N B ; B 82 0 762 729 ; +C 67 ; WX 722 ; N C ; B 107 -23 793 741 ; +C 68 ; WX 722 ; N D ; B 77 0 776 729 ; +C 69 ; WX 667 ; N E ; B 79 0 762 729 ; +C 70 ; WX 611 ; N F ; B 74 0 741 729 ; +C 71 ; WX 778 ; N G ; B 107 -23 819 741 ; +C 72 ; WX 722 ; N H ; B 68 0 812 729 ; +C 73 ; WX 278 ; N I ; B 63 0 368 729 ; +C 74 ; WX 556 ; N J ; B 59 -23 641 729 ; +C 75 ; WX 722 ; N K ; B 74 0 843 729 ; +C 76 ; WX 611 ; N L ; B 80 0 606 729 ; +C 77 ; WX 833 ; N M ; B 66 0 931 729 ; +C 78 ; WX 722 ; N N ; B 68 0 816 729 ; +C 79 ; WX 778 ; N O ; B 106 -23 828 741 ; +C 80 ; WX 667 ; N P ; B 76 0 747 729 ; +C 81 ; WX 778 ; N Q ; B 109 -54 831 741 ; +C 82 ; WX 722 ; N R ; B 80 0 785 729 ; +C 83 ; WX 667 ; N S ; B 76 -23 725 741 ; +C 84 ; WX 611 ; N T ; B 142 0 753 729 ; +C 85 ; WX 722 ; N U ; B 119 -23 809 729 ; +C 86 ; WX 667 ; N V ; B 179 0 802 729 ; +C 87 ; WX 944 ; N W ; B 168 0 1087 729 ; +C 88 ; WX 667 ; N X ; B 22 0 802 729 ; +C 89 ; WX 667 ; N Y ; B 182 0 805 729 ; +C 90 ; WX 611 ; N Z ; B 30 0 733 729 ; +C 91 ; WX 333 ; N bracketleft ; B 23 -200 463 729 ; +C 92 ; WX 278 ; N backslash ; B 138 -23 285 709 ; +C 93 ; WX 333 ; N bracketright ; B -25 -200 415 729 ; +C 94 ; WX 584 ; N asciicircum ; B 119 270 580 695 ; +C 95 ; WX 556 ; N underscore ; B -65 -145 550 -76 ; +C 96 ; WX 278 ; N quoteleft ; B 167 469 357 729 ; +C 97 ; WX 556 ; N a ; B 50 -23 578 549 ; +C 98 ; WX 611 ; N b ; B 59 -23 640 729 ; +C 99 ; WX 556 ; N c ; B 77 -23 597 549 ; +C 100 ; WX 611 ; N d ; B 79 -23 700 729 ; +C 101 ; WX 556 ; N e ; B 64 -23 591 549 ; +C 102 ; WX 333 ; N f ; B 90 0 464 729 ; +C 103 ; WX 611 ; N g ; B 26 -218 656 549 ; +C 104 ; WX 611 ; N h ; B 67 0 629 729 ; +C 105 ; WX 278 ; N i ; B 67 0 362 729 ; +C 106 ; WX 278 ; N j ; B -43 -218 365 729 ; +C 107 ; WX 556 ; N k ; B 59 0 651 729 ; +C 108 ; WX 278 ; N l ; B 67 0 362 729 ; +C 109 ; WX 889 ; N m ; B 60 0 911 549 ; +C 110 ; WX 611 ; N n ; B 63 0 629 549 ; +C 111 ; WX 611 ; N o ; B 82 -23 634 549 ; +C 112 ; WX 611 ; N p ; B 11 -218 637 549 ; +C 113 ; WX 611 ; N q ; B 72 -218 659 549 ; +C 114 ; WX 389 ; N r ; B 63 0 487 549 ; +C 115 ; WX 556 ; N s ; B 60 -23 589 549 ; +C 116 ; WX 333 ; N t ; B 101 -23 414 674 ; +C 117 ; WX 611 ; N u ; B 88 -23 656 540 ; +C 118 ; WX 556 ; N v ; B 129 0 651 540 ; +C 119 ; WX 778 ; N w ; B 120 0 881 540 ; +C 120 ; WX 556 ; N x ; B 16 0 648 540 ; +C 121 ; WX 556 ; N y ; B 37 -219 653 540 ; +C 122 ; WX 500 ; N z ; B 21 0 575 540 ; +C 123 ; WX 389 ; N braceleft ; B 84 -200 472 729 ; +C 124 ; WX 280 ; N bar ; B 57 -200 335 729 ; +C 125 ; WX 389 ; N braceright ; B 29 -200 419 729 ; +C 126 ; WX 584 ; N asciitilde ; B 97 142 581 314 ; +C 161 ; WX 333 ; N exclamdown ; B 26 -186 331 540 ; +C 162 ; WX 556 ; N cent ; B 79 -124 598 634 ; +C 163 ; WX 556 ; N sterling ; B 49 -23 629 715 ; +C 164 ; WX 167 ; N fraction ; B -177 -20 489 715 ; +C 165 ; WX 556 ; N yen ; B 107 0 702 704 ; +C 166 ; WX 556 ; N florin ; B -21 -220 690 744 ; +C 167 ; WX 556 ; N section ; B 56 -201 596 723 ; +C 168 ; WX 556 ; N currency ; B 66 100 644 604 ; +C 169 ; WX 238 ; N quotesingle ; B 177 470 343 729 ; +C 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ; +C 171 ; WX 556 ; N guillemotleft ; B 135 72 571 481 ; +C 172 ; WX 333 ; N guilsinglleft ; B 128 72 351 481 ; +C 173 ; WX 333 ; N guilsinglright ; B 96 72 319 481 ; +C 174 ; WX 611 ; N fi ; B 85 0 703 729 ; +C 175 ; WX 611 ; N fl ; B 88 0 701 729 ; +C 177 ; WX 556 ; N endash ; B 35 207 624 311 ; +C 178 ; WX 556 ; N dagger ; B 109 -194 626 709 ; +C 179 ; WX 556 ; N daggerdbl ; B 35 -194 623 709 ; +C 180 ; WX 278 ; N periodcentered ; B 143 182 270 282 ; +C 182 ; WX 556 ; N paragraph ; B 121 -191 684 729 ; +C 183 ; WX 350 ; N bullet ; B 111 175 367 425 ; +C 184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ; +C 185 ; WX 500 ; N quotedblbase ; B 37 -135 462 125 ; +C 186 ; WX 500 ; N quotedblright ; B 173 469 595 729 ; +C 187 ; WX 556 ; N guillemotright ; B 103 72 533 481 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 189 ; WX 1000 ; N perthousand ; B 72 -21 1021 739 ; +C 191 ; WX 611 ; N questiondown ; B 52 -204 556 540 ; +C 193 ; WX 333 ; N grave ; B 175 607 339 757 ; +C 194 ; WX 333 ; N acute ; B 247 607 475 757 ; +C 195 ; WX 333 ; N circumflex ; B 135 610 453 757 ; +C 196 ; WX 333 ; N tilde ; B 117 622 500 744 ; +C 197 ; WX 333 ; N macron ; B 150 642 467 722 ; +C 198 ; WX 333 ; N breve ; B 188 611 455 754 ; +C 199 ; WX 333 ; N dotaccent ; B 241 621 377 741 ; +C 200 ; WX 333 ; N dieresis ; B 147 621 469 741 ; +C 202 ; WX 333 ; N ring ; B 214 593 398 773 ; +C 203 ; WX 333 ; N cedilla ; B -13 -220 270 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 82 610 498 757 ; +C 206 ; WX 333 ; N ogonek ; B 23 -233 248 0 ; +C 207 ; WX 333 ; N caron ; B 167 610 485 757 ; +C 208 ; WX 1000 ; N emdash ; B 37 207 1070 311 ; +C 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ; +C 227 ; WX 370 ; N ordfeminine ; B 96 262 451 729 ; +C 232 ; WX 611 ; N Lslash ; B 54 0 624 729 ; +C 233 ; WX 778 ; N Oslash ; B 34 -39 906 749 ; +C 234 ; WX 1000 ; N OE ; B 90 -23 1107 741 ; +C 235 ; WX 365 ; N ordmasculine ; B 92 262 471 729 ; +C 241 ; WX 889 ; N ae ; B 54 -23 927 549 ; +C 245 ; WX 278 ; N dotlessi ; B 67 0 322 540 ; +C 248 ; WX 278 ; N lslash ; B 50 0 372 729 ; +C 249 ; WX 611 ; N oslash ; B 12 -38 709 557 ; +C 250 ; WX 944 ; N oe ; B 71 -23 986 549 ; +C 251 ; WX 611 ; N germandbls ; B 67 -23 654 729 ; +C -1 ; WX 722 ; N Udieresis ; B 119 -23 809 920 ; +C -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Scedilla ; B 76 -220 725 741 ; +C -1 ; WX 611 ; N Tcaron ; B 142 0 753 936 ; +C -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ; +C -1 ; WX 722 ; N Rcaron ; B 80 0 785 936 ; +C -1 ; WX 722 ; N Racute ; B 80 0 785 936 ; +C -1 ; WX 667 ; N Sacute ; B 76 -23 725 936 ; +C -1 ; WX 778 ; N Otilde ; B 106 -23 828 923 ; +C -1 ; WX 611 ; N ucircumflex ; B 88 -23 656 757 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 106 -23 841 936 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Yacute ; B 182 0 805 936 ; +C -1 ; WX 722 ; N Eth ; B 73 0 776 729 ; +C -1 ; WX 722 ; N Dcroat ; B 73 0 776 729 ; +C -1 ; WX 611 ; N Zacute ; B 30 0 733 936 ; +C -1 ; WX 722 ; N Uring ; B 119 -23 809 953 ; +C -1 ; WX 611 ; N gbreve ; B 26 -218 656 754 ; +C -1 ; WX 556 ; N eogonek ; B 64 -233 591 549 ; +C -1 ; WX 556 ; N edotaccent ; B 64 -23 591 741 ; +C -1 ; WX 556 ; N ecaron ; B 64 -23 593 757 ; +C -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 721 729 ; +C -1 ; WX 556 ; N eacute ; B 64 -23 591 757 ; +C -1 ; WX 556 ; N edieresis ; B 64 -23 591 741 ; +C -1 ; WX 722 ; N dcaron ; B 79 -23 882 729 ; +C -1 ; WX 556 ; N ccedilla ; B 77 -220 597 549 ; +C -1 ; WX 556 ; N ccaron ; B 77 -23 607 757 ; +C -1 ; WX 556 ; N cacute ; B 77 -23 597 757 ; +C -1 ; WX 556 ; N aogonek ; B 50 -233 578 549 ; +C -1 ; WX 556 ; N aring ; B 50 -23 578 773 ; +C -1 ; WX 556 ; N atilde ; B 50 -23 612 744 ; +C -1 ; WX 556 ; N abreve ; B 50 -23 578 754 ; +C -1 ; WX 556 ; N egrave ; B 64 -23 591 757 ; +C -1 ; WX 556 ; N agrave ; B 50 -23 578 757 ; +C -1 ; WX 556 ; N aacute ; B 50 -23 587 757 ; +C -1 ; WX 556 ; N adieresis ; B 50 -23 581 741 ; +C -1 ; WX 722 ; N Uogonek ; B 119 -233 809 729 ; +C -1 ; WX 611 ; N ugrave ; B 88 -23 656 757 ; +C -1 ; WX 611 ; N uacute ; B 88 -23 656 757 ; +C -1 ; WX 611 ; N udieresis ; B 88 -23 656 741 ; +C -1 ; WX 404 ; N tcaron ; B 101 -23 578 829 ; +C -1 ; WX 556 ; N scommaaccent ; B 60 -307 589 549 ; +C -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ; +C -1 ; WX 556 ; N ecircumflex ; B 64 -23 591 757 ; +C -1 ; WX 722 ; N Ucircumflex ; B 119 -23 809 936 ; +C -1 ; WX 556 ; N acircumflex ; B 50 -23 578 757 ; +C -1 ; WX 611 ; N Zdotaccent ; B 30 0 733 918 ; +C -1 ; WX 556 ; N scaron ; B 60 -23 597 757 ; +C -1 ; WX 722 ; N Amacron ; B 26 0 706 901 ; +C -1 ; WX 556 ; N sacute ; B 60 -23 589 757 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 142 -307 753 729 ; +C -1 ; WX 667 ; N Ydieresis ; B 182 0 805 920 ; +C -1 ; WX 611 ; N thorn ; B 11 -218 637 729 ; +C -1 ; WX 667 ; N Emacron ; B 79 0 762 901 ; +C -1 ; WX 778 ; N Ograve ; B 106 -23 828 936 ; +C -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ; +C -1 ; WX 778 ; N Odieresis ; B 106 -23 828 920 ; +C -1 ; WX 722 ; N Ntilde ; B 68 0 816 923 ; +C -1 ; WX 722 ; N Ncaron ; B 68 0 816 936 ; +C -1 ; WX 722 ; N Nacute ; B 68 0 816 936 ; +C -1 ; WX 611 ; N Lcaron ; B 80 0 607 729 ; +C -1 ; WX 611 ; N Lacute ; B 80 0 606 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 63 0 388 918 ; +C -1 ; WX 389 ; N racute ; B 63 0 500 757 ; +C -1 ; WX 278 ; N Icircumflex ; B 63 0 467 936 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -23 710 757 ; +C -1 ; WX 611 ; N otilde ; B 82 -23 639 744 ; +C -1 ; WX 556 ; N Euro ; B 21 -23 648 724 ; +C -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 757 ; +C -1 ; WX 444 ; N onesuperior ; B 210 284 438 709 ; +C -1 ; WX 444 ; N twosuperior ; B 124 284 499 718 ; +C -1 ; WX 444 ; N threesuperior ; B 147 271 490 718 ; +C -1 ; WX 278 ; N Igrave ; B 63 0 368 936 ; +C -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ; +C -1 ; WX 278 ; N Imacron ; B 63 0 466 901 ; +C -1 ; WX 278 ; N Iogonek ; B 7 -233 368 729 ; +C -1 ; WX 278 ; N Idieresis ; B 63 0 483 920 ; +C -1 ; WX 778 ; N Gbreve ; B 107 -23 819 934 ; +C -1 ; WX 722 ; N Umacron ; B 119 -23 809 901 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 843 729 ; +C -1 ; WX 611 ; N ograve ; B 82 -23 634 757 ; +C -1 ; WX 667 ; N Scommaaccent ; B 76 -307 725 741 ; +C -1 ; WX 667 ; N Eogonek ; B 79 -233 762 729 ; +C -1 ; WX 611 ; N oacute ; B 82 -23 634 757 ; +C -1 ; WX 667 ; N Edotaccent ; B 79 0 762 918 ; +C -1 ; WX 268 ; N iogonek ; B 0 -233 351 729 ; +C -1 ; WX 611 ; N gcommaaccent ; B 26 -218 656 854 ; +C -1 ; WX 611 ; N odieresis ; B 82 -23 634 741 ; +C -1 ; WX 611 ; N ntilde ; B 63 0 646 744 ; +C -1 ; WX 611 ; N ncaron ; B 63 0 629 757 ; +C -1 ; WX 667 ; N Ecaron ; B 79 0 762 936 ; +C -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ; +C -1 ; WX 556 ; N scedilla ; B 60 -220 589 549 ; +C -1 ; WX 389 ; N rcaron ; B 63 0 533 757 ; +C -1 ; WX 667 ; N Egrave ; B 79 0 762 936 ; +C -1 ; WX 667 ; N Eacute ; B 79 0 762 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 107 -307 819 741 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 785 729 ; +C -1 ; WX 667 ; N Edieresis ; B 79 0 762 920 ; +C -1 ; WX 611 ; N nacute ; B 63 0 629 757 ; +C -1 ; WX 611 ; N uogonek ; B 88 -233 656 540 ; +C -1 ; WX 611 ; N umacron ; B 88 -23 656 722 ; +C -1 ; WX 722 ; N Dcaron ; B 77 0 776 936 ; +C -1 ; WX 384 ; N lcaron ; B 67 0 544 729 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -23 793 936 ; +C -1 ; WX 722 ; N Cacute ; B 107 -23 793 936 ; +C -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ; +C -1 ; WX 606 ; N degree ; B 240 383 543 686 ; +C -1 ; WX 722 ; N Aogonek ; B 26 -233 703 729 ; +C -1 ; WX 584 ; N minus ; B 77 172 606 292 ; +C -1 ; WX 584 ; N multiply ; B 102 18 582 444 ; +C -1 ; WX 584 ; N divide ; B 77 0 606 462 ; +C -1 ; WX 722 ; N Aring ; B 26 0 703 953 ; +C -1 ; WX 1000 ; N trademark ; B 213 273 1087 729 ; +C -1 ; WX 389 ; N rcommaaccent ; B 8 -307 487 549 ; +C -1 ; WX 278 ; N lacute ; B 67 0 474 936 ; +C -1 ; WX 611 ; N omacron ; B 82 -23 634 722 ; +C -1 ; WX 722 ; N Atilde ; B 26 0 739 923 ; +C -1 ; WX 278 ; N icircumflex ; B 67 0 426 757 ; +C -1 ; WX 278 ; N igrave ; B 67 0 322 757 ; +C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 629 549 ; +C -1 ; WX 278 ; N lcommaaccent ; B 11 -307 362 729 ; +C -1 ; WX 584 ; N plusminus ; B 50 0 630 633 ; +C -1 ; WX 1055 ; N onehalf ; B 210 -20 1050 715 ; +C -1 ; WX 1055 ; N onequarter ; B 210 -20 1032 715 ; +C -1 ; WX 1055 ; N threequarters ; B 147 -20 1032 718 ; +C -1 ; WX 278 ; N iacute ; B 67 0 448 757 ; +C -1 ; WX 722 ; N Abreve ; B 26 0 703 934 ; +C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 651 729 ; +C -1 ; WX 778 ; N Omacron ; B 106 -23 828 901 ; +C -1 ; WX 278 ; N imacron ; B 67 0 424 722 ; +C -1 ; WX 556 ; N emacron ; B 64 -23 591 722 ; +C -1 ; WX 556 ; N amacron ; B 50 -23 579 722 ; +C -1 ; WX 333 ; N tcommaaccent ; B 62 -307 414 674 ; +C -1 ; WX 556 ; N ydieresis ; B 37 -219 653 741 ; +C -1 ; WX 500 ; N zdotaccent ; B 21 0 575 741 ; +C -1 ; WX 500 ; N zcaron ; B 21 0 575 757 ; +C -1 ; WX 500 ; N zacute ; B 21 0 575 757 ; +C -1 ; WX 556 ; N yacute ; B 37 -219 653 757 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 88 -23 697 757 ; +C -1 ; WX 611 ; N eth ; B 83 -23 633 744 ; +C -1 ; WX 611 ; N uring ; B 88 -23 656 773 ; +C -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ; +C -1 ; WX 333 ; N commaaccent ; B 43 -307 217 -60 ; +C -1 ; WX 737 ; N copyright ; B 54 -22 837 743 ; +C -1 ; WX 737 ; N registered ; B 55 -22 837 743 ; +C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; +C -1 ; WX 278 ; N idieresis ; B 67 0 442 741 ; +C -1 ; WX 489 ; N lozenge ; B 95 0 541 744 ; +C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; +C -1 ; WX 584 ; N notequal ; B 61 -74 622 544 ; +C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; +C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; +C -1 ; WX 722 ; N Aacute ; B 26 0 714 936 ; +C -1 ; WX 584 ; N lessequal ; B 35 0 657 624 ; +C -1 ; WX 584 ; N greaterequal ; B 44 0 627 624 ; +C -1 ; WX 584 ; N logicalnot ; B 103 86 632 376 ; +C -1 ; WX 711 ; N summation ; B -18 -97 760 760 ; +C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 816 729 ; +C -1 ; WX 611 ; N dcroat ; B 79 -23 746 729 ; +C -1 ; WX 280 ; N brokenbar ; B 57 -200 335 729 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 80 -309 606 729 ; +C -1 ; WX 722 ; N Adieresis ; B 26 0 708 920 ; +C -1 ; WX 611 ; N mu ; B 11 -220 655 540 ; +C -1 ; WX 278 ; N .notdef ; B 245 0 245 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -36 +KPX A Ccedilla -36 +KPX A G -38 +KPX A O -37 +KPX A Odieresis -37 +KPX A Q -39 +KPX A T -91 +KPX A U -37 +KPX A Uacute -37 +KPX A Ucircumflex -37 +KPX A Udieresis -37 +KPX A Ugrave -37 +KPX A V -74 +KPX A W -57 +KPX A Y -96 +KPX A a -11 +KPX A b -10 +KPX A c -17 +KPX A ccedilla -17 +KPX A comma 9 +KPX A d -17 +KPX A e -10 +KPX A g -20 +KPX A guillemotleft -48 +KPX A guilsinglleft -44 +KPX A hyphen 2 +KPX A o -19 +KPX A period 13 +KPX A q -13 +KPX A quotedblright -71 +KPX A quoteright -67 +KPX A t -21 +KPX A u -17 +KPX A v -42 +KPX A w -28 +KPX A y -41 +KPX Aacute C -37 +KPX Aacute G -38 +KPX Aacute O -38 +KPX Aacute Q -40 +KPX Aacute T -91 +KPX Aacute U -38 +KPX Aacute V -74 +KPX Aacute W -57 +KPX Aacute Y -96 +KPX Aacute a -11 +KPX Aacute b -10 +KPX Aacute c -17 +KPX Aacute comma 9 +KPX Aacute d -17 +KPX Aacute e -11 +KPX Aacute g -20 +KPX Aacute guillemotleft -48 +KPX Aacute guilsinglleft -45 +KPX Aacute hyphen 2 +KPX Aacute o -20 +KPX Aacute period 12 +KPX Aacute q -14 +KPX Aacute quoteright -67 +KPX Aacute t -22 +KPX Aacute u -18 +KPX Aacute v -42 +KPX Aacute w -29 +KPX Aacute y -41 +KPX Acircumflex C -36 +KPX Acircumflex G -38 +KPX Acircumflex O -37 +KPX Acircumflex Q -39 +KPX Acircumflex T -91 +KPX Acircumflex U -37 +KPX Acircumflex V -74 +KPX Acircumflex W -57 +KPX Acircumflex Y -96 +KPX Acircumflex comma 9 +KPX Acircumflex period 13 +KPX Adieresis C -37 +KPX Adieresis G -38 +KPX Adieresis O -38 +KPX Adieresis Q -39 +KPX Adieresis T -91 +KPX Adieresis U -38 +KPX Adieresis V -74 +KPX Adieresis W -57 +KPX Adieresis Y -96 +KPX Adieresis a -11 +KPX Adieresis b -10 +KPX Adieresis c -17 +KPX Adieresis comma 9 +KPX Adieresis d -17 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -48 +KPX Adieresis guilsinglleft -44 +KPX Adieresis hyphen 2 +KPX Adieresis o -20 +KPX Adieresis period 12 +KPX Adieresis q -13 +KPX Adieresis quotedblright -71 +KPX Adieresis quoteright -67 +KPX Adieresis t -22 +KPX Adieresis u -17 +KPX Adieresis v -42 +KPX Adieresis w -28 +KPX Adieresis y -41 +KPX Agrave C -36 +KPX Agrave G -38 +KPX Agrave O -37 +KPX Agrave Q -39 +KPX Agrave T -91 +KPX Agrave U -37 +KPX Agrave V -74 +KPX Agrave W -57 +KPX Agrave Y -96 +KPX Agrave comma 9 +KPX Agrave period 13 +KPX Aring C -36 +KPX Aring G -38 +KPX Aring O -37 +KPX Aring Q -39 +KPX Aring T -91 +KPX Aring U -37 +KPX Aring V -74 +KPX Aring W -57 +KPX Aring Y -96 +KPX Aring a -11 +KPX Aring b -10 +KPX Aring c -17 +KPX Aring comma 9 +KPX Aring d -17 +KPX Aring e -10 +KPX Aring g -20 +KPX Aring guillemotleft -48 +KPX Aring guilsinglleft -44 +KPX Aring hyphen 2 +KPX Aring o -19 +KPX Aring period 13 +KPX Aring q -13 +KPX Aring quotedblright -71 +KPX Aring quoteright -67 +KPX Aring t -21 +KPX Aring u -17 +KPX Aring v -42 +KPX Aring w -28 +KPX Aring y -41 +KPX Atilde C -38 +KPX Atilde G -40 +KPX Atilde O -39 +KPX Atilde Q -41 +KPX Atilde T -92 +KPX Atilde U -39 +KPX Atilde V -74 +KPX Atilde W -57 +KPX Atilde Y -96 +KPX Atilde comma 9 +KPX Atilde period 11 +KPX B A -41 +KPX B AE -30 +KPX B Aacute -41 +KPX B Acircumflex -41 +KPX B Adieresis -41 +KPX B Aring -41 +KPX B Atilde -41 +KPX B O -18 +KPX B OE -9 +KPX B Oacute -18 +KPX B Ocircumflex -18 +KPX B Odieresis -18 +KPX B Ograve -18 +KPX B Oslash -17 +KPX B V -46 +KPX B W -30 +KPX B Y -63 +KPX C A -34 +KPX C AE -23 +KPX C Aacute -34 +KPX C Adieresis -34 +KPX C Aring -34 +KPX C H -1 +KPX C K -4 +KPX C O -12 +KPX C Oacute -12 +KPX C Odieresis -12 +KPX Ccedilla A -34 +KPX D A -40 +KPX D Aacute -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D J -4 +KPX D T -24 +KPX D V -37 +KPX D W -20 +KPX D X -40 +KPX D Y -62 +KPX F A -68 +KPX F Aacute -68 +KPX F Acircumflex -68 +KPX F Adieresis -68 +KPX F Agrave -68 +KPX F Aring -68 +KPX F Atilde -68 +KPX F J -33 +KPX F O -24 +KPX F Odieresis -24 +KPX F a -23 +KPX F aacute -23 +KPX F adieresis -23 +KPX F ae -26 +KPX F aring -23 +KPX F comma -84 +KPX F e -12 +KPX F eacute -12 +KPX F hyphen 4 +KPX F i -15 +KPX F j -17 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -16 +KPX F oslash -24 +KPX F period -82 +KPX F r -35 +KPX F u -32 +KPX G A -17 +KPX G AE -5 +KPX G Aacute -17 +KPX G Acircumflex -17 +KPX G Adieresis -17 +KPX G Agrave -17 +KPX G Aring -17 +KPX G Atilde -17 +KPX G T -28 +KPX G V -41 +KPX G W -25 +KPX G Y -65 +KPX J A -38 +KPX J AE -29 +KPX J Adieresis -38 +KPX J Aring -38 +KPX K C -59 +KPX K G -61 +KPX K O -60 +KPX K OE -51 +KPX K Oacute -60 +KPX K Odieresis -60 +KPX K S -45 +KPX K T 5 +KPX K a -17 +KPX K adieresis -17 +KPX K ae -17 +KPX K aring -17 +KPX K e -38 +KPX K hyphen -52 +KPX K o -45 +KPX K oacute -45 +KPX K odieresis -45 +KPX K u -35 +KPX K udieresis -35 +KPX K y -74 +KPX L A 0 +KPX L AE 12 +KPX L Aacute 0 +KPX L Adieresis 0 +KPX L Aring 0 +KPX L C -35 +KPX L Ccedilla -36 +KPX L G -40 +KPX L O -39 +KPX L Oacute -39 +KPX L Ocircumflex -39 +KPX L Odieresis -39 +KPX L Ograve -39 +KPX L Otilde -39 +KPX L S -14 +KPX L T -104 +KPX L U -35 +KPX L Udieresis -35 +KPX L V -102 +KPX L W -79 +KPX L Y -121 +KPX L hyphen -20 +KPX L quotedblright -147 +KPX L quoteright -143 +KPX L u -17 +KPX L udieresis -17 +KPX L y -64 +KPX N A -15 +KPX N AE -2 +KPX N Aacute -15 +KPX N Adieresis -15 +KPX N Aring -15 +KPX N C -1 +KPX N Ccedilla -1 +KPX N G -2 +KPX N O -2 +KPX N Oacute -2 +KPX N Odieresis -2 +KPX N a 5 +KPX N aacute 5 +KPX N adieresis 5 +KPX N ae 4 +KPX N aring 5 +KPX N comma 7 +KPX N e 10 +KPX N eacute 10 +KPX N o 1 +KPX N oacute 1 +KPX N odieresis 1 +KPX N oslash 2 +KPX N period 8 +KPX N u 4 +KPX N udieresis 4 +KPX O A -42 +KPX O AE -33 +KPX O Aacute -42 +KPX O Adieresis -42 +KPX O Aring -42 +KPX O T -32 +KPX O V -40 +KPX O W -24 +KPX O X -43 +KPX O Y -65 +KPX Oacute A -42 +KPX Oacute T -32 +KPX Oacute V -40 +KPX Oacute W -24 +KPX Oacute Y -65 +KPX Ocircumflex T -32 +KPX Ocircumflex V -40 +KPX Ocircumflex Y -65 +KPX Odieresis A -42 +KPX Odieresis T -32 +KPX Odieresis V -40 +KPX Odieresis W -24 +KPX Odieresis X -43 +KPX Odieresis Y -65 +KPX Ograve T -32 +KPX Ograve V -40 +KPX Ograve Y -65 +KPX Oslash A -34 +KPX Otilde T -32 +KPX Otilde V -40 +KPX Otilde Y -65 +KPX P A -71 +KPX P AE -62 +KPX P Aacute -71 +KPX P Adieresis -71 +KPX P Aring -71 +KPX P J -52 +KPX P a -14 +KPX P aacute -14 +KPX P adieresis -14 +KPX P ae -15 +KPX P aring -14 +KPX P comma -103 +KPX P e -13 +KPX P eacute -13 +KPX P hyphen -7 +KPX P o -22 +KPX P oacute -22 +KPX P odieresis -22 +KPX P oe -17 +KPX P oslash -26 +KPX P period -101 +KPX R C -12 +KPX R Ccedilla -12 +KPX R G -13 +KPX R O -13 +KPX R OE -3 +KPX R Oacute -13 +KPX R Odieresis -13 +KPX R T -12 +KPX R U -12 +KPX R Udieresis -12 +KPX R V -38 +KPX R W -22 +KPX R Y -50 +KPX R a -4 +KPX R aacute -4 +KPX R adieresis -4 +KPX R ae -5 +KPX R aring -4 +KPX R e 0 +KPX R eacute 0 +KPX R hyphen 10 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe -4 +KPX R u -6 +KPX R uacute -6 +KPX R udieresis -6 +KPX R y -4 +KPX S A -26 +KPX S AE -14 +KPX S Aacute -26 +KPX S Adieresis -26 +KPX S Aring -26 +KPX S T -15 +KPX S V -36 +KPX S W -20 +KPX S Y -54 +KPX S t -4 +KPX T A -93 +KPX T AE -85 +KPX T Aacute -93 +KPX T Acircumflex -93 +KPX T Adieresis -93 +KPX T Agrave -93 +KPX T Aring -93 +KPX T Atilde -93 +KPX T C -29 +KPX T G -30 +KPX T J -95 +KPX T O -30 +KPX T OE -20 +KPX T Oacute -30 +KPX T Ocircumflex -30 +KPX T Odieresis -30 +KPX T Ograve -30 +KPX T Oslash -36 +KPX T Otilde -30 +KPX T S -7 +KPX T V 9 +KPX T W 15 +KPX T Y 7 +KPX T a -77 +KPX T ae -78 +KPX T c -79 +KPX T colon -104 +KPX T comma -75 +KPX T e -72 +KPX T g -79 +KPX T guillemotleft -107 +KPX T guilsinglleft -103 +KPX T hyphen -53 +KPX T i -9 +KPX T j -11 +KPX T o -81 +KPX T oslash -80 +KPX T period -73 +KPX T r -76 +KPX T s -81 +KPX T semicolon -105 +KPX T u -78 +KPX T v -91 +KPX T w -85 +KPX T y -89 +KPX U A -40 +KPX U AE -30 +KPX U Aacute -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -17 +KPX U m -3 +KPX U n -5 +KPX U p -3 +KPX U period -12 +KPX U r -5 +KPX Uacute A -40 +KPX Uacute comma -17 +KPX Uacute m -3 +KPX Uacute n -5 +KPX Uacute p -3 +KPX Uacute period -12 +KPX Uacute r -5 +KPX Ucircumflex A -40 +KPX Udieresis A -40 +KPX Udieresis b -4 +KPX Udieresis comma -17 +KPX Udieresis m -3 +KPX Udieresis n -5 +KPX Udieresis p -3 +KPX Udieresis period -12 +KPX Udieresis r -5 +KPX Ugrave A -40 +KPX V A -75 +KPX V AE -65 +KPX V Aacute -75 +KPX V Acircumflex -75 +KPX V Adieresis -75 +KPX V Agrave -75 +KPX V Aring -75 +KPX V Atilde -75 +KPX V C -43 +KPX V G -44 +KPX V O -44 +KPX V Oacute -44 +KPX V Ocircumflex -44 +KPX V Odieresis -44 +KPX V Ograve -44 +KPX V Oslash -42 +KPX V Otilde -44 +KPX V S -31 +KPX V T 12 +KPX V a -51 +KPX V ae -52 +KPX V colon -74 +KPX V comma -76 +KPX V e -46 +KPX V g -54 +KPX V guillemotleft -81 +KPX V guilsinglleft -77 +KPX V hyphen -26 +KPX V i -13 +KPX V o -56 +KPX V oslash -55 +KPX V period -74 +KPX V r -43 +KPX V semicolon -77 +KPX V u -42 +KPX V y -19 +KPX W A -59 +KPX W AE -50 +KPX W Aacute -59 +KPX W Acircumflex -59 +KPX W Adieresis -59 +KPX W Agrave -59 +KPX W Aring -59 +KPX W Atilde -59 +KPX W C -28 +KPX W G -29 +KPX W O -29 +KPX W Oacute -29 +KPX W Ocircumflex -29 +KPX W Odieresis -29 +KPX W Ograve -29 +KPX W Oslash -27 +KPX W Otilde -29 +KPX W S -22 +KPX W T 16 +KPX W a -34 +KPX W ae -34 +KPX W colon -61 +KPX W comma -53 +KPX W e -28 +KPX W g -36 +KPX W guillemotleft -63 +KPX W guilsinglleft -59 +KPX W hyphen -9 +KPX W i -9 +KPX W o -38 +KPX W oslash -37 +KPX W period -51 +KPX W r -33 +KPX W semicolon -63 +KPX W u -32 +KPX W y -9 +KPX X C -39 +KPX X O -40 +KPX X Odieresis -40 +KPX X Q -43 +KPX X a -17 +KPX X e -33 +KPX X hyphen -33 +KPX X o -43 +KPX X u -35 +KPX X y -48 +KPX Y A -91 +KPX Y AE -81 +KPX Y Aacute -91 +KPX Y Acircumflex -91 +KPX Y Adieresis -91 +KPX Y Agrave -91 +KPX Y Aring -91 +KPX Y Atilde -91 +KPX Y C -60 +KPX Y G -61 +KPX Y O -61 +KPX Y Oacute -61 +KPX Y Ocircumflex -61 +KPX Y Odieresis -61 +KPX Y Ograve -61 +KPX Y Oslash -58 +KPX Y Otilde -61 +KPX Y S -39 +KPX Y T 14 +KPX Y a -71 +KPX Y ae -71 +KPX Y colon -90 +KPX Y comma -85 +KPX Y e -66 +KPX Y g -73 +KPX Y guillemotleft -105 +KPX Y guilsinglleft -101 +KPX Y hyphen -55 +KPX Y i -11 +KPX Y o -76 +KPX Y oslash -74 +KPX Y p -53 +KPX Y period -84 +KPX Y semicolon -93 +KPX Y u -57 +KPX Y v -36 +KPX Z v -21 +KPX Z y -19 +KPX a j -7 +KPX a quoteright -14 +KPX a v -23 +KPX a w -10 +KPX a y -24 +KPX aacute v -23 +KPX aacute w -10 +KPX aacute y -24 +KPX adieresis v -23 +KPX adieresis w -10 +KPX adieresis y -24 +KPX ae v -21 +KPX ae w -7 +KPX ae y -23 +KPX agrave v -23 +KPX agrave w -10 +KPX agrave y -24 +KPX aring v -23 +KPX aring w -10 +KPX aring y -24 +KPX b v -23 +KPX b w -9 +KPX b y -25 +KPX c h -9 +KPX c k -5 +KPX comma one -79 +KPX comma quotedblright -39 +KPX comma quoteright -35 +KPX e quoteright -13 +KPX e t -9 +KPX e v -22 +KPX e w -9 +KPX e x -25 +KPX e y -25 +KPX eacute v -22 +KPX eacute w -9 +KPX eacute y -25 +KPX ecircumflex v -22 +KPX ecircumflex w -9 +KPX ecircumflex y -25 +KPX eight four 2 +KPX eight one -32 +KPX eight seven -15 +KPX f a -6 +KPX f aacute -6 +KPX f adieresis -6 +KPX f ae -6 +KPX f aring -6 +KPX f e -6 +KPX f eacute -6 +KPX f f 14 +KPX f i -13 +KPX f j -15 +KPX f l -13 +KPX f o -16 +KPX f oacute -16 +KPX f odieresis -16 +KPX f oe -11 +KPX f oslash -16 +KPX f quoteright 0 +KPX f s -10 +KPX f t 14 +KPX five four -3 +KPX five one -37 +KPX five seven -17 +KPX four four 0 +KPX four one -55 +KPX four seven -33 +KPX g a -3 +KPX g adieresis -3 +KPX g ae -4 +KPX g aring -3 +KPX g e 1 +KPX g eacute 1 +KPX g l -5 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r -3 +KPX guillemotright A -56 +KPX guillemotright AE -46 +KPX guillemotright Aacute -56 +KPX guillemotright Adieresis -56 +KPX guillemotright Aring -56 +KPX guillemotright T -115 +KPX guillemotright V -84 +KPX guillemotright W -65 +KPX guillemotright Y -117 +KPX guilsinglright A -52 +KPX guilsinglright AE -42 +KPX guilsinglright Aacute -52 +KPX guilsinglright Adieresis -52 +KPX guilsinglright Aring -52 +KPX guilsinglright T -110 +KPX guilsinglright V -79 +KPX guilsinglright W -60 +KPX guilsinglright Y -113 +KPX h quoteright -15 +KPX h y -25 +KPX hyphen A -7 +KPX hyphen AE 2 +KPX hyphen Aacute -7 +KPX hyphen Adieresis -7 +KPX hyphen Aring -7 +KPX hyphen T -64 +KPX hyphen V -34 +KPX hyphen W -15 +KPX hyphen Y -71 +KPX i T -12 +KPX i j -7 +KPX k a -13 +KPX k aacute -13 +KPX k adieresis -13 +KPX k ae -15 +KPX k aring -13 +KPX k comma -3 +KPX k e -19 +KPX k eacute -19 +KPX k g -26 +KPX k hyphen -31 +KPX k o -28 +KPX k oacute -28 +KPX k odieresis -28 +KPX k period -3 +KPX k s -23 +KPX k u -8 +KPX k udieresis -8 +KPX l v -14 +KPX l y -11 +KPX m p -1 +KPX m v -23 +KPX m w -9 +KPX m y -23 +KPX n T -87 +KPX n p -2 +KPX n quoteright -15 +KPX n v -24 +KPX n w -11 +KPX n y -25 +KPX nine four -6 +KPX nine one -30 +KPX nine seven -23 +KPX o T -90 +KPX o quoteright -19 +KPX o t -13 +KPX o v -27 +KPX o w -13 +KPX o x -30 +KPX o y -29 +KPX oacute v -27 +KPX oacute w -13 +KPX oacute y -29 +KPX ocircumflex t -13 +KPX odieresis t -13 +KPX odieresis v -27 +KPX odieresis w -13 +KPX odieresis x -30 +KPX odieresis y -29 +KPX ograve v -27 +KPX ograve w -13 +KPX ograve y -29 +KPX one comma -51 +KPX one eight -47 +KPX one five -50 +KPX one four -70 +KPX one nine -47 +KPX one one -92 +KPX one period -49 +KPX one seven -72 +KPX one six -48 +KPX one three -53 +KPX one two -56 +KPX one zero -44 +KPX p t -10 +KPX p y -25 +KPX period one -80 +KPX period quotedblright -39 +KPX period quoteright -35 +KPX q c -3 +KPX q u -3 +KPX quotedblbase A 7 +KPX quotedblbase AE 19 +KPX quotedblbase T -79 +KPX quotedblbase V -77 +KPX quotedblbase W -54 +KPX quotedblbase Y -96 +KPX quotedblleft A -72 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -72 +KPX quotedblleft Adieresis -72 +KPX quotedblleft Aring -72 +KPX quotedblleft T -11 +KPX quotedblleft V 0 +KPX quotedblleft W 9 +KPX quotedblleft Y -15 +KPX quotedblright A -72 +KPX quotedblright AE -64 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T -7 +KPX quotedblright V 1 +KPX quotedblright W 11 +KPX quotedblright Y -14 +KPX quoteleft A -76 +KPX quoteleft AE -69 +KPX quoteleft Aacute -76 +KPX quoteleft Adieresis -76 +KPX quoteleft Aring -76 +KPX quoteleft T -15 +KPX quoteleft V -4 +KPX quoteleft W 5 +KPX quoteleft Y -20 +KPX quoteright A -80 +KPX quoteright AE -72 +KPX quoteright Aacute -80 +KPX quoteright Adieresis -80 +KPX quoteright Aring -80 +KPX quoteright comma -53 +KPX quoteright d -30 +KPX quoteright o -34 +KPX quoteright period -51 +KPX quoteright r -20 +KPX quoteright s -27 +KPX quoteright t -11 +KPX quoteright v -11 +KPX quoteright w -4 +KPX quoteright y -9 +KPX r a -1 +KPX r aacute -1 +KPX r acircumflex -1 +KPX r adieresis -1 +KPX r ae -2 +KPX r agrave -1 +KPX r aring -1 +KPX r c -6 +KPX r ccedilla -6 +KPX r colon -36 +KPX r comma -64 +KPX r d -5 +KPX r e 2 +KPX r eacute 2 +KPX r ecircumflex 2 +KPX r egrave 2 +KPX r f 15 +KPX r g -7 +KPX r h -12 +KPX r hyphen -40 +KPX r i -12 +KPX r j -13 +KPX r k -8 +KPX r l -12 +KPX r m -8 +KPX r n -10 +KPX r o -7 +KPX r oacute -7 +KPX r ocircumflex -7 +KPX r odieresis -7 +KPX r oe -2 +KPX r ograve -7 +KPX r oslash -12 +KPX r p -7 +KPX r period -63 +KPX r q -2 +KPX r quoteright 4 +KPX r r -10 +KPX r s -4 +KPX r semicolon -37 +KPX r t 15 +KPX r u -8 +KPX r v 12 +KPX r w 17 +KPX r x 7 +KPX r y 14 +KPX r z 2 +KPX s quoteright -12 +KPX s t -9 +KPX seven colon -71 +KPX seven comma -95 +KPX seven eight -10 +KPX seven five -28 +KPX seven four -70 +KPX seven one -21 +KPX seven period -94 +KPX seven seven 2 +KPX seven six -21 +KPX seven three -7 +KPX seven two -11 +KPX six four -1 +KPX six one -29 +KPX six seven -13 +KPX t S -9 +KPX t a -3 +KPX t aacute -3 +KPX t adieresis -3 +KPX t ae -5 +KPX t aring -3 +KPX t colon -41 +KPX t e -5 +KPX t eacute -5 +KPX t h -9 +KPX t o -15 +KPX t oacute -15 +KPX t odieresis -15 +KPX t quoteright -3 +KPX t semicolon -42 +KPX three four -2 +KPX three one -34 +KPX three seven -19 +KPX two four -16 +KPX two one -24 +KPX two seven -12 +KPX u quoteright -8 +KPX v a -21 +KPX v aacute -21 +KPX v acircumflex -21 +KPX v adieresis -21 +KPX v ae -21 +KPX v agrave -21 +KPX v aring -21 +KPX v atilde -21 +KPX v c -25 +KPX v colon -41 +KPX v comma -57 +KPX v e -18 +KPX v eacute -18 +KPX v ecircumflex -18 +KPX v egrave -18 +KPX v g -26 +KPX v hyphen -5 +KPX v l -12 +KPX v o -28 +KPX v oacute -28 +KPX v odieresis -28 +KPX v ograve -28 +KPX v oslash -28 +KPX v period -55 +KPX v s -25 +KPX v semicolon -43 +KPX w a -11 +KPX w aacute -11 +KPX w acircumflex -11 +KPX w adieresis -11 +KPX w ae -12 +KPX w agrave -11 +KPX w aring -11 +KPX w atilde -11 +KPX w c -12 +KPX w colon -36 +KPX w comma -38 +KPX w e -5 +KPX w eacute -5 +KPX w ecircumflex -5 +KPX w egrave -5 +KPX w g -13 +KPX w hyphen 7 +KPX w l -8 +KPX w o -15 +KPX w oacute -15 +KPX w odieresis -15 +KPX w ograve -15 +KPX w oslash -14 +KPX w period -36 +KPX w s -15 +KPX w semicolon -38 +KPX x a -22 +KPX x c -27 +KPX x e -20 +KPX x eacute -20 +KPX x o -30 +KPX x q -23 +KPX y a -20 +KPX y aacute -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y ae -20 +KPX y agrave -20 +KPX y aring -20 +KPX y atilde -20 +KPX y c -26 +KPX y colon -40 +KPX y comma -58 +KPX y e -19 +KPX y eacute -19 +KPX y ecircumflex -19 +KPX y egrave -19 +KPX y g -27 +KPX y hyphen -4 +KPX y l -11 +KPX y o -28 +KPX y oacute -28 +KPX y odieresis -28 +KPX y ograve -28 +KPX y oslash -27 +KPX y period -55 +KPX y s -24 +KPX y semicolon -43 +KPX zero four -3 +KPX zero one -29 +KPX zero seven -21 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n019024l.pfb b/PdfReader/Resources/Fonts/n019024l.pfb new file mode 100644 index 0000000000..2cdc3222a7 Binary files /dev/null and b/PdfReader/Resources/Fonts/n019024l.pfb differ diff --git a/PdfReader/Resources/Fonts/n021003l.afm b/PdfReader/Resources/Fonts/n021003l.afm new file mode 100644 index 0000000000..95759a53b0 --- /dev/null +++ b/PdfReader/Resources/Fonts/n021003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-Regu +FullName Nimbus Roman No9 L Regular +FamilyName Nimbus Roman No9 L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -168 -281 1000 924 +CapHeight 662 +XHeight 450 +Descender -217 +Ascender 683 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 130 -9 237 676 ; +C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; +C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; +C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; +C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; +C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; +C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ; +C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; +C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; +C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; +C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; +C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; +C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; +C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; +C 49 ; WX 500 ; N one ; B 111 0 394 676 ; +C 50 ; WX 500 ; N two ; B 30 0 475 676 ; +C 51 ; WX 500 ; N three ; B 43 -14 432 676 ; +C 52 ; WX 500 ; N four ; B 12 0 472 676 ; +C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; +C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; +C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; +C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; +C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; +C 60 ; WX 564 ; N less ; B 28 -10 536 516 ; +C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; +C 62 ; WX 564 ; N greater ; B 28 -10 536 516 ; +C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; +C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; +C 65 ; WX 722 ; N A ; B 15 0 706 674 ; +C 66 ; WX 667 ; N B ; B 17 0 593 662 ; +C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; +C 68 ; WX 722 ; N D ; B 16 0 685 662 ; +C 69 ; WX 611 ; N E ; B 12 0 597 662 ; +C 70 ; WX 556 ; N F ; B 12 0 546 662 ; +C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; +C 72 ; WX 722 ; N H ; B 19 0 702 662 ; +C 73 ; WX 333 ; N I ; B 18 0 315 662 ; +C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; +C 75 ; WX 722 ; N K ; B 34 0 723 662 ; +C 76 ; WX 611 ; N L ; B 12 0 598 662 ; +C 77 ; WX 889 ; N M ; B 12 0 863 662 ; +C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; +C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; +C 80 ; WX 556 ; N P ; B 16 0 542 662 ; +C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; +C 82 ; WX 667 ; N R ; B 17 0 659 662 ; +C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; +C 84 ; WX 611 ; N T ; B 17 0 593 662 ; +C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; +C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; +C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; +C 88 ; WX 722 ; N X ; B 10 0 704 662 ; +C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; +C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; +C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; +C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; +C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; +C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; +C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; +C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; +C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; +C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; +C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; +C 102 ; WX 333 ; N f ; B 20 0 383 683 ; +C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; +C 104 ; WX 500 ; N h ; B 9 0 487 683 ; +C 105 ; WX 278 ; N i ; B 16 0 253 683 ; +C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; +C 107 ; WX 500 ; N k ; B 7 0 505 683 ; +C 108 ; WX 278 ; N l ; B 19 0 257 683 ; +C 109 ; WX 778 ; N m ; B 16 0 775 460 ; +C 110 ; WX 500 ; N n ; B 16 0 485 460 ; +C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; +C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; +C 113 ; WX 500 ; N q ; B 24 -217 488 461 ; +C 114 ; WX 333 ; N r ; B 5 0 335 460 ; +C 115 ; WX 389 ; N s ; B 51 -10 348 459 ; +C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; +C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; +C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; +C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; +C 120 ; WX 500 ; N x ; B 17 0 479 450 ; +C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; +C 122 ; WX 444 ; N z ; B 27 0 418 450 ; +C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; +C 124 ; WX 200 ; N bar ; B 67 -14 133 676 ; +C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; +C 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 ; +C 161 ; WX 333 ; N exclamdown ; B 97 -218 204 469 ; +C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; +C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; +C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ; +C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; +C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ; +C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; +C 168 ; WX 500 ; N currency ; B -22 58 522 602 ; +C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; +C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; +C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; +C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; +C 174 ; WX 556 ; N fi ; B 31 0 521 683 ; +C 175 ; WX 556 ; N fl ; B 32 0 521 683 ; +C 177 ; WX 500 ; N endash ; B 0 201 500 250 ; +C 178 ; WX 500 ; N dagger ; B 59 -149 443 676 ; +C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; +C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; +C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ; +C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; +C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; +C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; +C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; +C 191 ; WX 444 ; N questiondown ; B 30 -218 376 468 ; +C 193 ; WX 333 ; N grave ; B 19 507 242 678 ; +C 194 ; WX 333 ; N acute ; B 93 507 317 678 ; +C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ; +C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ; +C 197 ; WX 333 ; N macron ; B 11 547 322 601 ; +C 198 ; WX 333 ; N breve ; B 26 507 307 664 ; +C 199 ; WX 333 ; N dotaccent ; B 118 523 217 622 ; +C 200 ; WX 333 ; N dieresis ; B 18 523 316 622 ; +C 202 ; WX 333 ; N ring ; B 67 512 266 711 ; +C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; +C 206 ; WX 333 ; N ogonek ; B 64 -165 249 0 ; +C 207 ; WX 333 ; N caron ; B 11 507 322 674 ; +C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; +C 225 ; WX 889 ; N AE ; B 0 0 863 662 ; +C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; +C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ; +C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; +C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ; +C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; +C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ; +C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; +C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ; +C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ; +C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ; +C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; +C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 834 ; +C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; +C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; +C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; +C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; +C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; +C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; +C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; +C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; +C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ; +C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ; +C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; +C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; +C -1 ; WX 722 ; N Uring ; B 14 -14 705 923 ; +C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; +C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 622 ; +C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; +C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ; +C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N edieresis ; B 25 -10 424 622 ; +C -1 ; WX 600 ; N dcaron ; B 27 -10 599 683 ; +C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; +C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; +C -1 ; WX 444 ; N cacute ; B 25 -10 412 678 ; +C -1 ; WX 444 ; N aogonek ; B 37 -165 444 460 ; +C -1 ; WX 444 ; N aring ; B 37 -10 442 721 ; +C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ; +C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; +C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ; +C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ; +C -1 ; WX 444 ; N adieresis ; B 37 -10 442 622 ; +C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; +C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N udieresis ; B 9 -10 479 622 ; +C -1 ; WX 278 ; N tcaron ; B 13 -10 300 676 ; +C -1 ; WX 389 ; N scommaaccent ; B 51 -281 348 459 ; +C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; +C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; +C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; +C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 834 ; +C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ; +C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; +C -1 ; WX 389 ; N sacute ; B 51 -10 365 678 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 17 -281 593 662 ; +C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 834 ; +C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ; +C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; +C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; +C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 834 ; +C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; +C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; +C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; +C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; +C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; +C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 834 ; +C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; +C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 470 678 ; +C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ; +C -1 ; WX 500 ; N Euro ; B -16 -14 477 674 ; +C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; +C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; +C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; +C -1 ; WX 300 ; N threesuperior ; B 14 262 291 676 ; +C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ; +C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; +C -1 ; WX 333 ; N Iogonek ; B 18 -165 397 662 ; +C -1 ; WX 333 ; N Idieresis ; B 18 0 316 834 ; +C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; +C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 34 -281 723 662 ; +C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ; +C -1 ; WX 556 ; N Scommaaccent ; B 42 -281 491 676 ; +C -1 ; WX 611 ; N Eogonek ; B 12 -165 611 662 ; +C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ; +C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 834 ; +C -1 ; WX 278 ; N iogonek ; B 16 -165 278 683 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 736 ; +C -1 ; WX 500 ; N odieresis ; B 29 -10 470 622 ; +C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ; +C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; +C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; +C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; +C -1 ; WX 389 ; N scedilla ; B 51 -215 348 459 ; +C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; +C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ; +C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 32 -281 709 676 ; +C -1 ; WX 667 ; N Rcommaaccent ; B 17 -281 659 662 ; +C -1 ; WX 611 ; N Edieresis ; B 12 0 597 834 ; +C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; +C -1 ; WX 500 ; N uogonek ; B 9 -165 500 450 ; +C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; +C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; +C -1 ; WX 348 ; N lcaron ; B 19 0 348 683 ; +C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; +C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; +C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; +C -1 ; WX 400 ; N degree ; B 57 390 343 676 ; +C -1 ; WX 722 ; N Aogonek ; B 15 -165 786 674 ; +C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; +C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ; +C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ; +C -1 ; WX 722 ; N Aring ; B 15 0 706 915 ; +C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -281 335 460 ; +C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; +C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; +C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ; +C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; +C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ; +C -1 ; WX 500 ; N ncommaaccent ; B 16 -281 485 460 ; +C -1 ; WX 278 ; N lcommaaccent ; B 19 -281 257 683 ; +C -1 ; WX 564 ; N plusminus ; B 30 0 534 568 ; +C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; +C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; +C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; +C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ; +C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; +C -1 ; WX 500 ; N kcommaaccent ; B 7 -281 505 683 ; +C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; +C -1 ; WX 278 ; N imacron ; B -16 0 292 601 ; +C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; +C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; +C -1 ; WX 278 ; N tcommaaccent ; B 13 -281 279 579 ; +C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 622 ; +C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 622 ; +C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ; +C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; +C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 479 678 ; +C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ; +C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; +C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; +C -1 ; WX 333 ; N commaaccent ; B 97 -281 236 -38 ; +C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ; +C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ; +C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; +C -1 ; WX 278 ; N idieresis ; B 11 0 269 622 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 564 ; N notequal ; B 30 -3 534 509 ; +C -1 ; WX 549 ; N radical ; B -2 -65 526 924 ; +C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ; +C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ; +C -1 ; WX 564 ; N lessequal ; B 28 0 536 628 ; +C -1 ; WX 564 ; N greaterequal ; B 28 0 536 628 ; +C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 12 -281 707 662 ; +C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; +C -1 ; WX 200 ; N brokenbar ; B 67 -14 133 676 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 12 -281 598 662 ; +C -1 ; WX 722 ; N Adieresis ; B 15 0 706 834 ; +C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -51 +KPX A Ccedilla -57 +KPX A G -57 +KPX A O -60 +KPX A Odieresis -60 +KPX A Q -60 +KPX A T -54 +KPX A U -62 +KPX A Uacute -62 +KPX A Ucircumflex -62 +KPX A Udieresis -62 +KPX A Ugrave -62 +KPX A V -131 +KPX A W -113 +KPX A Y -81 +KPX A a -6 +KPX A b -20 +KPX A c -29 +KPX A ccedilla -29 +KPX A comma -3 +KPX A d -28 +KPX A e -27 +KPX A g -20 +KPX A guillemotleft -64 +KPX A guilsinglleft -74 +KPX A hyphen -23 +KPX A o -40 +KPX A period -10 +KPX A q -21 +KPX A quotedblright -91 +KPX A quoteright -116 +KPX A t -20 +KPX A u -28 +KPX A v -81 +KPX A w -73 +KPX A y -83 +KPX Aacute C -51 +KPX Aacute G -57 +KPX Aacute O -60 +KPX Aacute Q -60 +KPX Aacute T -54 +KPX Aacute U -62 +KPX Aacute V -131 +KPX Aacute W -113 +KPX Aacute Y -81 +KPX Aacute a -6 +KPX Aacute b -20 +KPX Aacute c -29 +KPX Aacute comma -3 +KPX Aacute d -28 +KPX Aacute e -27 +KPX Aacute g -20 +KPX Aacute guillemotleft -64 +KPX Aacute guilsinglleft -74 +KPX Aacute hyphen -23 +KPX Aacute o -40 +KPX Aacute period -10 +KPX Aacute q -21 +KPX Aacute quoteright -116 +KPX Aacute t -20 +KPX Aacute u -28 +KPX Aacute v -81 +KPX Aacute w -73 +KPX Aacute y -83 +KPX Acircumflex C -51 +KPX Acircumflex G -57 +KPX Acircumflex O -60 +KPX Acircumflex Q -60 +KPX Acircumflex T -54 +KPX Acircumflex U -62 +KPX Acircumflex V -131 +KPX Acircumflex W -113 +KPX Acircumflex Y -81 +KPX Acircumflex comma -3 +KPX Acircumflex period -10 +KPX Adieresis C -51 +KPX Adieresis G -57 +KPX Adieresis O -60 +KPX Adieresis Q -60 +KPX Adieresis T -54 +KPX Adieresis U -62 +KPX Adieresis V -131 +KPX Adieresis W -113 +KPX Adieresis Y -81 +KPX Adieresis a -6 +KPX Adieresis b -20 +KPX Adieresis c -29 +KPX Adieresis comma -3 +KPX Adieresis d -28 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -64 +KPX Adieresis guilsinglleft -74 +KPX Adieresis hyphen -23 +KPX Adieresis o -40 +KPX Adieresis period -10 +KPX Adieresis q -21 +KPX Adieresis quotedblright -91 +KPX Adieresis quoteright -116 +KPX Adieresis t -20 +KPX Adieresis u -28 +KPX Adieresis v -81 +KPX Adieresis w -73 +KPX Adieresis y -83 +KPX Agrave C -51 +KPX Agrave G -57 +KPX Agrave O -60 +KPX Agrave Q -60 +KPX Agrave T -54 +KPX Agrave U -62 +KPX Agrave V -131 +KPX Agrave W -113 +KPX Agrave Y -81 +KPX Agrave comma -3 +KPX Agrave period -10 +KPX Aring C -51 +KPX Aring G -57 +KPX Aring O -60 +KPX Aring Q -60 +KPX Aring T -54 +KPX Aring U -62 +KPX Aring V -131 +KPX Aring W -113 +KPX Aring Y -81 +KPX Aring a -6 +KPX Aring b -20 +KPX Aring c -29 +KPX Aring comma -3 +KPX Aring d -28 +KPX Aring e -27 +KPX Aring g -20 +KPX Aring guillemotleft -64 +KPX Aring guilsinglleft -74 +KPX Aring hyphen -23 +KPX Aring o -40 +KPX Aring period -10 +KPX Aring q -21 +KPX Aring quotedblright -91 +KPX Aring quoteright -116 +KPX Aring t -20 +KPX Aring u -28 +KPX Aring v -81 +KPX Aring w -73 +KPX Aring y -83 +KPX Atilde C -51 +KPX Atilde G -57 +KPX Atilde O -60 +KPX Atilde Q -60 +KPX Atilde T -54 +KPX Atilde U -62 +KPX Atilde V -131 +KPX Atilde W -113 +KPX Atilde Y -81 +KPX Atilde comma -3 +KPX Atilde period -10 +KPX B A -51 +KPX B AE -44 +KPX B Aacute -51 +KPX B Acircumflex -51 +KPX B Adieresis -51 +KPX B Aring -51 +KPX B Atilde -51 +KPX B O -24 +KPX B OE -18 +KPX B Oacute -24 +KPX B Ocircumflex -24 +KPX B Odieresis -24 +KPX B Ograve -24 +KPX B Oslash -23 +KPX B V -65 +KPX B W -59 +KPX B Y -68 +KPX C A -23 +KPX C AE -15 +KPX C Aacute -23 +KPX C Adieresis -23 +KPX C Aring -23 +KPX C H -2 +KPX C K -10 +KPX C O -12 +KPX C Oacute -12 +KPX C Odieresis -12 +KPX Ccedilla A -27 +KPX D A -67 +KPX D Aacute -67 +KPX D Acircumflex -67 +KPX D Adieresis -67 +KPX D Agrave -67 +KPX D Aring -67 +KPX D Atilde -67 +KPX D J -41 +KPX D T -10 +KPX D V -71 +KPX D W -57 +KPX D X -64 +KPX D Y -74 +KPX F A -71 +KPX F Aacute -71 +KPX F Acircumflex -71 +KPX F Adieresis -71 +KPX F Agrave -71 +KPX F Aring -71 +KPX F Atilde -71 +KPX F J -13 +KPX F O -10 +KPX F Odieresis -10 +KPX F a -34 +KPX F aacute -34 +KPX F adieresis -10 +KPX F ae -36 +KPX F aring -34 +KPX F comma -51 +KPX F e -19 +KPX F eacute -19 +KPX F hyphen 3 +KPX F i -13 +KPX F j -20 +KPX F o -21 +KPX F oacute -21 +KPX F odieresis -21 +KPX F oe -21 +KPX F oslash -21 +KPX F period -58 +KPX F r -10 +KPX F u -11 +KPX G A -26 +KPX G AE -19 +KPX G Aacute -26 +KPX G Acircumflex -26 +KPX G Adieresis -26 +KPX G Agrave -26 +KPX G Aring -26 +KPX G Atilde -26 +KPX G T -21 +KPX G V -23 +KPX G W -18 +KPX G Y -26 +KPX J A -53 +KPX J AE -46 +KPX J Adieresis -53 +KPX J Aring -53 +KPX K C -43 +KPX K G -49 +KPX K O -51 +KPX K OE -44 +KPX K Oacute -51 +KPX K Odieresis -51 +KPX K S 1 +KPX K T 0 +KPX K a 2 +KPX K adieresis 2 +KPX K ae 0 +KPX K aring 2 +KPX K e -19 +KPX K hyphen -63 +KPX K o -31 +KPX K oacute -31 +KPX K odieresis -31 +KPX K u -19 +KPX K udieresis -19 +KPX K y -86 +KPX L A 0 +KPX L AE 6 +KPX L Aacute 0 +KPX L Adieresis 0 +KPX L Aring 0 +KPX L C 2 +KPX L Ccedilla 0 +KPX L G 0 +KPX L O -3 +KPX L Oacute -3 +KPX L Ocircumflex -3 +KPX L Odieresis -3 +KPX L Ograve -3 +KPX L Otilde -3 +KPX L S 5 +KPX L T -73 +KPX L U -26 +KPX L Udieresis -26 +KPX L V -115 +KPX L W -89 +KPX L Y -100 +KPX L hyphen 25 +KPX L quotedblright -100 +KPX L quoteright -125 +KPX L u -10 +KPX L udieresis -10 +KPX L y -56 +KPX N A -28 +KPX N AE -21 +KPX N Aacute -28 +KPX N Adieresis -28 +KPX N Aring -28 +KPX N C -16 +KPX N Ccedilla -16 +KPX N G -19 +KPX N O -20 +KPX N Oacute -20 +KPX N Odieresis -20 +KPX N a -27 +KPX N aacute -27 +KPX N adieresis -27 +KPX N ae -27 +KPX N aring -27 +KPX N comma -14 +KPX N e -17 +KPX N eacute -17 +KPX N o -21 +KPX N oacute -21 +KPX N odieresis -21 +KPX N oslash -20 +KPX N period -21 +KPX N u -25 +KPX N udieresis -25 +KPX O A -58 +KPX O AE -50 +KPX O Aacute -58 +KPX O Adieresis -58 +KPX O Aring -58 +KPX O T -9 +KPX O V -69 +KPX O W -54 +KPX O X -55 +KPX O Y -72 +KPX Oacute A -58 +KPX Oacute T -9 +KPX Oacute V -69 +KPX Oacute W -54 +KPX Oacute Y -72 +KPX Ocircumflex T -9 +KPX Ocircumflex V -69 +KPX Ocircumflex Y -72 +KPX Odieresis A -58 +KPX Odieresis T -9 +KPX Odieresis V -69 +KPX Odieresis W -54 +KPX Odieresis X -55 +KPX Odieresis Y -72 +KPX Ograve T -9 +KPX Ograve V -69 +KPX Ograve Y -72 +KPX Oslash A -58 +KPX Otilde T -9 +KPX Otilde V -69 +KPX Otilde Y -72 +KPX P A -90 +KPX P AE -91 +KPX P Aacute -90 +KPX P Adieresis -90 +KPX P Aring -90 +KPX P J -52 +KPX P a -17 +KPX P aacute -17 +KPX P adieresis -17 +KPX P ae -18 +KPX P aring -17 +KPX P comma -94 +KPX P e -23 +KPX P eacute -23 +KPX P hyphen -37 +KPX P o -25 +KPX P oacute -25 +KPX P odieresis -25 +KPX P oe -25 +KPX P oslash -25 +KPX P period -101 +KPX R C -41 +KPX R Ccedilla -41 +KPX R G -44 +KPX R O -45 +KPX R OE -39 +KPX R Oacute -45 +KPX R Odieresis -45 +KPX R T -34 +KPX R U -56 +KPX R Udieresis -55 +KPX R V -73 +KPX R W -67 +KPX R Y -76 +KPX R a -2 +KPX R aacute -2 +KPX R adieresis -2 +KPX R ae -5 +KPX R aring -2 +KPX R e -23 +KPX R eacute -23 +KPX R hyphen -52 +KPX R o -36 +KPX R oacute -36 +KPX R odieresis -36 +KPX R oe -31 +KPX R u -24 +KPX R uacute -24 +KPX R udieresis -24 +KPX R y -37 +KPX S A -37 +KPX S AE -30 +KPX S Aacute -37 +KPX S Adieresis -37 +KPX S Aring -37 +KPX S T -19 +KPX S V -27 +KPX S W -21 +KPX S Y -30 +KPX S t -20 +KPX T A -53 +KPX T AE -45 +KPX T Aacute -53 +KPX T Acircumflex -53 +KPX T Adieresis -53 +KPX T Agrave -53 +KPX T Aring -53 +KPX T Atilde -53 +KPX T C -8 +KPX T G -11 +KPX T J -18 +KPX T O -10 +KPX T OE -4 +KPX T Oacute -10 +KPX T Ocircumflex -10 +KPX T Odieresis -10 +KPX T Ograve -10 +KPX T Oslash -10 +KPX T Otilde -10 +KPX T S -10 +KPX T V 14 +KPX T W 20 +KPX T Y 11 +KPX T a -77 +KPX T ae -80 +KPX T c -87 +KPX T colon -87 +KPX T comma -74 +KPX T e -86 +KPX T g -91 +KPX T guillemotleft -114 +KPX T guilsinglleft -125 +KPX T hyphen -73 +KPX T i -18 +KPX T j -25 +KPX T o -90 +KPX T oslash -89 +KPX T period -82 +KPX T r -50 +KPX T s -73 +KPX T semicolon -87 +KPX T u -93 +KPX T v -105 +KPX T w -106 +KPX T y -102 +KPX U A -65 +KPX U AE -58 +KPX U Aacute -65 +KPX U Acircumflex -65 +KPX U Adieresis -65 +KPX U Aring -65 +KPX U Atilde -65 +KPX U comma -31 +KPX U m -33 +KPX U n -31 +KPX U p -28 +KPX U period -37 +KPX U r -27 +KPX Uacute A -65 +KPX Uacute comma -31 +KPX Uacute m -33 +KPX Uacute n -31 +KPX Uacute p -28 +KPX Uacute period -37 +KPX Uacute r -27 +KPX Ucircumflex A -65 +KPX Udieresis A -65 +KPX Udieresis b 21 +KPX Udieresis comma -31 +KPX Udieresis m -33 +KPX Udieresis n -31 +KPX Udieresis p -28 +KPX Udieresis period -37 +KPX Udieresis r -27 +KPX Ugrave A -65 +KPX V A -124 +KPX V AE -104 +KPX V Aacute -124 +KPX V Acircumflex -124 +KPX V Adieresis -124 +KPX V Agrave -124 +KPX V Aring -124 +KPX V Atilde -124 +KPX V C -63 +KPX V G -66 +KPX V O -67 +KPX V Oacute -67 +KPX V Ocircumflex -67 +KPX V Odieresis -67 +KPX V Ograve -67 +KPX V Oslash -65 +KPX V Otilde -67 +KPX V S -47 +KPX V T 10 +KPX V a -88 +KPX V ae -89 +KPX V colon -90 +KPX V comma -105 +KPX V e -85 +KPX V g -101 +KPX V guillemotleft -109 +KPX V guilsinglleft -119 +KPX V hyphen -69 +KPX V i -20 +KPX V o -89 +KPX V oslash -88 +KPX V period -112 +KPX V r -56 +KPX V semicolon -89 +KPX V u -51 +KPX V y -54 +KPX W A -113 +KPX W AE -98 +KPX W Aacute -113 +KPX W Acircumflex -113 +KPX W Adieresis -113 +KPX W Agrave -113 +KPX W Aring -113 +KPX W Atilde -113 +KPX W C -53 +KPX W G -56 +KPX W O -56 +KPX W Oacute -56 +KPX W Ocircumflex -56 +KPX W Odieresis -56 +KPX W Ograve -56 +KPX W Oslash -55 +KPX W Otilde -56 +KPX W S -41 +KPX W T 17 +KPX W a -80 +KPX W ae -81 +KPX W colon -81 +KPX W comma -89 +KPX W e -72 +KPX W g -91 +KPX W guillemotleft -97 +KPX W guilsinglleft -107 +KPX W hyphen -56 +KPX W i -13 +KPX W o -76 +KPX W oslash -75 +KPX W period -96 +KPX W r -47 +KPX W semicolon -81 +KPX W u -43 +KPX W y -45 +KPX X C -52 +KPX X O -61 +KPX X Odieresis -61 +KPX X Q -61 +KPX X a -7 +KPX X e -28 +KPX X hyphen -54 +KPX X o -41 +KPX X u -29 +KPX X y -96 +KPX Y A -74 +KPX Y AE -67 +KPX Y Aacute -74 +KPX Y Acircumflex -74 +KPX Y Adieresis -74 +KPX Y Agrave -74 +KPX Y Aring -74 +KPX Y Atilde -74 +KPX Y C -68 +KPX Y G -71 +KPX Y O -69 +KPX Y Oacute -69 +KPX Y Ocircumflex -69 +KPX Y Odieresis -69 +KPX Y Ograve -69 +KPX Y Oslash -69 +KPX Y Otilde -69 +KPX Y S -44 +KPX Y T 13 +KPX Y a -99 +KPX Y ae -102 +KPX Y colon -109 +KPX Y comma -96 +KPX Y e -103 +KPX Y g -113 +KPX Y guillemotleft -135 +KPX Y guilsinglleft -145 +KPX Y hyphen -98 +KPX Y i -17 +KPX Y o -107 +KPX Y oslash -106 +KPX Y p -88 +KPX Y period -103 +KPX Y semicolon -108 +KPX Y u -78 +KPX Y v -86 +KPX Z v -48 +KPX Z y -50 +KPX a j -26 +KPX a quoteright -40 +KPX a v -30 +KPX a w -31 +KPX a y -32 +KPX aacute v -30 +KPX aacute w -31 +KPX aacute y -32 +KPX adieresis v -30 +KPX adieresis w -31 +KPX adieresis y -32 +KPX ae v -27 +KPX ae w -28 +KPX ae y -30 +KPX agrave v -30 +KPX agrave w -31 +KPX agrave y -32 +KPX aring v -30 +KPX aring w -31 +KPX aring y -32 +KPX b v -29 +KPX b w -30 +KPX b y -32 +KPX c h -15 +KPX c k -19 +KPX comma one -52 +KPX comma quotedblright -29 +KPX comma quoteright -53 +KPX e quoteright -30 +KPX e t -10 +KPX e v -27 +KPX e w -28 +KPX e x -35 +KPX e y -30 +KPX eacute v -27 +KPX eacute w -28 +KPX eacute y -30 +KPX ecircumflex v -27 +KPX ecircumflex w -28 +KPX ecircumflex y -30 +KPX eight four 0 +KPX eight one -64 +KPX eight seven -15 +KPX f a -25 +KPX f aacute -25 +KPX f adieresis 12 +KPX f ae -25 +KPX f aring -6 +KPX f e -34 +KPX f eacute -34 +KPX f f 6 +KPX f i 15 +KPX f j 8 +KPX f l 44 +KPX f o -38 +KPX f oacute -38 +KPX f odieresis -1 +KPX f oe -36 +KPX f oslash -37 +KPX f quoteright 17 +KPX f s -21 +KPX f t 10 +KPX five four -8 +KPX five one -70 +KPX five seven -36 +KPX four four 14 +KPX four one -75 +KPX four seven -42 +KPX g a -17 +KPX g adieresis -17 +KPX g ae -18 +KPX g aring -17 +KPX g e -25 +KPX g eacute -25 +KPX g l -7 +KPX g oacute -26 +KPX g odieresis -26 +KPX g r 11 +KPX guillemotright A -62 +KPX guillemotright AE -61 +KPX guillemotright Aacute -62 +KPX guillemotright Adieresis -62 +KPX guillemotright Aring -62 +KPX guillemotright T -114 +KPX guillemotright V -117 +KPX guillemotright W -95 +KPX guillemotright Y -138 +KPX guilsinglright A -72 +KPX guilsinglright AE -71 +KPX guilsinglright Aacute -72 +KPX guilsinglright Adieresis -72 +KPX guilsinglright Aring -72 +KPX guilsinglright T -124 +KPX guilsinglright V -128 +KPX guilsinglright W -105 +KPX guilsinglright Y -149 +KPX h quoteright -38 +KPX h y -30 +KPX hyphen A -26 +KPX hyphen AE -25 +KPX hyphen Aacute -26 +KPX hyphen Adieresis -26 +KPX hyphen Aring -26 +KPX hyphen T -77 +KPX hyphen V -82 +KPX hyphen W -59 +KPX hyphen Y -108 +KPX i T -28 +KPX i j -36 +KPX k a 1 +KPX k aacute 1 +KPX k adieresis 1 +KPX k ae -1 +KPX k aring 1 +KPX k comma 4 +KPX k e -19 +KPX k eacute -19 +KPX k g -12 +KPX k hyphen -65 +KPX k o -32 +KPX k oacute -32 +KPX k odieresis -32 +KPX k period -2 +KPX k s 5 +KPX k u 14 +KPX k udieresis 14 +KPX l v -28 +KPX l y -25 +KPX m p -9 +KPX m v -30 +KPX m w -31 +KPX m y -31 +KPX n T -55 +KPX n p -13 +KPX n quoteright -39 +KPX n v -30 +KPX n w -31 +KPX n y -31 +KPX nine four -7 +KPX nine one -63 +KPX nine seven -6 +KPX o T -91 +KPX o quoteright -34 +KPX o t -9 +KPX o v -36 +KPX o w -36 +KPX o x -36 +KPX o y -41 +KPX oacute v -36 +KPX oacute w -36 +KPX oacute y -41 +KPX ocircumflex t -9 +KPX odieresis t -9 +KPX odieresis v -36 +KPX odieresis w -36 +KPX odieresis x -36 +KPX odieresis y -41 +KPX ograve v -36 +KPX ograve w -36 +KPX ograve y -41 +KPX one comma -48 +KPX one eight -68 +KPX one five -37 +KPX one four -72 +KPX one nine -61 +KPX one one -78 +KPX one period -55 +KPX one seven -78 +KPX one six -66 +KPX one three -41 +KPX one two -34 +KPX one zero -54 +KPX p t -6 +KPX p y -28 +KPX period one -61 +KPX period quotedblright -33 +KPX period quoteright -58 +KPX q c -7 +KPX q u -12 +KPX quotedblbase A 12 +KPX quotedblbase AE 19 +KPX quotedblbase T -60 +KPX quotedblbase V -104 +KPX quotedblbase W -76 +KPX quotedblbase Y -87 +KPX quotedblleft A -86 +KPX quotedblleft AE -91 +KPX quotedblleft Aacute -86 +KPX quotedblleft Adieresis -86 +KPX quotedblleft Aring -86 +KPX quotedblleft T 14 +KPX quotedblleft V 1 +KPX quotedblleft W 7 +KPX quotedblleft Y -1 +KPX quotedblright A -94 +KPX quotedblright AE -99 +KPX quotedblright Aacute -94 +KPX quotedblright Adieresis -94 +KPX quotedblright Aring -94 +KPX quotedblright T 11 +KPX quotedblright V 0 +KPX quotedblright W 6 +KPX quotedblright Y -2 +KPX quoteleft A -110 +KPX quoteleft AE -115 +KPX quoteleft Aacute -110 +KPX quoteleft Adieresis -110 +KPX quoteleft Aring -110 +KPX quoteleft T -9 +KPX quoteleft V -23 +KPX quoteleft W -17 +KPX quoteleft Y -26 +KPX quoteright A -130 +KPX quoteright AE -135 +KPX quoteright Aacute -130 +KPX quoteright Adieresis -130 +KPX quoteright Aring -130 +KPX quoteright comma -71 +KPX quoteright d -56 +KPX quoteright o -54 +KPX quoteright period -78 +KPX quoteright r -44 +KPX quoteright s -47 +KPX quoteright t -43 +KPX quoteright v -47 +KPX quoteright w -47 +KPX quoteright y -45 +KPX r a -1 +KPX r aacute -1 +KPX r acircumflex -1 +KPX r adieresis -1 +KPX r ae -3 +KPX r agrave -1 +KPX r aring -1 +KPX r c -8 +KPX r ccedilla -8 +KPX r colon -7 +KPX r comma -41 +KPX r d -10 +KPX r e -6 +KPX r eacute -6 +KPX r ecircumflex -6 +KPX r egrave -6 +KPX r f 19 +KPX r g -15 +KPX r h -6 +KPX r hyphen -46 +KPX r i 20 +KPX r j 14 +KPX r k -10 +KPX r l -18 +KPX r m 20 +KPX r n 22 +KPX r o -8 +KPX r oacute -8 +KPX r ocircumflex -8 +KPX r odieresis -8 +KPX r oe -7 +KPX r ograve -8 +KPX r oslash -7 +KPX r p 25 +KPX r period -48 +KPX r q -10 +KPX r quoteright -19 +KPX r r 26 +KPX r s 0 +KPX r semicolon -7 +KPX r t 23 +KPX r u 19 +KPX r v 20 +KPX r w 19 +KPX r x 17 +KPX r y 22 +KPX r z 2 +KPX s quoteright -38 +KPX s t -15 +KPX seven colon -68 +KPX seven comma -72 +KPX seven eight -40 +KPX seven five -59 +KPX seven four -63 +KPX seven one -56 +KPX seven period -79 +KPX seven seven -20 +KPX seven six -46 +KPX seven three -35 +KPX seven two -31 +KPX six four 12 +KPX six one -74 +KPX six seven -29 +KPX t S 2 +KPX t a 10 +KPX t aacute 10 +KPX t adieresis 10 +KPX t ae 9 +KPX t aring 10 +KPX t colon -8 +KPX t e 0 +KPX t eacute 0 +KPX t h 10 +KPX t o -8 +KPX t oacute -8 +KPX t odieresis -8 +KPX t quoteright -29 +KPX t semicolon -8 +KPX three four -6 +KPX three one -75 +KPX three seven -28 +KPX two four 0 +KPX two one -60 +KPX two seven -16 +KPX u quoteright -36 +KPX v a -24 +KPX v aacute -24 +KPX v acircumflex -24 +KPX v adieresis -24 +KPX v ae -24 +KPX v agrave -24 +KPX v aring -24 +KPX v atilde -24 +KPX v c -37 +KPX v colon -20 +KPX v comma -69 +KPX v e -36 +KPX v eacute -36 +KPX v ecircumflex -36 +KPX v egrave -36 +KPX v g -41 +KPX v hyphen -28 +KPX v l -31 +KPX v o -38 +KPX v oacute -38 +KPX v odieresis -38 +KPX v ograve -38 +KPX v oslash -38 +KPX v period -76 +KPX v s -21 +KPX v semicolon -20 +KPX w a -27 +KPX w aacute -27 +KPX w acircumflex -27 +KPX w adieresis -27 +KPX w ae -27 +KPX w agrave -27 +KPX w aring -27 +KPX w atilde -27 +KPX w c -33 +KPX w colon -23 +KPX w comma -64 +KPX w e -31 +KPX w eacute -31 +KPX w ecircumflex -31 +KPX w egrave -31 +KPX w g -43 +KPX w hyphen -24 +KPX w l -33 +KPX w o -35 +KPX w oacute -35 +KPX w odieresis -35 +KPX w ograve -35 +KPX w oslash -34 +KPX w period -71 +KPX w s -23 +KPX w semicolon -23 +KPX x a -11 +KPX x c -34 +KPX x e -32 +KPX x eacute -32 +KPX x o -45 +KPX x q -26 +KPX y a -32 +KPX y aacute -32 +KPX y acircumflex -32 +KPX y adieresis -32 +KPX y ae -31 +KPX y agrave -32 +KPX y aring -32 +KPX y atilde -32 +KPX y c -37 +KPX y colon -23 +KPX y comma -66 +KPX y e -35 +KPX y eacute -35 +KPX y ecircumflex -35 +KPX y egrave -35 +KPX y g -48 +KPX y hyphen -27 +KPX y l -32 +KPX y o -39 +KPX y oacute -39 +KPX y odieresis -39 +KPX y ograve -39 +KPX y oslash -38 +KPX y period -73 +KPX y s -26 +KPX y semicolon -23 +KPX zero four 12 +KPX zero one -55 +KPX zero seven -5 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n021003l.pfb b/PdfReader/Resources/Fonts/n021003l.pfb new file mode 100644 index 0000000000..9aecb5a72e Binary files /dev/null and b/PdfReader/Resources/Fonts/n021003l.pfb differ diff --git a/PdfReader/Resources/Fonts/n021004l.afm b/PdfReader/Resources/Fonts/n021004l.afm new file mode 100644 index 0000000000..8931279b60 --- /dev/null +++ b/PdfReader/Resources/Fonts/n021004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-Medi +FullName Nimbus Roman No9 L Medium +FamilyName Nimbus Roman No9 L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -168 -341 1000 960 +CapHeight 676 +XHeight 461 +Descender -205 +Ascender 676 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; +C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; +C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; +C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; +C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; +C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; +C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ; +C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; +C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; +C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; +C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; +C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; +C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; +C 49 ; WX 500 ; N one ; B 65 0 442 688 ; +C 50 ; WX 500 ; N two ; B 17 0 478 688 ; +C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; +C 52 ; WX 500 ; N four ; B 19 0 475 688 ; +C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; +C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; +C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; +C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; +C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; +C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; +C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; +C 60 ; WX 570 ; N less ; B 31 -12 539 518 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -12 539 518 ; +C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; +C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; +C 65 ; WX 722 ; N A ; B 9 0 689 690 ; +C 66 ; WX 667 ; N B ; B 16 0 619 676 ; +C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; +C 68 ; WX 722 ; N D ; B 14 0 690 676 ; +C 69 ; WX 667 ; N E ; B 16 0 641 676 ; +C 70 ; WX 611 ; N F ; B 16 0 583 676 ; +C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; +C 72 ; WX 778 ; N H ; B 21 0 759 676 ; +C 73 ; WX 389 ; N I ; B 20 0 370 676 ; +C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; +C 75 ; WX 778 ; N K ; B 30 0 769 676 ; +C 76 ; WX 667 ; N L ; B 19 0 638 676 ; +C 77 ; WX 944 ; N M ; B 14 0 921 676 ; +C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; +C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; +C 80 ; WX 611 ; N P ; B 16 0 600 676 ; +C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; +C 82 ; WX 722 ; N R ; B 26 0 715 676 ; +C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; +C 84 ; WX 667 ; N T ; B 31 0 636 676 ; +C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; +C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; +C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; +C 88 ; WX 722 ; N X ; B 16 0 699 676 ; +C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; +C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; +C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; +C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; +C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; +C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; +C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; +C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; +C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; +C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; +C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; +C 102 ; WX 333 ; N f ; B 14 0 389 691 ; +C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; +C 104 ; WX 556 ; N h ; B 16 0 534 676 ; +C 105 ; WX 278 ; N i ; B 16 0 255 691 ; +C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; +C 107 ; WX 556 ; N k ; B 22 0 543 676 ; +C 108 ; WX 278 ; N l ; B 16 0 255 676 ; +C 109 ; WX 833 ; N m ; B 16 0 814 473 ; +C 110 ; WX 556 ; N n ; B 21 0 539 473 ; +C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; +C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; +C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; +C 114 ; WX 444 ; N r ; B 29 0 434 473 ; +C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; +C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; +C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; +C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; +C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; +C 120 ; WX 500 ; N x ; B 12 0 484 461 ; +C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; +C 122 ; WX 444 ; N z ; B 21 0 420 461 ; +C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; +C 124 ; WX 220 ; N bar ; B 66 -19 154 691 ; +C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; +C 126 ; WX 520 ; N asciitilde ; B 29 175 491 331 ; +C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; +C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; +C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; +C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ; +C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; +C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ; +C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; +C 168 ; WX 500 ; N currency ; B -26 61 526 613 ; +C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; +C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; +C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; +C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; +C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; +C 174 ; WX 556 ; N fi ; B 14 0 536 691 ; +C 175 ; WX 556 ; N fl ; B 14 0 536 691 ; +C 177 ; WX 500 ; N endash ; B 0 181 500 271 ; +C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ; +C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; +C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; +C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; +C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ; +C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; +C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; +C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; +C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; +C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; +C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; +C 193 ; WX 333 ; N grave ; B 8 528 246 713 ; +C 194 ; WX 333 ; N acute ; B 86 528 324 713 ; +C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ; +C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ; +C 197 ; WX 333 ; N macron ; B 1 565 331 637 ; +C 198 ; WX 333 ; N breve ; B 15 528 318 691 ; +C 199 ; WX 333 ; N dotaccent ; B 103 537 232 666 ; +C 200 ; WX 333 ; N dieresis ; B -2 537 337 666 ; +C 202 ; WX 333 ; N ring ; B 60 537 273 750 ; +C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; +C 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ; +C 207 ; WX 333 ; N caron ; B -2 528 335 704 ; +C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; +C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ; +C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; +C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ; +C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; +C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ; +C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; +C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ; +C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; +C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ; +C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ; +C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ; +C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; +C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 876 ; +C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; +C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; +C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; +C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; +C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; +C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; +C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; +C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; +C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; +C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ; +C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ; +C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; +C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; +C -1 ; WX 722 ; N Uring ; B 16 -19 701 960 ; +C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; +C -1 ; WX 444 ; N eogonek ; B 25 -173 444 473 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 666 ; +C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; +C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ; +C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ; +C -1 ; WX 444 ; N edieresis ; B 25 -14 426 666 ; +C -1 ; WX 665 ; N dcaron ; B 25 -14 665 691 ; +C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; +C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; +C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; +C -1 ; WX 500 ; N aogonek ; B 25 -173 500 473 ; +C -1 ; WX 500 ; N aring ; B 25 -14 488 750 ; +C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ; +C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; +C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ; +C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ; +C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ; +C -1 ; WX 500 ; N adieresis ; B 25 -14 488 666 ; +C -1 ; WX 722 ; N Uogonek ; B 16 -173 701 676 ; +C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; +C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ; +C -1 ; WX 556 ; N udieresis ; B 16 -14 537 666 ; +C -1 ; WX 400 ; N tcaron ; B 20 -12 400 691 ; +C -1 ; WX 389 ; N scommaaccent ; B 25 -341 361 473 ; +C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; +C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; +C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; +C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 876 ; +C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ; +C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; +C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; +C -1 ; WX 667 ; N Tcommaaccent ; B 31 -341 636 676 ; +C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 876 ; +C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ; +C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; +C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; +C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; +C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 876 ; +C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; +C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; +C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 638 691 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; +C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 876 ; +C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; +C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 509 713 ; +C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ; +C -1 ; WX 500 ; N Euro ; B -36 -24 478 671 ; +C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; +C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; +C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; +C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; +C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; +C -1 ; WX 389 ; N Iogonek ; B 20 -173 505 676 ; +C -1 ; WX 389 ; N Idieresis ; B 20 0 370 876 ; +C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; +C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; +C -1 ; WX 778 ; N Kcommaaccent ; B 30 -341 769 676 ; +C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ; +C -1 ; WX 556 ; N Scommaaccent ; B 35 -341 513 692 ; +C -1 ; WX 667 ; N Eogonek ; B 16 -173 737 676 ; +C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ; +C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 876 ; +C -1 ; WX 278 ; N iogonek ; B 16 -173 388 691 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 811 ; +C -1 ; WX 500 ; N odieresis ; B 25 -14 476 666 ; +C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ; +C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; +C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; +C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; +C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; +C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; +C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ; +C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 37 -341 755 691 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 26 -341 715 676 ; +C -1 ; WX 667 ; N Edieresis ; B 16 0 641 876 ; +C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; +C -1 ; WX 556 ; N uogonek ; B 16 -173 556 461 ; +C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; +C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; +C -1 ; WX 396 ; N lcaron ; B 16 0 396 691 ; +C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; +C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; +C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; +C -1 ; WX 400 ; N degree ; B 57 402 343 688 ; +C -1 ; WX 722 ; N Aogonek ; B 9 -173 822 690 ; +C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; +C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ; +C -1 ; WX 722 ; N Aring ; B 9 0 689 948 ; +C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ; +C -1 ; WX 444 ; N rcommaaccent ; B 29 -341 434 473 ; +C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; +C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; +C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ; +C -1 ; WX 278 ; N icircumflex ; B -36 0 301 704 ; +C -1 ; WX 278 ; N igrave ; B -26 0 255 713 ; +C -1 ; WX 556 ; N ncommaaccent ; B 21 -341 539 473 ; +C -1 ; WX 278 ; N lcommaaccent ; B 16 -341 255 676 ; +C -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ; +C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; +C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; +C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; +C -1 ; WX 278 ; N iacute ; B 16 0 290 713 ; +C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; +C -1 ; WX 556 ; N kcommaaccent ; B 22 -341 543 676 ; +C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; +C -1 ; WX 278 ; N imacron ; B -27 0 303 637 ; +C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; +C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; +C -1 ; WX 333 ; N tcommaaccent ; B 20 -341 332 630 ; +C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 666 ; +C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 666 ; +C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ; +C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; +C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 537 713 ; +C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ; +C -1 ; WX 556 ; N uring ; B 16 -14 537 750 ; +C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; +C -1 ; WX 333 ; N commaaccent ; B 84 -341 249 -40 ; +C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ; +C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ; +C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; +C -1 ; WX 278 ; N idieresis ; B -36 0 303 666 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ; +C -1 ; WX 549 ; N radical ; B -17 -35 535 916 ; +C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ; +C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ; +C -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 16 -20 472 743 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 16 -341 701 676 ; +C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; +C -1 ; WX 220 ; N brokenbar ; B 66 -19 154 691 ; +C -1 ; WX 667 ; N Lcommaaccent ; B 19 -341 638 676 ; +C -1 ; WX 722 ; N Adieresis ; B 9 0 689 876 ; +C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -73 +KPX A Ccedilla -77 +KPX A G -68 +KPX A O -68 +KPX A Odieresis -68 +KPX A Q -68 +KPX A T -59 +KPX A U -66 +KPX A Uacute -66 +KPX A Ucircumflex -66 +KPX A Udieresis -66 +KPX A Ugrave -66 +KPX A V -130 +KPX A W -116 +KPX A Y -74 +KPX A a -5 +KPX A b -22 +KPX A c -35 +KPX A ccedilla -43 +KPX A comma 1 +KPX A d -28 +KPX A e -32 +KPX A g -7 +KPX A guillemotleft -53 +KPX A guilsinglleft -67 +KPX A hyphen -30 +KPX A o -37 +KPX A period 0 +KPX A q -38 +KPX A quotedblright -76 +KPX A quoteright -108 +KPX A t -27 +KPX A u -30 +KPX A v -84 +KPX A w -79 +KPX A y -83 +KPX Aacute C -73 +KPX Aacute G -68 +KPX Aacute O -68 +KPX Aacute Q -68 +KPX Aacute T -59 +KPX Aacute U -66 +KPX Aacute V -130 +KPX Aacute W -116 +KPX Aacute Y -74 +KPX Aacute a -5 +KPX Aacute b -22 +KPX Aacute c -35 +KPX Aacute comma 1 +KPX Aacute d -28 +KPX Aacute e -32 +KPX Aacute g -7 +KPX Aacute guillemotleft -53 +KPX Aacute guilsinglleft -67 +KPX Aacute hyphen -30 +KPX Aacute o -37 +KPX Aacute period 0 +KPX Aacute q -38 +KPX Aacute quoteright -108 +KPX Aacute t -27 +KPX Aacute u -30 +KPX Aacute v -84 +KPX Aacute w -79 +KPX Aacute y -83 +KPX Acircumflex C -73 +KPX Acircumflex G -68 +KPX Acircumflex O -68 +KPX Acircumflex Q -68 +KPX Acircumflex T -59 +KPX Acircumflex U -66 +KPX Acircumflex V -130 +KPX Acircumflex W -116 +KPX Acircumflex Y -74 +KPX Acircumflex comma 1 +KPX Acircumflex period 0 +KPX Adieresis C -73 +KPX Adieresis G -68 +KPX Adieresis O -68 +KPX Adieresis Q -68 +KPX Adieresis T -59 +KPX Adieresis U -66 +KPX Adieresis V -130 +KPX Adieresis W -116 +KPX Adieresis Y -74 +KPX Adieresis a -5 +KPX Adieresis b -22 +KPX Adieresis c -35 +KPX Adieresis comma 1 +KPX Adieresis d -28 +KPX Adieresis g -7 +KPX Adieresis guillemotleft -53 +KPX Adieresis guilsinglleft -67 +KPX Adieresis hyphen -30 +KPX Adieresis o -37 +KPX Adieresis period 0 +KPX Adieresis q -38 +KPX Adieresis quotedblright -76 +KPX Adieresis quoteright -108 +KPX Adieresis t -27 +KPX Adieresis u -30 +KPX Adieresis v -84 +KPX Adieresis w -79 +KPX Adieresis y -83 +KPX Agrave C -73 +KPX Agrave G -68 +KPX Agrave O -68 +KPX Agrave Q -68 +KPX Agrave T -59 +KPX Agrave U -66 +KPX Agrave V -130 +KPX Agrave W -116 +KPX Agrave Y -74 +KPX Agrave comma 1 +KPX Agrave period 0 +KPX Aring C -73 +KPX Aring G -68 +KPX Aring O -68 +KPX Aring Q -68 +KPX Aring T -59 +KPX Aring U -66 +KPX Aring V -130 +KPX Aring W -116 +KPX Aring Y -74 +KPX Aring a -5 +KPX Aring b -22 +KPX Aring c -35 +KPX Aring comma 1 +KPX Aring d -28 +KPX Aring e -32 +KPX Aring g -7 +KPX Aring guillemotleft -53 +KPX Aring guilsinglleft -67 +KPX Aring hyphen -30 +KPX Aring o -37 +KPX Aring period 0 +KPX Aring q -38 +KPX Aring quotedblright -76 +KPX Aring quoteright -108 +KPX Aring t -27 +KPX Aring u -30 +KPX Aring v -84 +KPX Aring w -79 +KPX Aring y -83 +KPX Atilde C -73 +KPX Atilde G -68 +KPX Atilde O -68 +KPX Atilde Q -68 +KPX Atilde T -59 +KPX Atilde U -66 +KPX Atilde V -130 +KPX Atilde W -116 +KPX Atilde Y -74 +KPX Atilde comma 1 +KPX Atilde period 0 +KPX B A -34 +KPX B AE -32 +KPX B Aacute -34 +KPX B Acircumflex -34 +KPX B Adieresis -34 +KPX B Aring -34 +KPX B Atilde -34 +KPX B O -12 +KPX B OE -4 +KPX B Oacute -12 +KPX B Ocircumflex -12 +KPX B Odieresis -12 +KPX B Ograve -12 +KPX B Oslash -11 +KPX B V -45 +KPX B W -46 +KPX B Y -44 +KPX C A -25 +KPX C AE -22 +KPX C Aacute -25 +KPX C Adieresis -25 +KPX C Aring -25 +KPX C H -2 +KPX C K -6 +KPX C O -14 +KPX C Oacute -14 +KPX C Odieresis -14 +KPX Ccedilla A -33 +KPX D A -55 +KPX D Aacute -55 +KPX D Acircumflex -55 +KPX D Adieresis -55 +KPX D Agrave -55 +KPX D Aring -55 +KPX D Atilde -55 +KPX D J -40 +KPX D T -7 +KPX D V -60 +KPX D W -50 +KPX D X -51 +KPX D Y -59 +KPX F A -79 +KPX F Aacute -79 +KPX F Acircumflex -79 +KPX F Adieresis -79 +KPX F Agrave -79 +KPX F Aring -79 +KPX F Atilde -79 +KPX F J -42 +KPX F O -7 +KPX F Odieresis -7 +KPX F a -50 +KPX F aacute -50 +KPX F adieresis -22 +KPX F ae -53 +KPX F aring -50 +KPX F comma -59 +KPX F e -51 +KPX F eacute -51 +KPX F hyphen -34 +KPX F i -1 +KPX F j -26 +KPX F o -54 +KPX F oacute -54 +KPX F odieresis -24 +KPX F oe -51 +KPX F oslash -53 +KPX F period -60 +KPX F r -7 +KPX F u -10 +KPX G A -27 +KPX G AE -24 +KPX G Aacute -27 +KPX G Acircumflex -27 +KPX G Adieresis -27 +KPX G Agrave -27 +KPX G Aring -27 +KPX G Atilde -27 +KPX G T -41 +KPX G V -33 +KPX G W -35 +KPX G Y -33 +KPX J A -30 +KPX J AE -27 +KPX J Adieresis -30 +KPX J Aring -30 +KPX K C -61 +KPX K G -56 +KPX K O -56 +KPX K OE -46 +KPX K Oacute -56 +KPX K Odieresis -56 +KPX K S 13 +KPX K T -2 +KPX K a 6 +KPX K adieresis 6 +KPX K ae 3 +KPX K aring 6 +KPX K e -20 +KPX K hyphen -47 +KPX K o -25 +KPX K oacute -25 +KPX K odieresis -25 +KPX K u -18 +KPX K udieresis -18 +KPX K y -83 +KPX L A -1 +KPX L AE 1 +KPX L Aacute -1 +KPX L Adieresis -1 +KPX L Aring -1 +KPX L C -11 +KPX L Ccedilla -14 +KPX L G -5 +KPX L O -5 +KPX L Oacute -5 +KPX L Ocircumflex -5 +KPX L Odieresis -5 +KPX L Ograve -5 +KPX L Otilde -5 +KPX L S 2 +KPX L T -74 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -106 +KPX L W -87 +KPX L Y -89 +KPX L hyphen 24 +KPX L quotedblright -37 +KPX L quoteright -69 +KPX L u -11 +KPX L udieresis -12 +KPX L y -49 +KPX N A -19 +KPX N AE -16 +KPX N Aacute -19 +KPX N Adieresis -19 +KPX N Aring -19 +KPX N C -22 +KPX N Ccedilla -22 +KPX N G -16 +KPX N O -15 +KPX N Oacute -15 +KPX N Odieresis -15 +KPX N a -16 +KPX N aacute -16 +KPX N adieresis -16 +KPX N ae -18 +KPX N aring -16 +KPX N comma 1 +KPX N e -13 +KPX N eacute -13 +KPX N o -16 +KPX N oacute -16 +KPX N odieresis -16 +KPX N oslash -15 +KPX N period 0 +KPX N u -17 +KPX N udieresis -17 +KPX O A -55 +KPX O AE -54 +KPX O Aacute -55 +KPX O Adieresis -55 +KPX O Aring -55 +KPX O T -9 +KPX O V -60 +KPX O W -54 +KPX O X -51 +KPX O Y -59 +KPX Oacute A -55 +KPX Oacute T -9 +KPX Oacute V -60 +KPX Oacute W -54 +KPX Oacute Y -59 +KPX Ocircumflex T -9 +KPX Ocircumflex V -60 +KPX Ocircumflex Y -59 +KPX Odieresis A -55 +KPX Odieresis T -9 +KPX Odieresis V -60 +KPX Odieresis W -54 +KPX Odieresis X -51 +KPX Odieresis Y -59 +KPX Ograve T -9 +KPX Ograve V -60 +KPX Ograve Y -59 +KPX Oslash A -52 +KPX Otilde T -9 +KPX Otilde V -60 +KPX Otilde Y -59 +KPX P A -81 +KPX P AE -94 +KPX P Aacute -81 +KPX P Adieresis -81 +KPX P Aring -81 +KPX P J -68 +KPX P a -19 +KPX P aacute -19 +KPX P adieresis -19 +KPX P ae -22 +KPX P aring -19 +KPX P comma -85 +KPX P e -29 +KPX P eacute -29 +KPX P hyphen -39 +KPX P o -33 +KPX P oacute -33 +KPX P odieresis -22 +KPX P oe -30 +KPX P oslash -33 +KPX P period -86 +KPX R C -36 +KPX R Ccedilla -37 +KPX R G -30 +KPX R O -29 +KPX R OE -22 +KPX R Oacute -29 +KPX R Odieresis -29 +KPX R T -26 +KPX R U -37 +KPX R Udieresis -37 +KPX R V -53 +KPX R W -55 +KPX R Y -53 +KPX R a 7 +KPX R aacute 7 +KPX R adieresis 7 +KPX R ae 4 +KPX R aring 7 +KPX R e -19 +KPX R eacute -19 +KPX R hyphen -30 +KPX R o -24 +KPX R oacute -24 +KPX R odieresis -24 +KPX R oe -21 +KPX R u -17 +KPX R uacute -17 +KPX R udieresis -17 +KPX R y -27 +KPX S A -24 +KPX S AE -21 +KPX S Aacute -24 +KPX S Adieresis -24 +KPX S Aring -24 +KPX S T -16 +KPX S V -9 +KPX S W -10 +KPX S Y -8 +KPX S t -10 +KPX T A -46 +KPX T AE -44 +KPX T Aacute -46 +KPX T Acircumflex -46 +KPX T Adieresis -46 +KPX T Agrave -46 +KPX T Aring -46 +KPX T Atilde -46 +KPX T C -17 +KPX T G -11 +KPX T J -43 +KPX T O -9 +KPX T OE -3 +KPX T Oacute -9 +KPX T Ocircumflex -9 +KPX T Odieresis -9 +KPX T Ograve -9 +KPX T Oslash -11 +KPX T Otilde -9 +KPX T S -2 +KPX T V 11 +KPX T W 9 +KPX T Y 11 +KPX T a -65 +KPX T ae -69 +KPX T c -88 +KPX T colon -85 +KPX T comma -63 +KPX T e -85 +KPX T g -68 +KPX T guillemotleft -99 +KPX T guilsinglleft -113 +KPX T hyphen -73 +KPX T i -16 +KPX T j -40 +KPX T o -88 +KPX T oslash -87 +KPX T period -64 +KPX T r -61 +KPX T s -59 +KPX T semicolon -85 +KPX T u -89 +KPX T v -106 +KPX T w -107 +KPX T y -104 +KPX U A -54 +KPX U AE -52 +KPX U Aacute -54 +KPX U Acircumflex -54 +KPX U Adieresis -54 +KPX U Aring -54 +KPX U Atilde -54 +KPX U comma -17 +KPX U m -23 +KPX U n -25 +KPX U p -28 +KPX U period -18 +KPX U r -29 +KPX Uacute A -54 +KPX Uacute comma -17 +KPX Uacute m -23 +KPX Uacute n -25 +KPX Uacute p -28 +KPX Uacute period -18 +KPX Uacute r -29 +KPX Ucircumflex A -54 +KPX Udieresis A -54 +KPX Udieresis b 10 +KPX Udieresis comma -17 +KPX Udieresis m -23 +KPX Udieresis n -25 +KPX Udieresis p -28 +KPX Udieresis period -18 +KPX Udieresis r -29 +KPX Ugrave A -54 +KPX V A -113 +KPX V AE -113 +KPX V Aacute -113 +KPX V Acircumflex -113 +KPX V Adieresis -113 +KPX V Agrave -113 +KPX V Aring -113 +KPX V Atilde -113 +KPX V C -70 +KPX V G -64 +KPX V O -63 +KPX V Oacute -63 +KPX V Ocircumflex -63 +KPX V Odieresis -63 +KPX V Ograve -63 +KPX V Oslash -65 +KPX V Otilde -63 +KPX V S -25 +KPX V T 8 +KPX V a -87 +KPX V ae -90 +KPX V colon -94 +KPX V comma -94 +KPX V e -86 +KPX V g -86 +KPX V guillemotleft -98 +KPX V guilsinglleft -112 +KPX V hyphen -68 +KPX V i -13 +KPX V o -89 +KPX V oslash -87 +KPX V period -95 +KPX V r -60 +KPX V semicolon -94 +KPX V u -58 +KPX V y -56 +KPX W A -98 +KPX W AE -102 +KPX W Aacute -98 +KPX W Acircumflex -98 +KPX W Adieresis -98 +KPX W Agrave -98 +KPX W Aring -98 +KPX W Atilde -98 +KPX W C -58 +KPX W G -52 +KPX W O -51 +KPX W Oacute -51 +KPX W Ocircumflex -51 +KPX W Odieresis -51 +KPX W Ograve -51 +KPX W Oslash -50 +KPX W Otilde -51 +KPX W S -24 +KPX W T 9 +KPX W a -70 +KPX W ae -73 +KPX W colon -81 +KPX W comma -72 +KPX W e -67 +KPX W g -70 +KPX W guillemotleft -79 +KPX W guilsinglleft -93 +KPX W hyphen -49 +KPX W i -12 +KPX W o -70 +KPX W oslash -69 +KPX W period -73 +KPX W r -49 +KPX W semicolon -80 +KPX W u -45 +KPX W y -44 +KPX X C -63 +KPX X O -56 +KPX X Odieresis -56 +KPX X Q -57 +KPX X a 0 +KPX X e -27 +KPX X hyphen -43 +KPX X o -32 +KPX X u -25 +KPX X y -90 +KPX Y A -64 +KPX Y AE -62 +KPX Y Aacute -64 +KPX Y Acircumflex -64 +KPX Y Adieresis -64 +KPX Y Agrave -64 +KPX Y Aring -64 +KPX Y Atilde -64 +KPX Y C -71 +KPX Y G -65 +KPX Y O -64 +KPX Y Oacute -64 +KPX Y Ocircumflex -64 +KPX Y Odieresis -64 +KPX Y Ograve -64 +KPX Y Oslash -68 +KPX Y Otilde -64 +KPX Y S -26 +KPX Y T 7 +KPX Y a -83 +KPX Y ae -87 +KPX Y colon -103 +KPX Y comma -80 +KPX Y e -93 +KPX Y g -86 +KPX Y guillemotleft -111 +KPX Y guilsinglleft -125 +KPX Y hyphen -87 +KPX Y i -14 +KPX Y o -96 +KPX Y oslash -95 +KPX Y p -72 +KPX Y period -81 +KPX Y semicolon -103 +KPX Y u -76 +KPX Y v -78 +KPX Z v -45 +KPX Z y -44 +KPX a j -39 +KPX a quoteright -34 +KPX a v -39 +KPX a w -40 +KPX a y -44 +KPX aacute v -39 +KPX aacute w -40 +KPX aacute y -44 +KPX adieresis v -39 +KPX adieresis w -40 +KPX adieresis y -44 +KPX ae v -34 +KPX ae w -35 +KPX ae y -37 +KPX agrave v -39 +KPX agrave w -40 +KPX agrave y -44 +KPX aring v -39 +KPX aring w -40 +KPX aring y -44 +KPX b v -39 +KPX b w -40 +KPX b y -42 +KPX c h -17 +KPX c k -18 +KPX comma one -12 +KPX comma quotedblright 9 +KPX comma quoteright -23 +KPX e quoteright -19 +KPX e t -10 +KPX e v -29 +KPX e w -30 +KPX e x -19 +KPX e y -31 +KPX eacute v -29 +KPX eacute w -30 +KPX eacute y -31 +KPX ecircumflex v -29 +KPX ecircumflex w -30 +KPX ecircumflex y -31 +KPX eight four 11 +KPX eight one -19 +KPX eight seven 0 +KPX f a -17 +KPX f aacute -17 +KPX f adieresis 14 +KPX f ae -21 +KPX f aring -15 +KPX f e -29 +KPX f eacute -29 +KPX f f 12 +KPX f i 22 +KPX f j -1 +KPX f l 33 +KPX f o -32 +KPX f oacute -32 +KPX f odieresis 11 +KPX f oe -29 +KPX f oslash -31 +KPX f quoteright 18 +KPX f s -8 +KPX f t -3 +KPX five four 1 +KPX five one -28 +KPX five seven -9 +KPX four four 13 +KPX four one -35 +KPX four seven -16 +KPX g a -15 +KPX g adieresis -15 +KPX g ae -18 +KPX g aring -15 +KPX g e -20 +KPX g eacute -20 +KPX g l 0 +KPX g oacute -20 +KPX g odieresis -20 +KPX g r 1 +KPX guillemotright A -40 +KPX guillemotright AE -46 +KPX guillemotright Aacute -40 +KPX guillemotright Adieresis -40 +KPX guillemotright Aring -40 +KPX guillemotright T -100 +KPX guillemotright V -102 +KPX guillemotright W -84 +KPX guillemotright Y -106 +KPX guilsinglright A -54 +KPX guilsinglright AE -60 +KPX guilsinglright Aacute -54 +KPX guilsinglright Adieresis -54 +KPX guilsinglright Aring -54 +KPX guilsinglright T -114 +KPX guilsinglright V -116 +KPX guilsinglright W -98 +KPX guilsinglright Y -120 +KPX h quoteright -30 +KPX h y -34 +KPX hyphen A -18 +KPX hyphen AE -24 +KPX hyphen Aacute -18 +KPX hyphen Adieresis -18 +KPX hyphen Aring -18 +KPX hyphen T -74 +KPX hyphen V -72 +KPX hyphen W -54 +KPX hyphen Y -83 +KPX i T -18 +KPX i j -36 +KPX k a -3 +KPX k aacute -3 +KPX k adieresis -3 +KPX k ae -7 +KPX k aring -3 +KPX k comma 0 +KPX k e -33 +KPX k eacute -33 +KPX k g -4 +KPX k hyphen -47 +KPX k o -38 +KPX k oacute -38 +KPX k odieresis -38 +KPX k period 0 +KPX k s 5 +KPX k u -5 +KPX k udieresis -5 +KPX l v -22 +KPX l y -19 +KPX m p -16 +KPX m v -32 +KPX m w -33 +KPX m y -33 +KPX n T -56 +KPX n p -14 +KPX n quoteright -28 +KPX n v -31 +KPX n w -32 +KPX n y -32 +KPX nine four 2 +KPX nine one -26 +KPX nine seven 10 +KPX o T -88 +KPX o quoteright -27 +KPX o t -10 +KPX o v -42 +KPX o w -38 +KPX o x -29 +KPX o y -42 +KPX oacute v -42 +KPX oacute w -38 +KPX oacute y -42 +KPX ocircumflex t -10 +KPX odieresis t -10 +KPX odieresis v -42 +KPX odieresis w -38 +KPX odieresis x -29 +KPX odieresis y -42 +KPX ograve v -42 +KPX ograve w -38 +KPX ograve y -42 +KPX one comma -16 +KPX one eight -34 +KPX one five -16 +KPX one four -56 +KPX one nine -9 +KPX one one -27 +KPX one period -17 +KPX one seven -56 +KPX one six -47 +KPX one three -10 +KPX one two -2 +KPX one zero -35 +KPX p t -11 +KPX p y -34 +KPX period one -21 +KPX period quotedblright 5 +KPX period quoteright -27 +KPX q c -13 +KPX q u -15 +KPX quotedblbase A 19 +KPX quotedblbase AE 20 +KPX quotedblbase T -59 +KPX quotedblbase V -98 +KPX quotedblbase W -75 +KPX quotedblbase Y -73 +KPX quotedblleft A -59 +KPX quotedblleft AE -78 +KPX quotedblleft Aacute -59 +KPX quotedblleft Adieresis -59 +KPX quotedblleft Aring -59 +KPX quotedblleft T 9 +KPX quotedblleft V 15 +KPX quotedblleft W 13 +KPX quotedblleft Y 15 +KPX quotedblright A -72 +KPX quotedblright AE -91 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T 4 +KPX quotedblright V 5 +KPX quotedblright W 4 +KPX quotedblright Y 6 +KPX quoteleft A -92 +KPX quoteleft AE -111 +KPX quoteleft Aacute -92 +KPX quoteleft Adieresis -92 +KPX quoteleft Aring -92 +KPX quoteleft T -22 +KPX quoteleft V -17 +KPX quoteleft W -19 +KPX quoteleft Y -17 +KPX quoteright A -91 +KPX quoteright AE -110 +KPX quoteright Aacute -91 +KPX quoteright Adieresis -91 +KPX quoteright Aring -91 +KPX quoteright comma -34 +KPX quoteright d -31 +KPX quoteright o -34 +KPX quoteright period -35 +KPX quoteright r -26 +KPX quoteright s -17 +KPX quoteright t -19 +KPX quoteright v -25 +KPX quoteright w -23 +KPX quoteright y -22 +KPX r a -6 +KPX r aacute -6 +KPX r acircumflex -6 +KPX r adieresis -6 +KPX r ae -8 +KPX r agrave -6 +KPX r aring -6 +KPX r c -15 +KPX r ccedilla -10 +KPX r colon -16 +KPX r comma -67 +KPX r d -13 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f 11 +KPX r g -5 +KPX r h -15 +KPX r hyphen -18 +KPX r i 6 +KPX r j -12 +KPX r k -15 +KPX r l -14 +KPX r m 6 +KPX r n 4 +KPX r o -14 +KPX r oacute -14 +KPX r ocircumflex -14 +KPX r odieresis -14 +KPX r oe -12 +KPX r ograve -14 +KPX r oslash -14 +KPX r p 4 +KPX r period -68 +KPX r q -15 +KPX r quoteright -8 +KPX r r 0 +KPX r s 0 +KPX r semicolon -16 +KPX r t 9 +KPX r u 9 +KPX r v 8 +KPX r w 7 +KPX r x 11 +KPX r y 9 +KPX r z -1 +KPX s quoteright -17 +KPX s t -7 +KPX seven colon -64 +KPX seven comma -57 +KPX seven eight -18 +KPX seven five -34 +KPX seven four -54 +KPX seven one -25 +KPX seven period -58 +KPX seven seven -6 +KPX seven six -37 +KPX seven three -20 +KPX seven two -21 +KPX six four 13 +KPX six one -43 +KPX six seven -7 +KPX t S 11 +KPX t a 11 +KPX t aacute 11 +KPX t adieresis 11 +KPX t ae 7 +KPX t aring 11 +KPX t colon -12 +KPX t e -1 +KPX t eacute -1 +KPX t h -4 +KPX t o -4 +KPX t oacute -4 +KPX t odieresis -4 +KPX t quoteright -31 +KPX t semicolon -12 +KPX three four 9 +KPX three one -33 +KPX three seven -15 +KPX two four 14 +KPX two one -29 +KPX two seven -7 +KPX u quoteright -25 +KPX v a -23 +KPX v aacute -23 +KPX v acircumflex -23 +KPX v adieresis -23 +KPX v ae -25 +KPX v agrave -23 +KPX v aring -23 +KPX v atilde -23 +KPX v c -40 +KPX v colon -23 +KPX v comma -56 +KPX v e -35 +KPX v eacute -35 +KPX v ecircumflex -35 +KPX v egrave -35 +KPX v g -22 +KPX v hyphen -27 +KPX v l -16 +KPX v o -40 +KPX v oacute -40 +KPX v odieresis -40 +KPX v ograve -40 +KPX v oslash -39 +KPX v period -57 +KPX v s -16 +KPX v semicolon -23 +KPX w a -23 +KPX w aacute -23 +KPX w acircumflex -23 +KPX w adieresis -23 +KPX w ae -25 +KPX w agrave -23 +KPX w aring -23 +KPX w atilde -23 +KPX w c -36 +KPX w colon -23 +KPX w comma -50 +KPX w e -33 +KPX w eacute -33 +KPX w ecircumflex -33 +KPX w egrave -33 +KPX w g -22 +KPX w hyphen -23 +KPX w l -16 +KPX w o -36 +KPX w oacute -36 +KPX w odieresis -36 +KPX w ograve -36 +KPX w oslash -35 +KPX w period -51 +KPX w s -16 +KPX w semicolon -23 +KPX x a -2 +KPX x c -30 +KPX x e -27 +KPX x eacute -27 +KPX x o -30 +KPX x q -32 +KPX y a -32 +KPX y aacute -32 +KPX y acircumflex -32 +KPX y adieresis -32 +KPX y ae -34 +KPX y agrave -32 +KPX y aring -32 +KPX y atilde -32 +KPX y c -42 +KPX y colon -28 +KPX y comma -56 +KPX y e -40 +KPX y eacute -40 +KPX y ecircumflex -40 +KPX y egrave -40 +KPX y g -31 +KPX y hyphen -29 +KPX y l -19 +KPX y o -42 +KPX y oacute -42 +KPX y odieresis -42 +KPX y ograve -42 +KPX y oslash -41 +KPX y period -57 +KPX y s -24 +KPX y semicolon -28 +KPX zero four 11 +KPX zero one -31 +KPX zero seven 7 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n021004l.pfb b/PdfReader/Resources/Fonts/n021004l.pfb new file mode 100644 index 0000000000..83c8068750 Binary files /dev/null and b/PdfReader/Resources/Fonts/n021004l.pfb differ diff --git a/PdfReader/Resources/Fonts/n021023l.afm b/PdfReader/Resources/Fonts/n021023l.afm new file mode 100644 index 0000000000..8454d36a0c --- /dev/null +++ b/PdfReader/Resources/Fonts/n021023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-ReguItal +FullName Nimbus Roman No9 L Regular Italic +FamilyName Nimbus Roman No9 L +Weight Regular +ItalicAngle -15.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -169 -270 1010 924 +CapHeight 653 +XHeight 432 +Descender -205 +Ascender 683 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; +C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; +C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; +C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; +C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; +C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; +C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ; +C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; +C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; +C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; +C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; +C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; +C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; +C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; +C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; +C 49 ; WX 500 ; N one ; B 49 0 409 676 ; +C 50 ; WX 500 ; N two ; B 12 0 452 676 ; +C 51 ; WX 500 ; N three ; B 15 -7 466 676 ; +C 52 ; WX 500 ; N four ; B 1 0 479 676 ; +C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; +C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; +C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; +C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; +C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; +C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; +C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; +C 60 ; WX 675 ; N less ; B 84 -10 592 516 ; +C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; +C 62 ; WX 675 ; N greater ; B 84 -10 592 516 ; +C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; +C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; +C 65 ; WX 611 ; N A ; B -51 0 564 668 ; +C 66 ; WX 611 ; N B ; B -8 0 588 653 ; +C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; +C 68 ; WX 722 ; N D ; B -8 0 700 653 ; +C 69 ; WX 611 ; N E ; B -1 0 634 653 ; +C 70 ; WX 611 ; N F ; B 8 0 645 653 ; +C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; +C 72 ; WX 722 ; N H ; B -8 0 767 653 ; +C 73 ; WX 333 ; N I ; B -8 0 384 653 ; +C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; +C 75 ; WX 667 ; N K ; B 7 0 722 653 ; +C 76 ; WX 556 ; N L ; B -8 0 559 653 ; +C 77 ; WX 833 ; N M ; B -18 0 873 653 ; +C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; +C 79 ; WX 722 ; N O ; B 60 -18 706 666 ; +C 80 ; WX 611 ; N P ; B 0 0 605 653 ; +C 81 ; WX 722 ; N Q ; B 59 -183 699 666 ; +C 82 ; WX 611 ; N R ; B -13 0 588 653 ; +C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; +C 84 ; WX 556 ; N T ; B 59 0 633 653 ; +C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; +C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; +C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; +C 88 ; WX 611 ; N X ; B -29 0 655 653 ; +C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; +C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; +C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; +C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; +C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; +C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; +C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; +C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; +C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; +C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; +C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; +C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; +C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; +C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; +C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; +C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; +C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; +C 108 ; WX 278 ; N l ; B 40 -11 279 683 ; +C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; +C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; +C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; +C 112 ; WX 500 ; N p ; B -75 -205 469 442 ; +C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; +C 114 ; WX 389 ; N r ; B 45 0 412 441 ; +C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; +C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; +C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; +C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; +C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; +C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; +C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; +C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; +C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; +C 124 ; WX 275 ; N bar ; B 105 -18 171 666 ; +C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; +C 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 ; +C 161 ; WX 389 ; N exclamdown ; B 59 -205 321 474 ; +C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; +C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; +C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ; +C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; +C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ; +C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; +C 168 ; WX 500 ; N currency ; B -22 53 522 597 ; +C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; +C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; +C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; +C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; +C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; +C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ; +C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ; +C 177 ; WX 500 ; N endash ; B -6 197 505 243 ; +C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ; +C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; +C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; +C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ; +C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; +C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; +C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; +C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; +C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; +C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; +C 191 ; WX 500 ; N questiondown ; B 28 -205 367 473 ; +C 193 ; WX 333 ; N grave ; B 121 492 311 664 ; +C 194 ; WX 333 ; N acute ; B 180 494 403 664 ; +C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ; +C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ; +C 197 ; WX 333 ; N macron ; B 99 532 411 583 ; +C 198 ; WX 333 ; N breve ; B 117 492 418 650 ; +C 199 ; WX 333 ; N dotaccent ; B 207 508 305 606 ; +C 200 ; WX 333 ; N dieresis ; B 107 508 405 606 ; +C 202 ; WX 333 ; N ring ; B 155 508 355 707 ; +C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; +C 206 ; WX 333 ; N ogonek ; B -20 -169 200 40 ; +C 207 ; WX 333 ; N caron ; B 121 492 426 661 ; +C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ; +C 225 ; WX 889 ; N AE ; B -27 0 911 653 ; +C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; +C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ; +C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; +C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ; +C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; +C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ; +C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; +C 248 ; WX 278 ; N lslash ; B 37 -11 307 683 ; +C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ; +C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ; +C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; +C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; +C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; +C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; +C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; +C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; +C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; +C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; +C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; +C -1 ; WX 722 ; N Otilde ; B 60 -18 706 836 ; +C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; +C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ; +C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ; +C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; +C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; +C -1 ; WX 722 ; N Uring ; B 102 -18 765 919 ; +C -1 ; WX 500 ; N gbreve ; B 8 -206 502 650 ; +C -1 ; WX 444 ; N eogonek ; B 31 -169 444 441 ; +C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; +C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; +C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; +C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ; +C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ; +C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; +C -1 ; WX 521 ; N dcaron ; B 15 -13 641 683 ; +C -1 ; WX 444 ; N ccedilla ; B 26 -217 425 441 ; +C -1 ; WX 444 ; N ccaron ; B 30 -11 484 661 ; +C -1 ; WX 444 ; N cacute ; B 30 -11 458 664 ; +C -1 ; WX 500 ; N aogonek ; B 17 -169 500 441 ; +C -1 ; WX 500 ; N aring ; B 17 -11 476 707 ; +C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ; +C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; +C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ; +C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ; +C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ; +C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; +C -1 ; WX 722 ; N Uogonek ; B 102 -169 765 653 ; +C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; +C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ; +C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; +C -1 ; WX 278 ; N tcaron ; B 37 -11 378 666 ; +C -1 ; WX 389 ; N scommaaccent ; B 16 -270 366 442 ; +C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; +C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; +C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; +C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; +C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; +C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ; +C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; +C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; +C -1 ; WX 556 ; N Tcommaaccent ; B 59 -270 633 653 ; +C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; +C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ; +C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; +C -1 ; WX 722 ; N Ograve ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Oacute ; B 60 -18 706 876 ; +C -1 ; WX 722 ; N Odieresis ; B 60 -18 706 818 ; +C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; +C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; +C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; +C -1 ; WX 556 ; N Lcaron ; B -8 0 596 666 ; +C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; +C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; +C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; +C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 570 664 ; +C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ; +C -1 ; WX 500 ; N Euro ; B 57 0 668 693 ; +C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; +C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; +C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; +C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; +C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ; +C -1 ; WX 333 ; N Iacute ; B -8 0 403 876 ; +C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; +C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; +C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; +C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; +C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 7 -270 722 653 ; +C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ; +C -1 ; WX 500 ; N Scommaaccent ; B 17 -270 508 667 ; +C -1 ; WX 611 ; N Eogonek ; B -1 -169 651 653 ; +C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ; +C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; +C -1 ; WX 278 ; N iogonek ; B 49 -169 278 654 ; +C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; +C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; +C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; +C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; +C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; +C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; +C -1 ; WX 389 ; N scedilla ; B -2 -217 366 442 ; +C -1 ; WX 389 ; N rcaron ; B 45 0 454 661 ; +C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ; +C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 52 -270 722 666 ; +C -1 ; WX 611 ; N Rcommaaccent ; B -13 -270 588 653 ; +C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; +C -1 ; WX 500 ; N nacute ; B 14 -9 487 664 ; +C -1 ; WX 500 ; N uogonek ; B 42 -169 500 441 ; +C -1 ; WX 500 ; N umacron ; B 42 -11 495 583 ; +C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; +C -1 ; WX 278 ; N lcaron ; B 40 -11 395 683 ; +C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; +C -1 ; WX 667 ; N Cacute ; B 66 -18 689 876 ; +C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; +C -1 ; WX 400 ; N degree ; B 101 390 387 676 ; +C -1 ; WX 611 ; N Aogonek ; B -51 -169 707 668 ; +C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; +C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ; +C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ; +C -1 ; WX 611 ; N Aring ; B -51 0 564 904 ; +C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ; +C -1 ; WX 389 ; N rcommaaccent ; B 35 -270 412 441 ; +C -1 ; WX 278 ; N lacute ; B 40 -11 376 876 ; +C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; +C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ; +C -1 ; WX 278 ; N icircumflex ; B 34 -11 328 661 ; +C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ; +C -1 ; WX 500 ; N ncommaaccent ; B 14 -270 474 441 ; +C -1 ; WX 278 ; N lcommaaccent ; B -21 -270 279 683 ; +C -1 ; WX 675 ; N plusminus ; B 86 0 590 568 ; +C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; +C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; +C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; +C -1 ; WX 278 ; N iacute ; B 49 -11 356 664 ; +C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; +C -1 ; WX 444 ; N kcommaaccent ; B 14 -270 461 683 ; +C -1 ; WX 722 ; N Omacron ; B 60 -18 706 795 ; +C -1 ; WX 278 ; N imacron ; B 49 -11 384 583 ; +C -1 ; WX 444 ; N emacron ; B 31 -11 467 583 ; +C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; +C -1 ; WX 278 ; N tcommaaccent ; B -21 -270 296 546 ; +C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; +C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; +C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; +C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; +C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 570 664 ; +C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ; +C -1 ; WX 500 ; N uring ; B 42 -11 475 707 ; +C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 706 873 ; +C -1 ; WX 333 ; N commaaccent ; B 7 -270 146 -40 ; +C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ; +C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ; +C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; +C -1 ; WX 278 ; N idieresis ; B 49 -11 353 606 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 564 ; N notequal ; B 30 -3 534 509 ; +C -1 ; WX 549 ; N radical ; B -2 -65 526 924 ; +C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ; +C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ; +C -1 ; WX 675 ; N lessequal ; B 84 0 592 628 ; +C -1 ; WX 675 ; N greaterequal ; B 84 0 592 628 ; +C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C -1 ; WX 667 ; N Ncommaaccent ; B -20 -270 727 653 ; +C -1 ; WX 500 ; N dcroat ; B 15 -13 558 683 ; +C -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ; +C -1 ; WX 556 ; N Lcommaaccent ; B -8 -270 559 653 ; +C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; +C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -50 +KPX A Ccedilla -50 +KPX A G -44 +KPX A O -45 +KPX A Odieresis -45 +KPX A Q -44 +KPX A T -14 +KPX A U -57 +KPX A Uacute -57 +KPX A Ucircumflex -57 +KPX A Udieresis -57 +KPX A Ugrave -57 +KPX A V -81 +KPX A W -75 +KPX A Y -21 +KPX A a -4 +KPX A b 0 +KPX A c -18 +KPX A ccedilla -28 +KPX A comma 8 +KPX A d -4 +KPX A e -17 +KPX A g -25 +KPX A guillemotleft -44 +KPX A guilsinglleft -43 +KPX A hyphen -13 +KPX A o -17 +KPX A period 8 +KPX A q -12 +KPX A quotedblright -92 +KPX A quoteright -92 +KPX A t -6 +KPX A u -9 +KPX A v -50 +KPX A w -44 +KPX A y -57 +KPX Aacute C -50 +KPX Aacute G -44 +KPX Aacute O -45 +KPX Aacute Q -44 +KPX Aacute T -14 +KPX Aacute U -57 +KPX Aacute V -81 +KPX Aacute W -75 +KPX Aacute Y -21 +KPX Aacute a -4 +KPX Aacute b 0 +KPX Aacute c -18 +KPX Aacute comma 8 +KPX Aacute d -4 +KPX Aacute e -17 +KPX Aacute g -25 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -43 +KPX Aacute hyphen -13 +KPX Aacute o -17 +KPX Aacute period 8 +KPX Aacute q -12 +KPX Aacute quoteright -92 +KPX Aacute t -6 +KPX Aacute u -9 +KPX Aacute v -50 +KPX Aacute w -44 +KPX Aacute y -57 +KPX Acircumflex C -50 +KPX Acircumflex G -44 +KPX Acircumflex O -45 +KPX Acircumflex Q -44 +KPX Acircumflex T -14 +KPX Acircumflex U -57 +KPX Acircumflex V -81 +KPX Acircumflex W -75 +KPX Acircumflex Y -21 +KPX Acircumflex comma 8 +KPX Acircumflex period 8 +KPX Adieresis C -50 +KPX Adieresis G -44 +KPX Adieresis O -45 +KPX Adieresis Q -44 +KPX Adieresis T -14 +KPX Adieresis U -57 +KPX Adieresis V -81 +KPX Adieresis W -75 +KPX Adieresis Y -21 +KPX Adieresis a -4 +KPX Adieresis b 0 +KPX Adieresis c -18 +KPX Adieresis comma 8 +KPX Adieresis d -4 +KPX Adieresis g -25 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -43 +KPX Adieresis hyphen -13 +KPX Adieresis o -17 +KPX Adieresis period 8 +KPX Adieresis q -12 +KPX Adieresis quotedblright -92 +KPX Adieresis quoteright -92 +KPX Adieresis t -6 +KPX Adieresis u -9 +KPX Adieresis v -50 +KPX Adieresis w -44 +KPX Adieresis y -57 +KPX Agrave C -50 +KPX Agrave G -44 +KPX Agrave O -45 +KPX Agrave Q -44 +KPX Agrave T -14 +KPX Agrave U -57 +KPX Agrave V -81 +KPX Agrave W -75 +KPX Agrave Y -21 +KPX Agrave comma 8 +KPX Agrave period 8 +KPX Aring C -50 +KPX Aring G -44 +KPX Aring O -45 +KPX Aring Q -44 +KPX Aring T -14 +KPX Aring U -57 +KPX Aring V -81 +KPX Aring W -75 +KPX Aring Y -21 +KPX Aring a -4 +KPX Aring b 0 +KPX Aring c -18 +KPX Aring comma 8 +KPX Aring d -4 +KPX Aring e -17 +KPX Aring g -25 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -43 +KPX Aring hyphen -13 +KPX Aring o -17 +KPX Aring period 8 +KPX Aring q -12 +KPX Aring quotedblright -92 +KPX Aring quoteright -92 +KPX Aring t -6 +KPX Aring u -9 +KPX Aring v -50 +KPX Aring w -44 +KPX Aring y -57 +KPX Atilde C -50 +KPX Atilde G -44 +KPX Atilde O -45 +KPX Atilde Q -44 +KPX Atilde T -14 +KPX Atilde U -57 +KPX Atilde V -81 +KPX Atilde W -75 +KPX Atilde Y -21 +KPX Atilde comma 7 +KPX Atilde period 7 +KPX B A -23 +KPX B AE -35 +KPX B Aacute -23 +KPX B Acircumflex -23 +KPX B Adieresis -23 +KPX B Aring -23 +KPX B Atilde -23 +KPX B O -14 +KPX B OE -6 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -14 +KPX B V -32 +KPX B W -29 +KPX B Y -39 +KPX C A -14 +KPX C AE -30 +KPX C Aacute -14 +KPX C Adieresis -14 +KPX C Aring -14 +KPX C H -13 +KPX C K -21 +KPX C O -19 +KPX C Oacute -19 +KPX C Odieresis -19 +KPX Ccedilla A -18 +KPX D A -36 +KPX D Aacute -36 +KPX D Acircumflex -36 +KPX D Adieresis -36 +KPX D Agrave -36 +KPX D Aring -36 +KPX D Atilde -36 +KPX D J -32 +KPX D T -9 +KPX D V -42 +KPX D W -36 +KPX D X -40 +KPX D Y -50 +KPX F A -72 +KPX F Aacute -72 +KPX F Acircumflex -72 +KPX F Adieresis -72 +KPX F Agrave -72 +KPX F Aring -72 +KPX F Atilde -72 +KPX F J -60 +KPX F O -40 +KPX F Odieresis -40 +KPX F a -77 +KPX F aacute -78 +KPX F adieresis -52 +KPX F ae -82 +KPX F aring -70 +KPX F comma -95 +KPX F e -83 +KPX F eacute -83 +KPX F hyphen -45 +KPX F i -36 +KPX F j -41 +KPX F o -79 +KPX F oacute -79 +KPX F odieresis -52 +KPX F oe -75 +KPX F oslash -80 +KPX F period -99 +KPX F r -52 +KPX F u -50 +KPX G A -17 +KPX G AE -29 +KPX G Aacute -17 +KPX G Acircumflex -17 +KPX G Adieresis -17 +KPX G Agrave -17 +KPX G Aring -17 +KPX G Atilde -17 +KPX G T -13 +KPX G V -5 +KPX G W -2 +KPX G Y -12 +KPX J A -40 +KPX J AE -52 +KPX J Adieresis -40 +KPX J Aring -40 +KPX K C -55 +KPX K G -53 +KPX K O -46 +KPX K OE -45 +KPX K Oacute -46 +KPX K Odieresis -46 +KPX K S 6 +KPX K T 21 +KPX K a -5 +KPX K adieresis -5 +KPX K ae -5 +KPX K aring -5 +KPX K e -18 +KPX K hyphen -57 +KPX K o -18 +KPX K oacute -18 +KPX K odieresis -18 +KPX K u -10 +KPX K udieresis -10 +KPX K y -89 +KPX L A 44 +KPX L AE 32 +KPX L Aacute 44 +KPX L Adieresis 44 +KPX L Aring 44 +KPX L C 6 +KPX L Ccedilla 4 +KPX L G 11 +KPX L O 10 +KPX L Oacute 10 +KPX L Ocircumflex 10 +KPX L Odieresis 10 +KPX L Ograve 10 +KPX L Otilde 10 +KPX L S 20 +KPX L T -13 +KPX L U -8 +KPX L Udieresis -8 +KPX L V -55 +KPX L W -48 +KPX L Y -20 +KPX L hyphen 47 +KPX L quotedblright -92 +KPX L quoteright -92 +KPX L u 12 +KPX L udieresis 10 +KPX L y -26 +KPX N A -20 +KPX N AE -32 +KPX N Aacute -20 +KPX N Adieresis -20 +KPX N Aring -20 +KPX N C -21 +KPX N Ccedilla -20 +KPX N G -14 +KPX N O -20 +KPX N Oacute -20 +KPX N Odieresis -20 +KPX N a -22 +KPX N aacute -23 +KPX N adieresis -23 +KPX N ae -27 +KPX N aring -23 +KPX N comma -13 +KPX N e -28 +KPX N eacute -30 +KPX N o -25 +KPX N oacute -27 +KPX N odieresis -27 +KPX N oslash -27 +KPX N period -16 +KPX N u -24 +KPX N udieresis -25 +KPX O A -38 +KPX O AE -70 +KPX O Aacute -38 +KPX O Adieresis -38 +KPX O Aring -38 +KPX O T -3 +KPX O V -45 +KPX O W -39 +KPX O X -41 +KPX O Y -51 +KPX Oacute A -38 +KPX Oacute T -3 +KPX Oacute V -45 +KPX Oacute W -39 +KPX Oacute Y -51 +KPX Ocircumflex T -3 +KPX Ocircumflex V -45 +KPX Ocircumflex Y -51 +KPX Odieresis A -38 +KPX Odieresis T -3 +KPX Odieresis V -45 +KPX Odieresis W -39 +KPX Odieresis X -41 +KPX Odieresis Y -51 +KPX Ograve T -3 +KPX Ograve V -45 +KPX Ograve Y -51 +KPX Oslash A -38 +KPX Otilde T -3 +KPX Otilde V -45 +KPX Otilde Y -51 +KPX P A -79 +KPX P AE -116 +KPX P Aacute -79 +KPX P Adieresis -79 +KPX P Aring -79 +KPX P J -89 +KPX P a -74 +KPX P aacute -74 +KPX P adieresis -64 +KPX P ae -80 +KPX P aring -74 +KPX P comma -118 +KPX P e -79 +KPX P eacute -79 +KPX P hyphen -64 +KPX P o -73 +KPX P oacute -73 +KPX P odieresis -64 +KPX P oe -67 +KPX P oslash -74 +KPX P period -121 +KPX R C -26 +KPX R Ccedilla -25 +KPX R G -20 +KPX R O -26 +KPX R OE -18 +KPX R Oacute -26 +KPX R Odieresis -26 +KPX R T 0 +KPX R U -36 +KPX R Udieresis -36 +KPX R V -31 +KPX R W -28 +KPX R Y -19 +KPX R a -3 +KPX R aacute -3 +KPX R adieresis -3 +KPX R ae -3 +KPX R aring -3 +KPX R e -15 +KPX R eacute -15 +KPX R hyphen -29 +KPX R o -15 +KPX R oacute -15 +KPX R odieresis -15 +KPX R oe -15 +KPX R u -7 +KPX R uacute -7 +KPX R udieresis -7 +KPX R y 0 +KPX S A -2 +KPX S AE -14 +KPX S Aacute -2 +KPX S Adieresis -2 +KPX S Aring -2 +KPX S T 1 +KPX S V 5 +KPX S W 8 +KPX S Y -1 +KPX S t -13 +KPX T A -33 +KPX T AE -45 +KPX T Aacute -33 +KPX T Acircumflex -33 +KPX T Adieresis -33 +KPX T Agrave -33 +KPX T Aring -33 +KPX T Atilde -33 +KPX T C -15 +KPX T G -7 +KPX T J -39 +KPX T O -20 +KPX T OE -8 +KPX T Oacute -20 +KPX T Ocircumflex -20 +KPX T Odieresis -20 +KPX T Ograve -20 +KPX T Oslash -20 +KPX T Otilde -20 +KPX T S -2 +KPX T V 41 +KPX T W 43 +KPX T Y 33 +KPX T a -81 +KPX T ae -81 +KPX T c -86 +KPX T colon -84 +KPX T comma -70 +KPX T e -90 +KPX T g -102 +KPX T guillemotleft -102 +KPX T guilsinglleft -101 +KPX T hyphen -68 +KPX T i -16 +KPX T j -20 +KPX T o -87 +KPX T oslash -89 +KPX T period -71 +KPX T r -87 +KPX T s -74 +KPX T semicolon -92 +KPX T u -86 +KPX T v -72 +KPX T w -69 +KPX T y -70 +KPX U A -50 +KPX U AE -69 +KPX U Aacute -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -35 +KPX U m -28 +KPX U n -29 +KPX U p -32 +KPX U period -39 +KPX U r -41 +KPX Uacute A -50 +KPX Uacute comma -35 +KPX Uacute m -28 +KPX Uacute n -29 +KPX Uacute p -32 +KPX Uacute period -39 +KPX Uacute r -41 +KPX Ucircumflex A -50 +KPX Udieresis A -50 +KPX Udieresis b 1 +KPX Udieresis comma -35 +KPX Udieresis m -28 +KPX Udieresis n -29 +KPX Udieresis p -32 +KPX Udieresis period -39 +KPX Udieresis r -41 +KPX Ugrave A -50 +KPX V A -66 +KPX V AE -102 +KPX V Aacute -66 +KPX V Acircumflex -66 +KPX V Adieresis -66 +KPX V Agrave -66 +KPX V Aring -66 +KPX V Atilde -66 +KPX V C -48 +KPX V G -42 +KPX V O -48 +KPX V Oacute -48 +KPX V Ocircumflex -48 +KPX V Odieresis -48 +KPX V Ograve -48 +KPX V Oslash -48 +KPX V Otilde -48 +KPX V S -15 +KPX V T 32 +KPX V a -67 +KPX V ae -72 +KPX V colon -82 +KPX V comma -76 +KPX V e -74 +KPX V g -84 +KPX V guillemotleft -82 +KPX V guilsinglleft -81 +KPX V hyphen -45 +KPX V i -16 +KPX V o -70 +KPX V oslash -72 +KPX V period -80 +KPX V r -45 +KPX V semicolon -79 +KPX V u -40 +KPX V y -16 +KPX W A -57 +KPX W AE -85 +KPX W Aacute -57 +KPX W Acircumflex -57 +KPX W Adieresis -57 +KPX W Agrave -57 +KPX W Aring -57 +KPX W Atilde -57 +KPX W C -39 +KPX W G -33 +KPX W O -39 +KPX W Oacute -39 +KPX W Ocircumflex -39 +KPX W Odieresis -39 +KPX W Ograve -39 +KPX W Oslash -39 +KPX W Otilde -39 +KPX W S -17 +KPX W T 30 +KPX W a -53 +KPX W ae -58 +KPX W colon -77 +KPX W comma -58 +KPX W e -60 +KPX W g -75 +KPX W guillemotleft -68 +KPX W guilsinglleft -67 +KPX W hyphen -32 +KPX W i -18 +KPX W o -56 +KPX W oslash -58 +KPX W period -62 +KPX W r -40 +KPX W semicolon -74 +KPX W u -35 +KPX W y -11 +KPX X C -50 +KPX X O -44 +KPX X Odieresis -44 +KPX X Q -42 +KPX X a -3 +KPX X e -15 +KPX X hyphen -41 +KPX X o -15 +KPX X u -7 +KPX X y -67 +KPX Y A -27 +KPX Y AE -39 +KPX Y Aacute -27 +KPX Y Acircumflex -27 +KPX Y Adieresis -27 +KPX Y Agrave -27 +KPX Y Aring -27 +KPX Y Atilde -27 +KPX Y C -52 +KPX Y G -45 +KPX Y O -52 +KPX Y Oacute -52 +KPX Y Ocircumflex -52 +KPX Y Odieresis -52 +KPX Y Ograve -52 +KPX Y Oslash -52 +KPX Y Otilde -52 +KPX Y S -15 +KPX Y T 32 +KPX Y a -72 +KPX Y ae -75 +KPX Y colon -78 +KPX Y comma -64 +KPX Y e -78 +KPX Y g -94 +KPX Y guillemotleft -93 +KPX Y guilsinglleft -92 +KPX Y hyphen -60 +KPX Y i -16 +KPX Y o -75 +KPX Y oslash -77 +KPX Y p -52 +KPX Y period -65 +KPX Y semicolon -86 +KPX Y u -58 +KPX Y v -32 +KPX Z v -12 +KPX Z y -28 +KPX a j -22 +KPX a quoteright -28 +KPX a v 1 +KPX a w 4 +KPX a y 2 +KPX aacute v 1 +KPX aacute w 4 +KPX aacute y 2 +KPX adieresis v 1 +KPX adieresis w 4 +KPX adieresis y 2 +KPX ae v 2 +KPX ae w 5 +KPX ae y 6 +KPX agrave v 1 +KPX agrave w 4 +KPX agrave y 2 +KPX aring v 1 +KPX aring w 4 +KPX aring y 2 +KPX b v -10 +KPX b w -7 +KPX b y -3 +KPX c h -30 +KPX c k -29 +KPX comma one -40 +KPX comma quotedblright -39 +KPX comma quoteright -39 +KPX e quoteright -21 +KPX e t -16 +KPX e v 0 +KPX e w 2 +KPX e x -10 +KPX e y 4 +KPX eacute v 0 +KPX eacute w 2 +KPX eacute y 4 +KPX ecircumflex v 0 +KPX ecircumflex w 2 +KPX ecircumflex y 4 +KPX eight four 13 +KPX eight one -50 +KPX eight seven -1 +KPX f a -26 +KPX f aacute -27 +KPX f adieresis -2 +KPX f ae -30 +KPX f aring -17 +KPX f e -32 +KPX f eacute -34 +KPX f f 30 +KPX f i 17 +KPX f j 13 +KPX f l 42 +KPX f o -29 +KPX f oacute -30 +KPX f odieresis -2 +KPX f oe -24 +KPX f oslash -31 +KPX f quoteright 18 +KPX f s -20 +KPX f t 18 +KPX five four -5 +KPX five one -71 +KPX five seven -28 +KPX four four 12 +KPX four one -69 +KPX four seven -27 +KPX g a -41 +KPX g adieresis -42 +KPX g ae -46 +KPX g aring -42 +KPX g e -45 +KPX g eacute -45 +KPX g l -46 +KPX g oacute -41 +KPX g odieresis -41 +KPX g r -21 +KPX guillemotright A -25 +KPX guillemotright AE -51 +KPX guillemotright Aacute -25 +KPX guillemotright Adieresis -25 +KPX guillemotright Aring -25 +KPX guillemotright T -77 +KPX guillemotright V -76 +KPX guillemotright W -67 +KPX guillemotright Y -81 +KPX guilsinglright A -24 +KPX guilsinglright AE -50 +KPX guilsinglright Aacute -24 +KPX guilsinglright Adieresis -24 +KPX guilsinglright Aring -24 +KPX guilsinglright T -76 +KPX guilsinglright V -75 +KPX guilsinglright W -66 +KPX guilsinglright Y -80 +KPX h quoteright -31 +KPX h y -4 +KPX hyphen A 3 +KPX hyphen AE -23 +KPX hyphen Aacute 3 +KPX hyphen Adieresis 3 +KPX hyphen Aring 3 +KPX hyphen T -46 +KPX hyphen V -43 +KPX hyphen W -34 +KPX hyphen Y -53 +KPX i T -10 +KPX i j -31 +KPX k a 12 +KPX k aacute 12 +KPX k adieresis 12 +KPX k ae 9 +KPX k aring 12 +KPX k comma 27 +KPX k e 5 +KPX k eacute 5 +KPX k g -27 +KPX k hyphen -27 +KPX k o 6 +KPX k oacute 6 +KPX k odieresis 6 +KPX k period 26 +KPX k s 7 +KPX k u 8 +KPX k udieresis 8 +KPX l v -12 +KPX l y -11 +KPX m p -4 +KPX m v -6 +KPX m w -4 +KPX m y -3 +KPX n T -41 +KPX n p -7 +KPX n quoteright -34 +KPX n v -10 +KPX n w -7 +KPX n y -6 +KPX nine four 2 +KPX nine one -64 +KPX nine seven -5 +KPX o T -63 +KPX o quoteright -24 +KPX o t -15 +KPX o v -18 +KPX o w -15 +KPX o x -33 +KPX o y -10 +KPX oacute v -18 +KPX oacute w -15 +KPX oacute y -10 +KPX ocircumflex t -16 +KPX odieresis t -16 +KPX odieresis v -18 +KPX odieresis w -15 +KPX odieresis x -33 +KPX odieresis y -10 +KPX ograve v -18 +KPX ograve w -15 +KPX ograve y -10 +KPX one comma -52 +KPX one eight -57 +KPX one five -55 +KPX one four -69 +KPX one nine -61 +KPX one one -69 +KPX one period -56 +KPX one seven -60 +KPX one six -50 +KPX one three -55 +KPX one two -50 +KPX one zero -41 +KPX p t -14 +KPX p y -4 +KPX period one -39 +KPX period quotedblright -38 +KPX period quoteright -38 +KPX q c -13 +KPX q u -11 +KPX quotedblbase A 1 +KPX quotedblbase AE -13 +KPX quotedblbase T -64 +KPX quotedblbase V -96 +KPX quotedblbase W -84 +KPX quotedblbase Y -69 +KPX quotedblleft A -88 +KPX quotedblleft AE -141 +KPX quotedblleft Aacute -88 +KPX quotedblleft Adieresis -88 +KPX quotedblleft Aring -88 +KPX quotedblleft T -19 +KPX quotedblleft V -17 +KPX quotedblleft W -15 +KPX quotedblleft Y -25 +KPX quotedblright A -94 +KPX quotedblright AE -147 +KPX quotedblright Aacute -94 +KPX quotedblright Adieresis -94 +KPX quotedblright Aring -94 +KPX quotedblright T -21 +KPX quotedblright V -22 +KPX quotedblright W -19 +KPX quotedblright Y -30 +KPX quoteleft A -78 +KPX quoteleft AE -131 +KPX quoteleft Aacute -78 +KPX quoteleft Adieresis -78 +KPX quoteleft Aring -78 +KPX quoteleft T -9 +KPX quoteleft V -8 +KPX quoteleft W -5 +KPX quoteleft Y -15 +KPX quoteright A -87 +KPX quoteright AE -140 +KPX quoteright Aacute -87 +KPX quoteright Adieresis -87 +KPX quoteright Aring -87 +KPX quoteright comma -73 +KPX quoteright d -79 +KPX quoteright o -78 +KPX quoteright period -78 +KPX quoteright r -57 +KPX quoteright s -63 +KPX quoteright t -49 +KPX quoteright v -28 +KPX quoteright w -26 +KPX quoteright y -28 +KPX r a -29 +KPX r aacute -29 +KPX r acircumflex -29 +KPX r adieresis -29 +KPX r ae -36 +KPX r agrave -29 +KPX r aring -29 +KPX r c -26 +KPX r ccedilla -17 +KPX r colon -28 +KPX r comma -68 +KPX r d -31 +KPX r e -35 +KPX r eacute -35 +KPX r ecircumflex -35 +KPX r egrave -35 +KPX r f 23 +KPX r g -21 +KPX r h -17 +KPX r hyphen -52 +KPX r i 8 +KPX r j 4 +KPX r k -15 +KPX r l -21 +KPX r m 17 +KPX r n 16 +KPX r o -28 +KPX r oacute -28 +KPX r ocircumflex -28 +KPX r odieresis -28 +KPX r oe -23 +KPX r ograve -28 +KPX r oslash -29 +KPX r p 13 +KPX r period -72 +KPX r q -31 +KPX r quoteright -4 +KPX r r 4 +KPX r s -17 +KPX r semicolon -28 +KPX r t 12 +KPX r u 11 +KPX r v 30 +KPX r w 32 +KPX r x 7 +KPX r y 33 +KPX r z 0 +KPX s quoteright -20 +KPX s t -12 +KPX seven colon -88 +KPX seven comma -79 +KPX seven eight -32 +KPX seven five -53 +KPX seven four -65 +KPX seven one -47 +KPX seven period -83 +KPX seven seven -11 +KPX seven six -37 +KPX seven three -42 +KPX seven two -13 +KPX six four 17 +KPX six one -64 +KPX six seven -37 +KPX t S -9 +KPX t a -6 +KPX t aacute -6 +KPX t adieresis -6 +KPX t ae -10 +KPX t aring -6 +KPX t colon -29 +KPX t e -13 +KPX t eacute -13 +KPX t h -11 +KPX t o -11 +KPX t oacute -11 +KPX t odieresis -11 +KPX t quoteright -19 +KPX t semicolon -26 +KPX three four -9 +KPX three one -76 +KPX three seven -15 +KPX two four -12 +KPX two one -45 +KPX two seven -22 +KPX u quoteright -31 +KPX v a -24 +KPX v aacute -26 +KPX v acircumflex -26 +KPX v adieresis -26 +KPX v ae -29 +KPX v agrave -26 +KPX v aring -26 +KPX v atilde -26 +KPX v c -26 +KPX v colon -48 +KPX v comma -46 +KPX v e -30 +KPX v eacute -32 +KPX v ecircumflex -32 +KPX v egrave -32 +KPX v g -36 +KPX v hyphen 0 +KPX v l -29 +KPX v o -26 +KPX v oacute -28 +KPX v odieresis -28 +KPX v ograve -28 +KPX v oslash -29 +KPX v period -51 +KPX v s -30 +KPX v semicolon -48 +KPX w a -26 +KPX w aacute -28 +KPX w acircumflex -28 +KPX w adieresis -28 +KPX w ae -31 +KPX w agrave -28 +KPX w aring -28 +KPX w atilde -28 +KPX w c -28 +KPX w colon -49 +KPX w comma -47 +KPX w e -32 +KPX w eacute -34 +KPX w ecircumflex -34 +KPX w egrave -34 +KPX w g -38 +KPX w hyphen -4 +KPX w l -30 +KPX w o -28 +KPX w oacute -30 +KPX w odieresis -30 +KPX w ograve -30 +KPX w oslash -31 +KPX w period -51 +KPX w s -32 +KPX w semicolon -49 +KPX x a 6 +KPX x c 0 +KPX x e 0 +KPX x eacute 0 +KPX x o 1 +KPX x q 2 +KPX y a -12 +KPX y aacute -12 +KPX y acircumflex -12 +KPX y adieresis -12 +KPX y ae -17 +KPX y agrave -12 +KPX y aring -12 +KPX y atilde -12 +KPX y c -15 +KPX y colon -48 +KPX y comma -21 +KPX y e -19 +KPX y eacute -19 +KPX y ecircumflex -19 +KPX y egrave -19 +KPX y g -34 +KPX y hyphen 7 +KPX y l -18 +KPX y o -15 +KPX y oacute -15 +KPX y odieresis -15 +KPX y ograve -15 +KPX y oslash -16 +KPX y period -25 +KPX y s -19 +KPX y semicolon -45 +KPX zero four 14 +KPX zero one -50 +KPX zero seven -3 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n021023l.pfb b/PdfReader/Resources/Fonts/n021023l.pfb new file mode 100644 index 0000000000..a667ed011f Binary files /dev/null and b/PdfReader/Resources/Fonts/n021023l.pfb differ diff --git a/PdfReader/Resources/Fonts/n021024l.afm b/PdfReader/Resources/Fonts/n021024l.afm new file mode 100644 index 0000000000..0833e4f046 --- /dev/null +++ b/PdfReader/Resources/Fonts/n021024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusRomNo9L-MediItal +FullName Nimbus Roman No9 L Medium Italic +FamilyName Nimbus Roman No9 L +Weight Bold +ItalicAngle -15.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -200 -324 996 964 +CapHeight 669 +XHeight 449 +Descender -205 +Ascender 699 +StartCharMetrics 316 +C 32 ; WX 250 ; N space ; B 125 0 125 0 ; +C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; +C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; +C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; +C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; +C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; +C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; +C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ; +C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; +C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; +C 42 ; WX 500 ; N asterisk ; B 65 252 456 685 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; +C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; +C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; +C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; +C 49 ; WX 500 ; N one ; B 5 0 419 683 ; +C 50 ; WX 500 ; N two ; B -27 0 446 683 ; +C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; +C 52 ; WX 500 ; N four ; B -15 0 503 683 ; +C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; +C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; +C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; +C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; +C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; +C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; +C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; +C 60 ; WX 570 ; N less ; B 31 -12 539 518 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -12 539 518 ; +C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; +C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; +C 65 ; WX 667 ; N A ; B -67 0 593 683 ; +C 66 ; WX 667 ; N B ; B -24 0 624 669 ; +C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; +C 68 ; WX 722 ; N D ; B -46 0 685 669 ; +C 69 ; WX 667 ; N E ; B -27 0 653 669 ; +C 70 ; WX 667 ; N F ; B -13 0 660 669 ; +C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; +C 72 ; WX 778 ; N H ; B -24 0 799 669 ; +C 73 ; WX 389 ; N I ; B -32 0 406 669 ; +C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; +C 75 ; WX 667 ; N K ; B -21 0 702 669 ; +C 76 ; WX 611 ; N L ; B -22 0 590 669 ; +C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; +C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; +C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; +C 80 ; WX 611 ; N P ; B -27 0 613 669 ; +C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; +C 82 ; WX 667 ; N R ; B -29 0 623 669 ; +C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; +C 84 ; WX 611 ; N T ; B 50 0 650 669 ; +C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; +C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; +C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; +C 88 ; WX 667 ; N X ; B -24 0 694 669 ; +C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; +C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; +C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; +C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; +C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; +C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; +C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; +C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; +C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; +C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; +C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; +C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; +C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; +C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; +C 105 ; WX 278 ; N i ; B 2 -9 263 685 ; +C 106 ; WX 278 ; N j ; B -189 -207 279 685 ; +C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; +C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; +C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; +C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; +C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; +C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; +C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; +C 114 ; WX 389 ; N r ; B -21 0 389 462 ; +C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; +C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; +C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; +C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; +C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; +C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; +C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; +C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; +C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; +C 124 ; WX 220 ; N bar ; B 66 -18 154 685 ; +C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; +C 126 ; WX 570 ; N asciitilde ; B 54 175 516 331 ; +C 161 ; WX 389 ; N exclamdown ; B 19 -205 320 494 ; +C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; +C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; +C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ; +C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; +C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ; +C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; +C 168 ; WX 500 ; N currency ; B -26 34 526 586 ; +C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; +C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; +C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; +C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; +C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; +C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ; +C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ; +C 177 ; WX 500 ; N endash ; B -40 178 477 269 ; +C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ; +C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; +C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; +C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; +C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ; +C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; +C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; +C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; +C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; +C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; +C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; +C 193 ; WX 333 ; N grave ; B 85 516 297 697 ; +C 194 ; WX 333 ; N acute ; B 139 516 379 697 ; +C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ; +C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ; +C 197 ; WX 333 ; N macron ; B 51 553 393 623 ; +C 198 ; WX 333 ; N breve ; B 71 516 387 678 ; +C 199 ; WX 333 ; N dotaccent ; B 163 525 293 655 ; +C 200 ; WX 333 ; N dieresis ; B 55 525 397 655 ; +C 202 ; WX 333 ; N ring ; B 127 540 340 754 ; +C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; +C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; +C 206 ; WX 333 ; N ogonek ; B -40 -173 189 44 ; +C 207 ; WX 333 ; N caron ; B 79 516 411 690 ; +C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ; +C 225 ; WX 944 ; N AE ; B -64 0 918 669 ; +C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; +C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ; +C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; +C 234 ; WX 944 ; N OE ; B 23 -9 946 677 ; +C 235 ; WX 300 ; N ordmasculine ; B 56 400 350 685 ; +C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ; +C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; +C 248 ; WX 278 ; N lslash ; B -13 -9 301 699 ; +C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ; +C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ; +C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; +C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; +C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; +C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; +C -1 ; WX 611 ; N Tcaron ; B 50 0 650 900 ; +C -1 ; WX 556 ; N Scaron ; B 2 -18 526 897 ; +C -1 ; WX 667 ; N Rcaron ; B -29 0 623 900 ; +C -1 ; WX 667 ; N Racute ; B -29 0 623 907 ; +C -1 ; WX 556 ; N Sacute ; B 2 -18 526 907 ; +C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; +C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 693 907 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 907 ; +C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ; +C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ; +C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; +C -1 ; WX 611 ; N Zacute ; B -11 0 590 907 ; +C -1 ; WX 722 ; N Uring ; B 67 -18 744 964 ; +C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; +C -1 ; WX 444 ; N eogonek ; B 5 -173 404 462 ; +C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; +C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; +C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; +C -1 ; WX 611 ; N Thorn ; B -27 0 574 669 ; +C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ; +C -1 ; WX 444 ; N edieresis ; B 5 -13 443 655 ; +C -1 ; WX 600 ; N dcaron ; B -21 -13 664 699 ; +C -1 ; WX 444 ; N ccedilla ; B -24 -218 392 462 ; +C -1 ; WX 444 ; N ccaron ; B -5 -13 468 690 ; +C -1 ; WX 444 ; N cacute ; B -5 -13 444 697 ; +C -1 ; WX 500 ; N aogonek ; B -21 -173 500 462 ; +C -1 ; WX 500 ; N aring ; B -21 -14 455 754 ; +C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ; +C -1 ; WX 500 ; N abreve ; B -21 -14 470 678 ; +C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ; +C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ; +C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ; +C -1 ; WX 500 ; N adieresis ; B -21 -14 471 655 ; +C -1 ; WX 722 ; N Uogonek ; B 67 -173 744 669 ; +C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; +C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ; +C -1 ; WX 556 ; N udieresis ; B 15 -9 494 655 ; +C -1 ; WX 345 ; N tcaron ; B -11 -9 409 685 ; +C -1 ; WX 389 ; N scommaaccent ; B -26 -324 333 462 ; +C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; +C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; +C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; +C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; +C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 865 ; +C -1 ; WX 389 ; N scaron ; B -19 -13 439 690 ; +C -1 ; WX 667 ; N Amacron ; B -67 0 593 833 ; +C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 50 -324 650 669 ; +C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; +C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ; +C -1 ; WX 667 ; N Emacron ; B -27 0 653 833 ; +C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; +C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; +C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; +C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; +C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 900 ; +C -1 ; WX 722 ; N Nacute ; B -27 -15 748 907 ; +C -1 ; WX 611 ; N Lcaron ; B -22 0 651 685 ; +C -1 ; WX 611 ; N Lacute ; B -22 0 590 907 ; +C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 865 ; +C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; +C -1 ; WX 389 ; N Icircumflex ; B -32 0 420 897 ; +C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; +C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ; +C -1 ; WX 500 ; N Euro ; B 53 -5 666 689 ; +C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; +C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; +C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; +C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; +C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ; +C -1 ; WX 389 ; N Iacute ; B -32 0 407 907 ; +C -1 ; WX 389 ; N Imacron ; B -32 0 461 833 ; +C -1 ; WX 389 ; N Iogonek ; B -32 -173 406 669 ; +C -1 ; WX 389 ; N Idieresis ; B -32 0 445 862 ; +C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 888 ; +C -1 ; WX 722 ; N Umacron ; B 67 -18 744 833 ; +C -1 ; WX 667 ; N Kcommaaccent ; B -21 -324 702 669 ; +C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ; +C -1 ; WX 556 ; N Scommaaccent ; B 2 -324 526 685 ; +C -1 ; WX 667 ; N Eogonek ; B -27 -173 667 669 ; +C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ; +C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 865 ; +C -1 ; WX 278 ; N iogonek ; B 2 -173 278 685 ; +C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 765 ; +C -1 ; WX 500 ; N odieresis ; B -3 -13 466 655 ; +C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; +C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; +C -1 ; WX 667 ; N Ecaron ; B -27 0 653 900 ; +C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; +C -1 ; WX 389 ; N scedilla ; B -40 -218 333 462 ; +C -1 ; WX 389 ; N rcaron ; B -21 0 439 690 ; +C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ; +C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 21 -324 706 685 ; +C -1 ; WX 667 ; N Rcommaaccent ; B -29 -324 623 669 ; +C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; +C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; +C -1 ; WX 556 ; N uogonek ; B 15 -173 556 462 ; +C -1 ; WX 556 ; N umacron ; B 15 -9 505 623 ; +C -1 ; WX 722 ; N Dcaron ; B -46 0 685 900 ; +C -1 ; WX 382 ; N lcaron ; B 2 -9 446 699 ; +C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 900 ; +C -1 ; WX 667 ; N Cacute ; B 32 -18 677 907 ; +C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; +C -1 ; WX 400 ; N degree ; B 83 397 369 683 ; +C -1 ; WX 667 ; N Aogonek ; B -67 -173 729 683 ; +C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; +C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ; +C -1 ; WX 667 ; N Aring ; B -67 0 593 950 ; +C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ; +C -1 ; WX 389 ; N rcommaaccent ; B -80 -324 389 462 ; +C -1 ; WX 278 ; N lacute ; B 2 -9 392 907 ; +C -1 ; WX 500 ; N omacron ; B -3 -13 477 623 ; +C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ; +C -1 ; WX 278 ; N icircumflex ; B -2 -9 325 690 ; +C -1 ; WX 278 ; N igrave ; B 2 -9 260 697 ; +C -1 ; WX 556 ; N ncommaaccent ; B -6 -324 493 462 ; +C -1 ; WX 278 ; N lcommaaccent ; B -81 -324 290 699 ; +C -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ; +C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; +C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; +C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; +C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ; +C -1 ; WX 667 ; N Abreve ; B -67 0 593 888 ; +C -1 ; WX 500 ; N kcommaaccent ; B -23 -324 483 699 ; +C -1 ; WX 722 ; N Omacron ; B 27 -18 691 833 ; +C -1 ; WX 278 ; N imacron ; B 2 -9 366 623 ; +C -1 ; WX 444 ; N emacron ; B 5 -13 449 623 ; +C -1 ; WX 500 ; N amacron ; B -21 -14 477 623 ; +C -1 ; WX 278 ; N tcommaaccent ; B -81 -324 281 594 ; +C -1 ; WX 444 ; N ydieresis ; B -94 -205 438 655 ; +C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; +C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; +C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; +C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; +C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ; +C -1 ; WX 556 ; N uring ; B 15 -9 492 754 ; +C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; +C -1 ; WX 333 ; N commaaccent ; B -54 -324 130 -40 ; +C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ; +C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ; +C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; +C -1 ; WX 278 ; N idieresis ; B 2 -9 360 655 ; +C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ; +C -1 ; WX 549 ; N radical ; B -17 -35 535 916 ; +C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ; +C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ; +C -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ; +C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ; +C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; +C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C -1 ; WX 494 ; N partialdiff ; B 16 -20 472 743 ; +C -1 ; WX 722 ; N Ncommaaccent ; B -27 -324 748 669 ; +C -1 ; WX 500 ; N dcroat ; B -21 -13 540 699 ; +C -1 ; WX 220 ; N brokenbar ; B 66 -18 154 685 ; +C -1 ; WX 611 ; N Lcommaaccent ; B -22 -324 590 669 ; +C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; +C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ; +C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -61 +KPX A Ccedilla -63 +KPX A G -59 +KPX A O -53 +KPX A Odieresis -53 +KPX A Q -54 +KPX A T -33 +KPX A U -61 +KPX A Uacute -61 +KPX A Ucircumflex -61 +KPX A Udieresis -61 +KPX A Ugrave -61 +KPX A V -110 +KPX A W -107 +KPX A Y -44 +KPX A a -5 +KPX A b -1 +KPX A c -20 +KPX A ccedilla -29 +KPX A comma 0 +KPX A d -5 +KPX A e -25 +KPX A g -20 +KPX A guillemotleft -58 +KPX A guilsinglleft -68 +KPX A hyphen -23 +KPX A o -23 +KPX A period 1 +KPX A q -18 +KPX A quotedblright -78 +KPX A quoteright -101 +KPX A t -4 +KPX A u -18 +KPX A v -51 +KPX A w -56 +KPX A y -67 +KPX Aacute C -61 +KPX Aacute G -59 +KPX Aacute O -53 +KPX Aacute Q -54 +KPX Aacute T -33 +KPX Aacute U -61 +KPX Aacute V -110 +KPX Aacute W -107 +KPX Aacute Y -44 +KPX Aacute a -5 +KPX Aacute b -1 +KPX Aacute c -20 +KPX Aacute comma 0 +KPX Aacute d -5 +KPX Aacute e -25 +KPX Aacute g -20 +KPX Aacute guillemotleft -58 +KPX Aacute guilsinglleft -68 +KPX Aacute hyphen -23 +KPX Aacute o -23 +KPX Aacute period 1 +KPX Aacute q -18 +KPX Aacute quoteright -101 +KPX Aacute t -4 +KPX Aacute u -18 +KPX Aacute v -51 +KPX Aacute w -56 +KPX Aacute y -67 +KPX Acircumflex C -61 +KPX Acircumflex G -59 +KPX Acircumflex O -53 +KPX Acircumflex Q -54 +KPX Acircumflex T -33 +KPX Acircumflex U -61 +KPX Acircumflex V -110 +KPX Acircumflex W -107 +KPX Acircumflex Y -44 +KPX Acircumflex comma 0 +KPX Acircumflex period 1 +KPX Adieresis C -61 +KPX Adieresis G -59 +KPX Adieresis O -53 +KPX Adieresis Q -54 +KPX Adieresis T -33 +KPX Adieresis U -61 +KPX Adieresis V -110 +KPX Adieresis W -107 +KPX Adieresis Y -44 +KPX Adieresis a -5 +KPX Adieresis b -1 +KPX Adieresis c -20 +KPX Adieresis comma 0 +KPX Adieresis d -5 +KPX Adieresis g -20 +KPX Adieresis guillemotleft -58 +KPX Adieresis guilsinglleft -68 +KPX Adieresis hyphen -23 +KPX Adieresis o -23 +KPX Adieresis period 1 +KPX Adieresis q -18 +KPX Adieresis quotedblright -78 +KPX Adieresis quoteright -101 +KPX Adieresis t -4 +KPX Adieresis u -18 +KPX Adieresis v -51 +KPX Adieresis w -56 +KPX Adieresis y -67 +KPX Agrave C -61 +KPX Agrave G -59 +KPX Agrave O -53 +KPX Agrave Q -54 +KPX Agrave T -33 +KPX Agrave U -61 +KPX Agrave V -110 +KPX Agrave W -107 +KPX Agrave Y -44 +KPX Agrave comma 0 +KPX Agrave period 1 +KPX Aring C -61 +KPX Aring G -59 +KPX Aring O -53 +KPX Aring Q -54 +KPX Aring T -33 +KPX Aring U -61 +KPX Aring V -110 +KPX Aring W -107 +KPX Aring Y -44 +KPX Aring a -5 +KPX Aring b -1 +KPX Aring c -20 +KPX Aring comma 0 +KPX Aring d -5 +KPX Aring e -25 +KPX Aring g -20 +KPX Aring guillemotleft -58 +KPX Aring guilsinglleft -68 +KPX Aring hyphen -23 +KPX Aring o -23 +KPX Aring period 1 +KPX Aring q -18 +KPX Aring quotedblright -78 +KPX Aring quoteright -101 +KPX Aring t -4 +KPX Aring u -18 +KPX Aring v -51 +KPX Aring w -56 +KPX Aring y -67 +KPX Atilde C -61 +KPX Atilde G -59 +KPX Atilde O -53 +KPX Atilde Q -54 +KPX Atilde T -33 +KPX Atilde U -61 +KPX Atilde V -110 +KPX Atilde W -107 +KPX Atilde Y -44 +KPX Atilde comma 0 +KPX Atilde period 1 +KPX B A -34 +KPX B AE -40 +KPX B Aacute -34 +KPX B Acircumflex -34 +KPX B Adieresis -34 +KPX B Aring -34 +KPX B Atilde -34 +KPX B O -22 +KPX B OE -20 +KPX B Oacute -22 +KPX B Ocircumflex -22 +KPX B Odieresis -22 +KPX B Ograve -22 +KPX B Oslash -23 +KPX B V -46 +KPX B W -46 +KPX B Y -50 +KPX C A -24 +KPX C AE -31 +KPX C Aacute -24 +KPX C Adieresis -24 +KPX C Aring -24 +KPX C H -26 +KPX C K -28 +KPX C O -25 +KPX C Oacute -25 +KPX C Odieresis -25 +KPX Ccedilla A -30 +KPX D A -54 +KPX D Aacute -54 +KPX D Acircumflex -54 +KPX D Adieresis -54 +KPX D Agrave -54 +KPX D Aring -54 +KPX D Atilde -54 +KPX D J -67 +KPX D T -27 +KPX D V -60 +KPX D W -58 +KPX D X -64 +KPX D Y -64 +KPX F A -101 +KPX F Aacute -101 +KPX F Acircumflex -101 +KPX F Adieresis -101 +KPX F Agrave -101 +KPX F Aring -101 +KPX F Atilde -101 +KPX F J -88 +KPX F O -48 +KPX F Odieresis -48 +KPX F a -75 +KPX F aacute -75 +KPX F adieresis -48 +KPX F ae -83 +KPX F aring -75 +KPX F comma -96 +KPX F e -86 +KPX F eacute -86 +KPX F hyphen -54 +KPX F i -29 +KPX F j -34 +KPX F o -81 +KPX F oacute -82 +KPX F odieresis -45 +KPX F oe -86 +KPX F oslash -79 +KPX F period -98 +KPX F r -38 +KPX F u -42 +KPX G A -14 +KPX G AE -20 +KPX G Aacute -14 +KPX G Acircumflex -14 +KPX G Adieresis -14 +KPX G Agrave -14 +KPX G Aring -14 +KPX G Atilde -14 +KPX G T -42 +KPX G V -27 +KPX G W -27 +KPX G Y -31 +KPX J A -39 +KPX J AE -42 +KPX J Adieresis -39 +KPX J Aring -39 +KPX K C -51 +KPX K G -46 +KPX K O -43 +KPX K OE -42 +KPX K Oacute -43 +KPX K Odieresis -43 +KPX K S -1 +KPX K T 0 +KPX K a 3 +KPX K adieresis 3 +KPX K ae -4 +KPX K aring 3 +KPX K e -16 +KPX K hyphen -30 +KPX K o -13 +KPX K oacute -13 +KPX K odieresis -13 +KPX K u -8 +KPX K udieresis -8 +KPX K y -68 +KPX L A 28 +KPX L AE 25 +KPX L Aacute 28 +KPX L Adieresis 28 +KPX L Aring 28 +KPX L C 0 +KPX L Ccedilla 0 +KPX L G 4 +KPX L O 4 +KPX L Oacute 4 +KPX L Ocircumflex 4 +KPX L Odieresis 4 +KPX L Ograve 4 +KPX L Otilde 4 +KPX L S 1 +KPX L T -30 +KPX L U -17 +KPX L Udieresis -17 +KPX L V -77 +KPX L W -74 +KPX L Y -41 +KPX L hyphen 41 +KPX L quotedblright -45 +KPX L quoteright -67 +KPX L u 5 +KPX L udieresis 5 +KPX L y -23 +KPX N A -39 +KPX N AE -42 +KPX N Aacute -39 +KPX N Adieresis -39 +KPX N Aring -39 +KPX N C -32 +KPX N Ccedilla -30 +KPX N G -26 +KPX N O -32 +KPX N Oacute -32 +KPX N Odieresis -32 +KPX N a -25 +KPX N aacute -27 +KPX N adieresis -27 +KPX N ae -34 +KPX N aring -27 +KPX N comma -24 +KPX N e -37 +KPX N eacute -38 +KPX N o -32 +KPX N oacute -34 +KPX N odieresis -34 +KPX N oslash -32 +KPX N period -26 +KPX N u -33 +KPX N udieresis -33 +KPX O A -57 +KPX O AE -67 +KPX O Aacute -57 +KPX O Adieresis -57 +KPX O Aring -57 +KPX O T -18 +KPX O V -52 +KPX O W -52 +KPX O X -63 +KPX O Y -56 +KPX Oacute A -57 +KPX Oacute T -18 +KPX Oacute V -52 +KPX Oacute W -52 +KPX Oacute Y -56 +KPX Ocircumflex T -18 +KPX Ocircumflex V -52 +KPX Ocircumflex Y -56 +KPX Odieresis A -57 +KPX Odieresis T -18 +KPX Odieresis V -52 +KPX Odieresis W -52 +KPX Odieresis X -63 +KPX Odieresis Y -56 +KPX Ograve T -18 +KPX Ograve V -52 +KPX Ograve Y -56 +KPX Oslash A -57 +KPX Otilde T -18 +KPX Otilde V -52 +KPX Otilde Y -56 +KPX P A -89 +KPX P AE -104 +KPX P Aacute -89 +KPX P Adieresis -89 +KPX P Aring -89 +KPX P J -105 +KPX P a -50 +KPX P aacute -50 +KPX P adieresis -38 +KPX P ae -58 +KPX P aring -50 +KPX P comma -107 +KPX P e -57 +KPX P eacute -57 +KPX P hyphen -54 +KPX P o -52 +KPX P oacute -52 +KPX P odieresis -35 +KPX P oe -57 +KPX P oslash -47 +KPX P period -109 +KPX R C -33 +KPX R Ccedilla -32 +KPX R G -28 +KPX R O -34 +KPX R OE -32 +KPX R Oacute -34 +KPX R Odieresis -34 +KPX R T -24 +KPX R U -44 +KPX R Udieresis -44 +KPX R V -46 +KPX R W -46 +KPX R Y -40 +KPX R a -1 +KPX R aacute -1 +KPX R adieresis -1 +KPX R ae -9 +KPX R aring -1 +KPX R e -21 +KPX R eacute -21 +KPX R hyphen -30 +KPX R o -18 +KPX R oacute -18 +KPX R odieresis -18 +KPX R oe -23 +KPX R u -13 +KPX R uacute -13 +KPX R udieresis -13 +KPX R y -12 +KPX S A -11 +KPX S AE -17 +KPX S Aacute -11 +KPX S Adieresis -11 +KPX S Aring -11 +KPX S T -34 +KPX S V -20 +KPX S W -20 +KPX S Y -24 +KPX S t -6 +KPX T A -52 +KPX T AE -54 +KPX T Aacute -52 +KPX T Acircumflex -52 +KPX T Adieresis -52 +KPX T Agrave -52 +KPX T Aring -52 +KPX T Atilde -52 +KPX T C -15 +KPX T G -9 +KPX T J -63 +KPX T O -22 +KPX T OE -18 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -22 +KPX T Otilde -22 +KPX T S -16 +KPX T V 15 +KPX T W 15 +KPX T Y 11 +KPX T a -83 +KPX T ae -91 +KPX T c -89 +KPX T colon -98 +KPX T comma -77 +KPX T e -94 +KPX T g -95 +KPX T guillemotleft -110 +KPX T guilsinglleft -120 +KPX T hyphen -74 +KPX T i -19 +KPX T j -27 +KPX T o -90 +KPX T oslash -90 +KPX T period -79 +KPX T r -76 +KPX T s -78 +KPX T semicolon -98 +KPX T u -91 +KPX T v -89 +KPX T w -89 +KPX T y -86 +KPX U A -65 +KPX U AE -71 +KPX U Aacute -65 +KPX U Acircumflex -65 +KPX U Adieresis -65 +KPX U Aring -65 +KPX U Atilde -65 +KPX U comma -40 +KPX U m -35 +KPX U n -39 +KPX U p -30 +KPX U period -41 +KPX U r -32 +KPX Uacute A -65 +KPX Uacute comma -40 +KPX Uacute m -35 +KPX Uacute n -39 +KPX Uacute p -30 +KPX Uacute period -41 +KPX Uacute r -32 +KPX Ucircumflex A -65 +KPX Udieresis A -65 +KPX Udieresis b 1 +KPX Udieresis comma -40 +KPX Udieresis m -35 +KPX Udieresis n -39 +KPX Udieresis p -30 +KPX Udieresis period -41 +KPX Udieresis r -32 +KPX Ugrave A -65 +KPX V A -100 +KPX V AE -111 +KPX V Aacute -100 +KPX V Acircumflex -100 +KPX V Adieresis -100 +KPX V Agrave -100 +KPX V Aring -100 +KPX V Atilde -100 +KPX V C -60 +KPX V G -53 +KPX V O -64 +KPX V Oacute -64 +KPX V Ocircumflex -64 +KPX V Odieresis -64 +KPX V Ograve -64 +KPX V Oslash -64 +KPX V Otilde -64 +KPX V S -25 +KPX V T 7 +KPX V a -76 +KPX V ae -84 +KPX V colon -96 +KPX V comma -96 +KPX V e -87 +KPX V g -83 +KPX V guillemotleft -99 +KPX V guilsinglleft -109 +KPX V hyphen -62 +KPX V i -12 +KPX V o -83 +KPX V oslash -81 +KPX V period -97 +KPX V r -44 +KPX V semicolon -96 +KPX V u -47 +KPX V y -34 +KPX W A -83 +KPX W AE -87 +KPX W Aacute -83 +KPX W Acircumflex -83 +KPX W Adieresis -83 +KPX W Agrave -83 +KPX W Aring -83 +KPX W Atilde -83 +KPX W C -46 +KPX W G -41 +KPX W O -47 +KPX W Oacute -47 +KPX W Ocircumflex -47 +KPX W Odieresis -47 +KPX W Ograve -47 +KPX W Oslash -48 +KPX W Otilde -47 +KPX W S -24 +KPX W T 8 +KPX W a -51 +KPX W ae -60 +KPX W colon -78 +KPX W comma -62 +KPX W e -62 +KPX W g -63 +KPX W guillemotleft -74 +KPX W guilsinglleft -84 +KPX W hyphen -37 +KPX W i -11 +KPX W o -58 +KPX W oslash -57 +KPX W period -64 +KPX W r -34 +KPX W semicolon -79 +KPX W u -38 +KPX W y -25 +KPX X C -58 +KPX X O -56 +KPX X Odieresis -56 +KPX X Q -58 +KPX X a -9 +KPX X e -29 +KPX X hyphen -46 +KPX X o -26 +KPX X u -21 +KPX X y -81 +KPX Y A -45 +KPX Y AE -47 +KPX Y Aacute -45 +KPX Y Acircumflex -45 +KPX Y Adieresis -45 +KPX Y Agrave -45 +KPX Y Aring -45 +KPX Y Atilde -45 +KPX Y C -59 +KPX Y G -54 +KPX Y O -61 +KPX Y Oacute -61 +KPX Y Ocircumflex -61 +KPX Y Odieresis -61 +KPX Y Ograve -61 +KPX Y Oslash -61 +KPX Y Otilde -61 +KPX Y S -25 +KPX Y T 7 +KPX Y a -69 +KPX Y ae -77 +KPX Y colon -91 +KPX Y comma -67 +KPX Y e -80 +KPX Y g -81 +KPX Y guillemotleft -97 +KPX Y guilsinglleft -107 +KPX Y hyphen -63 +KPX Y i -12 +KPX Y o -76 +KPX Y oslash -75 +KPX Y p -54 +KPX Y period -69 +KPX Y semicolon -91 +KPX Y u -59 +KPX Y v -54 +KPX Z v -29 +KPX Z y -39 +KPX a j -2 +KPX a quoteright -22 +KPX a v -5 +KPX a w -5 +KPX a y -3 +KPX aacute v -5 +KPX aacute w -5 +KPX aacute y -3 +KPX adieresis v -5 +KPX adieresis w -5 +KPX adieresis y -3 +KPX ae v -5 +KPX ae w -5 +KPX ae y -8 +KPX agrave v -5 +KPX agrave w -5 +KPX agrave y -3 +KPX aring v -5 +KPX aring w -5 +KPX aring y -3 +KPX b v -12 +KPX b w -12 +KPX b y -17 +KPX c h -20 +KPX c k -16 +KPX comma one -26 +KPX comma quotedblright -1 +KPX comma quoteright -23 +KPX e quoteright -12 +KPX e t -3 +KPX e v -3 +KPX e w -3 +KPX e x -15 +KPX e y -6 +KPX eacute v -3 +KPX eacute w -3 +KPX eacute y -6 +KPX ecircumflex v -3 +KPX ecircumflex w -3 +KPX ecircumflex y -6 +KPX eight four -4 +KPX eight one -52 +KPX eight seven -13 +KPX f a -23 +KPX f aacute -24 +KPX f adieresis 17 +KPX f ae -32 +KPX f aring -20 +KPX f e -35 +KPX f eacute -36 +KPX f f 2 +KPX f i 20 +KPX f j 12 +KPX f l 43 +KPX f o -30 +KPX f oacute -31 +KPX f odieresis 20 +KPX f oe -35 +KPX f oslash -29 +KPX f quoteright 12 +KPX f s -14 +KPX f t 9 +KPX five four -13 +KPX five one -56 +KPX five seven -37 +KPX four four 1 +KPX four one -50 +KPX four seven -21 +KPX g a -25 +KPX g adieresis -25 +KPX g ae -34 +KPX g aring -25 +KPX g e -32 +KPX g eacute -32 +KPX g l -21 +KPX g oacute -27 +KPX g odieresis -27 +KPX g r 3 +KPX guillemotright A -30 +KPX guillemotright AE -39 +KPX guillemotright Aacute -30 +KPX guillemotright Adieresis -30 +KPX guillemotright Aring -30 +KPX guillemotright T -76 +KPX guillemotright V -79 +KPX guillemotright W -75 +KPX guillemotright Y -83 +KPX guilsinglright A -40 +KPX guilsinglright AE -49 +KPX guilsinglright Aacute -40 +KPX guilsinglright Adieresis -40 +KPX guilsinglright Aring -40 +KPX guilsinglright T -86 +KPX guilsinglright V -89 +KPX guilsinglright W -85 +KPX guilsinglright Y -93 +KPX h quoteright -32 +KPX h y -20 +KPX hyphen A -13 +KPX hyphen AE -22 +KPX hyphen Aacute -13 +KPX hyphen Adieresis -13 +KPX hyphen Aring -13 +KPX hyphen T -59 +KPX hyphen V -62 +KPX hyphen W -59 +KPX hyphen Y -69 +KPX i T -20 +KPX i j -5 +KPX k a 10 +KPX k aacute 10 +KPX k adieresis 10 +KPX k ae 2 +KPX k aring 10 +KPX k comma 19 +KPX k e -2 +KPX k eacute -2 +KPX k g -14 +KPX k hyphen 1 +KPX k o 1 +KPX k oacute 1 +KPX k odieresis 1 +KPX k period 17 +KPX k s 1 +KPX k u 2 +KPX k udieresis 2 +KPX l v -12 +KPX l y -8 +KPX m p -1 +KPX m v -16 +KPX m w -16 +KPX m y -16 +KPX n T -59 +KPX n p -4 +KPX n quoteright -32 +KPX n v -20 +KPX n w -20 +KPX n y -20 +KPX nine four -18 +KPX nine one -67 +KPX nine seven -12 +KPX o T -75 +KPX o quoteright -22 +KPX o t -2 +KPX o v -21 +KPX o w -21 +KPX o x -26 +KPX o y -29 +KPX oacute v -21 +KPX oacute w -21 +KPX oacute y -29 +KPX ocircumflex t -4 +KPX odieresis t -4 +KPX odieresis v -21 +KPX odieresis w -21 +KPX odieresis x -26 +KPX odieresis y -29 +KPX ograve v -21 +KPX ograve w -21 +KPX ograve y -29 +KPX one comma -38 +KPX one eight -56 +KPX one five -45 +KPX one four -75 +KPX one nine -40 +KPX one one -48 +KPX one period -39 +KPX one seven -65 +KPX one six -62 +KPX one three -43 +KPX one two -32 +KPX one zero -48 +KPX p t -2 +KPX p y -13 +KPX period one -32 +KPX period quotedblright -5 +KPX period quoteright -27 +KPX q c -6 +KPX q u -5 +KPX quotedblbase A 24 +KPX quotedblbase AE 19 +KPX quotedblbase T -37 +KPX quotedblbase V -79 +KPX quotedblbase W -74 +KPX quotedblbase Y -48 +KPX quotedblleft A -76 +KPX quotedblleft AE -98 +KPX quotedblleft Aacute -76 +KPX quotedblleft Adieresis -76 +KPX quotedblleft Aring -76 +KPX quotedblleft T -11 +KPX quotedblleft V 3 +KPX quotedblleft W 3 +KPX quotedblleft Y 0 +KPX quotedblright A -72 +KPX quotedblright AE -94 +KPX quotedblright Aacute -72 +KPX quotedblright Adieresis -72 +KPX quotedblright Aring -72 +KPX quotedblright T -1 +KPX quotedblright V 6 +KPX quotedblright W 6 +KPX quotedblright Y 2 +KPX quoteleft A -83 +KPX quoteleft AE -105 +KPX quoteleft Aacute -83 +KPX quoteleft Adieresis -83 +KPX quoteleft Aring -83 +KPX quoteleft T -18 +KPX quoteleft V -3 +KPX quoteleft W -3 +KPX quoteleft Y -7 +KPX quoteright A -94 +KPX quoteright AE -116 +KPX quoteright Aacute -94 +KPX quoteright Adieresis -94 +KPX quoteright Aring -94 +KPX quoteright comma -57 +KPX quoteright d -50 +KPX quoteright o -50 +KPX quoteright period -59 +KPX quoteright r -26 +KPX quoteright s -26 +KPX quoteright t -19 +KPX quoteright v -23 +KPX quoteright w -23 +KPX quoteright y -18 +KPX r a -13 +KPX r aacute -13 +KPX r acircumflex -13 +KPX r adieresis -13 +KPX r ae -22 +KPX r agrave -13 +KPX r aring -13 +KPX r c -15 +KPX r ccedilla -8 +KPX r colon -30 +KPX r comma -67 +KPX r d -14 +KPX r e -20 +KPX r eacute -20 +KPX r ecircumflex -20 +KPX r egrave -20 +KPX r f 8 +KPX r g -4 +KPX r h -16 +KPX r hyphen -13 +KPX r i 17 +KPX r j 12 +KPX r k -11 +KPX r l -12 +KPX r m 10 +KPX r n 6 +KPX r o -15 +KPX r oacute -15 +KPX r ocircumflex -15 +KPX r odieresis -15 +KPX r oe -19 +KPX r ograve -15 +KPX r oslash -12 +KPX r p 16 +KPX r period -69 +KPX r q -19 +KPX r quoteright 0 +KPX r r 14 +KPX r s 1 +KPX r semicolon -30 +KPX r t 12 +KPX r u 11 +KPX r v 20 +KPX r w 20 +KPX r x 7 +KPX r y 20 +KPX r z 10 +KPX s quoteright -22 +KPX s t -6 +KPX seven colon -90 +KPX seven comma -80 +KPX seven eight -46 +KPX seven five -60 +KPX seven four -79 +KPX seven one -43 +KPX seven period -81 +KPX seven seven -27 +KPX seven six -60 +KPX seven three -42 +KPX seven two -30 +KPX six four 2 +KPX six one -52 +KPX six seven -32 +KPX t S -11 +KPX t a 10 +KPX t aacute 10 +KPX t adieresis 10 +KPX t ae 2 +KPX t aring 10 +KPX t colon -22 +KPX t e -2 +KPX t eacute -2 +KPX t h -5 +KPX t o 1 +KPX t oacute 1 +KPX t odieresis 1 +KPX t quoteright -19 +KPX t semicolon -23 +KPX three four -15 +KPX three one -67 +KPX three seven -27 +KPX two four -8 +KPX two one -48 +KPX two seven -27 +KPX u quoteright -33 +KPX v a -20 +KPX v aacute -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v ae -28 +KPX v agrave -20 +KPX v aring -20 +KPX v atilde -20 +KPX v c -24 +KPX v colon -51 +KPX v comma -51 +KPX v e -28 +KPX v eacute -28 +KPX v ecircumflex -28 +KPX v egrave -28 +KPX v g -20 +KPX v hyphen -1 +KPX v l -24 +KPX v o -24 +KPX v oacute -24 +KPX v odieresis -24 +KPX v ograve -24 +KPX v oslash -22 +KPX v period -51 +KPX v s -19 +KPX v semicolon -51 +KPX w a -24 +KPX w aacute -24 +KPX w acircumflex -24 +KPX w adieresis -24 +KPX w ae -32 +KPX w agrave -24 +KPX w aring -24 +KPX w atilde -24 +KPX w c -30 +KPX w colon -56 +KPX w comma -53 +KPX w e -34 +KPX w eacute -34 +KPX w ecircumflex -34 +KPX w egrave -34 +KPX w g -26 +KPX w hyphen -7 +KPX w l -28 +KPX w o -30 +KPX w oacute -30 +KPX w odieresis -30 +KPX w ograve -30 +KPX w oslash -28 +KPX w period -53 +KPX w s -24 +KPX w semicolon -56 +KPX x a -1 +KPX x c -10 +KPX x e -14 +KPX x eacute -14 +KPX x o -11 +KPX x q -12 +KPX y a -11 +KPX y aacute -12 +KPX y acircumflex -12 +KPX y adieresis -12 +KPX y ae -19 +KPX y agrave -12 +KPX y aring -12 +KPX y atilde -12 +KPX y c -17 +KPX y colon -43 +KPX y comma -25 +KPX y e -22 +KPX y eacute -23 +KPX y ecircumflex -23 +KPX y egrave -23 +KPX y g -23 +KPX y hyphen 2 +KPX y l -16 +KPX y o -17 +KPX y oacute -19 +KPX y odieresis -19 +KPX y ograve -19 +KPX y oslash -17 +KPX y period -26 +KPX y s -13 +KPX y semicolon -44 +KPX zero four -1 +KPX zero one -50 +KPX zero seven -12 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n021024l.pfb b/PdfReader/Resources/Fonts/n021024l.pfb new file mode 100644 index 0000000000..d627f0f015 Binary files /dev/null and b/PdfReader/Resources/Fonts/n021024l.pfb differ diff --git a/PdfReader/Resources/Fonts/n022003l.afm b/PdfReader/Resources/Fonts/n022003l.afm new file mode 100644 index 0000000000..2ebe8d247b --- /dev/null +++ b/PdfReader/Resources/Fonts/n022003l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-Regu +FullName Nimbus Mono L Regular +FamilyName Nimbus Mono L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -12 -237 650 811 +CapHeight 563 +XHeight 417 +Descender -186 +Ascender 604 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 295 0 295 0 ; +C 33 ; WX 600 ; N exclam ; B 240 -15 360 618 ; +C 34 ; WX 600 ; N quotedbl ; B 146 315 454 604 ; +C 35 ; WX 600 ; N numbersign ; B 92 -62 508 647 ; +C 36 ; WX 600 ; N dollar ; B 113 -92 487 655 ; +C 37 ; WX 600 ; N percent ; B 87 -12 513 611 ; +C 38 ; WX 600 ; N ampersand ; B 105 -16 478 519 ; +C 39 ; WX 600 ; N quoteright ; B 135 314 340 604 ; +C 40 ; WX 600 ; N parenleft ; B 294 -124 458 604 ; +C 41 ; WX 600 ; N parenright ; B 147 -124 311 604 ; +C 42 ; WX 600 ; N asterisk ; B 113 250 487 604 ; +C 43 ; WX 600 ; N plus ; B 72 32 528 530 ; +C 44 ; WX 600 ; N comma ; B 135 -145 340 145 ; +C 45 ; WX 600 ; N hyphen ; B 72 258 528 299 ; +C 46 ; WX 600 ; N period ; B 226 -15 374 116 ; +C 47 ; WX 600 ; N slash ; B 113 -81 487 668 ; +C 48 ; WX 600 ; N zero ; B 113 -15 487 618 ; +C 49 ; WX 600 ; N one ; B 113 0 487 612 ; +C 50 ; WX 600 ; N two ; B 84 0 478 618 ; +C 51 ; WX 600 ; N three ; B 96 -15 499 618 ; +C 52 ; WX 600 ; N four ; B 105 0 478 604 ; +C 53 ; WX 600 ; N five ; B 96 -15 499 604 ; +C 54 ; WX 600 ; N six ; B 136 -15 510 618 ; +C 55 ; WX 600 ; N seven ; B 105 -1 478 604 ; +C 56 ; WX 600 ; N eight ; B 113 -15 487 618 ; +C 57 ; WX 600 ; N nine ; B 136 -15 510 618 ; +C 58 ; WX 600 ; N colon ; B 226 -15 374 417 ; +C 59 ; WX 600 ; N semicolon ; B 139 -145 350 417 ; +C 60 ; WX 600 ; N less ; B 72 44 522 518 ; +C 61 ; WX 600 ; N equal ; B 51 190 549 375 ; +C 62 ; WX 600 ; N greater ; B 78 44 528 518 ; +C 63 ; WX 600 ; N question ; B 134 -15 487 577 ; +C 64 ; WX 600 ; N at ; B 105 -62 478 624 ; +C 65 ; WX 600 ; N A ; B 9 0 591 563 ; +C 66 ; WX 600 ; N B ; B 43 0 541 563 ; +C 67 ; WX 600 ; N C ; B 63 -16 534 576 ; +C 68 ; WX 600 ; N D ; B 43 0 520 563 ; +C 69 ; WX 600 ; N E ; B 43 0 520 563 ; +C 70 ; WX 600 ; N F ; B 43 0 520 563 ; +C 71 ; WX 600 ; N G ; B 63 -16 562 576 ; +C 72 ; WX 600 ; N H ; B 53 0 551 563 ; +C 73 ; WX 600 ; N I ; B 113 0 487 563 ; +C 74 ; WX 600 ; N J ; B 84 -16 583 563 ; +C 75 ; WX 600 ; N K ; B 43 0 572 563 ; +C 76 ; WX 600 ; N L ; B 63 0 541 563 ; +C 77 ; WX 600 ; N M ; B 11 0 593 563 ; +C 78 ; WX 600 ; N N ; B 22 0 562 563 ; +C 79 ; WX 600 ; N O ; B 51 -16 549 576 ; +C 80 ; WX 600 ; N P ; B 43 0 499 563 ; +C 81 ; WX 600 ; N Q ; B 51 -115 549 576 ; +C 82 ; WX 600 ; N R ; B 43 0 589 563 ; +C 83 ; WX 600 ; N S ; B 92 -16 508 576 ; +C 84 ; WX 600 ; N T ; B 72 0 528 563 ; +C 85 ; WX 600 ; N U ; B 40 -16 560 563 ; +C 86 ; WX 600 ; N V ; B 9 0 591 563 ; +C 87 ; WX 600 ; N W ; B 20 0 580 563 ; +C 88 ; WX 600 ; N X ; B 40 0 560 563 ; +C 89 ; WX 600 ; N Y ; B 51 0 549 563 ; +C 90 ; WX 600 ; N Z ; B 103 0 497 563 ; +C 91 ; WX 600 ; N bracketleft ; B 280 -124 445 604 ; +C 92 ; WX 600 ; N backslash ; B 113 -81 487 668 ; +C 93 ; WX 600 ; N bracketright ; B 155 -124 320 604 ; +C 94 ; WX 600 ; N asciicircum ; B 113 354 487 615 ; +C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 260 343 465 604 ; +C 97 ; WX 600 ; N a ; B 72 -16 541 431 ; +C 98 ; WX 600 ; N b ; B 22 -16 541 604 ; +C 99 ; WX 600 ; N c ; B 84 -16 535 431 ; +C 100 ; WX 600 ; N d ; B 63 -16 583 604 ; +C 101 ; WX 600 ; N e ; B 63 -16 520 431 ; +C 102 ; WX 600 ; N f ; B 105 0 541 604 ; +C 103 ; WX 600 ; N g ; B 63 -186 562 431 ; +C 104 ; WX 600 ; N h ; B 43 0 551 604 ; +C 105 ; WX 600 ; N i ; B 92 0 508 624 ; +C 106 ; WX 600 ; N j ; B 147 -186 458 624 ; +C 107 ; WX 600 ; N k ; B 63 0 541 604 ; +C 108 ; WX 600 ; N l ; B 92 0 508 604 ; +C 109 ; WX 600 ; N m ; B 11 0 593 431 ; +C 110 ; WX 600 ; N n ; B 53 0 541 431 ; +C 111 ; WX 600 ; N o ; B 72 -16 528 431 ; +C 112 ; WX 600 ; N p ; B 22 -186 541 431 ; +C 113 ; WX 600 ; N q ; B 63 -186 583 431 ; +C 114 ; WX 600 ; N r ; B 84 0 541 427 ; +C 115 ; WX 600 ; N s ; B 103 -16 497 431 ; +C 116 ; WX 600 ; N t ; B 43 -16 499 563 ; +C 117 ; WX 600 ; N u ; B 43 -16 541 417 ; +C 118 ; WX 600 ; N v ; B 30 0 570 417 ; +C 119 ; WX 600 ; N w ; B 30 0 570 417 ; +C 120 ; WX 600 ; N x ; B 51 0 549 417 ; +C 121 ; WX 600 ; N y ; B 51 -186 549 417 ; +C 122 ; WX 600 ; N z ; B 115 0 489 417 ; +C 123 ; WX 600 ; N braceleft ; B 197 -124 403 604 ; +C 124 ; WX 600 ; N bar ; B 280 -124 320 604 ; +C 125 ; WX 600 ; N braceright ; B 197 -124 403 604 ; +C 126 ; WX 600 ; N asciitilde ; B 92 212 508 348 ; +C 161 ; WX 600 ; N exclamdown ; B 240 -216 360 417 ; +C 162 ; WX 600 ; N cent ; B 113 -13 469 630 ; +C 163 ; WX 600 ; N sterling ; B 63 0 520 578 ; +C 164 ; WX 600 ; N fraction ; B 50 138 549 470 ; +C 165 ; WX 600 ; N yen ; B 51 0 549 563 ; +C 166 ; WX 600 ; N florin ; B 87 -93 518 618 ; +C 167 ; WX 600 ; N section ; B 66 -62 534 603 ; +C 168 ; WX 600 ; N currency ; B 103 95 497 489 ; +C 169 ; WX 600 ; N quotesingle ; B 236 315 364 604 ; +C 170 ; WX 600 ; N quotedblleft ; B 93 343 507 604 ; +C 171 ; WX 600 ; N guillemotleft ; B 63 0 541 417 ; +C 172 ; WX 600 ; N guilsinglleft ; B 63 0 312 417 ; +C 173 ; WX 600 ; N guilsinglright ; B 293 0 541 417 ; +C 174 ; WX 600 ; N fi ; B 10 0 585 624 ; +C 175 ; WX 600 ; N fl ; B 10 0 587 604 ; +C 177 ; WX 600 ; N endash ; B 72 261 528 302 ; +C 178 ; WX 600 ; N dagger ; B 124 -63 476 604 ; +C 179 ; WX 600 ; N daggerdbl ; B 124 -62 476 604 ; +C 180 ; WX 600 ; N periodcentered ; B 226 217 374 348 ; +C 182 ; WX 600 ; N paragraph ; B 79 -62 525 604 ; +C 183 ; WX 600 ; N bullet ; B 202 141 398 337 ; +C 184 ; WX 600 ; N quotesinglbase ; B 135 -145 340 145 ; +C 185 ; WX 600 ; N quotedblbase ; B 93 -116 507 145 ; +C 186 ; WX 600 ; N quotedblright ; B 93 343 507 604 ; +C 187 ; WX 600 ; N guillemotright ; B 63 0 541 417 ; +C 188 ; WX 600 ; N ellipsis ; B 51 -15 549 84 ; +C 189 ; WX 600 ; N perthousand ; B 34 -9 564 614 ; +C 191 ; WX 600 ; N questiondown ; B 113 -175 466 417 ; +C 193 ; WX 600 ; N grave ; B 155 490 320 639 ; +C 194 ; WX 600 ; N acute ; B 280 490 445 639 ; +C 195 ; WX 600 ; N circumflex ; B 155 490 445 639 ; +C 196 ; WX 600 ; N tilde ; B 145 516 455 605 ; +C 197 ; WX 600 ; N macron ; B 155 536 445 576 ; +C 198 ; WX 600 ; N breve ; B 155 490 445 620 ; +C 199 ; WX 600 ; N dotaccent ; B 250 511 350 611 ; +C 200 ; WX 600 ; N dieresis ; B 140 511 461 611 ; +C 202 ; WX 600 ; N ring ; B 207 480 393 661 ; +C 203 ; WX 600 ; N cedilla ; B 210 -173 377 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 155 490 445 633 ; +C 206 ; WX 600 ; N ogonek ; B 280 -155 433 0 ; +C 207 ; WX 600 ; N caron ; B 155 490 445 639 ; +C 208 ; WX 600 ; N emdash ; B 1 261 599 302 ; +C 225 ; WX 600 ; N AE ; B 10 0 590 563 ; +C 227 ; WX 600 ; N ordfeminine ; B 155 279 447 574 ; +C 232 ; WX 600 ; N Lslash ; B 43 0 541 563 ; +C 233 ; WX 600 ; N Oslash ; B 40 -43 560 605 ; +C 234 ; WX 600 ; N OE ; B 10 0 590 563 ; +C 235 ; WX 600 ; N ordmasculine ; B 154 284 448 577 ; +C 241 ; WX 600 ; N ae ; B 12 -16 578 431 ; +C 245 ; WX 600 ; N dotlessi ; B 92 0 508 417 ; +C 248 ; WX 600 ; N lslash ; B 92 0 508 604 ; +C 249 ; WX 600 ; N oslash ; B 53 -43 543 458 ; +C 250 ; WX 600 ; N oe ; B 12 -16 578 431 ; +C 251 ; WX 600 ; N germandbls ; B 43 -16 499 604 ; +C -1 ; WX 600 ; N Udieresis ; B 40 -16 560 761 ; +C -1 ; WX 600 ; N Uacute ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N Scedilla ; B 92 -173 508 576 ; +C -1 ; WX 600 ; N Tcaron ; B 72 0 528 789 ; +C -1 ; WX 600 ; N Scaron ; B 92 -16 508 789 ; +C -1 ; WX 600 ; N Rcaron ; B 43 0 589 789 ; +C -1 ; WX 600 ; N Racute ; B 43 0 589 789 ; +C -1 ; WX 600 ; N Sacute ; B 92 -16 508 789 ; +C -1 ; WX 600 ; N Otilde ; B 51 -16 549 755 ; +C -1 ; WX 600 ; N ucircumflex ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 51 -16 549 783 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 40 -16 560 783 ; +C -1 ; WX 600 ; N Yacute ; B 51 0 549 789 ; +C -1 ; WX 600 ; N Eth ; B 0 0 520 563 ; +C -1 ; WX 600 ; N Dcroat ; B 0 0 520 563 ; +C -1 ; WX 600 ; N Zacute ; B 103 0 497 789 ; +C -1 ; WX 600 ; N Uring ; B 40 -16 560 811 ; +C -1 ; WX 600 ; N gbreve ; B 63 -186 562 620 ; +C -1 ; WX 600 ; N eogonek ; B 63 -155 520 431 ; +C -1 ; WX 600 ; N edotaccent ; B 63 -16 520 611 ; +C -1 ; WX 600 ; N ecaron ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N Ugrave ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N Thorn ; B 43 0 499 563 ; +C -1 ; WX 600 ; N eacute ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N edieresis ; B 63 -16 520 611 ; +C -1 ; WX 600 ; N dcaron ; B 63 -16 650 616 ; +C -1 ; WX 600 ; N ccedilla ; B 84 -173 535 431 ; +C -1 ; WX 600 ; N ccaron ; B 84 -16 535 639 ; +C -1 ; WX 600 ; N cacute ; B 84 -16 535 639 ; +C -1 ; WX 600 ; N aogonek ; B 72 -155 556 431 ; +C -1 ; WX 600 ; N aring ; B 72 -16 541 661 ; +C -1 ; WX 600 ; N atilde ; B 72 -16 541 605 ; +C -1 ; WX 600 ; N abreve ; B 72 -16 541 620 ; +C -1 ; WX 600 ; N egrave ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N agrave ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N aacute ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N adieresis ; B 72 -16 541 611 ; +C -1 ; WX 600 ; N Uogonek ; B 40 -155 560 563 ; +C -1 ; WX 600 ; N ugrave ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N uacute ; B 43 -16 541 639 ; +C -1 ; WX 600 ; N udieresis ; B 43 -16 541 611 ; +C -1 ; WX 600 ; N tcaron ; B 43 -16 508 616 ; +C -1 ; WX 600 ; N scommaaccent ; B 103 -237 497 431 ; +C -1 ; WX 600 ; N Zcaron ; B 103 0 497 789 ; +C -1 ; WX 600 ; N ecircumflex ; B 63 -16 520 639 ; +C -1 ; WX 600 ; N Ucircumflex ; B 40 -16 560 789 ; +C -1 ; WX 600 ; N acircumflex ; B 72 -16 541 639 ; +C -1 ; WX 600 ; N Zdotaccent ; B 103 0 497 761 ; +C -1 ; WX 600 ; N scaron ; B 103 -16 497 639 ; +C -1 ; WX 600 ; N Amacron ; B 9 0 591 726 ; +C -1 ; WX 600 ; N sacute ; B 103 -16 497 639 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 72 -237 528 563 ; +C -1 ; WX 600 ; N Ydieresis ; B 51 0 549 761 ; +C -1 ; WX 600 ; N thorn ; B 22 -186 541 590 ; +C -1 ; WX 600 ; N Emacron ; B 43 0 520 726 ; +C -1 ; WX 600 ; N Ograve ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N Oacute ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N Odieresis ; B 51 -16 549 761 ; +C -1 ; WX 600 ; N Ntilde ; B 22 0 562 755 ; +C -1 ; WX 600 ; N Ncaron ; B 22 0 562 789 ; +C -1 ; WX 600 ; N Nacute ; B 22 0 562 789 ; +C -1 ; WX 600 ; N Lcaron ; B 63 0 541 566 ; +C -1 ; WX 600 ; N Lacute ; B 63 0 541 789 ; +C -1 ; WX 600 ; N Idotaccent ; B 113 0 487 761 ; +C -1 ; WX 600 ; N racute ; B 84 0 541 639 ; +C -1 ; WX 600 ; N Icircumflex ; B 113 0 487 789 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 72 -16 528 633 ; +C -1 ; WX 600 ; N otilde ; B 72 -16 528 605 ; +C -1 ; WX 600 ; N Euro ; B 11 -16 534 576 ; +C -1 ; WX 600 ; N ocircumflex ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N onesuperior ; B 191 259 410 612 ; +C -1 ; WX 600 ; N twosuperior ; B 175 259 405 612 ; +C -1 ; WX 600 ; N threesuperior ; B 181 251 416 612 ; +C -1 ; WX 600 ; N Igrave ; B 113 0 487 789 ; +C -1 ; WX 600 ; N Iacute ; B 113 0 487 789 ; +C -1 ; WX 600 ; N Imacron ; B 113 0 487 726 ; +C -1 ; WX 600 ; N Iogonek ; B 113 -155 500 563 ; +C -1 ; WX 600 ; N Idieresis ; B 113 0 487 761 ; +C -1 ; WX 600 ; N Gbreve ; B 63 -16 562 770 ; +C -1 ; WX 600 ; N Umacron ; B 40 -16 560 726 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 43 -237 572 563 ; +C -1 ; WX 600 ; N ograve ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N Scommaaccent ; B 92 -237 508 576 ; +C -1 ; WX 600 ; N Eogonek ; B 43 -155 549 563 ; +C -1 ; WX 600 ; N oacute ; B 72 -16 528 639 ; +C -1 ; WX 600 ; N Edotaccent ; B 43 0 520 761 ; +C -1 ; WX 600 ; N iogonek ; B 92 -155 520 624 ; +C -1 ; WX 600 ; N gcommaaccent ; B 63 -186 562 666 ; +C -1 ; WX 600 ; N odieresis ; B 72 -16 528 611 ; +C -1 ; WX 600 ; N ntilde ; B 53 0 541 605 ; +C -1 ; WX 600 ; N ncaron ; B 53 0 541 639 ; +C -1 ; WX 600 ; N Ecaron ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Ecircumflex ; B 43 0 520 789 ; +C -1 ; WX 600 ; N scedilla ; B 103 -173 497 431 ; +C -1 ; WX 600 ; N rcaron ; B 84 0 541 639 ; +C -1 ; WX 600 ; N Egrave ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Eacute ; B 43 0 520 789 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 63 -237 562 576 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 43 -237 589 563 ; +C -1 ; WX 600 ; N Edieresis ; B 43 0 520 761 ; +C -1 ; WX 600 ; N nacute ; B 53 0 541 639 ; +C -1 ; WX 600 ; N uogonek ; B 43 -155 556 417 ; +C -1 ; WX 600 ; N umacron ; B 43 -16 541 576 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 520 789 ; +C -1 ; WX 600 ; N lcaron ; B 92 0 508 616 ; +C -1 ; WX 600 ; N Ccaron ; B 63 -16 534 789 ; +C -1 ; WX 600 ; N Cacute ; B 63 -16 534 789 ; +C -1 ; WX 600 ; N Ccedilla ; B 63 -173 534 576 ; +C -1 ; WX 600 ; N degree ; B 155 346 445 636 ; +C -1 ; WX 600 ; N Aogonek ; B 9 -155 600 563 ; +C -1 ; WX 600 ; N minus ; B 72 261 528 302 ; +C -1 ; WX 600 ; N multiply ; B 118 100 482 464 ; +C -1 ; WX 600 ; N divide ; B 72 25 528 540 ; +C -1 ; WX 600 ; N Aring ; B 9 0 591 811 ; +C -1 ; WX 600 ; N trademark ; B 4 243 598 563 ; +C -1 ; WX 600 ; N rcommaaccent ; B 84 -237 541 427 ; +C -1 ; WX 600 ; N lacute ; B 92 0 508 789 ; +C -1 ; WX 600 ; N omacron ; B 72 -16 528 576 ; +C -1 ; WX 600 ; N Atilde ; B 9 0 591 755 ; +C -1 ; WX 600 ; N icircumflex ; B 92 0 508 639 ; +C -1 ; WX 600 ; N igrave ; B 92 0 508 639 ; +C -1 ; WX 600 ; N ncommaaccent ; B 53 -237 541 431 ; +C -1 ; WX 600 ; N lcommaaccent ; B 92 -237 508 604 ; +C -1 ; WX 600 ; N plusminus ; B 72 0 528 529 ; +C -1 ; WX 600 ; N onehalf ; B 23 0 573 612 ; +C -1 ; WX 600 ; N onequarter ; B 16 0 580 612 ; +C -1 ; WX 600 ; N threequarters ; B 6 0 580 612 ; +C -1 ; WX 600 ; N iacute ; B 92 0 508 639 ; +C -1 ; WX 600 ; N Abreve ; B 9 0 591 770 ; +C -1 ; WX 600 ; N kcommaaccent ; B 63 -237 541 604 ; +C -1 ; WX 600 ; N Omacron ; B 51 -16 549 726 ; +C -1 ; WX 600 ; N imacron ; B 92 0 508 576 ; +C -1 ; WX 600 ; N emacron ; B 63 -16 520 576 ; +C -1 ; WX 600 ; N amacron ; B 72 -16 541 576 ; +C -1 ; WX 600 ; N tcommaaccent ; B 43 -237 499 563 ; +C -1 ; WX 600 ; N ydieresis ; B 51 -186 549 611 ; +C -1 ; WX 600 ; N zdotaccent ; B 115 0 489 611 ; +C -1 ; WX 600 ; N zcaron ; B 115 0 489 639 ; +C -1 ; WX 600 ; N zacute ; B 115 0 489 639 ; +C -1 ; WX 600 ; N yacute ; B 51 -186 549 639 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 43 -16 541 633 ; +C -1 ; WX 600 ; N eth ; B 72 -17 528 620 ; +C -1 ; WX 600 ; N uring ; B 43 -16 541 661 ; +C -1 ; WX 600 ; N Ocircumflex ; B 51 -16 549 789 ; +C -1 ; WX 600 ; N commaaccent ; B 234 -237 367 -60 ; +C -1 ; WX 600 ; N copyright ; B 3 -15 596 578 ; +C -1 ; WX 600 ; N registered ; B 3 -15 596 578 ; +C -1 ; WX 600 ; N Acircumflex ; B 9 0 591 789 ; +C -1 ; WX 600 ; N idieresis ; B 92 0 508 611 ; +C -1 ; WX 600 ; N lozenge ; B 89 -11 511 575 ; +C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; +C -1 ; WX 600 ; N notequal ; B 51 94 549 464 ; +C -1 ; WX 600 ; N radical ; B 27 0 628 699 ; +C -1 ; WX 600 ; N Agrave ; B 9 0 591 789 ; +C -1 ; WX 600 ; N Aacute ; B 9 0 591 789 ; +C -1 ; WX 600 ; N lessequal ; B 53 0 525 535 ; +C -1 ; WX 600 ; N greaterequal ; B 59 0 531 535 ; +C -1 ; WX 600 ; N logicalnot ; B 72 168 528 438 ; +C -1 ; WX 600 ; N summation ; B 113 -127 507 563 ; +C -1 ; WX 600 ; N partialdiff ; B 71 -17 529 582 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 22 -237 562 563 ; +C -1 ; WX 600 ; N dcroat ; B 63 -16 583 604 ; +C -1 ; WX 600 ; N brokenbar ; B 280 -124 320 604 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 63 -237 541 563 ; +C -1 ; WX 600 ; N Adieresis ; B 9 0 591 761 ; +C -1 ; WX 600 ; N mu ; B 43 -200 541 417 ; +C -1 ; WX 600 ; N .notdef ; B 295 0 295 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -33 +KPX A Ccedilla -30 +KPX A G -27 +KPX A O -27 +KPX A Odieresis -27 +KPX A Q -28 +KPX A T -27 +KPX A U -32 +KPX A Uacute -32 +KPX A Ucircumflex -32 +KPX A Udieresis -32 +KPX A Ugrave -32 +KPX A V -74 +KPX A W -12 +KPX A Y -28 +KPX A a 8 +KPX A b 46 +KPX A c -19 +KPX A ccedilla -15 +KPX A comma -39 +KPX A d -10 +KPX A e -14 +KPX A g -23 +KPX A guillemotleft -49 +KPX A guilsinglleft -49 +KPX A hyphen -30 +KPX A o -16 +KPX A period -67 +KPX A q -24 +KPX A quotedblright -78 +KPX A quoteright -98 +KPX A t -26 +KPX A u -15 +KPX A v -55 +KPX A w -19 +KPX A y -60 +KPX Aacute C -33 +KPX Aacute G -27 +KPX Aacute O -27 +KPX Aacute Q -28 +KPX Aacute T -27 +KPX Aacute U -32 +KPX Aacute V -74 +KPX Aacute W -12 +KPX Aacute Y -28 +KPX Aacute a 8 +KPX Aacute b 46 +KPX Aacute c -19 +KPX Aacute comma -39 +KPX Aacute d -10 +KPX Aacute e -14 +KPX Aacute g -23 +KPX Aacute guillemotleft -49 +KPX Aacute guilsinglleft -49 +KPX Aacute hyphen -30 +KPX Aacute o -16 +KPX Aacute period -67 +KPX Aacute q -24 +KPX Aacute quoteright -98 +KPX Aacute t -26 +KPX Aacute u -15 +KPX Aacute v -55 +KPX Aacute w -19 +KPX Aacute y -60 +KPX Acircumflex C -33 +KPX Acircumflex G -27 +KPX Acircumflex O -27 +KPX Acircumflex Q -28 +KPX Acircumflex T -27 +KPX Acircumflex U -32 +KPX Acircumflex V -74 +KPX Acircumflex W -12 +KPX Acircumflex Y -28 +KPX Acircumflex comma -39 +KPX Acircumflex period -67 +KPX Adieresis C -33 +KPX Adieresis G -27 +KPX Adieresis O -27 +KPX Adieresis Q -28 +KPX Adieresis T -27 +KPX Adieresis U -32 +KPX Adieresis V -74 +KPX Adieresis W -12 +KPX Adieresis Y -28 +KPX Adieresis a 8 +KPX Adieresis b 46 +KPX Adieresis c -19 +KPX Adieresis comma -39 +KPX Adieresis d -10 +KPX Adieresis g -23 +KPX Adieresis guillemotleft -49 +KPX Adieresis guilsinglleft -49 +KPX Adieresis hyphen -30 +KPX Adieresis o -16 +KPX Adieresis period -67 +KPX Adieresis q -24 +KPX Adieresis quotedblright -78 +KPX Adieresis quoteright -98 +KPX Adieresis t -26 +KPX Adieresis u -15 +KPX Adieresis v -55 +KPX Adieresis w -19 +KPX Adieresis y -60 +KPX Agrave C -33 +KPX Agrave G -27 +KPX Agrave O -27 +KPX Agrave Q -28 +KPX Agrave T -27 +KPX Agrave U -32 +KPX Agrave V -74 +KPX Agrave W -12 +KPX Agrave Y -28 +KPX Agrave comma -39 +KPX Agrave period -67 +KPX Aring C -33 +KPX Aring G -27 +KPX Aring O -27 +KPX Aring Q -28 +KPX Aring T -27 +KPX Aring U -32 +KPX Aring V -74 +KPX Aring W -12 +KPX Aring Y -28 +KPX Aring a 8 +KPX Aring b 46 +KPX Aring c -19 +KPX Aring comma -39 +KPX Aring d -10 +KPX Aring e -14 +KPX Aring g -23 +KPX Aring guillemotleft -49 +KPX Aring guilsinglleft -49 +KPX Aring hyphen -30 +KPX Aring o -16 +KPX Aring period -67 +KPX Aring q -24 +KPX Aring quotedblright -78 +KPX Aring quoteright -98 +KPX Aring t -26 +KPX Aring u -15 +KPX Aring v -55 +KPX Aring w -19 +KPX Aring y -60 +KPX Atilde C -33 +KPX Atilde G -27 +KPX Atilde O -27 +KPX Atilde Q -28 +KPX Atilde T -27 +KPX Atilde U -32 +KPX Atilde V -74 +KPX Atilde W -12 +KPX Atilde Y -28 +KPX Atilde comma -39 +KPX Atilde period -67 +KPX B A -9 +KPX B AE -9 +KPX B Aacute -9 +KPX B Acircumflex -9 +KPX B Adieresis -9 +KPX B Aring -9 +KPX B Atilde -9 +KPX B O -10 +KPX B OE 10 +KPX B Oacute -10 +KPX B Ocircumflex -10 +KPX B Odieresis -10 +KPX B Ograve -10 +KPX B Oslash -8 +KPX B V -29 +KPX B W -12 +KPX B Y -50 +KPX C A -9 +KPX C AE -9 +KPX C Aacute -9 +KPX C Adieresis -9 +KPX C Aring -9 +KPX C H -26 +KPX C K -11 +KPX C O -21 +KPX C Oacute -21 +KPX C Odieresis -21 +KPX Ccedilla A -5 +KPX D A -42 +KPX D Aacute -42 +KPX D Acircumflex -42 +KPX D Adieresis -42 +KPX D Agrave -42 +KPX D Aring -42 +KPX D Atilde -42 +KPX D J -31 +KPX D T -40 +KPX D V -42 +KPX D W -17 +KPX D X -55 +KPX D Y -63 +KPX F A -38 +KPX F Aacute -38 +KPX F Acircumflex -38 +KPX F Adieresis -38 +KPX F Agrave -38 +KPX F Aring -38 +KPX F Atilde -38 +KPX F J -95 +KPX F O -27 +KPX F Odieresis -27 +KPX F a -47 +KPX F aacute -47 +KPX F adieresis -43 +KPX F ae -20 +KPX F aring -47 +KPX F comma -168 +KPX F e -56 +KPX F eacute -56 +KPX F hyphen -67 +KPX F i -47 +KPX F j -54 +KPX F o -63 +KPX F oacute -63 +KPX F odieresis -48 +KPX F oe -21 +KPX F oslash -63 +KPX F period -193 +KPX F r -32 +KPX F u -1 +KPX G A 6 +KPX G AE 5 +KPX G Aacute 6 +KPX G Acircumflex 6 +KPX G Adieresis 6 +KPX G Agrave 6 +KPX G Aring 6 +KPX G Atilde 6 +KPX G T -25 +KPX G V 6 +KPX G W 1 +KPX G Y -14 +KPX J A -7 +KPX J AE -16 +KPX J Adieresis -7 +KPX J Aring -7 +KPX K C -42 +KPX K G -36 +KPX K O -37 +KPX K OE -19 +KPX K Oacute -37 +KPX K Odieresis -37 +KPX K S -9 +KPX K T -12 +KPX K a -1 +KPX K adieresis -1 +KPX K ae 26 +KPX K aring -1 +KPX K e -24 +KPX K hyphen -61 +KPX K o -25 +KPX K oacute -25 +KPX K odieresis -25 +KPX K u -25 +KPX K udieresis -25 +KPX K y -67 +KPX L A 17 +KPX L AE 16 +KPX L Aacute 17 +KPX L Adieresis 17 +KPX L Aring 17 +KPX L C -11 +KPX L Ccedilla -10 +KPX L G -10 +KPX L O -6 +KPX L Oacute -6 +KPX L Ocircumflex -6 +KPX L Odieresis -6 +KPX L Ograve -6 +KPX L Otilde -6 +KPX L S -24 +KPX L T -52 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -66 +KPX L W -27 +KPX L Y -53 +KPX L hyphen 3 +KPX L quotedblright -66 +KPX L quoteright -73 +KPX L u -16 +KPX L udieresis -16 +KPX L y -45 +KPX N A -3 +KPX N AE -3 +KPX N Aacute -3 +KPX N Adieresis -3 +KPX N Aring -3 +KPX N C -12 +KPX N Ccedilla -12 +KPX N G -11 +KPX N O -9 +KPX N Oacute -9 +KPX N Odieresis -9 +KPX N a -19 +KPX N aacute -19 +KPX N adieresis -19 +KPX N ae 11 +KPX N aring -19 +KPX N comma -58 +KPX N e -6 +KPX N eacute -6 +KPX N o -10 +KPX N oacute -10 +KPX N odieresis -10 +KPX N oslash -7 +KPX N period -83 +KPX N u -9 +KPX N udieresis -9 +KPX O A -27 +KPX O AE -26 +KPX O Aacute -27 +KPX O Adieresis -27 +KPX O Aring -27 +KPX O T -30 +KPX O V -31 +KPX O W -5 +KPX O X -43 +KPX O Y -52 +KPX Oacute A -27 +KPX Oacute T -30 +KPX Oacute V -31 +KPX Oacute W -5 +KPX Oacute Y -52 +KPX Ocircumflex T -30 +KPX Ocircumflex V -31 +KPX Ocircumflex Y -52 +KPX Odieresis A -27 +KPX Odieresis T -30 +KPX Odieresis V -31 +KPX Odieresis W -5 +KPX Odieresis X -43 +KPX Odieresis Y -52 +KPX Ograve T -30 +KPX Ograve V -31 +KPX Ograve Y -52 +KPX Oslash A -26 +KPX Otilde T -30 +KPX Otilde V -31 +KPX Otilde Y -52 +KPX P A -79 +KPX P AE -76 +KPX P Aacute -79 +KPX P Adieresis -79 +KPX P Aring -79 +KPX P J -82 +KPX P a -52 +KPX P aacute -52 +KPX P adieresis -52 +KPX P ae -25 +KPX P aring -52 +KPX P comma -156 +KPX P e -42 +KPX P eacute -42 +KPX P hyphen -46 +KPX P o -48 +KPX P oacute -48 +KPX P odieresis -48 +KPX P oe -13 +KPX P oslash -48 +KPX P period -181 +KPX R C -27 +KPX R Ccedilla -28 +KPX R G -26 +KPX R O -25 +KPX R OE -4 +KPX R Oacute -25 +KPX R Odieresis -25 +KPX R T -28 +KPX R U -32 +KPX R Udieresis -32 +KPX R V -33 +KPX R W -13 +KPX R Y -29 +KPX R a 7 +KPX R aacute 7 +KPX R adieresis 7 +KPX R ae 35 +KPX R aring 7 +KPX R e -15 +KPX R eacute -15 +KPX R hyphen -48 +KPX R o -17 +KPX R oacute -17 +KPX R odieresis -17 +KPX R oe 22 +KPX R u -11 +KPX R uacute -11 +KPX R udieresis -11 +KPX R y -15 +KPX S A -22 +KPX S AE -22 +KPX S Aacute -22 +KPX S Adieresis -22 +KPX S Aring -22 +KPX S T -42 +KPX S V -10 +KPX S W -16 +KPX S Y -31 +KPX S t -18 +KPX T A -27 +KPX T AE -27 +KPX T Aacute -27 +KPX T Acircumflex -27 +KPX T Adieresis -27 +KPX T Agrave -27 +KPX T Aring -27 +KPX T Atilde -27 +KPX T C -29 +KPX T G -30 +KPX T J -79 +KPX T O -29 +KPX T OE -7 +KPX T Oacute -29 +KPX T Ocircumflex -29 +KPX T Odieresis -29 +KPX T Ograve -29 +KPX T Oslash -29 +KPX T Otilde -29 +KPX T S -43 +KPX T V 10 +KPX T W 5 +KPX T Y -10 +KPX T a -60 +KPX T ae -33 +KPX T c -88 +KPX T colon -136 +KPX T comma -108 +KPX T e -83 +KPX T g -92 +KPX T guillemotleft -122 +KPX T guilsinglleft -122 +KPX T hyphen -94 +KPX T i -58 +KPX T j -80 +KPX T o -85 +KPX T oslash -54 +KPX T period -136 +KPX T r -54 +KPX T s -63 +KPX T semicolon -111 +KPX T u -84 +KPX T v -93 +KPX T w -88 +KPX T y -103 +KPX U A -18 +KPX U AE -27 +KPX U Aacute -18 +KPX U Acircumflex -18 +KPX U Adieresis -18 +KPX U Aring -18 +KPX U Atilde -18 +KPX U comma -76 +KPX U m 6 +KPX U n -19 +KPX U p 0 +KPX U period -101 +KPX U r -41 +KPX Uacute A -18 +KPX Uacute comma -76 +KPX Uacute m 6 +KPX Uacute n -19 +KPX Uacute p 0 +KPX Uacute period -101 +KPX Uacute r -41 +KPX Ucircumflex A -18 +KPX Udieresis A -18 +KPX Udieresis b 25 +KPX Udieresis comma -76 +KPX Udieresis m 6 +KPX Udieresis n -19 +KPX Udieresis p 0 +KPX Udieresis period -101 +KPX Udieresis r -41 +KPX Ugrave A -18 +KPX V A -3 +KPX V AE -12 +KPX V Aacute -3 +KPX V Acircumflex -3 +KPX V Adieresis -3 +KPX V Agrave -3 +KPX V Aring -3 +KPX V Atilde -3 +KPX V C -29 +KPX V G -31 +KPX V O -31 +KPX V Oacute -31 +KPX V Ocircumflex -31 +KPX V Odieresis -31 +KPX V Ograve -31 +KPX V Oslash -31 +KPX V Otilde -31 +KPX V S -34 +KPX V T 10 +KPX V a -60 +KPX V ae -33 +KPX V colon -124 +KPX V comma -129 +KPX V e -52 +KPX V g -53 +KPX V guillemotleft -75 +KPX V guilsinglleft -75 +KPX V hyphen -43 +KPX V i -60 +KPX V o -56 +KPX V oslash -53 +KPX V period -154 +KPX V r -46 +KPX V semicolon -114 +KPX V u -15 +KPX V y -19 +KPX W A -8 +KPX W AE -14 +KPX W Aacute -8 +KPX W Acircumflex -8 +KPX W Adieresis -8 +KPX W Agrave -8 +KPX W Aring -8 +KPX W Atilde -8 +KPX W C -8 +KPX W G -7 +KPX W O -5 +KPX W Oacute -5 +KPX W Ocircumflex -5 +KPX W Odieresis -5 +KPX W Ograve -5 +KPX W Oslash -2 +KPX W Otilde -5 +KPX W S -24 +KPX W T 5 +KPX W a -20 +KPX W ae 10 +KPX W colon -88 +KPX W comma -66 +KPX W e -6 +KPX W g -7 +KPX W guillemotleft -31 +KPX W guilsinglleft -31 +KPX W hyphen -2 +KPX W i -43 +KPX W o -10 +KPX W oslash -7 +KPX W period -90 +KPX W r -29 +KPX W semicolon -69 +KPX W u 2 +KPX W y -2 +KPX X C -46 +KPX X O -43 +KPX X Odieresis -43 +KPX X Q -44 +KPX X a -7 +KPX X e -30 +KPX X hyphen -75 +KPX X o -31 +KPX X u -31 +KPX X y -53 +KPX Y A -24 +KPX Y AE -27 +KPX Y Aacute -24 +KPX Y Acircumflex -24 +KPX Y Adieresis -24 +KPX Y Agrave -24 +KPX Y Aring -24 +KPX Y Atilde -24 +KPX Y C -51 +KPX Y G -52 +KPX Y O -53 +KPX Y Oacute -53 +KPX Y Ocircumflex -53 +KPX Y Odieresis -53 +KPX Y Ograve -53 +KPX Y Oslash -53 +KPX Y Otilde -53 +KPX Y S -55 +KPX Y T -10 +KPX Y a -60 +KPX Y ae -32 +KPX Y colon -135 +KPX Y comma -107 +KPX Y e -78 +KPX Y g -81 +KPX Y guillemotleft -115 +KPX Y guilsinglleft -115 +KPX Y hyphen -91 +KPX Y i -57 +KPX Y o -83 +KPX Y oslash -54 +KPX Y p -35 +KPX Y period -135 +KPX Y semicolon -110 +KPX Y u -46 +KPX Y v -39 +KPX Z v -50 +KPX Z y -61 +KPX a j -87 +KPX a quoteright -56 +KPX a v -28 +KPX a w -21 +KPX a y -38 +KPX aacute v -28 +KPX aacute w -21 +KPX aacute y -38 +KPX adieresis v -28 +KPX adieresis w -21 +KPX adieresis y -38 +KPX ae v 21 +KPX ae w 21 +KPX ae y 10 +KPX agrave v -28 +KPX agrave w -21 +KPX agrave y -38 +KPX aring v -28 +KPX aring w -21 +KPX aring y -38 +KPX b v -12 +KPX b w 1 +KPX b y -22 +KPX c h -3 +KPX c k -9 +KPX comma one -144 +KPX comma quotedblright -119 +KPX comma quoteright -136 +KPX e quoteright -41 +KPX e t -29 +KPX e v -22 +KPX e w -19 +KPX e x -2 +KPX e y -33 +KPX eacute v -22 +KPX eacute w -19 +KPX eacute y -33 +KPX ecircumflex v -22 +KPX ecircumflex w -19 +KPX ecircumflex y -33 +KPX eight four -58 +KPX eight one -75 +KPX eight seven -68 +KPX f a -38 +KPX f aacute -38 +KPX f adieresis -22 +KPX f ae -11 +KPX f aring -38 +KPX f e -55 +KPX f eacute -55 +KPX f f -42 +KPX f i -36 +KPX f j -59 +KPX f l -25 +KPX f o -62 +KPX f oacute -62 +KPX f odieresis -27 +KPX f oe -20 +KPX f oslash -32 +KPX f quoteright -56 +KPX f s -41 +KPX f t -6 +KPX five four -52 +KPX five one -86 +KPX five seven -72 +KPX four four -62 +KPX four one -66 +KPX four seven -93 +KPX g a -10 +KPX g adieresis -10 +KPX g ae 16 +KPX g aring -10 +KPX g e -4 +KPX g eacute -4 +KPX g l -33 +KPX g oacute -8 +KPX g odieresis -8 +KPX g r 0 +KPX guillemotright A -43 +KPX guillemotright AE -39 +KPX guillemotright Aacute -43 +KPX guillemotright Adieresis -43 +KPX guillemotright Aring -43 +KPX guillemotright T -121 +KPX guillemotright V -71 +KPX guillemotright W -29 +KPX guillemotright Y -114 +KPX guilsinglright A -43 +KPX guilsinglright AE -39 +KPX guilsinglright Aacute -43 +KPX guilsinglright Adieresis -43 +KPX guilsinglright Aring -43 +KPX guilsinglright T -121 +KPX guilsinglright V -71 +KPX guilsinglright W -29 +KPX guilsinglright Y -114 +KPX h quoteright -49 +KPX h y -32 +KPX hyphen A -26 +KPX hyphen AE -20 +KPX hyphen Aacute -26 +KPX hyphen Adieresis -26 +KPX hyphen Aring -26 +KPX hyphen T -95 +KPX hyphen V -41 +KPX hyphen W -1 +KPX hyphen Y -92 +KPX i T -58 +KPX i j -142 +KPX k a -6 +KPX k aacute -6 +KPX k adieresis -6 +KPX k ae 21 +KPX k aring -6 +KPX k comma -53 +KPX k e -29 +KPX k eacute -29 +KPX k g -38 +KPX k hyphen -99 +KPX k o -30 +KPX k oacute -30 +KPX k odieresis -30 +KPX k period -81 +KPX k s -9 +KPX k u -3 +KPX k udieresis -3 +KPX l v -83 +KPX l y -93 +KPX m p 22 +KPX m v 14 +KPX m w 15 +KPX m y 3 +KPX n T -42 +KPX n p -5 +KPX n quoteright -47 +KPX n v -21 +KPX n w -12 +KPX n y -31 +KPX nine four -51 +KPX nine one -75 +KPX nine seven -66 +KPX o T -85 +KPX o quoteright -39 +KPX o t -22 +KPX o v -21 +KPX o w -6 +KPX o x -26 +KPX o y -31 +KPX oacute v -21 +KPX oacute w -6 +KPX oacute y -31 +KPX ocircumflex t -22 +KPX odieresis t -22 +KPX odieresis v -21 +KPX odieresis w -6 +KPX odieresis x -26 +KPX odieresis y -31 +KPX ograve v -21 +KPX ograve w -6 +KPX ograve y -31 +KPX one comma -91 +KPX one eight -86 +KPX one five -67 +KPX one four -119 +KPX one nine -75 +KPX one one -62 +KPX one period -119 +KPX one seven -141 +KPX one six -111 +KPX one three -61 +KPX one two -47 +KPX one zero -94 +KPX p t -15 +KPX p y -19 +KPX period one -119 +KPX period quotedblright -108 +KPX period quoteright -125 +KPX q c -2 +KPX q u 42 +KPX quotedblbase A -3 +KPX quotedblbase AE -3 +KPX quotedblbase T -78 +KPX quotedblbase V -83 +KPX quotedblbase W -23 +KPX quotedblbase Y -79 +KPX quotedblleft A -59 +KPX quotedblleft AE -52 +KPX quotedblleft Aacute -59 +KPX quotedblleft Adieresis -59 +KPX quotedblleft Aring -59 +KPX quotedblleft T -37 +KPX quotedblleft V -14 +KPX quotedblleft W -3 +KPX quotedblleft Y -35 +KPX quotedblright A -59 +KPX quotedblright AE -68 +KPX quotedblright Aacute -59 +KPX quotedblright Adieresis -59 +KPX quotedblright Aring -59 +KPX quotedblright T -45 +KPX quotedblright V -14 +KPX quotedblright W -20 +KPX quotedblright Y -35 +KPX quoteleft A -80 +KPX quoteleft AE -73 +KPX quoteleft Aacute -80 +KPX quoteleft Adieresis -80 +KPX quoteleft Aring -80 +KPX quoteleft T -59 +KPX quoteleft V -36 +KPX quoteleft W -24 +KPX quoteleft Y -56 +KPX quoteright A -140 +KPX quoteright AE -149 +KPX quoteright Aacute -140 +KPX quoteright Adieresis -140 +KPX quoteright Aring -140 +KPX quoteright comma -196 +KPX quoteright d -126 +KPX quoteright o -131 +KPX quoteright period -220 +KPX quoteright r -145 +KPX quoteright s -140 +KPX quoteright t -114 +KPX quoteright v -108 +KPX quoteright w -105 +KPX quoteright y -118 +KPX r a -20 +KPX r aacute -20 +KPX r acircumflex -20 +KPX r adieresis -20 +KPX r ae 7 +KPX r agrave -20 +KPX r aring -20 +KPX r c -24 +KPX r ccedilla -28 +KPX r colon -81 +KPX r comma -97 +KPX r d -14 +KPX r e -12 +KPX r eacute -12 +KPX r ecircumflex -12 +KPX r egrave -12 +KPX r f -18 +KPX r g -11 +KPX r h -19 +KPX r hyphen -120 +KPX r i -28 +KPX r j -35 +KPX r k -29 +KPX r l -47 +KPX r m 33 +KPX r n 6 +KPX r o -19 +KPX r oacute -19 +KPX r ocircumflex -19 +KPX r odieresis -19 +KPX r oe 18 +KPX r ograve -19 +KPX r oslash -19 +KPX r p 28 +KPX r period -125 +KPX r q -11 +KPX r quoteright -37 +KPX r r -13 +KPX r s -24 +KPX r semicolon -69 +KPX r t 17 +KPX r u 17 +KPX r v 24 +KPX r w 24 +KPX r x 2 +KPX r y 13 +KPX r z -19 +KPX s quoteright -48 +KPX s t -13 +KPX seven colon -148 +KPX seven comma -140 +KPX seven eight -79 +KPX seven five -84 +KPX seven four -111 +KPX seven one -67 +KPX seven period -165 +KPX seven seven -62 +KPX seven six -99 +KPX seven three -72 +KPX seven two -69 +KPX six four -46 +KPX six one -61 +KPX six seven -48 +KPX t S -35 +KPX t a -20 +KPX t aacute -20 +KPX t adieresis -20 +KPX t ae 8 +KPX t aring -20 +KPX t colon -102 +KPX t e -37 +KPX t eacute -37 +KPX t h -7 +KPX t o -39 +KPX t oacute -39 +KPX t odieresis -39 +KPX t quoteright -94 +KPX t semicolon -80 +KPX three four -52 +KPX three one -74 +KPX three seven -67 +KPX two four -92 +KPX two one -66 +KPX two seven -71 +KPX u quoteright -38 +KPX v a -6 +KPX v aacute -6 +KPX v acircumflex -6 +KPX v adieresis -6 +KPX v ae 20 +KPX v agrave -6 +KPX v aring -6 +KPX v atilde -6 +KPX v c -25 +KPX v colon -71 +KPX v comma -113 +KPX v e -13 +KPX v eacute -13 +KPX v ecircumflex -13 +KPX v egrave -13 +KPX v g -11 +KPX v hyphen -24 +KPX v l -82 +KPX v o -21 +KPX v oacute -21 +KPX v odieresis -21 +KPX v ograve -21 +KPX v oslash -21 +KPX v period -139 +KPX v s -19 +KPX v semicolon -62 +KPX w a -6 +KPX w aacute -6 +KPX w acircumflex -6 +KPX w adieresis -6 +KPX w ae 20 +KPX w agrave -6 +KPX w aring -6 +KPX w atilde -6 +KPX w c -10 +KPX w colon -71 +KPX w comma -70 +KPX w e -1 +KPX w eacute -1 +KPX w ecircumflex -1 +KPX w egrave -1 +KPX w g -3 +KPX w hyphen 1 +KPX w l -50 +KPX w o -6 +KPX w oacute -6 +KPX w odieresis -6 +KPX w ograve -6 +KPX w oslash -3 +KPX w period -95 +KPX w s -18 +KPX w semicolon -62 +KPX x a -2 +KPX x c -29 +KPX x e -25 +KPX x eacute -25 +KPX x o -26 +KPX x q -30 +KPX y a -17 +KPX y aacute -17 +KPX y acircumflex -17 +KPX y adieresis -17 +KPX y ae 10 +KPX y agrave -17 +KPX y aring -17 +KPX y atilde -17 +KPX y c -35 +KPX y colon -81 +KPX y comma -117 +KPX y e -24 +KPX y eacute -24 +KPX y ecircumflex -24 +KPX y egrave -24 +KPX y g -21 +KPX y hyphen -24 +KPX y l -93 +KPX y o -31 +KPX y oacute -31 +KPX y odieresis -31 +KPX y ograve -31 +KPX y oslash -31 +KPX y period -144 +KPX y s -30 +KPX y semicolon -72 +KPX zero four -58 +KPX zero one -81 +KPX zero seven -73 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n022003l.pfb b/PdfReader/Resources/Fonts/n022003l.pfb new file mode 100644 index 0000000000..6fa2ec355a Binary files /dev/null and b/PdfReader/Resources/Fonts/n022003l.pfb differ diff --git a/PdfReader/Resources/Fonts/n022004l.afm b/PdfReader/Resources/Fonts/n022004l.afm new file mode 100644 index 0000000000..0bafed51b8 --- /dev/null +++ b/PdfReader/Resources/Fonts/n022004l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-Bold +FullName Nimbus Mono L Bold +FamilyName Nimbus Mono L +Weight Bold +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -43 -278 681 871 +CapHeight 583 +XHeight 437 +Descender -205 +Ascender 624 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 375 0 375 0 ; +C 33 ; WX 600 ; N exclam ; B 220 -15 381 638 ; +C 34 ; WX 600 ; N quotedbl ; B 136 312 464 602 ; +C 35 ; WX 600 ; N numbersign ; B 62 -92 538 675 ; +C 36 ; WX 600 ; N dollar ; B 83 -123 517 684 ; +C 37 ; WX 600 ; N percent ; B 80 -15 521 617 ; +C 38 ; WX 600 ; N ampersand ; B 75 -14 508 550 ; +C 39 ; WX 600 ; N quoteright ; B 147 331 351 623 ; +C 40 ; WX 600 ; N parenleft ; B 264 -153 488 632 ; +C 41 ; WX 600 ; N parenright ; B 117 -153 341 632 ; +C 42 ; WX 600 ; N asterisk ; B 83 208 517 622 ; +C 43 ; WX 600 ; N plus ; B 42 0 558 560 ; +C 44 ; WX 600 ; N comma ; B 147 -158 351 134 ; +C 45 ; WX 600 ; N hyphen ; B 42 229 558 329 ; +C 46 ; WX 600 ; N period ; B 225 -15 375 117 ; +C 47 ; WX 600 ; N slash ; B 83 -113 517 695 ; +C 48 ; WX 600 ; N zero ; B 83 -15 517 638 ; +C 49 ; WX 600 ; N one ; B 83 0 517 638 ; +C 50 ; WX 600 ; N two ; B 54 0 508 638 ; +C 51 ; WX 600 ; N three ; B 66 -15 529 638 ; +C 52 ; WX 600 ; N four ; B 75 0 508 622 ; +C 53 ; WX 600 ; N five ; B 66 -15 529 622 ; +C 54 ; WX 600 ; N six ; B 105 -15 540 638 ; +C 55 ; WX 600 ; N seven ; B 75 -1 508 622 ; +C 56 ; WX 600 ; N eight ; B 83 -15 517 638 ; +C 57 ; WX 600 ; N nine ; B 106 -15 541 638 ; +C 58 ; WX 600 ; N colon ; B 225 -15 375 437 ; +C 59 ; WX 600 ; N semicolon ; B 147 -158 351 437 ; +C 60 ; WX 600 ; N less ; B 42 54 544 501 ; +C 61 ; WX 600 ; N equal ; B 42 138 558 422 ; +C 62 ; WX 600 ; N greater ; B 56 53 558 500 ; +C 63 ; WX 600 ; N question ; B 104 -15 517 598 ; +C 64 ; WX 600 ; N at ; B 76 -152 509 620 ; +C 65 ; WX 600 ; N A ; B -21 0 621 583 ; +C 66 ; WX 600 ; N B ; B 13 0 571 583 ; +C 67 ; WX 600 ; N C ; B 33 -14 564 597 ; +C 68 ; WX 600 ; N D ; B 13 0 550 583 ; +C 69 ; WX 600 ; N E ; B 13 0 550 583 ; +C 70 ; WX 600 ; N F ; B 13 0 550 583 ; +C 71 ; WX 600 ; N G ; B 33 -14 592 597 ; +C 72 ; WX 600 ; N H ; B 23 0 581 583 ; +C 73 ; WX 600 ; N I ; B 83 0 517 583 ; +C 74 ; WX 600 ; N J ; B 54 -14 613 583 ; +C 75 ; WX 600 ; N K ; B 13 0 602 583 ; +C 76 ; WX 600 ; N L ; B 33 0 571 583 ; +C 77 ; WX 600 ; N M ; B -19 0 623 584 ; +C 78 ; WX 600 ; N N ; B -8 0 592 583 ; +C 79 ; WX 600 ; N O ; B 21 -14 579 597 ; +C 80 ; WX 600 ; N P ; B 13 0 529 583 ; +C 81 ; WX 600 ; N Q ; B 21 -145 579 597 ; +C 82 ; WX 600 ; N R ; B 13 0 619 583 ; +C 83 ; WX 600 ; N S ; B 62 -14 538 597 ; +C 84 ; WX 600 ; N T ; B 42 0 558 583 ; +C 85 ; WX 600 ; N U ; B 10 -14 590 583 ; +C 86 ; WX 600 ; N V ; B -21 0 621 583 ; +C 87 ; WX 600 ; N W ; B -10 0 610 583 ; +C 88 ; WX 600 ; N X ; B 10 0 590 583 ; +C 89 ; WX 600 ; N Y ; B 21 0 579 583 ; +C 90 ; WX 600 ; N Z ; B 73 0 527 583 ; +C 91 ; WX 600 ; N bracketleft ; B 250 -148 475 627 ; +C 92 ; WX 600 ; N backslash ; B 83 -113 517 695 ; +C 93 ; WX 600 ; N bracketright ; B 125 -148 350 627 ; +C 94 ; WX 600 ; N asciicircum ; B 83 325 517 652 ; +C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 249 348 453 602 ; +C 97 ; WX 600 ; N a ; B 42 -16 571 450 ; +C 98 ; WX 600 ; N b ; B -8 -14 571 624 ; +C 99 ; WX 600 ; N c ; B 54 -16 565 450 ; +C 100 ; WX 600 ; N d ; B 33 -14 613 624 ; +C 101 ; WX 600 ; N e ; B 33 -16 550 450 ; +C 102 ; WX 600 ; N f ; B 75 0 571 623 ; +C 103 ; WX 600 ; N g ; B 33 -205 592 451 ; +C 104 ; WX 600 ; N h ; B 13 0 581 624 ; +C 105 ; WX 600 ; N i ; B 62 0 538 623 ; +C 106 ; WX 600 ; N j ; B 117 -205 488 623 ; +C 107 ; WX 600 ; N k ; B 33 0 571 624 ; +C 108 ; WX 600 ; N l ; B 62 0 538 624 ; +C 109 ; WX 600 ; N m ; B -19 0 623 450 ; +C 110 ; WX 600 ; N n ; B 23 0 571 450 ; +C 111 ; WX 600 ; N o ; B 42 -16 558 450 ; +C 112 ; WX 600 ; N p ; B -8 -205 571 450 ; +C 113 ; WX 600 ; N q ; B 33 -205 613 450 ; +C 114 ; WX 600 ; N r ; B 54 0 571 449 ; +C 115 ; WX 600 ; N s ; B 73 -16 527 450 ; +C 116 ; WX 600 ; N t ; B 13 -16 529 591 ; +C 117 ; WX 600 ; N u ; B 13 -13 571 437 ; +C 118 ; WX 600 ; N v ; B 0 0 600 437 ; +C 119 ; WX 600 ; N w ; B 0 0 600 437 ; +C 120 ; WX 600 ; N x ; B 21 0 579 437 ; +C 121 ; WX 600 ; N y ; B 21 -205 579 437 ; +C 122 ; WX 600 ; N z ; B 85 0 519 437 ; +C 123 ; WX 600 ; N braceleft ; B 167 -153 433 623 ; +C 124 ; WX 600 ; N bar ; B 250 -153 350 622 ; +C 125 ; WX 600 ; N braceright ; B 167 -153 433 623 ; +C 126 ; WX 600 ; N asciitilde ; B 62 179 538 385 ; +C 161 ; WX 600 ; N exclamdown ; B 220 -227 381 426 ; +C 162 ; WX 600 ; N cent ; B 83 -44 499 661 ; +C 163 ; WX 600 ; N sterling ; B 33 0 550 598 ; +C 164 ; WX 600 ; N fraction ; B 21 102 580 500 ; +C 165 ; WX 600 ; N yen ; B 21 0 579 580 ; +C 166 ; WX 600 ; N florin ; B 57 -123 548 638 ; +C 167 ; WX 600 ; N section ; B 36 -170 564 583 ; +C 168 ; WX 600 ; N currency ; B 73 64 527 519 ; +C 169 ; WX 600 ; N quotesingle ; B 236 312 364 602 ; +C 170 ; WX 600 ; N quotedblleft ; B 98 348 502 602 ; +C 171 ; WX 600 ; N guillemotleft ; B 33 20 571 415 ; +C 172 ; WX 600 ; N guilsinglleft ; B 33 20 342 415 ; +C 173 ; WX 600 ; N guilsinglright ; B 263 20 571 415 ; +C 174 ; WX 600 ; N fi ; B -14 0 619 624 ; +C 175 ; WX 600 ; N fl ; B -17 0 617 623 ; +C 177 ; WX 600 ; N endash ; B 42 229 558 329 ; +C 178 ; WX 600 ; N dagger ; B 94 -92 506 622 ; +C 179 ; WX 600 ; N daggerdbl ; B 94 -92 506 622 ; +C 180 ; WX 600 ; N periodcentered ; B 225 214 375 346 ; +C 182 ; WX 600 ; N paragraph ; B 49 -174 558 583 ; +C 183 ; WX 600 ; N bullet ; B 150 154 449 453 ; +C 184 ; WX 600 ; N quotesinglbase ; B 147 -158 351 134 ; +C 185 ; WX 600 ; N quotedblbase ; B 87 -120 491 134 ; +C 186 ; WX 600 ; N quotedblright ; B 87 348 491 602 ; +C 187 ; WX 600 ; N guillemotright ; B 33 20 571 415 ; +C 188 ; WX 600 ; N ellipsis ; B 25 -15 575 117 ; +C 189 ; WX 600 ; N perthousand ; B 0 0 600 618 ; +C 191 ; WX 600 ; N questiondown ; B 83 -227 496 386 ; +C 193 ; WX 600 ; N grave ; B 125 496 350 696 ; +C 194 ; WX 600 ; N acute ; B 250 496 475 696 ; +C 195 ; WX 600 ; N circumflex ; B 125 497 476 696 ; +C 196 ; WX 600 ; N tilde ; B 115 523 485 656 ; +C 197 ; WX 600 ; N macron ; B 125 546 475 626 ; +C 198 ; WX 600 ; N breve ; B 125 503 475 687 ; +C 199 ; WX 600 ; N dotaccent ; B 240 534 360 654 ; +C 200 ; WX 600 ; N dieresis ; B 136 534 464 654 ; +C 202 ; WX 600 ; N ring ; B 177 486 423 727 ; +C 203 ; WX 600 ; N cedilla ; B 180 -229 407 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 125 496 475 694 ; +C 206 ; WX 600 ; N ogonek ; B 250 -208 463 0 ; +C 207 ; WX 600 ; N caron ; B 125 497 476 696 ; +C 208 ; WX 600 ; N emdash ; B -29 229 629 329 ; +C 225 ; WX 600 ; N AE ; B -20 0 614 583 ; +C 227 ; WX 600 ; N ordfeminine ; B 118 182 489 595 ; +C 232 ; WX 600 ; N Lslash ; B 12 0 571 583 ; +C 233 ; WX 600 ; N Oslash ; B 9 -70 590 638 ; +C 234 ; WX 600 ; N OE ; B -20 0 612 583 ; +C 235 ; WX 600 ; N ordmasculine ; B 122 182 480 595 ; +C 241 ; WX 600 ; N ae ; B -13 -16 612 450 ; +C 245 ; WX 600 ; N dotlessi ; B 62 0 538 437 ; +C 248 ; WX 600 ; N lslash ; B 62 0 538 624 ; +C 249 ; WX 600 ; N oslash ; B 23 -70 573 494 ; +C 250 ; WX 600 ; N oe ; B -11 -16 613 450 ; +C 251 ; WX 600 ; N germandbls ; B 13 -16 529 623 ; +C -1 ; WX 600 ; N Udieresis ; B 10 -14 590 798 ; +C -1 ; WX 600 ; N Uacute ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N Scedilla ; B 62 -229 538 597 ; +C -1 ; WX 600 ; N Tcaron ; B 42 0 558 839 ; +C -1 ; WX 600 ; N Scaron ; B 62 -14 538 839 ; +C -1 ; WX 600 ; N Rcaron ; B 13 0 619 839 ; +C -1 ; WX 600 ; N Racute ; B 13 0 619 839 ; +C -1 ; WX 600 ; N Sacute ; B 62 -14 538 839 ; +C -1 ; WX 600 ; N Otilde ; B 21 -14 579 799 ; +C -1 ; WX 600 ; N ucircumflex ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 21 -14 579 838 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 10 -14 590 838 ; +C -1 ; WX 600 ; N Yacute ; B 21 0 579 839 ; +C -1 ; WX 600 ; N Eth ; B 0 0 550 583 ; +C -1 ; WX 600 ; N Dcroat ; B 0 0 550 583 ; +C -1 ; WX 600 ; N Zacute ; B 73 0 527 839 ; +C -1 ; WX 600 ; N Uring ; B 10 -14 590 871 ; +C -1 ; WX 600 ; N gbreve ; B 33 -205 592 687 ; +C -1 ; WX 600 ; N eogonek ; B 33 -208 550 450 ; +C -1 ; WX 600 ; N edotaccent ; B 33 -16 550 654 ; +C -1 ; WX 600 ; N ecaron ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N Ugrave ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N Thorn ; B 14 0 523 583 ; +C -1 ; WX 600 ; N eacute ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N edieresis ; B 33 -16 550 654 ; +C -1 ; WX 600 ; N dcaron ; B 33 -14 681 637 ; +C -1 ; WX 600 ; N ccedilla ; B 54 -229 565 450 ; +C -1 ; WX 600 ; N ccaron ; B 54 -16 565 696 ; +C -1 ; WX 600 ; N cacute ; B 54 -16 565 696 ; +C -1 ; WX 600 ; N aogonek ; B 42 -208 580 450 ; +C -1 ; WX 600 ; N aring ; B 42 -16 571 727 ; +C -1 ; WX 600 ; N atilde ; B 42 -16 571 656 ; +C -1 ; WX 600 ; N abreve ; B 42 -16 571 687 ; +C -1 ; WX 600 ; N egrave ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N agrave ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N aacute ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N adieresis ; B 42 -16 571 654 ; +C -1 ; WX 600 ; N Uogonek ; B 10 -208 590 583 ; +C -1 ; WX 600 ; N ugrave ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N uacute ; B 13 -13 571 696 ; +C -1 ; WX 600 ; N udieresis ; B 13 -13 571 654 ; +C -1 ; WX 600 ; N tcaron ; B 13 -16 530 637 ; +C -1 ; WX 600 ; N scommaaccent ; B 73 -278 527 450 ; +C -1 ; WX 600 ; N Zcaron ; B 73 0 527 839 ; +C -1 ; WX 600 ; N ecircumflex ; B 33 -16 550 696 ; +C -1 ; WX 600 ; N Ucircumflex ; B 10 -14 590 839 ; +C -1 ; WX 600 ; N acircumflex ; B 42 -16 571 696 ; +C -1 ; WX 600 ; N Zdotaccent ; B 73 0 527 798 ; +C -1 ; WX 600 ; N scaron ; B 73 -16 527 696 ; +C -1 ; WX 600 ; N Amacron ; B -21 0 621 769 ; +C -1 ; WX 600 ; N sacute ; B 73 -16 527 696 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 42 -278 558 583 ; +C -1 ; WX 600 ; N Ydieresis ; B 21 0 579 798 ; +C -1 ; WX 600 ; N thorn ; B -8 -205 571 624 ; +C -1 ; WX 600 ; N Emacron ; B 13 0 550 769 ; +C -1 ; WX 600 ; N Ograve ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N Oacute ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N Odieresis ; B 21 -14 579 798 ; +C -1 ; WX 600 ; N Ntilde ; B -8 0 592 799 ; +C -1 ; WX 600 ; N Ncaron ; B -8 0 592 839 ; +C -1 ; WX 600 ; N Nacute ; B -8 0 592 839 ; +C -1 ; WX 600 ; N Lcaron ; B 33 0 571 598 ; +C -1 ; WX 600 ; N Lacute ; B 33 0 571 839 ; +C -1 ; WX 600 ; N Idotaccent ; B 83 0 517 798 ; +C -1 ; WX 600 ; N racute ; B 54 0 571 696 ; +C -1 ; WX 600 ; N Icircumflex ; B 83 0 517 839 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 42 -16 558 694 ; +C -1 ; WX 600 ; N otilde ; B 42 -16 558 656 ; +C -1 ; WX 600 ; N Euro ; B 4 -14 538 597 ; +C -1 ; WX 600 ; N ocircumflex ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N onesuperior ; B 166 247 434 638 ; +C -1 ; WX 600 ; N twosuperior ; B 149 247 429 637 ; +C -1 ; WX 600 ; N threesuperior ; B 157 238 442 637 ; +C -1 ; WX 600 ; N Igrave ; B 83 0 517 839 ; +C -1 ; WX 600 ; N Iacute ; B 83 0 517 839 ; +C -1 ; WX 600 ; N Imacron ; B 83 0 517 769 ; +C -1 ; WX 600 ; N Iogonek ; B 83 -208 517 583 ; +C -1 ; WX 600 ; N Idieresis ; B 83 0 517 798 ; +C -1 ; WX 600 ; N Gbreve ; B 33 -14 592 831 ; +C -1 ; WX 600 ; N Umacron ; B 10 -14 590 769 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 13 -278 602 583 ; +C -1 ; WX 600 ; N ograve ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N Scommaaccent ; B 62 -278 538 597 ; +C -1 ; WX 600 ; N Eogonek ; B 13 -208 587 583 ; +C -1 ; WX 600 ; N oacute ; B 42 -16 558 696 ; +C -1 ; WX 600 ; N Edotaccent ; B 13 0 550 798 ; +C -1 ; WX 600 ; N iogonek ; B 62 -208 540 623 ; +C -1 ; WX 600 ; N gcommaaccent ; B 33 -205 592 721 ; +C -1 ; WX 600 ; N odieresis ; B 42 -16 558 654 ; +C -1 ; WX 600 ; N ntilde ; B 23 0 571 656 ; +C -1 ; WX 600 ; N ncaron ; B 23 0 571 696 ; +C -1 ; WX 600 ; N Ecaron ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Ecircumflex ; B 13 0 550 839 ; +C -1 ; WX 600 ; N scedilla ; B 73 -229 527 450 ; +C -1 ; WX 600 ; N rcaron ; B 54 0 571 696 ; +C -1 ; WX 600 ; N Egrave ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Eacute ; B 13 0 550 839 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 33 -278 592 597 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 13 -278 619 583 ; +C -1 ; WX 600 ; N Edieresis ; B 13 0 550 798 ; +C -1 ; WX 600 ; N nacute ; B 23 0 571 696 ; +C -1 ; WX 600 ; N uogonek ; B 13 -208 571 437 ; +C -1 ; WX 600 ; N umacron ; B 13 -13 571 626 ; +C -1 ; WX 600 ; N Dcaron ; B 13 0 550 839 ; +C -1 ; WX 600 ; N lcaron ; B 62 0 538 637 ; +C -1 ; WX 600 ; N Ccaron ; B 33 -14 564 839 ; +C -1 ; WX 600 ; N Cacute ; B 33 -14 564 839 ; +C -1 ; WX 600 ; N Ccedilla ; B 33 -229 564 597 ; +C -1 ; WX 600 ; N degree ; B 125 243 475 596 ; +C -1 ; WX 600 ; N Aogonek ; B -21 -208 621 583 ; +C -1 ; WX 600 ; N minus ; B 42 230 558 330 ; +C -1 ; WX 600 ; N multiply ; B 100 80 500 480 ; +C -1 ; WX 600 ; N divide ; B 42 28 558 532 ; +C -1 ; WX 600 ; N Aring ; B -21 0 621 871 ; +C -1 ; WX 600 ; N trademark ; B -33 220 620 583 ; +C -1 ; WX 600 ; N rcommaaccent ; B 54 -278 571 449 ; +C -1 ; WX 600 ; N lacute ; B 62 0 538 840 ; +C -1 ; WX 600 ; N omacron ; B 42 -16 558 626 ; +C -1 ; WX 600 ; N Atilde ; B -21 0 621 799 ; +C -1 ; WX 600 ; N icircumflex ; B 62 0 538 696 ; +C -1 ; WX 600 ; N igrave ; B 62 0 538 696 ; +C -1 ; WX 600 ; N ncommaaccent ; B 23 -278 571 450 ; +C -1 ; WX 600 ; N lcommaaccent ; B 62 -278 538 624 ; +C -1 ; WX 600 ; N plusminus ; B 42 0 558 624 ; +C -1 ; WX 600 ; N onehalf ; B -34 0 629 638 ; +C -1 ; WX 600 ; N onequarter ; B -34 0 629 638 ; +C -1 ; WX 600 ; N threequarters ; B -43 0 630 637 ; +C -1 ; WX 600 ; N iacute ; B 62 0 538 696 ; +C -1 ; WX 600 ; N Abreve ; B -21 0 621 831 ; +C -1 ; WX 600 ; N kcommaaccent ; B 33 -278 571 624 ; +C -1 ; WX 600 ; N Omacron ; B 21 -14 579 769 ; +C -1 ; WX 600 ; N imacron ; B 62 0 538 626 ; +C -1 ; WX 600 ; N emacron ; B 33 -16 550 626 ; +C -1 ; WX 600 ; N amacron ; B 42 -16 571 626 ; +C -1 ; WX 600 ; N tcommaaccent ; B 13 -278 529 591 ; +C -1 ; WX 600 ; N ydieresis ; B 21 -205 579 654 ; +C -1 ; WX 600 ; N zdotaccent ; B 85 0 519 654 ; +C -1 ; WX 600 ; N zcaron ; B 85 0 519 696 ; +C -1 ; WX 600 ; N zacute ; B 85 0 519 696 ; +C -1 ; WX 600 ; N yacute ; B 21 -205 579 696 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 13 -13 571 694 ; +C -1 ; WX 600 ; N eth ; B 42 -16 558 646 ; +C -1 ; WX 600 ; N uring ; B 13 -13 571 727 ; +C -1 ; WX 600 ; N Ocircumflex ; B 21 -14 579 839 ; +C -1 ; WX 600 ; N commaaccent ; B 183 -278 351 -59 ; +C -1 ; WX 600 ; N copyright ; B -7 -15 606 598 ; +C -1 ; WX 600 ; N registered ; B -7 -15 606 598 ; +C -1 ; WX 600 ; N Acircumflex ; B -21 0 621 839 ; +C -1 ; WX 600 ; N idieresis ; B 62 0 538 654 ; +C -1 ; WX 600 ; N lozenge ; B 72 -19 529 593 ; +C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; +C -1 ; WX 600 ; N notequal ; B 42 22 558 525 ; +C -1 ; WX 600 ; N radical ; B 12 -60 642 697 ; +C -1 ; WX 600 ; N Agrave ; B -21 0 621 839 ; +C -1 ; WX 600 ; N Aacute ; B -21 0 621 839 ; +C -1 ; WX 600 ; N lessequal ; B 3 0 549 591 ; +C -1 ; WX 600 ; N greaterequal ; B 35 0 582 591 ; +C -1 ; WX 600 ; N logicalnot ; B 42 115 465 445 ; +C -1 ; WX 600 ; N summation ; B 45 -97 538 671 ; +C -1 ; WX 600 ; N partialdiff ; B 102 -16 524 590 ; +C -1 ; WX 600 ; N Ncommaaccent ; B -8 -278 592 583 ; +C -1 ; WX 600 ; N dcroat ; B 33 -16 613 624 ; +C -1 ; WX 600 ; N brokenbar ; B 250 -153 350 622 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 33 -278 571 583 ; +C -1 ; WX 600 ; N Adieresis ; B -21 0 621 798 ; +C -1 ; WX 600 ; N mu ; B 13 -153 571 437 ; +C -1 ; WX 600 ; N .notdef ; B 375 0 375 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -14 +KPX A Ccedilla -22 +KPX A G -10 +KPX A O -15 +KPX A Odieresis -15 +KPX A Q -16 +KPX A T -27 +KPX A U -23 +KPX A Uacute -23 +KPX A Ucircumflex -23 +KPX A Udieresis -23 +KPX A Ugrave -23 +KPX A V -59 +KPX A W -13 +KPX A Y -27 +KPX A a 15 +KPX A b 45 +KPX A c -4 +KPX A ccedilla -8 +KPX A comma -47 +KPX A d 4 +KPX A e 2 +KPX A g 0 +KPX A guillemotleft -40 +KPX A guilsinglleft -40 +KPX A hyphen -19 +KPX A o -3 +KPX A period -62 +KPX A q -4 +KPX A quotedblright -84 +KPX A quoteright -113 +KPX A t -20 +KPX A u -12 +KPX A v -39 +KPX A w -13 +KPX A y -39 +KPX Aacute C -14 +KPX Aacute G -10 +KPX Aacute O -15 +KPX Aacute Q -16 +KPX Aacute T -27 +KPX Aacute U -23 +KPX Aacute V -59 +KPX Aacute W -13 +KPX Aacute Y -27 +KPX Aacute a 15 +KPX Aacute b 45 +KPX Aacute c -4 +KPX Aacute comma -47 +KPX Aacute d 4 +KPX Aacute e 2 +KPX Aacute g 0 +KPX Aacute guillemotleft -40 +KPX Aacute guilsinglleft -40 +KPX Aacute hyphen -19 +KPX Aacute o -3 +KPX Aacute period -62 +KPX Aacute q -4 +KPX Aacute quoteright -113 +KPX Aacute t -20 +KPX Aacute u -12 +KPX Aacute v -39 +KPX Aacute w -13 +KPX Aacute y -39 +KPX Acircumflex C -14 +KPX Acircumflex G -10 +KPX Acircumflex O -15 +KPX Acircumflex Q -16 +KPX Acircumflex T -27 +KPX Acircumflex U -23 +KPX Acircumflex V -59 +KPX Acircumflex W -13 +KPX Acircumflex Y -27 +KPX Acircumflex comma -47 +KPX Acircumflex period -62 +KPX Adieresis C -14 +KPX Adieresis G -10 +KPX Adieresis O -15 +KPX Adieresis Q -16 +KPX Adieresis T -27 +KPX Adieresis U -23 +KPX Adieresis V -59 +KPX Adieresis W -13 +KPX Adieresis Y -27 +KPX Adieresis a 15 +KPX Adieresis b 45 +KPX Adieresis c -4 +KPX Adieresis comma -47 +KPX Adieresis d 4 +KPX Adieresis g 0 +KPX Adieresis guillemotleft -40 +KPX Adieresis guilsinglleft -40 +KPX Adieresis hyphen -19 +KPX Adieresis o -3 +KPX Adieresis period -62 +KPX Adieresis q -4 +KPX Adieresis quotedblright -84 +KPX Adieresis quoteright -113 +KPX Adieresis t -20 +KPX Adieresis u -12 +KPX Adieresis v -39 +KPX Adieresis w -13 +KPX Adieresis y -39 +KPX Agrave C -14 +KPX Agrave G -10 +KPX Agrave O -15 +KPX Agrave Q -16 +KPX Agrave T -27 +KPX Agrave U -23 +KPX Agrave V -59 +KPX Agrave W -13 +KPX Agrave Y -27 +KPX Agrave comma -47 +KPX Agrave period -62 +KPX Aring C -14 +KPX Aring G -10 +KPX Aring O -15 +KPX Aring Q -16 +KPX Aring T -27 +KPX Aring U -23 +KPX Aring V -59 +KPX Aring W -13 +KPX Aring Y -27 +KPX Aring a 15 +KPX Aring b 45 +KPX Aring c -4 +KPX Aring comma -47 +KPX Aring d 4 +KPX Aring e 2 +KPX Aring g 0 +KPX Aring guillemotleft -40 +KPX Aring guilsinglleft -40 +KPX Aring hyphen -19 +KPX Aring o -3 +KPX Aring period -62 +KPX Aring q -4 +KPX Aring quotedblright -84 +KPX Aring quoteright -113 +KPX Aring t -20 +KPX Aring u -12 +KPX Aring v -39 +KPX Aring w -13 +KPX Aring y -39 +KPX Atilde C -14 +KPX Atilde G -10 +KPX Atilde O -15 +KPX Atilde Q -16 +KPX Atilde T -27 +KPX Atilde U -23 +KPX Atilde V -59 +KPX Atilde W -13 +KPX Atilde Y -27 +KPX Atilde comma -47 +KPX Atilde period -62 +KPX B A 4 +KPX B AE 3 +KPX B Aacute 4 +KPX B Acircumflex 4 +KPX B Adieresis 4 +KPX B Aring 4 +KPX B Atilde 4 +KPX B O -9 +KPX B OE 11 +KPX B Oacute -9 +KPX B Ocircumflex -9 +KPX B Odieresis -9 +KPX B Ograve -9 +KPX B Oslash -5 +KPX B V -18 +KPX B W -6 +KPX B Y -39 +KPX C A 8 +KPX C AE 7 +KPX C Aacute 8 +KPX C Adieresis 8 +KPX C Aring 8 +KPX C H -13 +KPX C K -8 +KPX C O -14 +KPX C Oacute -14 +KPX C Odieresis -14 +KPX Ccedilla A 3 +KPX D A -25 +KPX D Aacute -25 +KPX D Acircumflex -25 +KPX D Adieresis -25 +KPX D Agrave -25 +KPX D Aring -25 +KPX D Atilde -25 +KPX D J -32 +KPX D T -27 +KPX D V -30 +KPX D W -13 +KPX D X -37 +KPX D Y -51 +KPX F A -39 +KPX F Aacute -39 +KPX F Acircumflex -39 +KPX F Adieresis -39 +KPX F Agrave -39 +KPX F Aring -39 +KPX F Atilde -39 +KPX F J -78 +KPX F O -24 +KPX F Odieresis -24 +KPX F a -40 +KPX F aacute -40 +KPX F adieresis -40 +KPX F ae -18 +KPX F aring -40 +KPX F comma -168 +KPX F e -47 +KPX F eacute -47 +KPX F hyphen -55 +KPX F i -46 +KPX F j -54 +KPX F o -51 +KPX F oacute -51 +KPX F odieresis -51 +KPX F oe -16 +KPX F oslash -51 +KPX F period -187 +KPX F r -32 +KPX F u -1 +KPX G A 6 +KPX G AE 5 +KPX G Aacute 6 +KPX G Acircumflex 6 +KPX G Adieresis 6 +KPX G Agrave 6 +KPX G Aring 6 +KPX G Atilde 6 +KPX G T -25 +KPX G V 6 +KPX G W 6 +KPX G Y -14 +KPX J A -8 +KPX J AE -16 +KPX J Adieresis -8 +KPX J Aring -8 +KPX K C -24 +KPX K G -19 +KPX K O -25 +KPX K OE -4 +KPX K Oacute -25 +KPX K Odieresis -25 +KPX K S -9 +KPX K T -13 +KPX K a 6 +KPX K adieresis 6 +KPX K ae 31 +KPX K aring 6 +KPX K e -6 +KPX K hyphen -44 +KPX K o -12 +KPX K oacute -12 +KPX K odieresis -12 +KPX K u -22 +KPX K udieresis -22 +KPX K y -50 +KPX L A 16 +KPX L AE 16 +KPX L Aacute 16 +KPX L Adieresis 16 +KPX L Aring 16 +KPX L C -10 +KPX L Ccedilla -11 +KPX L G -10 +KPX L O -7 +KPX L Oacute -7 +KPX L Ocircumflex -7 +KPX L Odieresis -7 +KPX L Ograve -7 +KPX L Otilde -7 +KPX L S -24 +KPX L T -52 +KPX L U -29 +KPX L Udieresis -29 +KPX L V -57 +KPX L W -22 +KPX L Y -52 +KPX L hyphen 9 +KPX L quotedblright -72 +KPX L quoteright -99 +KPX L u -10 +KPX L udieresis -11 +KPX L y -33 +KPX N A -3 +KPX N AE -3 +KPX N Aacute -3 +KPX N Adieresis -3 +KPX N Aring -3 +KPX N C -7 +KPX N Ccedilla -6 +KPX N G -6 +KPX N O -5 +KPX N Oacute -5 +KPX N Odieresis -5 +KPX N a -11 +KPX N aacute -11 +KPX N adieresis -11 +KPX N ae 18 +KPX N aring -11 +KPX N comma -75 +KPX N e -3 +KPX N eacute -3 +KPX N o -8 +KPX N oacute -8 +KPX N odieresis -8 +KPX N oslash -3 +KPX N period -93 +KPX N u -8 +KPX N udieresis -8 +KPX O A -14 +KPX O AE -14 +KPX O Aacute -14 +KPX O Adieresis -14 +KPX O Aring -14 +KPX O T -15 +KPX O V -23 +KPX O W -2 +KPX O X -26 +KPX O Y -43 +KPX Oacute A -14 +KPX Oacute T -15 +KPX Oacute V -23 +KPX Oacute W -2 +KPX Oacute Y -43 +KPX Ocircumflex T -15 +KPX Ocircumflex V -23 +KPX Ocircumflex Y -43 +KPX Odieresis A -14 +KPX Odieresis T -15 +KPX Odieresis V -23 +KPX Odieresis W -2 +KPX Odieresis X -26 +KPX Odieresis Y -43 +KPX Ograve T -15 +KPX Ograve V -23 +KPX Ograve Y -43 +KPX Oslash A -10 +KPX Otilde T -15 +KPX Otilde V -23 +KPX Otilde Y -43 +KPX P A -61 +KPX P AE -59 +KPX P Aacute -61 +KPX P Adieresis -61 +KPX P Aring -61 +KPX P J -73 +KPX P a -49 +KPX P aacute -49 +KPX P adieresis -49 +KPX P ae -27 +KPX P aring -49 +KPX P comma -160 +KPX P e -38 +KPX P eacute -38 +KPX P hyphen -33 +KPX P o -42 +KPX P oacute -42 +KPX P odieresis -42 +KPX P oe -13 +KPX P oslash -42 +KPX P period -178 +KPX R C -14 +KPX R Ccedilla -17 +KPX R G -10 +KPX R O -14 +KPX R OE 5 +KPX R Oacute -14 +KPX R Odieresis -14 +KPX R T -28 +KPX R U -16 +KPX R Udieresis -17 +KPX R V -24 +KPX R W -8 +KPX R Y -28 +KPX R a 14 +KPX R aacute 14 +KPX R adieresis 14 +KPX R ae 40 +KPX R aring 14 +KPX R e 2 +KPX R eacute 2 +KPX R hyphen -25 +KPX R o -3 +KPX R oacute -3 +KPX R odieresis -3 +KPX R oe 29 +KPX R u -7 +KPX R uacute -8 +KPX R udieresis -8 +KPX R y -18 +KPX S A -10 +KPX S AE -10 +KPX S Aacute -10 +KPX S Adieresis -10 +KPX S Aring -10 +KPX S T -41 +KPX S V -10 +KPX S W -12 +KPX S Y -31 +KPX S t -17 +KPX T A -28 +KPX T AE -28 +KPX T Aacute -28 +KPX T Acircumflex -28 +KPX T Adieresis -28 +KPX T Agrave -28 +KPX T Aring -28 +KPX T Atilde -28 +KPX T C -19 +KPX T G -19 +KPX T J -65 +KPX T O -14 +KPX T OE 6 +KPX T Oacute -14 +KPX T Ocircumflex -14 +KPX T Odieresis -14 +KPX T Ograve -14 +KPX T Oslash -14 +KPX T Otilde -14 +KPX T S -41 +KPX T V 10 +KPX T W 4 +KPX T Y -10 +KPX T a -34 +KPX T ae -12 +KPX T c -37 +KPX T colon -112 +KPX T comma -130 +KPX T e -26 +KPX T g -24 +KPX T guillemotleft -73 +KPX T guilsinglleft -73 +KPX T hyphen -91 +KPX T i -42 +KPX T j -49 +KPX T o -31 +KPX T oslash -31 +KPX T period -148 +KPX T r -28 +KPX T s -39 +KPX T semicolon -100 +KPX T u 4 +KPX T v 10 +KPX T w 10 +KPX T y 0 +KPX U A -19 +KPX U AE -18 +KPX U Aacute -19 +KPX U Acircumflex -19 +KPX U Adieresis -19 +KPX U Aring -19 +KPX U Atilde -19 +KPX U comma -95 +KPX U m 16 +KPX U n -8 +KPX U p 0 +KPX U period -114 +KPX U r -34 +KPX Uacute A -19 +KPX Uacute comma -95 +KPX Uacute m 16 +KPX Uacute n -8 +KPX Uacute p 0 +KPX Uacute period -114 +KPX Uacute r -34 +KPX Ucircumflex A -19 +KPX Udieresis A -19 +KPX Udieresis b 27 +KPX Udieresis comma -95 +KPX Udieresis m 16 +KPX Udieresis n -8 +KPX Udieresis p 0 +KPX Udieresis period -114 +KPX Udieresis r -34 +KPX Ugrave A -19 +KPX V A -4 +KPX V AE -12 +KPX V Aacute -4 +KPX V Acircumflex -4 +KPX V Adieresis -4 +KPX V Agrave -4 +KPX V Aring -4 +KPX V Atilde -4 +KPX V C -24 +KPX V G -24 +KPX V O -23 +KPX V Oacute -23 +KPX V Ocircumflex -23 +KPX V Odieresis -23 +KPX V Ograve -23 +KPX V Oslash -23 +KPX V Otilde -23 +KPX V S -27 +KPX V T 10 +KPX V a -54 +KPX V ae -27 +KPX V colon -132 +KPX V comma -146 +KPX V e -47 +KPX V g -46 +KPX V guillemotleft -75 +KPX V guilsinglleft -75 +KPX V hyphen -39 +KPX V i -59 +KPX V o -52 +KPX V oslash -48 +KPX V period -164 +KPX V r -45 +KPX V semicolon -120 +KPX V u -15 +KPX V y -17 +KPX W A -9 +KPX W AE -9 +KPX W Aacute -9 +KPX W Acircumflex -9 +KPX W Adieresis -9 +KPX W Agrave -9 +KPX W Aring -9 +KPX W Atilde -9 +KPX W C -4 +KPX W G -3 +KPX W O -2 +KPX W Oacute -2 +KPX W Ocircumflex -2 +KPX W Odieresis -2 +KPX W Ograve -2 +KPX W Oslash 2 +KPX W Otilde -2 +KPX W S -17 +KPX W T 4 +KPX W a -11 +KPX W ae 17 +KPX W colon -99 +KPX W comma -83 +KPX W e -3 +KPX W g -3 +KPX W guillemotleft -31 +KPX W guilsinglleft -31 +KPX W hyphen 1 +KPX W i -38 +KPX W o -8 +KPX W oslash -4 +KPX W period -101 +KPX W r -25 +KPX W semicolon -82 +KPX W u 1 +KPX W y -2 +KPX X C -28 +KPX X O -26 +KPX X Odieresis -26 +KPX X Q -26 +KPX X a 0 +KPX X e -12 +KPX X hyphen -50 +KPX X o -18 +KPX X u -28 +KPX X y -43 +KPX Y A -25 +KPX Y AE -28 +KPX Y Aacute -25 +KPX Y Acircumflex -25 +KPX Y Adieresis -25 +KPX Y Agrave -25 +KPX Y Aring -25 +KPX Y Atilde -25 +KPX Y C -45 +KPX Y G -45 +KPX Y O -44 +KPX Y Oacute -44 +KPX Y Ocircumflex -44 +KPX Y Odieresis -44 +KPX Y Ograve -44 +KPX Y Oslash -43 +KPX Y Otilde -44 +KPX Y S -48 +KPX Y T -10 +KPX Y a -53 +KPX Y ae -28 +KPX Y colon -150 +KPX Y comma -118 +KPX Y e -59 +KPX Y g -59 +KPX Y guillemotleft -94 +KPX Y guilsinglleft -94 +KPX Y hyphen -81 +KPX Y i -58 +KPX Y o -64 +KPX Y oslash -51 +KPX Y p -30 +KPX Y period -136 +KPX Y semicolon -133 +KPX Y u -43 +KPX Y v -33 +KPX Z v -41 +KPX Z y -52 +KPX a j -81 +KPX a quoteright -78 +KPX a v -21 +KPX a w -12 +KPX a y -31 +KPX aacute v -21 +KPX aacute w -12 +KPX aacute y -31 +KPX adieresis v -21 +KPX adieresis w -12 +KPX adieresis y -31 +KPX ae v 28 +KPX ae w 32 +KPX ae y 18 +KPX agrave v -21 +KPX agrave w -12 +KPX agrave y -31 +KPX aring v -21 +KPX aring w -12 +KPX aring y -31 +KPX b v 0 +KPX b w 4 +KPX b y -10 +KPX c h 11 +KPX c k 6 +KPX comma one -128 +KPX comma quotedblright -137 +KPX comma quoteright -166 +KPX e quoteright -65 +KPX e t -16 +KPX e v -9 +KPX e w -3 +KPX e x 6 +KPX e y -20 +KPX eacute v -9 +KPX eacute w -3 +KPX eacute y -20 +KPX ecircumflex v -9 +KPX ecircumflex w -3 +KPX ecircumflex y -20 +KPX eight four -58 +KPX eight one -72 +KPX eight seven -65 +KPX f a -32 +KPX f aacute -32 +KPX f adieresis -32 +KPX f ae -7 +KPX f aring -32 +KPX f e -43 +KPX f eacute -43 +KPX f f -43 +KPX f i -37 +KPX f j -60 +KPX f l -25 +KPX f o -47 +KPX f oacute -47 +KPX f odieresis -42 +KPX f oe -15 +KPX f oslash -29 +KPX f quoteright -73 +KPX f s -42 +KPX f t -6 +KPX five four -52 +KPX five one -73 +KPX five seven -73 +KPX four four -62 +KPX four one -66 +KPX four seven -93 +KPX g a -4 +KPX g adieresis -4 +KPX g ae 23 +KPX g aring -4 +KPX g e 1 +KPX g eacute 1 +KPX g l -34 +KPX g oacute -3 +KPX g odieresis -3 +KPX g r 0 +KPX guillemotright A -37 +KPX guillemotright AE -34 +KPX guillemotright Aacute -37 +KPX guillemotright Adieresis -37 +KPX guillemotright Aring -37 +KPX guillemotright T -71 +KPX guillemotright V -72 +KPX guillemotright W -29 +KPX guillemotright Y -92 +KPX guilsinglright A -37 +KPX guilsinglright AE -34 +KPX guilsinglright Aacute -37 +KPX guilsinglright Adieresis -37 +KPX guilsinglright Aring -37 +KPX guilsinglright T -71 +KPX guilsinglright V -72 +KPX guilsinglright W -29 +KPX guilsinglright Y -92 +KPX h quoteright -69 +KPX h y -23 +KPX hyphen A -18 +KPX hyphen AE -14 +KPX hyphen Aacute -18 +KPX hyphen Adieresis -18 +KPX hyphen Aring -18 +KPX hyphen T -90 +KPX hyphen V -38 +KPX hyphen W 1 +KPX hyphen Y -81 +KPX i T -58 +KPX i j -143 +KPX k a 1 +KPX k aacute 1 +KPX k adieresis 1 +KPX k ae 26 +KPX k aring 1 +KPX k comma -63 +KPX k e -11 +KPX k eacute -11 +KPX k g -14 +KPX k hyphen -50 +KPX k o -17 +KPX k oacute -17 +KPX k odieresis -17 +KPX k period -75 +KPX k s -9 +KPX k u -3 +KPX k udieresis -3 +KPX l v -77 +KPX l y -77 +KPX m p 32 +KPX m v 18 +KPX m w 22 +KPX m y 8 +KPX n T -40 +KPX n p 4 +KPX n quoteright -68 +KPX n v -12 +KPX n w -5 +KPX n y -22 +KPX nine four -53 +KPX nine one -66 +KPX nine seven -57 +KPX o T -31 +KPX o quoteright -62 +KPX o t -13 +KPX o v -6 +KPX o w -3 +KPX o x -10 +KPX o y -17 +KPX oacute v -6 +KPX oacute w -3 +KPX oacute y -17 +KPX ocircumflex t -13 +KPX odieresis t -13 +KPX odieresis v -6 +KPX odieresis w -3 +KPX odieresis x -10 +KPX odieresis y -17 +KPX ograve v -6 +KPX ograve w -3 +KPX ograve y -17 +KPX one comma -99 +KPX one eight -74 +KPX one five -55 +KPX one four -87 +KPX one nine -73 +KPX one one -62 +KPX one period -114 +KPX one seven -141 +KPX one six -98 +KPX one three -53 +KPX one two -47 +KPX one zero -86 +KPX p t -3 +KPX p y -6 +KPX period one -113 +KPX period quotedblright -131 +KPX period quoteright -161 +KPX q c 2 +KPX q u 41 +KPX quotedblbase A -6 +KPX quotedblbase AE -7 +KPX quotedblbase T -90 +KPX quotedblbase V -104 +KPX quotedblbase W -43 +KPX quotedblbase Y -78 +KPX quotedblleft A -62 +KPX quotedblleft AE -60 +KPX quotedblleft Aacute -62 +KPX quotedblleft Adieresis -62 +KPX quotedblleft Aring -62 +KPX quotedblleft T -24 +KPX quotedblleft V -22 +KPX quotedblleft W -13 +KPX quotedblleft Y -49 +KPX quotedblright A -76 +KPX quotedblright AE -75 +KPX quotedblright Aacute -76 +KPX quotedblright Adieresis -76 +KPX quotedblright Aring -76 +KPX quotedblright T -39 +KPX quotedblright V -30 +KPX quotedblright W -26 +KPX quotedblright Y -51 +KPX quoteleft A -87 +KPX quoteleft AE -85 +KPX quoteleft Aacute -87 +KPX quoteleft Adieresis -87 +KPX quoteleft Aring -87 +KPX quoteleft T -49 +KPX quoteleft V -46 +KPX quoteleft W -38 +KPX quoteleft Y -73 +KPX quoteright A -154 +KPX quoteright AE -153 +KPX quoteright Aacute -154 +KPX quoteright Adieresis -154 +KPX quoteright Aring -154 +KPX quoteright comma -227 +KPX quoteright d -140 +KPX quoteright o -143 +KPX quoteright period -244 +KPX quoteright r -149 +KPX quoteright s -150 +KPX quoteright t -117 +KPX quoteright v -110 +KPX quoteright w -105 +KPX quoteright y -116 +KPX r a -17 +KPX r aacute -17 +KPX r acircumflex -17 +KPX r adieresis -17 +KPX r ae 4 +KPX r agrave -17 +KPX r aring -17 +KPX r c -18 +KPX r ccedilla -15 +KPX r colon -95 +KPX r comma -108 +KPX r d -8 +KPX r e -7 +KPX r eacute -7 +KPX r ecircumflex -7 +KPX r egrave -7 +KPX r f -16 +KPX r g -5 +KPX r h -20 +KPX r hyphen -41 +KPX r i -25 +KPX r j -33 +KPX r k -30 +KPX r l -47 +KPX r m 36 +KPX r n 10 +KPX r o -12 +KPX r oacute -12 +KPX r ocircumflex -12 +KPX r odieresis -12 +KPX r oe 18 +KPX r ograve -12 +KPX r oslash -12 +KPX r p 30 +KPX r period -122 +KPX r q -4 +KPX r quoteright -41 +KPX r r -11 +KPX r s -21 +KPX r semicolon -83 +KPX r t 20 +KPX r u 20 +KPX r v 26 +KPX r w 26 +KPX r x 7 +KPX r y 16 +KPX r z -21 +KPX s quoteright -60 +KPX s t -11 +KPX seven colon -156 +KPX seven comma -157 +KPX seven eight -74 +KPX seven five -82 +KPX seven four -101 +KPX seven one -67 +KPX seven period -176 +KPX seven seven -62 +KPX seven six -93 +KPX seven three -72 +KPX seven two -64 +KPX six four -49 +KPX six one -54 +KPX six seven -46 +KPX t S -35 +KPX t a -16 +KPX t aacute -16 +KPX t adieresis -16 +KPX t ae 9 +KPX t aring -16 +KPX t colon -117 +KPX t e -24 +KPX t eacute -24 +KPX t h -5 +KPX t o -30 +KPX t oacute -30 +KPX t odieresis -30 +KPX t quoteright -102 +KPX t semicolon -103 +KPX three four -52 +KPX three one -71 +KPX three seven -64 +KPX two four -67 +KPX two one -66 +KPX two seven -68 +KPX u quoteright -56 +KPX v a -3 +KPX v aacute -3 +KPX v acircumflex -3 +KPX v adieresis -3 +KPX v ae 18 +KPX v agrave -3 +KPX v aring -3 +KPX v atilde -3 +KPX v c -11 +KPX v colon -81 +KPX v comma -136 +KPX v e 0 +KPX v eacute 0 +KPX v ecircumflex 0 +KPX v egrave 0 +KPX v g 1 +KPX v hyphen -23 +KPX v l -77 +KPX v o -5 +KPX v oacute -5 +KPX v odieresis -5 +KPX v ograve -5 +KPX v oslash -5 +KPX v period -156 +KPX v s -11 +KPX v semicolon -69 +KPX w a -3 +KPX w aacute -3 +KPX w acircumflex -3 +KPX w adieresis -3 +KPX w ae 23 +KPX w agrave -3 +KPX w aring -3 +KPX w atilde -3 +KPX w c -6 +KPX w colon -81 +KPX w comma -90 +KPX w e 2 +KPX w eacute 2 +KPX w ecircumflex 2 +KPX w egrave 2 +KPX w g 3 +KPX w hyphen 3 +KPX w l -48 +KPX w o -2 +KPX w oacute -2 +KPX w odieresis -2 +KPX w ograve -2 +KPX w oslash 2 +KPX w period -109 +KPX w s -11 +KPX w semicolon -69 +KPX x a 5 +KPX x c -14 +KPX x e -5 +KPX x eacute -5 +KPX x o -10 +KPX x q -8 +KPX y a -13 +KPX y aacute -13 +KPX y acircumflex -13 +KPX y adieresis -13 +KPX y ae 8 +KPX y agrave -13 +KPX y aring -13 +KPX y atilde -13 +KPX y c -21 +KPX y colon -91 +KPX y comma -134 +KPX y e -11 +KPX y eacute -11 +KPX y ecircumflex -11 +KPX y egrave -11 +KPX y g -9 +KPX y hyphen -19 +KPX y l -78 +KPX y o -15 +KPX y oacute -15 +KPX y odieresis -15 +KPX y ograve -15 +KPX y oslash -15 +KPX y period -155 +KPX y s -21 +KPX y semicolon -79 +KPX zero four -59 +KPX zero one -76 +KPX zero seven -68 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n022004l.pfb b/PdfReader/Resources/Fonts/n022004l.pfb new file mode 100644 index 0000000000..74fe4bf46a Binary files /dev/null and b/PdfReader/Resources/Fonts/n022004l.pfb differ diff --git a/PdfReader/Resources/Fonts/n022023l.afm b/PdfReader/Resources/Fonts/n022023l.afm new file mode 100644 index 0000000000..718ec5de05 --- /dev/null +++ b/PdfReader/Resources/Fonts/n022023l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-ReguObli +FullName Nimbus Mono L Regular Oblique +FamilyName Nimbus Mono L +Weight Regular +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -61 -237 774 811 +CapHeight 563 +XHeight 417 +Descender -186 +Ascender 604 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 319 0 319 0 ; +C 33 ; WX 600 ; N exclam ; B 246 -15 463 618 ; +C 34 ; WX 600 ; N quotedbl ; B 254 315 582 604 ; +C 35 ; WX 600 ; N numbersign ; B 137 -62 589 647 ; +C 36 ; WX 600 ; N dollar ; B 131 -92 582 655 ; +C 37 ; WX 600 ; N percent ; B 137 -12 591 611 ; +C 38 ; WX 600 ; N ampersand ; B 132 -16 527 519 ; +C 39 ; WX 600 ; N quoteright ; B 207 314 468 604 ; +C 40 ; WX 600 ; N parenleft ; B 335 -124 583 604 ; +C 41 ; WX 600 ; N parenright ; B 124 -124 372 604 ; +C 42 ; WX 600 ; N asterisk ; B 211 250 586 604 ; +C 43 ; WX 600 ; N plus ; B 131 32 588 530 ; +C 44 ; WX 600 ; N comma ; B 110 -145 371 145 ; +C 45 ; WX 600 ; N hyphen ; B 131 258 588 299 ; +C 46 ; WX 600 ; N period ; B 235 -15 386 116 ; +C 47 ; WX 600 ; N slash ; B 99 -81 625 668 ; +C 48 ; WX 600 ; N zero ; B 156 -15 571 618 ; +C 49 ; WX 600 ; N one ; B 117 0 492 612 ; +C 50 ; WX 600 ; N two ; B 84 0 572 618 ; +C 51 ; WX 600 ; N three ; B 110 -15 579 618 ; +C 52 ; WX 600 ; N four ; B 141 0 545 604 ; +C 53 ; WX 600 ; N five ; B 113 -15 584 604 ; +C 54 ; WX 600 ; N six ; B 184 -15 631 618 ; +C 55 ; WX 600 ; N seven ; B 215 -1 606 604 ; +C 56 ; WX 600 ; N eight ; B 143 -15 576 618 ; +C 57 ; WX 600 ; N nine ; B 142 -15 589 618 ; +C 58 ; WX 600 ; N colon ; B 235 -15 450 417 ; +C 59 ; WX 600 ; N semicolon ; B 114 -145 426 417 ; +C 60 ; WX 600 ; N less ; B 131 44 627 518 ; +C 61 ; WX 600 ; N equal ; B 95 190 625 375 ; +C 62 ; WX 600 ; N greater ; B 92 44 588 518 ; +C 63 ; WX 600 ; N question ; B 231 -15 581 577 ; +C 64 ; WX 600 ; N at ; B 139 -62 561 624 ; +C 65 ; WX 600 ; N A ; B 13 0 596 563 ; +C 66 ; WX 600 ; N B ; B 47 0 591 563 ; +C 67 ; WX 600 ; N C ; B 110 -16 635 576 ; +C 68 ; WX 600 ; N D ; B 47 0 592 563 ; +C 69 ; WX 600 ; N E ; B 47 0 619 563 ; +C 70 ; WX 600 ; N F ; B 47 0 640 563 ; +C 71 ; WX 600 ; N G ; B 108 -16 636 576 ; +C 72 ; WX 600 ; N H ; B 57 0 646 563 ; +C 73 ; WX 600 ; N I ; B 117 0 603 563 ; +C 74 ; WX 600 ; N J ; B 100 -16 699 563 ; +C 75 ; WX 600 ; N K ; B 47 0 662 563 ; +C 76 ; WX 600 ; N L ; B 67 0 585 563 ; +C 77 ; WX 600 ; N M ; B 15 0 700 563 ; +C 78 ; WX 600 ; N N ; B 46 0 678 563 ; +C 79 ; WX 600 ; N O ; B 102 -16 616 576 ; +C 80 ; WX 600 ; N P ; B 47 0 587 563 ; +C 81 ; WX 600 ; N Q ; B 102 -115 616 576 ; +C 82 ; WX 600 ; N R ; B 47 0 594 563 ; +C 83 ; WX 600 ; N S ; B 96 -17 602 577 ; +C 84 ; WX 600 ; N T ; B 152 0 648 563 ; +C 85 ; WX 600 ; N U ; B 136 -16 676 563 ; +C 86 ; WX 600 ; N V ; B 124 0 707 563 ; +C 87 ; WX 600 ; N W ; B 122 0 696 563 ; +C 88 ; WX 600 ; N X ; B 44 0 662 563 ; +C 89 ; WX 600 ; N Y ; B 153 0 665 563 ; +C 90 ; WX 600 ; N Z ; B 103 0 590 563 ; +C 91 ; WX 600 ; N bracketleft ; B 254 -124 570 604 ; +C 92 ; WX 600 ; N backslash ; B 250 -81 474 668 ; +C 93 ; WX 600 ; N bracketright ; B 132 -124 448 604 ; +C 94 ; WX 600 ; N asciicircum ; B 192 354 567 615 ; +C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 388 343 544 604 ; +C 97 ; WX 600 ; N a ; B 93 -16 546 431 ; +C 98 ; WX 600 ; N b ; B 26 -16 591 604 ; +C 99 ; WX 600 ; N c ; B 121 -17 596 432 ; +C 100 ; WX 600 ; N d ; B 102 -16 630 604 ; +C 101 ; WX 600 ; N e ; B 104 -16 570 431 ; +C 102 ; WX 600 ; N f ; B 109 0 663 604 ; +C 103 ; WX 600 ; N g ; B 105 -186 647 431 ; +C 104 ; WX 600 ; N h ; B 55 0 556 604 ; +C 105 ; WX 600 ; N i ; B 96 0 513 624 ; +C 106 ; WX 600 ; N j ; B 112 -186 547 624 ; +C 107 ; WX 600 ; N k ; B 67 0 578 604 ; +C 108 ; WX 600 ; N l ; B 96 0 513 604 ; +C 109 ; WX 600 ; N m ; B 15 0 603 431 ; +C 110 ; WX 600 ; N n ; B 57 0 546 431 ; +C 111 ; WX 600 ; N o ; B 111 -16 577 431 ; +C 112 ; WX 600 ; N p ; B -13 -186 593 431 ; +C 113 ; WX 600 ; N q ; B 105 -186 668 431 ; +C 114 ; WX 600 ; N r ; B 88 0 619 427 ; +C 115 ; WX 600 ; N s ; B 108 -17 558 431 ; +C 116 ; WX 600 ; N t ; B 127 -16 518 563 ; +C 117 ; WX 600 ; N u ; B 127 -16 569 417 ; +C 118 ; WX 600 ; N v ; B 114 0 655 417 ; +C 119 ; WX 600 ; N w ; B 114 0 655 417 ; +C 120 ; WX 600 ; N x ; B 55 0 611 417 ; +C 121 ; WX 600 ; N y ; B 22 -186 634 417 ; +C 122 ; WX 600 ; N z ; B 115 0 563 417 ; +C 123 ; WX 600 ; N braceleft ; B 248 -124 528 604 ; +C 124 ; WX 600 ; N bar ; B 257 -124 444 604 ; +C 125 ; WX 600 ; N braceright ; B 175 -124 455 604 ; +C 126 ; WX 600 ; N asciitilde ; B 145 212 575 348 ; +C 161 ; WX 600 ; N exclamdown ; B 222 -216 439 417 ; +C 162 ; WX 600 ; N cent ; B 175 -13 563 630 ; +C 163 ; WX 600 ; N sterling ; B 90 0 541 578 ; +C 164 ; WX 600 ; N fraction ; B 84 138 645 470 ; +C 165 ; WX 600 ; N yen ; B 161 0 665 563 ; +C 166 ; WX 600 ; N florin ; B 74 -93 643 618 ; +C 167 ; WX 600 ; N section ; B 91 -62 624 603 ; +C 168 ; WX 600 ; N currency ; B 127 95 597 489 ; +C 169 ; WX 600 ; N quotesingle ; B 344 315 492 604 ; +C 170 ; WX 600 ; N quotedblleft ; B 221 343 586 604 ; +C 171 ; WX 600 ; N guillemotleft ; B 108 0 626 417 ; +C 172 ; WX 600 ; N guilsinglleft ; B 108 0 397 417 ; +C 173 ; WX 600 ; N guilsinglright ; B 297 0 585 417 ; +C 174 ; WX 600 ; N fi ; B 14 0 615 624 ; +C 175 ; WX 600 ; N fl ; B 14 0 611 604 ; +C 177 ; WX 600 ; N endash ; B 131 261 588 302 ; +C 178 ; WX 600 ; N dagger ; B 208 -63 561 604 ; +C 179 ; WX 600 ; N daggerdbl ; B 154 -62 561 604 ; +C 180 ; WX 600 ; N periodcentered ; B 285 217 436 348 ; +C 182 ; WX 600 ; N paragraph ; B 152 -62 648 604 ; +C 183 ; WX 600 ; N bullet ; B 253 141 449 337 ; +C 184 ; WX 600 ; N quotesinglbase ; B 110 -145 371 145 ; +C 185 ; WX 600 ; N quotedblbase ; B 73 -116 538 145 ; +C 186 ; WX 600 ; N quotedblright ; B 170 343 635 604 ; +C 187 ; WX 600 ; N guillemotright ; B 67 0 585 417 ; +C 188 ; WX 600 ; N ellipsis ; B 57 -15 557 84 ; +C 189 ; WX 600 ; N perthousand ; B 91 -9 598 614 ; +C 191 ; WX 600 ; N questiondown ; B 105 -175 455 417 ; +C 193 ; WX 600 ; N grave ; B 286 490 429 639 ; +C 194 ; WX 600 ; N acute ; B 388 490 577 639 ; +C 195 ; WX 600 ; N circumflex ; B 263 490 554 639 ; +C 196 ; WX 600 ; N tilde ; B 258 516 579 605 ; +C 197 ; WX 600 ; N macron ; B 273 536 564 576 ; +C 198 ; WX 600 ; N breve ; B 280 489 574 621 ; +C 199 ; WX 600 ; N dotaccent ; B 368 511 470 611 ; +C 200 ; WX 600 ; N dieresis ; B 258 511 581 611 ; +C 202 ; WX 600 ; N ring ; B 326 480 516 661 ; +C 203 ; WX 600 ; N cedilla ; B 181 -173 356 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 263 490 576 633 ; +C 206 ; WX 600 ; N ogonek ; B 258 -155 408 0 ; +C 207 ; WX 600 ; N caron ; B 286 490 577 639 ; +C 208 ; WX 600 ; N emdash ; B 60 261 659 302 ; +C 225 ; WX 600 ; N AE ; B 14 0 690 563 ; +C 227 ; WX 600 ; N ordfeminine ; B 229 279 511 574 ; +C 232 ; WX 600 ; N Lslash ; B 66 0 586 563 ; +C 233 ; WX 600 ; N Oslash ; B 34 -43 685 605 ; +C 234 ; WX 600 ; N OE ; B 62 0 690 563 ; +C 235 ; WX 600 ; N ordmasculine ; B 243 284 543 577 ; +C 241 ; WX 600 ; N ae ; B 36 -16 630 431 ; +C 245 ; WX 600 ; N dotlessi ; B 96 0 513 417 ; +C 248 ; WX 600 ; N lslash ; B 96 0 524 604 ; +C 249 ; WX 600 ; N oslash ; B 47 -43 637 458 ; +C 250 ; WX 600 ; N oe ; B 50 -16 630 431 ; +C 251 ; WX 600 ; N germandbls ; B 47 -16 539 604 ; +C -1 ; WX 600 ; N Udieresis ; B 136 -16 676 762 ; +C -1 ; WX 600 ; N Uacute ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N Scedilla ; B 96 -179 602 577 ; +C -1 ; WX 600 ; N Tcaron ; B 152 0 648 789 ; +C -1 ; WX 600 ; N Scaron ; B 96 -17 618 789 ; +C -1 ; WX 600 ; N Rcaron ; B 47 0 594 789 ; +C -1 ; WX 600 ; N Racute ; B 47 0 594 789 ; +C -1 ; WX 600 ; N Sacute ; B 96 -17 602 789 ; +C -1 ; WX 600 ; N Otilde ; B 103 -16 618 755 ; +C -1 ; WX 600 ; N ucircumflex ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 102 -16 672 787 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 136 -16 676 787 ; +C -1 ; WX 600 ; N Yacute ; B 153 0 665 789 ; +C -1 ; WX 600 ; N Eth ; B 47 0 592 563 ; +C -1 ; WX 600 ; N Dcroat ; B 47 0 592 563 ; +C -1 ; WX 600 ; N Zacute ; B 103 0 590 789 ; +C -1 ; WX 600 ; N Uring ; B 136 -16 676 807 ; +C -1 ; WX 600 ; N gbreve ; B 105 -186 647 621 ; +C -1 ; WX 600 ; N eogonek ; B 104 -155 570 431 ; +C -1 ; WX 600 ; N edotaccent ; B 104 -16 570 611 ; +C -1 ; WX 600 ; N ecaron ; B 104 -16 577 639 ; +C -1 ; WX 600 ; N Ugrave ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N Thorn ; B 47 0 566 563 ; +C -1 ; WX 600 ; N eacute ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N edieresis ; B 104 -16 586 611 ; +C -1 ; WX 600 ; N dcaron ; B 102 -16 774 618 ; +C -1 ; WX 600 ; N ccedilla ; B 122 -173 596 431 ; +C -1 ; WX 600 ; N ccaron ; B 121 -17 596 639 ; +C -1 ; WX 600 ; N cacute ; B 121 -17 596 639 ; +C -1 ; WX 600 ; N aogonek ; B 93 -155 546 431 ; +C -1 ; WX 600 ; N aring ; B 93 -16 546 661 ; +C -1 ; WX 600 ; N atilde ; B 93 -16 570 605 ; +C -1 ; WX 600 ; N abreve ; B 93 -16 574 621 ; +C -1 ; WX 600 ; N egrave ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N agrave ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N aacute ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N adieresis ; B 93 -16 571 611 ; +C -1 ; WX 600 ; N Uogonek ; B 136 -155 676 563 ; +C -1 ; WX 600 ; N ugrave ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N uacute ; B 127 -16 569 639 ; +C -1 ; WX 600 ; N udieresis ; B 127 -16 573 611 ; +C -1 ; WX 600 ; N tcaron ; B 127 -16 593 618 ; +C -1 ; WX 600 ; N scommaaccent ; B 108 -237 558 431 ; +C -1 ; WX 600 ; N Zcaron ; B 103 0 604 789 ; +C -1 ; WX 600 ; N ecircumflex ; B 104 -16 570 639 ; +C -1 ; WX 600 ; N Ucircumflex ; B 136 -16 676 789 ; +C -1 ; WX 600 ; N acircumflex ; B 93 -16 546 639 ; +C -1 ; WX 600 ; N Zdotaccent ; B 103 0 590 762 ; +C -1 ; WX 600 ; N scaron ; B 107 -17 584 639 ; +C -1 ; WX 600 ; N Amacron ; B 13 0 596 723 ; +C -1 ; WX 600 ; N sacute ; B 108 -17 577 639 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 152 -237 648 563 ; +C -1 ; WX 600 ; N Ydieresis ; B 153 0 665 762 ; +C -1 ; WX 600 ; N thorn ; B -13 -186 593 590 ; +C -1 ; WX 600 ; N Emacron ; B 47 0 619 723 ; +C -1 ; WX 600 ; N Ograve ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N Oacute ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N Odieresis ; B 102 -16 616 762 ; +C -1 ; WX 600 ; N Ntilde ; B 46 0 678 755 ; +C -1 ; WX 600 ; N Ncaron ; B 46 0 678 789 ; +C -1 ; WX 600 ; N Nacute ; B 46 0 678 789 ; +C -1 ; WX 600 ; N Lcaron ; B 67 0 638 576 ; +C -1 ; WX 600 ; N Lacute ; B 67 0 585 789 ; +C -1 ; WX 600 ; N Idotaccent ; B 117 0 603 762 ; +C -1 ; WX 600 ; N racute ; B 88 0 619 639 ; +C -1 ; WX 600 ; N Icircumflex ; B 117 0 603 789 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 111 -16 616 633 ; +C -1 ; WX 600 ; N otilde ; B 111 -16 586 605 ; +C -1 ; WX 600 ; N Euro ; B 60 -16 634 576 ; +C -1 ; WX 600 ; N ocircumflex ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N onesuperior ; B 249 259 469 612 ; +C -1 ; WX 600 ; N twosuperior ; B 230 259 514 612 ; +C -1 ; WX 600 ; N threesuperior ; B 245 251 516 612 ; +C -1 ; WX 600 ; N Igrave ; B 117 0 603 789 ; +C -1 ; WX 600 ; N Iacute ; B 117 0 603 789 ; +C -1 ; WX 600 ; N Imacron ; B 117 0 603 723 ; +C -1 ; WX 600 ; N Iogonek ; B 117 -155 603 563 ; +C -1 ; WX 600 ; N Idieresis ; B 117 0 611 762 ; +C -1 ; WX 600 ; N Gbreve ; B 108 -16 656 777 ; +C -1 ; WX 600 ; N Umacron ; B 136 -16 676 723 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 47 -237 662 563 ; +C -1 ; WX 600 ; N ograve ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N Scommaaccent ; B 96 -237 602 577 ; +C -1 ; WX 600 ; N Eogonek ; B 47 -155 619 563 ; +C -1 ; WX 600 ; N oacute ; B 111 -16 577 639 ; +C -1 ; WX 600 ; N Edotaccent ; B 47 0 619 762 ; +C -1 ; WX 600 ; N iogonek ; B 96 -155 513 624 ; +C -1 ; WX 600 ; N gcommaaccent ; B 105 -186 647 668 ; +C -1 ; WX 600 ; N odieresis ; B 111 -16 581 611 ; +C -1 ; WX 600 ; N ntilde ; B 57 0 570 605 ; +C -1 ; WX 600 ; N ncaron ; B 57 0 577 639 ; +C -1 ; WX 600 ; N Ecaron ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Ecircumflex ; B 47 0 619 789 ; +C -1 ; WX 600 ; N scedilla ; B 108 -173 558 431 ; +C -1 ; WX 600 ; N rcaron ; B 88 0 619 639 ; +C -1 ; WX 600 ; N Egrave ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Eacute ; B 47 0 619 789 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 108 -237 636 576 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 47 -237 594 563 ; +C -1 ; WX 600 ; N Edieresis ; B 47 0 619 762 ; +C -1 ; WX 600 ; N nacute ; B 57 0 577 639 ; +C -1 ; WX 600 ; N uogonek ; B 127 -155 569 417 ; +C -1 ; WX 600 ; N umacron ; B 127 -16 569 576 ; +C -1 ; WX 600 ; N Dcaron ; B 47 0 592 789 ; +C -1 ; WX 600 ; N lcaron ; B 96 0 593 618 ; +C -1 ; WX 600 ; N Ccaron ; B 110 -16 635 789 ; +C -1 ; WX 600 ; N Cacute ; B 110 -16 635 789 ; +C -1 ; WX 600 ; N Ccedilla ; B 110 -173 635 576 ; +C -1 ; WX 600 ; N degree ; B 257 346 553 636 ; +C -1 ; WX 600 ; N Aogonek ; B 13 -155 596 563 ; +C -1 ; WX 600 ; N minus ; B 131 261 588 302 ; +C -1 ; WX 600 ; N multiply ; B 143 100 577 464 ; +C -1 ; WX 600 ; N divide ; B 131 25 588 540 ; +C -1 ; WX 600 ; N Aring ; B 13 0 596 811 ; +C -1 ; WX 600 ; N trademark ; B 90 243 710 563 ; +C -1 ; WX 600 ; N rcommaaccent ; B 88 -237 619 427 ; +C -1 ; WX 600 ; N lacute ; B 96 0 572 789 ; +C -1 ; WX 600 ; N omacron ; B 111 -16 577 576 ; +C -1 ; WX 600 ; N Atilde ; B 13 0 596 755 ; +C -1 ; WX 600 ; N icircumflex ; B 95 0 536 639 ; +C -1 ; WX 600 ; N igrave ; B 96 0 513 639 ; +C -1 ; WX 600 ; N ncommaaccent ; B 57 -237 546 431 ; +C -1 ; WX 600 ; N lcommaaccent ; B 96 -237 513 604 ; +C -1 ; WX 600 ; N plusminus ; B 76 0 597 529 ; +C -1 ; WX 600 ; N onehalf ; B 82 0 627 612 ; +C -1 ; WX 600 ; N onequarter ; B 74 0 619 612 ; +C -1 ; WX 600 ; N threequarters ; B 70 0 619 612 ; +C -1 ; WX 600 ; N iacute ; B 96 0 535 639 ; +C -1 ; WX 600 ; N Abreve ; B 13 0 596 777 ; +C -1 ; WX 600 ; N kcommaaccent ; B 67 -237 578 604 ; +C -1 ; WX 600 ; N Omacron ; B 102 -16 616 723 ; +C -1 ; WX 600 ; N imacron ; B 96 0 564 576 ; +C -1 ; WX 600 ; N emacron ; B 104 -16 570 576 ; +C -1 ; WX 600 ; N amacron ; B 93 -16 564 576 ; +C -1 ; WX 600 ; N tcommaaccent ; B 127 -237 518 563 ; +C -1 ; WX 600 ; N ydieresis ; B 22 -186 634 611 ; +C -1 ; WX 600 ; N zdotaccent ; B 115 0 563 611 ; +C -1 ; WX 600 ; N zcaron ; B 115 0 576 639 ; +C -1 ; WX 600 ; N zacute ; B 115 0 577 639 ; +C -1 ; WX 600 ; N yacute ; B 22 -186 634 639 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 127 -16 576 633 ; +C -1 ; WX 600 ; N eth ; B 111 -17 582 620 ; +C -1 ; WX 600 ; N uring ; B 127 -16 569 661 ; +C -1 ; WX 600 ; N Ocircumflex ; B 102 -16 616 789 ; +C -1 ; WX 600 ; N commaaccent ; B 159 -237 322 -60 ; +C -1 ; WX 600 ; N copyright ; B 57 -15 663 578 ; +C -1 ; WX 600 ; N registered ; B 57 -15 663 578 ; +C -1 ; WX 600 ; N Acircumflex ; B 13 0 596 789 ; +C -1 ; WX 600 ; N idieresis ; B 96 0 568 611 ; +C -1 ; WX 600 ; N lozenge ; B 149 -11 571 575 ; +C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; +C -1 ; WX 600 ; N notequal ; B 96 94 625 464 ; +C -1 ; WX 600 ; N radical ; B 88 0 773 699 ; +C -1 ; WX 600 ; N Agrave ; B 13 0 596 789 ; +C -1 ; WX 600 ; N Aacute ; B 13 0 596 789 ; +C -1 ; WX 600 ; N lessequal ; B 56 0 635 535 ; +C -1 ; WX 600 ; N greaterequal ; B 71 0 600 535 ; +C -1 ; WX 600 ; N logicalnot ; B 160 168 621 438 ; +C -1 ; WX 600 ; N summation ; B 90 -127 616 563 ; +C -1 ; WX 600 ; N partialdiff ; B 111 -16 580 581 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 46 -237 678 563 ; +C -1 ; WX 600 ; N dcroat ; B 102 -16 690 604 ; +C -1 ; WX 600 ; N brokenbar ; B 257 -124 444 604 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 67 -237 585 563 ; +C -1 ; WX 600 ; N Adieresis ; B 13 0 596 762 ; +C -1 ; WX 600 ; N mu ; B 86 -200 569 417 ; +C -1 ; WX 600 ; N .notdef ; B 319 0 319 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -41 +KPX A Ccedilla -39 +KPX A G -36 +KPX A O -35 +KPX A Odieresis -35 +KPX A Q -37 +KPX A T -34 +KPX A U -41 +KPX A Uacute -41 +KPX A Ucircumflex -41 +KPX A Udieresis -41 +KPX A Ugrave -41 +KPX A V -78 +KPX A W -20 +KPX A Y -35 +KPX A a 1 +KPX A b 40 +KPX A c -26 +KPX A ccedilla -23 +KPX A comma -47 +KPX A d -17 +KPX A e -21 +KPX A g -27 +KPX A guillemotleft -57 +KPX A guilsinglleft -57 +KPX A hyphen -35 +KPX A o -22 +KPX A period -70 +KPX A q -27 +KPX A quotedblright -82 +KPX A quoteright -102 +KPX A t -33 +KPX A u -23 +KPX A v -59 +KPX A w -27 +KPX A y -63 +KPX Aacute C -41 +KPX Aacute G -36 +KPX Aacute O -35 +KPX Aacute Q -37 +KPX Aacute T -34 +KPX Aacute U -41 +KPX Aacute V -78 +KPX Aacute W -20 +KPX Aacute Y -35 +KPX Aacute a 1 +KPX Aacute b 40 +KPX Aacute c -26 +KPX Aacute comma -47 +KPX Aacute d -17 +KPX Aacute e -21 +KPX Aacute g -27 +KPX Aacute guillemotleft -57 +KPX Aacute guilsinglleft -57 +KPX Aacute hyphen -35 +KPX Aacute o -22 +KPX Aacute period -70 +KPX Aacute q -27 +KPX Aacute quoteright -102 +KPX Aacute t -33 +KPX Aacute u -23 +KPX Aacute v -59 +KPX Aacute w -27 +KPX Aacute y -63 +KPX Acircumflex C -41 +KPX Acircumflex G -36 +KPX Acircumflex O -35 +KPX Acircumflex Q -37 +KPX Acircumflex T -34 +KPX Acircumflex U -41 +KPX Acircumflex V -78 +KPX Acircumflex W -20 +KPX Acircumflex Y -35 +KPX Acircumflex comma -47 +KPX Acircumflex period -70 +KPX Adieresis C -41 +KPX Adieresis G -36 +KPX Adieresis O -35 +KPX Adieresis Q -37 +KPX Adieresis T -34 +KPX Adieresis U -41 +KPX Adieresis V -78 +KPX Adieresis W -20 +KPX Adieresis Y -35 +KPX Adieresis a 1 +KPX Adieresis b 40 +KPX Adieresis c -26 +KPX Adieresis comma -47 +KPX Adieresis d -17 +KPX Adieresis g -27 +KPX Adieresis guillemotleft -57 +KPX Adieresis guilsinglleft -57 +KPX Adieresis hyphen -35 +KPX Adieresis o -22 +KPX Adieresis period -70 +KPX Adieresis q -27 +KPX Adieresis quotedblright -82 +KPX Adieresis quoteright -102 +KPX Adieresis t -33 +KPX Adieresis u -23 +KPX Adieresis v -59 +KPX Adieresis w -27 +KPX Adieresis y -63 +KPX Agrave C -41 +KPX Agrave G -36 +KPX Agrave O -35 +KPX Agrave Q -37 +KPX Agrave T -34 +KPX Agrave U -41 +KPX Agrave V -78 +KPX Agrave W -20 +KPX Agrave Y -35 +KPX Agrave comma -47 +KPX Agrave period -70 +KPX Aring C -41 +KPX Aring G -36 +KPX Aring O -35 +KPX Aring Q -37 +KPX Aring T -34 +KPX Aring U -41 +KPX Aring V -78 +KPX Aring W -20 +KPX Aring Y -35 +KPX Aring a 1 +KPX Aring b 40 +KPX Aring c -26 +KPX Aring comma -47 +KPX Aring d -17 +KPX Aring e -21 +KPX Aring g -27 +KPX Aring guillemotleft -57 +KPX Aring guilsinglleft -57 +KPX Aring hyphen -35 +KPX Aring o -22 +KPX Aring period -70 +KPX Aring q -27 +KPX Aring quotedblright -82 +KPX Aring quoteright -102 +KPX Aring t -33 +KPX Aring u -23 +KPX Aring v -59 +KPX Aring w -27 +KPX Aring y -63 +KPX Atilde C -41 +KPX Atilde G -36 +KPX Atilde O -35 +KPX Atilde Q -37 +KPX Atilde T -34 +KPX Atilde U -41 +KPX Atilde V -78 +KPX Atilde W -20 +KPX Atilde Y -35 +KPX Atilde comma -47 +KPX Atilde period -70 +KPX B A -15 +KPX B AE -16 +KPX B Aacute -15 +KPX B Acircumflex -15 +KPX B Adieresis -15 +KPX B Aring -15 +KPX B Atilde -15 +KPX B O -15 +KPX B OE 5 +KPX B Oacute -15 +KPX B Ocircumflex -15 +KPX B Odieresis -15 +KPX B Ograve -15 +KPX B Oslash -14 +KPX B V -37 +KPX B W -15 +KPX B Y -58 +KPX C A -14 +KPX C AE -14 +KPX C Aacute -14 +KPX C Adieresis -14 +KPX C Aring -14 +KPX C H -34 +KPX C K -19 +KPX C O -24 +KPX C Oacute -24 +KPX C Odieresis -24 +KPX Ccedilla A -8 +KPX D A -47 +KPX D Aacute -47 +KPX D Acircumflex -47 +KPX D Adieresis -47 +KPX D Agrave -47 +KPX D Aring -47 +KPX D Atilde -47 +KPX D J -38 +KPX D T -47 +KPX D V -50 +KPX D W -20 +KPX D X -60 +KPX D Y -71 +KPX F A -45 +KPX F Aacute -45 +KPX F Acircumflex -45 +KPX F Adieresis -45 +KPX F Agrave -45 +KPX F Aring -45 +KPX F Atilde -45 +KPX F J -100 +KPX F O -34 +KPX F Odieresis -34 +KPX F a -52 +KPX F aacute -52 +KPX F adieresis -49 +KPX F ae -25 +KPX F aring -52 +KPX F comma -172 +KPX F e -61 +KPX F eacute -61 +KPX F hyphen -72 +KPX F i -51 +KPX F j -59 +KPX F o -68 +KPX F oacute -68 +KPX F odieresis -54 +KPX F oe -26 +KPX F oslash -68 +KPX F period -196 +KPX F r -37 +KPX F u -6 +KPX G A 0 +KPX G AE 0 +KPX G Aacute 0 +KPX G Acircumflex 0 +KPX G Adieresis 0 +KPX G Agrave 0 +KPX G Aring 0 +KPX G Atilde 0 +KPX G T -31 +KPX G V -1 +KPX G W -4 +KPX G Y -22 +KPX J A -14 +KPX J AE -23 +KPX J Adieresis -14 +KPX J Aring -14 +KPX K C -50 +KPX K G -46 +KPX K O -45 +KPX K OE -28 +KPX K Oacute -45 +KPX K Odieresis -45 +KPX K S -16 +KPX K T -18 +KPX K a -8 +KPX K adieresis -8 +KPX K ae 19 +KPX K aring -8 +KPX K e -30 +KPX K hyphen -66 +KPX K o -32 +KPX K oacute -32 +KPX K odieresis -32 +KPX K u -33 +KPX K udieresis -33 +KPX K y -72 +KPX L A 9 +KPX L AE 9 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -19 +KPX L Ccedilla -19 +KPX L G -18 +KPX L O -15 +KPX L Oacute -15 +KPX L Ocircumflex -15 +KPX L Odieresis -15 +KPX L Ograve -15 +KPX L Otilde -15 +KPX L S -31 +KPX L T -59 +KPX L U -36 +KPX L Udieresis -36 +KPX L V -71 +KPX L W -31 +KPX L Y -60 +KPX L hyphen -1 +KPX L quotedblright -76 +KPX L quoteright -84 +KPX L u -20 +KPX L udieresis -20 +KPX L y -50 +KPX N A -10 +KPX N AE -10 +KPX N Aacute -10 +KPX N Adieresis -10 +KPX N Aring -10 +KPX N C -18 +KPX N Ccedilla -18 +KPX N G -16 +KPX N O -14 +KPX N Oacute -14 +KPX N Odieresis -14 +KPX N a -23 +KPX N aacute -23 +KPX N adieresis -23 +KPX N ae 7 +KPX N aring -23 +KPX N comma -64 +KPX N e -10 +KPX N eacute -10 +KPX N o -14 +KPX N oacute -14 +KPX N odieresis -14 +KPX N oslash -11 +KPX N period -87 +KPX N u -14 +KPX N udieresis -14 +KPX O A -33 +KPX O AE -30 +KPX O Aacute -33 +KPX O Adieresis -33 +KPX O Aring -33 +KPX O T -37 +KPX O V -40 +KPX O W -8 +KPX O X -47 +KPX O Y -61 +KPX Oacute A -33 +KPX Oacute T -37 +KPX Oacute V -40 +KPX Oacute W -8 +KPX Oacute Y -61 +KPX Ocircumflex T -37 +KPX Ocircumflex V -40 +KPX Ocircumflex Y -61 +KPX Odieresis A -33 +KPX Odieresis T -37 +KPX Odieresis V -40 +KPX Odieresis W -8 +KPX Odieresis X -47 +KPX Odieresis Y -61 +KPX Ograve T -37 +KPX Ograve V -40 +KPX Ograve Y -61 +KPX Oslash A -31 +KPX Otilde T -36 +KPX Otilde V -39 +KPX Otilde Y -60 +KPX P A -87 +KPX P AE -81 +KPX P Aacute -87 +KPX P Adieresis -87 +KPX P Aring -87 +KPX P J -90 +KPX P a -57 +KPX P aacute -57 +KPX P adieresis -57 +KPX P ae -29 +KPX P aring -57 +KPX P comma -161 +KPX P e -47 +KPX P eacute -47 +KPX P hyphen -52 +KPX P o -53 +KPX P oacute -53 +KPX P odieresis -53 +KPX P oe -18 +KPX P oslash -53 +KPX P period -185 +KPX R C -32 +KPX R Ccedilla -33 +KPX R G -31 +KPX R O -29 +KPX R OE -8 +KPX R Oacute -29 +KPX R Odieresis -29 +KPX R T -35 +KPX R U -36 +KPX R Udieresis -36 +KPX R V -42 +KPX R W -21 +KPX R Y -36 +KPX R a 0 +KPX R aacute 0 +KPX R adieresis 0 +KPX R ae 27 +KPX R aring 0 +KPX R e -22 +KPX R eacute -22 +KPX R hyphen -53 +KPX R o -23 +KPX R oacute -23 +KPX R odieresis -23 +KPX R oe 15 +KPX R u -16 +KPX R uacute -16 +KPX R udieresis -16 +KPX R y -20 +KPX S A -28 +KPX S AE -28 +KPX S Aacute -28 +KPX S Adieresis -28 +KPX S Aring -28 +KPX S T -48 +KPX S V -18 +KPX S W -23 +KPX S Y -39 +KPX S t -25 +KPX T A -34 +KPX T AE -35 +KPX T Aacute -34 +KPX T Acircumflex -34 +KPX T Adieresis -34 +KPX T Agrave -34 +KPX T Aring -34 +KPX T Atilde -34 +KPX T C -36 +KPX T G -35 +KPX T J -88 +KPX T O -34 +KPX T OE -12 +KPX T Oacute -34 +KPX T Ocircumflex -34 +KPX T Odieresis -34 +KPX T Ograve -34 +KPX T Oslash -34 +KPX T Otilde -34 +KPX T S -50 +KPX T V 4 +KPX T W -1 +KPX T Y -17 +KPX T a -68 +KPX T ae -38 +KPX T c -83 +KPX T colon -145 +KPX T comma -116 +KPX T e -83 +KPX T g -76 +KPX T guillemotleft -129 +KPX T guilsinglleft -129 +KPX T hyphen -99 +KPX T i -51 +KPX T j -59 +KPX T o -87 +KPX T oslash -60 +KPX T period -145 +KPX T r -37 +KPX T s -70 +KPX T semicolon -119 +KPX T u -92 +KPX T v -98 +KPX T w -96 +KPX T y -108 +KPX U A -26 +KPX U AE -35 +KPX U Aacute -26 +KPX U Acircumflex -26 +KPX U Adieresis -26 +KPX U Aring -26 +KPX U Atilde -26 +KPX U comma -80 +KPX U m 3 +KPX U n -22 +KPX U p -5 +KPX U period -105 +KPX U r -47 +KPX Uacute A -26 +KPX Uacute comma -80 +KPX Uacute m 3 +KPX Uacute n -22 +KPX Uacute p -5 +KPX Uacute period -105 +KPX Uacute r -47 +KPX Ucircumflex A -26 +KPX Udieresis A -26 +KPX Udieresis b 17 +KPX Udieresis comma -80 +KPX Udieresis m 3 +KPX Udieresis n -22 +KPX Udieresis p -5 +KPX Udieresis period -105 +KPX Udieresis r -47 +KPX Ugrave A -26 +KPX V A -10 +KPX V AE -19 +KPX V Aacute -10 +KPX V Acircumflex -10 +KPX V Adieresis -10 +KPX V Agrave -10 +KPX V Aring -10 +KPX V Atilde -10 +KPX V C -39 +KPX V G -38 +KPX V O -37 +KPX V Oacute -37 +KPX V Ocircumflex -37 +KPX V Odieresis -37 +KPX V Ograve -37 +KPX V Oslash -38 +KPX V Otilde -38 +KPX V S -41 +KPX V T 4 +KPX V a -65 +KPX V ae -37 +KPX V colon -130 +KPX V comma -134 +KPX V e -56 +KPX V g -57 +KPX V guillemotleft -83 +KPX V guilsinglleft -83 +KPX V hyphen -49 +KPX V i -65 +KPX V o -60 +KPX V oslash -57 +KPX V period -158 +KPX V r -51 +KPX V semicolon -121 +KPX V u -20 +KPX V y -24 +KPX W A -16 +KPX W AE -21 +KPX W Aacute -16 +KPX W Acircumflex -16 +KPX W Adieresis -16 +KPX W Agrave -16 +KPX W Aring -16 +KPX W Atilde -16 +KPX W C -14 +KPX W G -12 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Oslash -7 +KPX W Otilde -10 +KPX W S -29 +KPX W T -2 +KPX W a -24 +KPX W ae 6 +KPX W colon -93 +KPX W comma -71 +KPX W e -10 +KPX W g -11 +KPX W guillemotleft -38 +KPX W guilsinglleft -38 +KPX W hyphen -7 +KPX W i -48 +KPX W o -14 +KPX W oslash -11 +KPX W period -95 +KPX W r -34 +KPX W semicolon -74 +KPX W u -2 +KPX W y -6 +KPX X C -52 +KPX X O -48 +KPX X Odieresis -48 +KPX X Q -48 +KPX X a -14 +KPX X e -36 +KPX X hyphen -81 +KPX X o -38 +KPX X u -39 +KPX X y -57 +KPX Y A -31 +KPX Y AE -34 +KPX Y Aacute -31 +KPX Y Acircumflex -31 +KPX Y Adieresis -31 +KPX Y Agrave -31 +KPX Y Aring -31 +KPX Y Atilde -31 +KPX Y C -60 +KPX Y G -60 +KPX Y O -59 +KPX Y Oacute -59 +KPX Y Ocircumflex -59 +KPX Y Odieresis -59 +KPX Y Ograve -59 +KPX Y Oslash -59 +KPX Y Otilde -59 +KPX Y S -62 +KPX Y T -17 +KPX Y a -67 +KPX Y ae -40 +KPX Y colon -145 +KPX Y comma -116 +KPX Y e -81 +KPX Y g -84 +KPX Y guillemotleft -119 +KPX Y guilsinglleft -119 +KPX Y hyphen -96 +KPX Y i -63 +KPX Y o -86 +KPX Y oslash -59 +KPX Y p -39 +KPX Y period -144 +KPX Y semicolon -119 +KPX Y u -50 +KPX Y v -44 +KPX Z v -54 +KPX Z y -64 +KPX a j -93 +KPX a quoteright -60 +KPX a v -33 +KPX a w -23 +KPX a y -44 +KPX aacute v -33 +KPX aacute w -23 +KPX aacute y -44 +KPX adieresis v -33 +KPX adieresis w -23 +KPX adieresis y -44 +KPX ae v 16 +KPX ae w 16 +KPX ae y 5 +KPX agrave v -33 +KPX agrave w -23 +KPX agrave y -44 +KPX aring v -33 +KPX aring w -23 +KPX aring y -44 +KPX b v -17 +KPX b w 0 +KPX b y -28 +KPX c h -6 +KPX c k -12 +KPX comma one -148 +KPX comma quotedblright -123 +KPX comma quoteright -142 +KPX e quoteright -43 +KPX e t -34 +KPX e v -28 +KPX e w -20 +KPX e x -5 +KPX e y -39 +KPX eacute v -28 +KPX eacute w -20 +KPX eacute y -39 +KPX ecircumflex v -28 +KPX ecircumflex w -20 +KPX ecircumflex y -39 +KPX eight four -65 +KPX eight one -85 +KPX eight seven -77 +KPX f a -44 +KPX f aacute -44 +KPX f adieresis -26 +KPX f ae -17 +KPX f aring -44 +KPX f e -58 +KPX f eacute -58 +KPX f f -46 +KPX f i -40 +KPX f j -63 +KPX f l -31 +KPX f o -65 +KPX f oacute -65 +KPX f odieresis -31 +KPX f oe -23 +KPX f oslash -36 +KPX f quoteright -62 +KPX f s -46 +KPX f t -10 +KPX five four -56 +KPX five one -90 +KPX five seven -78 +KPX four four -68 +KPX four one -73 +KPX four seven -99 +KPX g a -14 +KPX g adieresis -14 +KPX g ae 13 +KPX g aring -14 +KPX g e -7 +KPX g eacute -7 +KPX g l -37 +KPX g oacute -12 +KPX g odieresis -12 +KPX g r -4 +KPX guillemotright A -50 +KPX guillemotright AE -46 +KPX guillemotright Aacute -50 +KPX guillemotright Adieresis -50 +KPX guillemotright Aring -50 +KPX guillemotright T -128 +KPX guillemotright V -80 +KPX guillemotright W -37 +KPX guillemotright Y -119 +KPX guilsinglright A -50 +KPX guilsinglright AE -46 +KPX guilsinglright Aacute -50 +KPX guilsinglright Adieresis -50 +KPX guilsinglright Aring -50 +KPX guilsinglright T -128 +KPX guilsinglright V -80 +KPX guilsinglright W -37 +KPX guilsinglright Y -119 +KPX h quoteright -52 +KPX h y -37 +KPX hyphen A -29 +KPX hyphen AE -23 +KPX hyphen Aacute -29 +KPX hyphen Adieresis -29 +KPX hyphen Aring -29 +KPX hyphen T -98 +KPX hyphen V -44 +KPX hyphen W -4 +KPX hyphen Y -95 +KPX i T -64 +KPX i j -146 +KPX k a -12 +KPX k aacute -12 +KPX k adieresis -12 +KPX k ae 15 +KPX k aring -12 +KPX k comma -60 +KPX k e -34 +KPX k eacute -34 +KPX k g -43 +KPX k hyphen -104 +KPX k o -35 +KPX k oacute -35 +KPX k odieresis -35 +KPX k period -89 +KPX k s -14 +KPX k u -7 +KPX k udieresis -7 +KPX l v -86 +KPX l y -96 +KPX m p 19 +KPX m v 7 +KPX m w 13 +KPX m y -3 +KPX n T -48 +KPX n p -8 +KPX n quoteright -50 +KPX n v -25 +KPX n w -14 +KPX n y -36 +KPX nine four -58 +KPX nine one -84 +KPX nine seven -75 +KPX o T -89 +KPX o quoteright -41 +KPX o t -24 +KPX o v -25 +KPX o w -7 +KPX o x -28 +KPX o y -36 +KPX oacute v -25 +KPX oacute w -7 +KPX oacute y -36 +KPX ocircumflex t -24 +KPX odieresis t -24 +KPX odieresis v -25 +KPX odieresis w -7 +KPX odieresis x -28 +KPX odieresis y -36 +KPX ograve v -25 +KPX ograve w -7 +KPX ograve y -36 +KPX one comma -99 +KPX one eight -94 +KPX one five -76 +KPX one four -127 +KPX one nine -81 +KPX one one -69 +KPX one period -128 +KPX one seven -147 +KPX one six -119 +KPX one three -69 +KPX one two -54 +KPX one zero -102 +KPX p t -20 +KPX p y -25 +KPX period one -125 +KPX period quotedblright -114 +KPX period quoteright -133 +KPX q c -4 +KPX q u 37 +KPX quotedblbase A -6 +KPX quotedblbase AE -6 +KPX quotedblbase T -82 +KPX quotedblbase V -85 +KPX quotedblbase W -24 +KPX quotedblbase Y -83 +KPX quotedblleft A -66 +KPX quotedblleft AE -57 +KPX quotedblleft Aacute -66 +KPX quotedblleft Adieresis -66 +KPX quotedblleft Aring -66 +KPX quotedblleft T -46 +KPX quotedblleft V -18 +KPX quotedblleft W -8 +KPX quotedblleft Y -46 +KPX quotedblright A -67 +KPX quotedblright AE -76 +KPX quotedblright Aacute -66 +KPX quotedblright Adieresis -66 +KPX quotedblright Aring -66 +KPX quotedblright T -53 +KPX quotedblright V -22 +KPX quotedblright W -26 +KPX quotedblright Y -43 +KPX quoteleft A -87 +KPX quoteleft AE -78 +KPX quoteleft Aacute -87 +KPX quoteleft Adieresis -87 +KPX quoteleft Aring -87 +KPX quoteleft T -67 +KPX quoteleft V -39 +KPX quoteleft W -29 +KPX quoteleft Y -67 +KPX quoteright A -145 +KPX quoteright AE -154 +KPX quoteright Aacute -145 +KPX quoteright Adieresis -145 +KPX quoteright Aring -145 +KPX quoteright comma -201 +KPX quoteright d -129 +KPX quoteright o -135 +KPX quoteright period -224 +KPX quoteright r -150 +KPX quoteright s -144 +KPX quoteright t -118 +KPX quoteright v -112 +KPX quoteright w -108 +KPX quoteright y -122 +KPX r a -26 +KPX r aacute -26 +KPX r acircumflex -26 +KPX r adieresis -26 +KPX r ae 1 +KPX r agrave -26 +KPX r aring -26 +KPX r c -26 +KPX r ccedilla -34 +KPX r colon -86 +KPX r comma -104 +KPX r d -18 +KPX r e -17 +KPX r eacute -17 +KPX r ecircumflex -17 +KPX r egrave -17 +KPX r f -24 +KPX r g -15 +KPX r h -24 +KPX r hyphen -125 +KPX r i -34 +KPX r j -42 +KPX r k -34 +KPX r l -51 +KPX r m 27 +KPX r n 0 +KPX r o -24 +KPX r oacute -24 +KPX r ocircumflex -24 +KPX r odieresis -24 +KPX r oe 13 +KPX r ograve -24 +KPX r oslash -24 +KPX r p 21 +KPX r period -133 +KPX r q -16 +KPX r quoteright -44 +KPX r r -20 +KPX r s -29 +KPX r semicolon -75 +KPX r t 11 +KPX r u 11 +KPX r v 17 +KPX r w 17 +KPX r x -4 +KPX r y 6 +KPX r z -23 +KPX s quoteright -51 +KPX s t -17 +KPX seven colon -154 +KPX seven comma -146 +KPX seven eight -86 +KPX seven five -91 +KPX seven four -116 +KPX seven one -74 +KPX seven period -169 +KPX seven seven -69 +KPX seven six -104 +KPX seven three -79 +KPX seven two -76 +KPX six four -52 +KPX six one -68 +KPX six seven -55 +KPX t S -40 +KPX t a -25 +KPX t aacute -25 +KPX t adieresis -25 +KPX t ae 2 +KPX t aring -25 +KPX t colon -107 +KPX t e -43 +KPX t eacute -43 +KPX t h -8 +KPX t o -45 +KPX t oacute -45 +KPX t odieresis -45 +KPX t quoteright -100 +KPX t semicolon -86 +KPX three four -58 +KPX three one -82 +KPX three seven -75 +KPX two four -97 +KPX two one -73 +KPX two seven -79 +KPX u quoteright -43 +KPX v a -9 +KPX v aacute -9 +KPX v acircumflex -9 +KPX v adieresis -9 +KPX v ae 17 +KPX v agrave -9 +KPX v aring -9 +KPX v atilde -9 +KPX v c -22 +KPX v colon -75 +KPX v comma -118 +KPX v e -17 +KPX v eacute -17 +KPX v ecircumflex -17 +KPX v egrave -17 +KPX v g -14 +KPX v hyphen -30 +KPX v l -87 +KPX v o -23 +KPX v oacute -23 +KPX v odieresis -23 +KPX v ograve -23 +KPX v oslash -23 +KPX v period -143 +KPX v s -22 +KPX v semicolon -66 +KPX w a -9 +KPX w aacute -9 +KPX w acircumflex -9 +KPX w adieresis -9 +KPX w ae 17 +KPX w agrave -9 +KPX w aring -9 +KPX w atilde -9 +KPX w c -12 +KPX w colon -75 +KPX w comma -75 +KPX w e -4 +KPX w eacute -4 +KPX w ecircumflex -4 +KPX w egrave -4 +KPX w g -6 +KPX w hyphen -4 +KPX w l -53 +KPX w o -9 +KPX w oacute -9 +KPX w odieresis -9 +KPX w ograve -9 +KPX w oslash -6 +KPX w period -99 +KPX w s -22 +KPX w semicolon -66 +KPX x a -8 +KPX x c -35 +KPX x e -30 +KPX x eacute -30 +KPX x o -31 +KPX x q -33 +KPX y a -20 +KPX y aacute -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y ae 6 +KPX y agrave -20 +KPX y aring -20 +KPX y atilde -20 +KPX y c -33 +KPX y colon -86 +KPX y comma -122 +KPX y e -28 +KPX y eacute -28 +KPX y ecircumflex -28 +KPX y egrave -28 +KPX y g -25 +KPX y hyphen -29 +KPX y l -98 +KPX y o -34 +KPX y oacute -34 +KPX y odieresis -34 +KPX y ograve -34 +KPX y oslash -34 +KPX y period -148 +KPX y s -33 +KPX y semicolon -77 +KPX zero four -64 +KPX zero one -91 +KPX zero seven -82 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n022023l.pfb b/PdfReader/Resources/Fonts/n022023l.pfb new file mode 100644 index 0000000000..9f988d4f1b Binary files /dev/null and b/PdfReader/Resources/Fonts/n022023l.pfb differ diff --git a/PdfReader/Resources/Fonts/n022024l.afm b/PdfReader/Resources/Fonts/n022024l.afm new file mode 100644 index 0000000000..8e614b89be --- /dev/null +++ b/PdfReader/Resources/Fonts/n022024l.afm @@ -0,0 +1,1341 @@ +StartFontMetrics 3.0 +Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +Comment Creation Date: 12/22/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName NimbusMonL-BoldObli +FullName Nimbus Mono L Bold Oblique +FamilyName Nimbus Mono L +Weight Bold +ItalicAngle -12.0 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.05 +Notice (URW)++,Copyright 1999 by (URW)++ Design & Development +EncodingScheme AdobeStandardEncoding +FontBBox -61 -278 840 871 +CapHeight 583 +XHeight 437 +Descender -205 +Ascender 624 +StartCharMetrics 316 +C 32 ; WX 600 ; N space ; B 386 0 386 0 ; +C 33 ; WX 600 ; N exclam ; B 234 -15 501 638 ; +C 34 ; WX 600 ; N quotedbl ; B 243 312 592 602 ; +C 35 ; WX 600 ; N numbersign ; B 101 -92 623 675 ; +C 36 ; WX 600 ; N dollar ; B 100 -123 610 684 ; +C 37 ; WX 600 ; N percent ; B 131 -15 599 617 ; +C 38 ; WX 600 ; N ampersand ; B 102 -14 557 550 ; +C 39 ; WX 600 ; N quoteright ; B 222 331 483 623 ; +C 40 ; WX 600 ; N parenleft ; B 304 -153 613 632 ; +C 41 ; WX 600 ; N parenright ; B 94 -153 403 632 ; +C 42 ; WX 600 ; N asterisk ; B 178 208 614 622 ; +C 43 ; WX 600 ; N plus ; B 101 0 619 560 ; +C 44 ; WX 600 ; N comma ; B 118 -158 379 134 ; +C 45 ; WX 600 ; N hyphen ; B 101 229 619 329 ; +C 46 ; WX 600 ; N period ; B 234 -15 387 117 ; +C 47 ; WX 600 ; N slash ; B 69 -113 656 695 ; +C 48 ; WX 600 ; N zero ; B 130 -15 602 638 ; +C 49 ; WX 600 ; N one ; B 93 0 529 638 ; +C 50 ; WX 600 ; N two ; B 54 0 602 638 ; +C 51 ; WX 600 ; N three ; B 80 -15 609 638 ; +C 52 ; WX 600 ; N four ; B 104 0 579 622 ; +C 53 ; WX 600 ; N five ; B 83 -15 610 622 ; +C 54 ; WX 600 ; N six ; B 154 -15 663 638 ; +C 55 ; WX 600 ; N seven ; B 184 -1 640 622 ; +C 56 ; WX 600 ; N eight ; B 114 -15 608 638 ; +C 57 ; WX 600 ; N nine ; B 115 -15 624 638 ; +C 58 ; WX 600 ; N colon ; B 234 -15 455 437 ; +C 59 ; WX 600 ; N semicolon ; B 118 -158 431 437 ; +C 60 ; WX 600 ; N less ; B 102 54 642 501 ; +C 61 ; WX 600 ; N equal ; B 81 138 638 422 ; +C 62 ; WX 600 ; N greater ; B 76 53 616 500 ; +C 63 ; WX 600 ; N question ; B 197 -15 608 598 ; +C 64 ; WX 600 ; N at ; B 98 -152 582 620 ; +C 65 ; WX 600 ; N A ; B -11 0 633 583 ; +C 66 ; WX 600 ; N B ; B 22 0 620 583 ; +C 67 ; WX 600 ; N C ; B 80 -14 663 597 ; +C 68 ; WX 600 ; N D ; B 23 0 622 583 ; +C 69 ; WX 600 ; N E ; B 23 0 652 583 ; +C 70 ; WX 600 ; N F ; B 23 0 674 583 ; +C 71 ; WX 600 ; N G ; B 79 -14 667 597 ; +C 72 ; WX 600 ; N H ; B 32 0 675 583 ; +C 73 ; WX 600 ; N I ; B 93 0 632 583 ; +C 74 ; WX 600 ; N J ; B 64 -14 727 583 ; +C 75 ; WX 600 ; N K ; B 22 0 687 583 ; +C 76 ; WX 600 ; N L ; B 42 0 616 583 ; +C 77 ; WX 600 ; N M ; B -10 0 728 583 ; +C 78 ; WX 600 ; N N ; B 21 0 706 583 ; +C 79 ; WX 600 ; N O ; B 75 -14 649 597 ; +C 80 ; WX 600 ; N P ; B 23 0 617 583 ; +C 81 ; WX 600 ; N Q ; B 75 -145 649 597 ; +C 82 ; WX 600 ; N R ; B 23 0 631 583 ; +C 83 ; WX 600 ; N S ; B 72 -14 634 597 ; +C 84 ; WX 600 ; N T ; B 121 0 682 583 ; +C 85 ; WX 600 ; N U ; B 110 -14 705 583 ; +C 86 ; WX 600 ; N V ; B 91 0 735 583 ; +C 87 ; WX 600 ; N W ; B 98 0 725 583 ; +C 88 ; WX 600 ; N X ; B 19 0 692 583 ; +C 89 ; WX 600 ; N Y ; B 128 0 694 583 ; +C 90 ; WX 600 ; N Z ; B 73 0 628 583 ; +C 91 ; WX 600 ; N bracketleft ; B 219 -148 598 627 ; +C 92 ; WX 600 ; N backslash ; B 219 -113 504 695 ; +C 93 ; WX 600 ; N bracketright ; B 104 -148 483 627 ; +C 94 ; WX 600 ; N asciicircum ; B 161 325 598 652 ; +C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; +C 96 ; WX 600 ; N quoteleft ; B 377 348 534 602 ; +C 97 ; WX 600 ; N a ; B 65 -16 583 450 ; +C 98 ; WX 600 ; N b ; B 2 -14 623 624 ; +C 99 ; WX 600 ; N c ; B 93 -16 626 450 ; +C 100 ; WX 600 ; N d ; B 74 -14 664 624 ; +C 101 ; WX 600 ; N e ; B 74 -16 600 450 ; +C 102 ; WX 600 ; N f ; B 84 0 691 623 ; +C 103 ; WX 600 ; N g ; B 73 -205 675 451 ; +C 104 ; WX 600 ; N h ; B 33 0 593 624 ; +C 105 ; WX 600 ; N i ; B 72 0 550 623 ; +C 106 ; WX 600 ; N j ; B 83 -205 581 623 ; +C 107 ; WX 600 ; N k ; B 42 0 606 624 ; +C 108 ; WX 600 ; N l ; B 72 0 550 624 ; +C 109 ; WX 600 ; N m ; B -9 0 635 450 ; +C 110 ; WX 600 ; N n ; B 33 0 583 450 ; +C 111 ; WX 600 ; N o ; B 84 -16 609 450 ; +C 112 ; WX 600 ; N p ; B -42 -205 623 450 ; +C 113 ; WX 600 ; N q ; B 75 -205 696 450 ; +C 114 ; WX 600 ; N r ; B 64 0 650 449 ; +C 115 ; WX 600 ; N s ; B 83 -16 592 450 ; +C 116 ; WX 600 ; N t ; B 94 -16 547 591 ; +C 117 ; WX 600 ; N u ; B 94 -13 603 437 ; +C 118 ; WX 600 ; N v ; B 81 0 683 437 ; +C 119 ; WX 600 ; N w ; B 82 0 684 437 ; +C 120 ; WX 600 ; N x ; B 30 0 641 437 ; +C 121 ; WX 600 ; N y ; B -13 -205 662 437 ; +C 122 ; WX 600 ; N z ; B 85 0 599 437 ; +C 123 ; WX 600 ; N braceleft ; B 217 -153 556 623 ; +C 124 ; WX 600 ; N bar ; B 227 -153 472 622 ; +C 125 ; WX 600 ; N braceright ; B 144 -153 483 623 ; +C 126 ; WX 600 ; N asciitilde ; B 114 179 606 385 ; +C 161 ; WX 600 ; N exclamdown ; B 186 -227 453 426 ; +C 162 ; WX 600 ; N cent ; B 144 -44 593 661 ; +C 163 ; WX 600 ; N sterling ; B 64 0 571 598 ; +C 164 ; WX 600 ; N fraction ; B 52 102 676 500 ; +C 165 ; WX 600 ; N yen ; B 133 0 693 580 ; +C 166 ; WX 600 ; N florin ; B 43 -123 672 638 ; +C 167 ; WX 600 ; N section ; B 45 -170 643 583 ; +C 168 ; WX 600 ; N currency ; B 96 64 626 519 ; +C 169 ; WX 600 ; N quotesingle ; B 343 312 492 602 ; +C 170 ; WX 600 ; N quotedblleft ; B 226 348 583 602 ; +C 171 ; WX 600 ; N guillemotleft ; B 80 20 654 415 ; +C 172 ; WX 600 ; N guilsinglleft ; B 80 20 425 415 ; +C 173 ; WX 600 ; N guilsinglright ; B 273 20 617 415 ; +C 174 ; WX 600 ; N fi ; B -4 0 633 624 ; +C 175 ; WX 600 ; N fl ; B -8 0 645 623 ; +C 177 ; WX 600 ; N endash ; B 101 229 619 329 ; +C 178 ; WX 600 ; N dagger ; B 175 -92 589 622 ; +C 179 ; WX 600 ; N daggerdbl ; B 123 -92 589 622 ; +C 180 ; WX 600 ; N periodcentered ; B 283 214 436 346 ; +C 182 ; WX 600 ; N paragraph ; B 108 -174 672 583 ; +C 183 ; WX 600 ; N bullet ; B 211 154 517 453 ; +C 184 ; WX 600 ; N quotesinglbase ; B 118 -158 379 134 ; +C 185 ; WX 600 ; N quotedblbase ; B 66 -120 519 134 ; +C 186 ; WX 600 ; N quotedblright ; B 166 348 619 602 ; +C 187 ; WX 600 ; N guillemotright ; B 43 20 617 415 ; +C 188 ; WX 600 ; N ellipsis ; B 34 -15 587 117 ; +C 189 ; WX 600 ; N perthousand ; B 104 0 627 618 ; +C 191 ; WX 600 ; N questiondown ; B 70 -227 481 386 ; +C 193 ; WX 600 ; N grave ; B 264 496 464 696 ; +C 194 ; WX 600 ; N acute ; B 362 496 616 696 ; +C 195 ; WX 600 ; N circumflex ; B 237 497 590 696 ; +C 196 ; WX 600 ; N tilde ; B 233 523 619 656 ; +C 197 ; WX 600 ; N macron ; B 249 546 600 626 ; +C 198 ; WX 600 ; N breve ; B 261 503 614 687 ; +C 199 ; WX 600 ; N dotaccent ; B 365 534 488 654 ; +C 200 ; WX 600 ; N dieresis ; B 261 534 592 654 ; +C 202 ; WX 600 ; N ring ; B 303 486 554 727 ; +C 203 ; WX 600 ; N cedilla ; B 143 -229 381 0 ; +C 205 ; WX 600 ; N hungarumlaut ; B 237 496 616 694 ; +C 206 ; WX 600 ; N ogonek ; B 222 -208 433 0 ; +C 207 ; WX 600 ; N caron ; B 264 497 617 696 ; +C 208 ; WX 600 ; N emdash ; B 30 229 690 329 ; +C 225 ; WX 600 ; N AE ; B -10 0 717 583 ; +C 227 ; WX 600 ; N ordfeminine ; B 170 182 559 595 ; +C 232 ; WX 600 ; N Lslash ; B 43 0 616 583 ; +C 233 ; WX 600 ; N Oslash ; B 4 -70 717 638 ; +C 234 ; WX 600 ; N OE ; B 34 0 717 583 ; +C 235 ; WX 600 ; N ordmasculine ; B 168 182 566 595 ; +C 241 ; WX 600 ; N ae ; B 14 -16 665 450 ; +C 245 ; WX 600 ; N dotlessi ; B 72 0 550 437 ; +C 248 ; WX 600 ; N lslash ; B 72 0 557 624 ; +C 249 ; WX 600 ; N oslash ; B 17 -70 669 494 ; +C 250 ; WX 600 ; N oe ; B 28 -16 666 450 ; +C 251 ; WX 600 ; N germandbls ; B 22 -16 569 623 ; +C -1 ; WX 600 ; N Udieresis ; B 110 -14 705 800 ; +C -1 ; WX 600 ; N Uacute ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -229 634 597 ; +C -1 ; WX 600 ; N Tcaron ; B 121 0 682 839 ; +C -1 ; WX 600 ; N Scaron ; B 72 -14 657 839 ; +C -1 ; WX 600 ; N Rcaron ; B 23 0 631 839 ; +C -1 ; WX 600 ; N Racute ; B 23 0 631 839 ; +C -1 ; WX 600 ; N Sacute ; B 72 -14 634 839 ; +C -1 ; WX 600 ; N Otilde ; B 75 -14 656 799 ; +C -1 ; WX 600 ; N ucircumflex ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 75 -14 680 837 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 110 -14 705 837 ; +C -1 ; WX 600 ; N Yacute ; B 128 0 694 839 ; +C -1 ; WX 600 ; N Eth ; B 23 0 622 583 ; +C -1 ; WX 600 ; N Dcroat ; B 23 0 622 583 ; +C -1 ; WX 600 ; N Zacute ; B 73 0 628 839 ; +C -1 ; WX 600 ; N Uring ; B 110 -14 705 871 ; +C -1 ; WX 600 ; N gbreve ; B 73 -205 675 687 ; +C -1 ; WX 600 ; N eogonek ; B 74 -208 600 450 ; +C -1 ; WX 600 ; N edotaccent ; B 74 -16 600 654 ; +C -1 ; WX 600 ; N ecaron ; B 74 -16 617 696 ; +C -1 ; WX 600 ; N Ugrave ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N Thorn ; B 23 0 588 583 ; +C -1 ; WX 600 ; N eacute ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N edieresis ; B 74 -16 600 654 ; +C -1 ; WX 740 ; N dcaron ; B 74 -14 840 639 ; +C -1 ; WX 600 ; N ccedilla ; B 92 -229 626 450 ; +C -1 ; WX 600 ; N ccaron ; B 93 -16 627 696 ; +C -1 ; WX 600 ; N cacute ; B 93 -16 626 696 ; +C -1 ; WX 600 ; N aogonek ; B 65 -208 583 450 ; +C -1 ; WX 600 ; N aring ; B 65 -16 583 727 ; +C -1 ; WX 600 ; N atilde ; B 65 -16 612 656 ; +C -1 ; WX 600 ; N abreve ; B 65 -16 614 687 ; +C -1 ; WX 600 ; N egrave ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N agrave ; B 65 -16 583 696 ; +C -1 ; WX 600 ; N aacute ; B 66 -16 584 696 ; +C -1 ; WX 600 ; N adieresis ; B 65 -16 583 654 ; +C -1 ; WX 600 ; N Uogonek ; B 110 -208 705 583 ; +C -1 ; WX 600 ; N ugrave ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N uacute ; B 94 -13 603 696 ; +C -1 ; WX 600 ; N udieresis ; B 94 -13 603 654 ; +C -1 ; WX 600 ; N tcaron ; B 94 -16 700 639 ; +C -1 ; WX 600 ; N scommaaccent ; B 83 -278 592 450 ; +C -1 ; WX 600 ; N Zcaron ; B 73 0 644 839 ; +C -1 ; WX 600 ; N ecircumflex ; B 74 -16 600 696 ; +C -1 ; WX 600 ; N Ucircumflex ; B 110 -14 705 839 ; +C -1 ; WX 600 ; N acircumflex ; B 65 -16 583 696 ; +C -1 ; WX 600 ; N Zdotaccent ; B 73 0 628 793 ; +C -1 ; WX 600 ; N scaron ; B 83 -16 627 696 ; +C -1 ; WX 600 ; N Amacron ; B -11 0 633 776 ; +C -1 ; WX 600 ; N sacute ; B 83 -16 616 696 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 121 -278 682 583 ; +C -1 ; WX 600 ; N Ydieresis ; B 128 0 694 800 ; +C -1 ; WX 600 ; N thorn ; B -42 -205 623 624 ; +C -1 ; WX 600 ; N Emacron ; B 23 0 652 776 ; +C -1 ; WX 600 ; N Ograve ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N Oacute ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N Odieresis ; B 75 -14 649 800 ; +C -1 ; WX 600 ; N Ntilde ; B 21 0 706 799 ; +C -1 ; WX 600 ; N Ncaron ; B 21 0 706 839 ; +C -1 ; WX 600 ; N Nacute ; B 21 0 706 839 ; +C -1 ; WX 600 ; N Lcaron ; B 42 0 680 598 ; +C -1 ; WX 600 ; N Lacute ; B 42 0 616 839 ; +C -1 ; WX 600 ; N Idotaccent ; B 93 0 632 793 ; +C -1 ; WX 600 ; N racute ; B 64 0 650 696 ; +C -1 ; WX 600 ; N Icircumflex ; B 93 0 632 839 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 84 -16 616 694 ; +C -1 ; WX 600 ; N otilde ; B 84 -16 626 656 ; +C -1 ; WX 600 ; N Euro ; B 54 -14 639 597 ; +C -1 ; WX 600 ; N ocircumflex ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N onesuperior ; B 224 247 494 638 ; +C -1 ; WX 600 ; N twosuperior ; B 202 247 538 637 ; +C -1 ; WX 600 ; N threesuperior ; B 218 238 543 637 ; +C -1 ; WX 600 ; N Igrave ; B 93 0 632 839 ; +C -1 ; WX 600 ; N Iacute ; B 93 0 632 839 ; +C -1 ; WX 600 ; N Imacron ; B 93 0 632 776 ; +C -1 ; WX 600 ; N Iogonek ; B 93 -208 632 583 ; +C -1 ; WX 600 ; N Idieresis ; B 93 0 632 800 ; +C -1 ; WX 600 ; N Gbreve ; B 79 -14 667 831 ; +C -1 ; WX 600 ; N Umacron ; B 110 -14 705 776 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 22 -278 687 583 ; +C -1 ; WX 600 ; N ograve ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N Scommaaccent ; B 72 -278 634 597 ; +C -1 ; WX 600 ; N Eogonek ; B 23 -208 652 583 ; +C -1 ; WX 600 ; N oacute ; B 84 -16 609 696 ; +C -1 ; WX 600 ; N Edotaccent ; B 23 0 652 793 ; +C -1 ; WX 600 ; N iogonek ; B 72 -208 550 623 ; +C -1 ; WX 600 ; N gcommaaccent ; B 73 -205 675 722 ; +C -1 ; WX 600 ; N odieresis ; B 84 -16 609 654 ; +C -1 ; WX 600 ; N ntilde ; B 33 0 613 656 ; +C -1 ; WX 600 ; N ncaron ; B 33 0 617 696 ; +C -1 ; WX 600 ; N Ecaron ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Ecircumflex ; B 23 0 652 839 ; +C -1 ; WX 600 ; N scedilla ; B 83 -229 592 450 ; +C -1 ; WX 600 ; N rcaron ; B 64 0 650 696 ; +C -1 ; WX 600 ; N Egrave ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Eacute ; B 23 0 652 839 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 79 -278 667 597 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 23 -278 631 583 ; +C -1 ; WX 600 ; N Edieresis ; B 23 0 652 800 ; +C -1 ; WX 600 ; N nacute ; B 33 0 616 696 ; +C -1 ; WX 600 ; N uogonek ; B 94 -208 603 437 ; +C -1 ; WX 600 ; N umacron ; B 94 -13 603 626 ; +C -1 ; WX 600 ; N Dcaron ; B 23 0 622 839 ; +C -1 ; WX 600 ; N lcaron ; B 72 0 700 639 ; +C -1 ; WX 600 ; N Ccaron ; B 80 -14 663 839 ; +C -1 ; WX 600 ; N Cacute ; B 80 -14 663 839 ; +C -1 ; WX 600 ; N Ccedilla ; B 80 -229 663 597 ; +C -1 ; WX 600 ; N degree ; B 210 243 568 596 ; +C -1 ; WX 600 ; N Aogonek ; B -11 -208 633 583 ; +C -1 ; WX 600 ; N minus ; B 101 230 619 330 ; +C -1 ; WX 600 ; N multiply ; B 126 80 592 480 ; +C -1 ; WX 600 ; N divide ; B 101 28 619 532 ; +C -1 ; WX 600 ; N Aring ; B -11 0 633 871 ; +C -1 ; WX 600 ; N trademark ; B 60 220 732 583 ; +C -1 ; WX 600 ; N rcommaaccent ; B 64 -278 650 449 ; +C -1 ; WX 600 ; N lacute ; B 72 0 600 839 ; +C -1 ; WX 600 ; N omacron ; B 84 -16 609 626 ; +C -1 ; WX 600 ; N Atilde ; B -11 0 633 799 ; +C -1 ; WX 600 ; N icircumflex ; B 72 0 573 696 ; +C -1 ; WX 600 ; N igrave ; B 72 0 550 696 ; +C -1 ; WX 600 ; N ncommaaccent ; B 33 -278 583 450 ; +C -1 ; WX 600 ; N lcommaaccent ; B 72 -278 550 624 ; +C -1 ; WX 600 ; N plusminus ; B 52 0 640 624 ; +C -1 ; WX 600 ; N onehalf ; B 25 0 685 638 ; +C -1 ; WX 600 ; N onequarter ; B 25 0 673 638 ; +C -1 ; WX 600 ; N threequarters ; B 18 0 673 637 ; +C -1 ; WX 600 ; N iacute ; B 71 0 574 696 ; +C -1 ; WX 600 ; N Abreve ; B -11 0 633 831 ; +C -1 ; WX 600 ; N kcommaaccent ; B 42 -278 606 624 ; +C -1 ; WX 600 ; N Omacron ; B 75 -14 649 776 ; +C -1 ; WX 600 ; N imacron ; B 72 0 600 626 ; +C -1 ; WX 600 ; N emacron ; B 74 -16 600 626 ; +C -1 ; WX 600 ; N amacron ; B 65 -16 600 626 ; +C -1 ; WX 600 ; N tcommaaccent ; B 94 -278 547 591 ; +C -1 ; WX 600 ; N ydieresis ; B -13 -205 662 654 ; +C -1 ; WX 600 ; N zdotaccent ; B 85 0 599 654 ; +C -1 ; WX 600 ; N zcaron ; B 85 0 619 696 ; +C -1 ; WX 600 ; N zacute ; B 85 0 616 696 ; +C -1 ; WX 600 ; N yacute ; B -13 -205 662 696 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 94 -13 616 694 ; +C -1 ; WX 600 ; N eth ; B 83 -16 617 646 ; +C -1 ; WX 600 ; N uring ; B 94 -13 603 727 ; +C -1 ; WX 600 ; N Ocircumflex ; B 75 -14 649 839 ; +C -1 ; WX 600 ; N commaaccent ; B 147 -278 342 -59 ; +C -1 ; WX 600 ; N copyright ; B 48 -15 675 598 ; +C -1 ; WX 600 ; N registered ; B 48 -15 675 598 ; +C -1 ; WX 600 ; N Acircumflex ; B -11 0 633 839 ; +C -1 ; WX 600 ; N idieresis ; B 72 0 575 656 ; +C -1 ; WX 600 ; N lozenge ; B 133 -19 590 593 ; +C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; +C -1 ; WX 600 ; N notequal ; B 81 22 638 525 ; +C -1 ; WX 600 ; N radical ; B 74 -60 782 697 ; +C -1 ; WX 600 ; N Agrave ; B -11 0 633 839 ; +C -1 ; WX 600 ; N Aacute ; B -11 0 633 839 ; +C -1 ; WX 600 ; N lessequal ; B 50 0 666 591 ; +C -1 ; WX 600 ; N greaterequal ; B 52 0 660 591 ; +C -1 ; WX 600 ; N logicalnot ; B 125 115 560 445 ; +C -1 ; WX 600 ; N summation ; B 32 -97 668 671 ; +C -1 ; WX 600 ; N partialdiff ; B 138 -16 579 590 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 21 -278 706 583 ; +C -1 ; WX 600 ; N dcroat ; B 74 -14 712 624 ; +C -1 ; WX 600 ; N brokenbar ; B 227 -153 472 622 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 42 -278 616 583 ; +C -1 ; WX 600 ; N Adieresis ; B -11 0 633 800 ; +C -1 ; WX 600 ; N mu ; B 72 -153 603 440 ; +C -1 ; WX 600 ; N .notdef ; B 386 0 386 0 ; +EndCharMetrics +StartKernData +StartKernPairs 998 +KPX A C -24 +KPX A Ccedilla -30 +KPX A G -20 +KPX A O -26 +KPX A Odieresis -26 +KPX A Q -25 +KPX A T -35 +KPX A U -33 +KPX A Uacute -33 +KPX A Ucircumflex -33 +KPX A Udieresis -33 +KPX A Ugrave -33 +KPX A V -63 +KPX A W -21 +KPX A Y -34 +KPX A a 8 +KPX A b 39 +KPX A c -12 +KPX A ccedilla -15 +KPX A comma -52 +KPX A d -4 +KPX A e -5 +KPX A g -5 +KPX A guillemotleft -44 +KPX A guilsinglleft -44 +KPX A hyphen -23 +KPX A o -11 +KPX A period -67 +KPX A q -10 +KPX A quotedblright -89 +KPX A quoteright -116 +KPX A t -25 +KPX A u -18 +KPX A v -41 +KPX A w -15 +KPX A y -41 +KPX Aacute C -24 +KPX Aacute G -20 +KPX Aacute O -26 +KPX Aacute Q -25 +KPX Aacute T -35 +KPX Aacute U -33 +KPX Aacute V -63 +KPX Aacute W -21 +KPX Aacute Y -34 +KPX Aacute a 8 +KPX Aacute b 39 +KPX Aacute c -12 +KPX Aacute comma -52 +KPX Aacute d -4 +KPX Aacute e -5 +KPX Aacute g -5 +KPX Aacute guillemotleft -44 +KPX Aacute guilsinglleft -44 +KPX Aacute hyphen -23 +KPX Aacute o -11 +KPX Aacute period -67 +KPX Aacute q -10 +KPX Aacute quoteright -116 +KPX Aacute t -25 +KPX Aacute u -18 +KPX Aacute v -41 +KPX Aacute w -15 +KPX Aacute y -41 +KPX Acircumflex C -24 +KPX Acircumflex G -20 +KPX Acircumflex O -26 +KPX Acircumflex Q -25 +KPX Acircumflex T -35 +KPX Acircumflex U -33 +KPX Acircumflex V -63 +KPX Acircumflex W -21 +KPX Acircumflex Y -34 +KPX Acircumflex comma -52 +KPX Acircumflex period -67 +KPX Adieresis C -24 +KPX Adieresis G -20 +KPX Adieresis O -26 +KPX Adieresis Q -25 +KPX Adieresis T -35 +KPX Adieresis U -33 +KPX Adieresis V -63 +KPX Adieresis W -21 +KPX Adieresis Y -34 +KPX Adieresis a 8 +KPX Adieresis b 39 +KPX Adieresis c -12 +KPX Adieresis comma -52 +KPX Adieresis d -4 +KPX Adieresis g -5 +KPX Adieresis guillemotleft -44 +KPX Adieresis guilsinglleft -44 +KPX Adieresis hyphen -23 +KPX Adieresis o -11 +KPX Adieresis period -67 +KPX Adieresis q -10 +KPX Adieresis quotedblright -89 +KPX Adieresis quoteright -116 +KPX Adieresis t -25 +KPX Adieresis u -18 +KPX Adieresis v -41 +KPX Adieresis w -15 +KPX Adieresis y -41 +KPX Agrave C -24 +KPX Agrave G -20 +KPX Agrave O -26 +KPX Agrave Q -25 +KPX Agrave T -35 +KPX Agrave U -33 +KPX Agrave V -63 +KPX Agrave W -21 +KPX Agrave Y -34 +KPX Agrave comma -52 +KPX Agrave period -67 +KPX Aring C -24 +KPX Aring G -20 +KPX Aring O -26 +KPX Aring Q -25 +KPX Aring T -35 +KPX Aring U -33 +KPX Aring V -63 +KPX Aring W -21 +KPX Aring Y -34 +KPX Aring a 8 +KPX Aring b 39 +KPX Aring c -12 +KPX Aring comma -52 +KPX Aring d -4 +KPX Aring e -5 +KPX Aring g -5 +KPX Aring guillemotleft -44 +KPX Aring guilsinglleft -44 +KPX Aring hyphen -23 +KPX Aring o -11 +KPX Aring period -67 +KPX Aring q -10 +KPX Aring quotedblright -89 +KPX Aring quoteright -116 +KPX Aring t -25 +KPX Aring u -18 +KPX Aring v -41 +KPX Aring w -15 +KPX Aring y -41 +KPX Atilde C -24 +KPX Atilde G -20 +KPX Atilde O -26 +KPX Atilde Q -25 +KPX Atilde T -35 +KPX Atilde U -33 +KPX Atilde V -63 +KPX Atilde W -21 +KPX Atilde Y -34 +KPX Atilde comma -52 +KPX Atilde period -67 +KPX B A -2 +KPX B AE -3 +KPX B Aacute -2 +KPX B Acircumflex -2 +KPX B Adieresis -2 +KPX B Aring -2 +KPX B Atilde -2 +KPX B O -14 +KPX B OE 7 +KPX B Oacute -14 +KPX B Ocircumflex -14 +KPX B Odieresis -14 +KPX B Ograve -14 +KPX B Oslash -12 +KPX B V -29 +KPX B W -10 +KPX B Y -50 +KPX C A 2 +KPX C AE 2 +KPX C Aacute 2 +KPX C Adieresis 2 +KPX C Aring 2 +KPX C H -18 +KPX C K -13 +KPX C O -19 +KPX C Oacute -19 +KPX C Odieresis -19 +KPX Ccedilla A -5 +KPX D A -32 +KPX D Aacute -32 +KPX D Acircumflex -32 +KPX D Adieresis -32 +KPX D Agrave -32 +KPX D Aring -32 +KPX D Atilde -32 +KPX D J -38 +KPX D T -36 +KPX D V -40 +KPX D W -16 +KPX D X -40 +KPX D Y -61 +KPX F A -47 +KPX F Aacute -47 +KPX F Acircumflex -47 +KPX F Adieresis -47 +KPX F Agrave -47 +KPX F Aring -47 +KPX F Atilde -47 +KPX F J -83 +KPX F O -32 +KPX F Odieresis -32 +KPX F a -44 +KPX F aacute -45 +KPX F adieresis -44 +KPX F ae -22 +KPX F aring -44 +KPX F comma -172 +KPX F e -51 +KPX F eacute -51 +KPX F hyphen -61 +KPX F i -50 +KPX F j -58 +KPX F o -55 +KPX F oacute -55 +KPX F odieresis -55 +KPX F oe -20 +KPX F oslash -55 +KPX F period -191 +KPX F r -37 +KPX F u -6 +KPX G A 0 +KPX G AE 0 +KPX G Aacute 0 +KPX G Acircumflex 0 +KPX G Adieresis 0 +KPX G Agrave 0 +KPX G Aring 0 +KPX G Atilde 0 +KPX G T -30 +KPX G V 1 +KPX G W 5 +KPX G Y -20 +KPX J A -15 +KPX J AE -24 +KPX J Adieresis -15 +KPX J Aring -15 +KPX K C -32 +KPX K G -30 +KPX K O -31 +KPX K OE -9 +KPX K Oacute -31 +KPX K Odieresis -31 +KPX K S -17 +KPX K T -20 +KPX K a -1 +KPX K adieresis -1 +KPX K ae 23 +KPX K aring -1 +KPX K e -14 +KPX K hyphen -50 +KPX K o -20 +KPX K oacute -20 +KPX K odieresis -20 +KPX K u -30 +KPX K udieresis -30 +KPX K y -56 +KPX L A 9 +KPX L AE 9 +KPX L Aacute 9 +KPX L Adieresis 9 +KPX L Aring 9 +KPX L C -19 +KPX L Ccedilla -19 +KPX L G -19 +KPX L O -16 +KPX L Oacute -16 +KPX L Ocircumflex -16 +KPX L Odieresis -16 +KPX L Ograve -16 +KPX L Otilde -16 +KPX L S -32 +KPX L T -60 +KPX L U -31 +KPX L Udieresis -31 +KPX L V -61 +KPX L W -23 +KPX L Y -59 +KPX L hyphen 5 +KPX L quotedblright -82 +KPX L quoteright -107 +KPX L u -13 +KPX L udieresis -14 +KPX L y -36 +KPX N A -10 +KPX N AE -11 +KPX N Aacute -10 +KPX N Adieresis -10 +KPX N Aring -10 +KPX N C -13 +KPX N Ccedilla -10 +KPX N G -12 +KPX N O -10 +KPX N Oacute -10 +KPX N Odieresis -10 +KPX N a -14 +KPX N aacute -15 +KPX N adieresis -14 +KPX N ae 14 +KPX N aring -14 +KPX N comma -79 +KPX N e -7 +KPX N eacute -7 +KPX N o -12 +KPX N oacute -12 +KPX N odieresis -12 +KPX N oslash -6 +KPX N period -98 +KPX N u -12 +KPX N udieresis -12 +KPX O A -21 +KPX O AE -20 +KPX O Aacute -21 +KPX O Adieresis -21 +KPX O Aring -21 +KPX O T -23 +KPX O V -32 +KPX O W -4 +KPX O X -28 +KPX O Y -51 +KPX Oacute A -21 +KPX Oacute T -23 +KPX Oacute V -32 +KPX Oacute W -4 +KPX Oacute Y -51 +KPX Ocircumflex T -23 +KPX Ocircumflex V -32 +KPX Ocircumflex Y -51 +KPX Odieresis A -21 +KPX Odieresis T -23 +KPX Odieresis V -32 +KPX Odieresis W -4 +KPX Odieresis X -28 +KPX Odieresis Y -51 +KPX Ograve T -23 +KPX Ograve V -32 +KPX Ograve Y -51 +KPX Oslash A -13 +KPX Otilde T -23 +KPX Otilde V -32 +KPX Otilde Y -51 +KPX P A -65 +KPX P AE -63 +KPX P Aacute -65 +KPX P Adieresis -65 +KPX P Aring -65 +KPX P J -80 +KPX P a -54 +KPX P aacute -54 +KPX P adieresis -54 +KPX P ae -31 +KPX P aring -54 +KPX P comma -164 +KPX P e -43 +KPX P eacute -43 +KPX P hyphen -39 +KPX P o -47 +KPX P oacute -47 +KPX P odieresis -47 +KPX P oe -18 +KPX P oslash -46 +KPX P period -183 +KPX R C -19 +KPX R Ccedilla -18 +KPX R G -18 +KPX R O -18 +KPX R OE 3 +KPX R Oacute -18 +KPX R Odieresis -18 +KPX R T -36 +KPX R U -20 +KPX R Udieresis -21 +KPX R V -34 +KPX R W -10 +KPX R Y -35 +KPX R a 7 +KPX R aacute 6 +KPX R adieresis 7 +KPX R ae 32 +KPX R aring 7 +KPX R e -4 +KPX R eacute -4 +KPX R hyphen -30 +KPX R o -9 +KPX R oacute -9 +KPX R odieresis -9 +KPX R oe 24 +KPX R u -9 +KPX R uacute -9 +KPX R udieresis -9 +KPX R y -22 +KPX S A -16 +KPX S AE -16 +KPX S Aacute -16 +KPX S Adieresis -16 +KPX S Aring -16 +KPX S T -47 +KPX S V -16 +KPX S W -15 +KPX S Y -37 +KPX S t -20 +KPX T A -35 +KPX T AE -35 +KPX T Aacute -35 +KPX T Acircumflex -35 +KPX T Adieresis -35 +KPX T Agrave -35 +KPX T Aring -35 +KPX T Atilde -35 +KPX T C -27 +KPX T G -27 +KPX T J -72 +KPX T O -22 +KPX T OE 0 +KPX T Oacute -22 +KPX T Ocircumflex -22 +KPX T Odieresis -22 +KPX T Ograve -22 +KPX T Oslash -23 +KPX T Otilde -22 +KPX T S -49 +KPX T V 4 +KPX T W -2 +KPX T Y -17 +KPX T a -39 +KPX T ae -17 +KPX T c -42 +KPX T colon -119 +KPX T comma -136 +KPX T e -31 +KPX T g -28 +KPX T guillemotleft -81 +KPX T guilsinglleft -81 +KPX T hyphen -96 +KPX T i -46 +KPX T j -53 +KPX T o -36 +KPX T oslash -36 +KPX T period -154 +KPX T r -33 +KPX T s -43 +KPX T semicolon -106 +KPX T u -1 +KPX T v 6 +KPX T w 5 +KPX T y -4 +KPX U A -23 +KPX U AE -22 +KPX U Aacute -23 +KPX U Acircumflex -23 +KPX U Adieresis -23 +KPX U Aring -23 +KPX U Atilde -23 +KPX U comma -98 +KPX U m 14 +KPX U n -10 +KPX U p -3 +KPX U period -118 +KPX U r -36 +KPX Uacute A -23 +KPX Uacute comma -98 +KPX Uacute m 14 +KPX Uacute n -10 +KPX Uacute p -3 +KPX Uacute period -118 +KPX Uacute r -36 +KPX Ucircumflex A -23 +KPX Udieresis A -23 +KPX Udieresis b 20 +KPX Udieresis comma -98 +KPX Udieresis m 14 +KPX Udieresis n -10 +KPX Udieresis p -3 +KPX Udieresis period -118 +KPX Udieresis r -36 +KPX Ugrave A -23 +KPX V A -12 +KPX V AE -21 +KPX V Aacute -12 +KPX V Acircumflex -12 +KPX V Adieresis -12 +KPX V Agrave -12 +KPX V Aring -12 +KPX V Atilde -12 +KPX V C -34 +KPX V G -34 +KPX V O -32 +KPX V Oacute -32 +KPX V Ocircumflex -32 +KPX V Odieresis -32 +KPX V Ograve -32 +KPX V Oslash -32 +KPX V Otilde -32 +KPX V S -35 +KPX V T 3 +KPX V a -59 +KPX V ae -30 +KPX V colon -139 +KPX V comma -150 +KPX V e -51 +KPX V g -50 +KPX V guillemotleft -83 +KPX V guilsinglleft -83 +KPX V hyphen -45 +KPX V i -64 +KPX V o -56 +KPX V oslash -51 +KPX V period -169 +KPX V r -51 +KPX V semicolon -127 +KPX V u -21 +KPX V y -22 +KPX W A -15 +KPX W AE -14 +KPX W Aacute -15 +KPX W Acircumflex -15 +KPX W Adieresis -15 +KPX W Agrave -15 +KPX W Aring -15 +KPX W Atilde -15 +KPX W C -9 +KPX W G -8 +KPX W O -7 +KPX W Oacute -7 +KPX W Ocircumflex -7 +KPX W Odieresis -7 +KPX W Ograve -7 +KPX W Oslash -3 +KPX W Otilde -7 +KPX W S -21 +KPX W T -1 +KPX W a -14 +KPX W ae 15 +KPX W colon -103 +KPX W comma -86 +KPX W e -6 +KPX W g -5 +KPX W guillemotleft -38 +KPX W guilsinglleft -38 +KPX W hyphen -3 +KPX W i -40 +KPX W o -11 +KPX W oslash -6 +KPX W period -105 +KPX W r -28 +KPX W semicolon -86 +KPX W u -3 +KPX W y -6 +KPX X C -33 +KPX X O -31 +KPX X Odieresis -31 +KPX X Q -30 +KPX X a -7 +KPX X e -20 +KPX X hyphen -55 +KPX X o -26 +KPX X u -36 +KPX X y -49 +KPX Y A -32 +KPX Y AE -35 +KPX Y Aacute -32 +KPX Y Acircumflex -32 +KPX Y Adieresis -32 +KPX Y Agrave -32 +KPX Y Aring -32 +KPX Y Atilde -32 +KPX Y C -54 +KPX Y G -54 +KPX Y O -52 +KPX Y Oacute -52 +KPX Y Ocircumflex -52 +KPX Y Odieresis -52 +KPX Y Ograve -52 +KPX Y Oslash -50 +KPX Y Otilde -52 +KPX Y S -55 +KPX Y T -17 +KPX Y a -61 +KPX Y ae -36 +KPX Y colon -157 +KPX Y comma -123 +KPX Y e -63 +KPX Y g -62 +KPX Y guillemotleft -99 +KPX Y guilsinglleft -99 +KPX Y hyphen -87 +KPX Y i -63 +KPX Y o -68 +KPX Y oslash -56 +KPX Y p -34 +KPX Y period -141 +KPX Y semicolon -139 +KPX Y u -48 +KPX Y v -38 +KPX Z v -47 +KPX Z y -55 +KPX a j -85 +KPX a quoteright -79 +KPX a v -25 +KPX a w -13 +KPX a y -36 +KPX aacute v -25 +KPX aacute w -13 +KPX aacute y -36 +KPX adieresis v -25 +KPX adieresis w -13 +KPX adieresis y -36 +KPX ae v 24 +KPX ae w 31 +KPX ae y 13 +KPX agrave v -25 +KPX agrave w -13 +KPX agrave y -36 +KPX aring v -25 +KPX aring w -13 +KPX aring y -36 +KPX b v -4 +KPX b w 3 +KPX b y -15 +KPX c h 8 +KPX c k 3 +KPX comma one -133 +KPX comma quotedblright -142 +KPX comma quoteright -170 +KPX e quoteright -64 +KPX e t -16 +KPX e v -14 +KPX e w -4 +KPX e x 3 +KPX e y -25 +KPX eacute v -14 +KPX eacute w -4 +KPX eacute y -25 +KPX ecircumflex v -14 +KPX ecircumflex w -4 +KPX ecircumflex y -25 +KPX eight four -63 +KPX eight one -80 +KPX eight seven -75 +KPX f a -38 +KPX f aacute -38 +KPX f adieresis -38 +KPX f ae -13 +KPX f aring -38 +KPX f e -46 +KPX f eacute -46 +KPX f f -46 +KPX f i -40 +KPX f j -63 +KPX f l -30 +KPX f o -51 +KPX f oacute -51 +KPX f odieresis -48 +KPX f oe -17 +KPX f oslash -34 +KPX f quoteright -78 +KPX f s -46 +KPX f t -10 +KPX five four -58 +KPX five one -80 +KPX five seven -80 +KPX four four -68 +KPX four one -72 +KPX four seven -100 +KPX g a -7 +KPX g adieresis -7 +KPX g ae 21 +KPX g aring -7 +KPX g e -1 +KPX g eacute -1 +KPX g l -38 +KPX g oacute -6 +KPX g odieresis -6 +KPX g r -5 +KPX guillemotright A -42 +KPX guillemotright AE -39 +KPX guillemotright Aacute -42 +KPX guillemotright Adieresis -42 +KPX guillemotright Aring -42 +KPX guillemotright T -81 +KPX guillemotright V -80 +KPX guillemotright W -35 +KPX guillemotright Y -96 +KPX guilsinglright A -42 +KPX guilsinglright AE -39 +KPX guilsinglright Aacute -42 +KPX guilsinglright Adieresis -42 +KPX guilsinglright Aring -42 +KPX guilsinglright T -81 +KPX guilsinglright V -80 +KPX guilsinglright W -35 +KPX guilsinglright Y -96 +KPX h quoteright -71 +KPX h y -29 +KPX hyphen A -21 +KPX hyphen AE -17 +KPX hyphen Aacute -21 +KPX hyphen Adieresis -21 +KPX hyphen Aring -21 +KPX hyphen T -93 +KPX hyphen V -41 +KPX hyphen W -1 +KPX hyphen Y -84 +KPX i T -64 +KPX i j -145 +KPX k a -5 +KPX k aacute -5 +KPX k adieresis -5 +KPX k ae 20 +KPX k aring -5 +KPX k comma -67 +KPX k e -17 +KPX k eacute -17 +KPX k g -16 +KPX k hyphen -53 +KPX k o -22 +KPX k oacute -22 +KPX k odieresis -22 +KPX k period -80 +KPX k s -13 +KPX k u -7 +KPX k udieresis -7 +KPX l v -77 +KPX l y -78 +KPX m p 31 +KPX m v 13 +KPX m w 22 +KPX m y 2 +KPX n T -47 +KPX n p 2 +KPX n quoteright -69 +KPX n v -17 +KPX n w -6 +KPX n y -28 +KPX nine four -59 +KPX nine one -76 +KPX nine seven -68 +KPX o T -39 +KPX o quoteright -61 +KPX o t -16 +KPX o v -10 +KPX o w -3 +KPX o x -10 +KPX o y -21 +KPX oacute v -10 +KPX oacute w -3 +KPX oacute y -21 +KPX ocircumflex t -16 +KPX odieresis t -16 +KPX odieresis v -10 +KPX odieresis w -3 +KPX odieresis x -10 +KPX odieresis y -21 +KPX ograve v -10 +KPX ograve w -3 +KPX ograve y -21 +KPX one comma -104 +KPX one eight -83 +KPX one five -63 +KPX one four -95 +KPX one nine -80 +KPX one one -68 +KPX one period -119 +KPX one seven -146 +KPX one six -107 +KPX one three -62 +KPX one two -53 +KPX one zero -95 +KPX p t -7 +KPX p y -12 +KPX period one -118 +KPX period quotedblright -137 +KPX period quoteright -165 +KPX q c 0 +KPX q u 37 +KPX quotedblbase A -10 +KPX quotedblbase AE -11 +KPX quotedblbase T -92 +KPX quotedblbase V -108 +KPX quotedblbase W -46 +KPX quotedblbase Y -80 +KPX quotedblleft A -66 +KPX quotedblleft AE -64 +KPX quotedblleft Aacute -66 +KPX quotedblleft Adieresis -66 +KPX quotedblleft Aring -66 +KPX quotedblleft T -28 +KPX quotedblleft V -20 +KPX quotedblleft W -15 +KPX quotedblleft Y -50 +KPX quotedblright A -81 +KPX quotedblright AE -79 +KPX quotedblright Aacute -81 +KPX quotedblright Adieresis -81 +KPX quotedblright Aring -81 +KPX quotedblright T -45 +KPX quotedblright V -35 +KPX quotedblright W -30 +KPX quotedblright Y -57 +KPX quoteleft A -90 +KPX quoteleft AE -88 +KPX quoteleft Aacute -90 +KPX quoteleft Adieresis -90 +KPX quoteleft Aring -90 +KPX quoteleft T -52 +KPX quoteleft V -45 +KPX quoteleft W -40 +KPX quoteleft Y -74 +KPX quoteright A -160 +KPX quoteright AE -158 +KPX quoteright Aacute -160 +KPX quoteright Adieresis -160 +KPX quoteright Aring -160 +KPX quoteright comma -234 +KPX quoteright d -146 +KPX quoteright o -148 +KPX quoteright period -251 +KPX quoteright r -155 +KPX quoteright s -154 +KPX quoteright t -121 +KPX quoteright v -114 +KPX quoteright w -109 +KPX quoteright y -120 +KPX r a -22 +KPX r aacute -22 +KPX r acircumflex -22 +KPX r adieresis -22 +KPX r ae 0 +KPX r agrave -22 +KPX r aring -22 +KPX r c -23 +KPX r ccedilla -18 +KPX r colon -100 +KPX r comma -112 +KPX r d -13 +KPX r e -11 +KPX r eacute -11 +KPX r ecircumflex -11 +KPX r egrave -11 +KPX r f -20 +KPX r g -9 +KPX r h -23 +KPX r hyphen -48 +KPX r i -30 +KPX r j -38 +KPX r k -33 +KPX r l -50 +KPX r m 31 +KPX r n 5 +KPX r o -16 +KPX r oacute -16 +KPX r ocircumflex -16 +KPX r odieresis -16 +KPX r oe 15 +KPX r ograve -16 +KPX r oslash -16 +KPX r p 25 +KPX r period -126 +KPX r q -8 +KPX r quoteright -45 +KPX r r -17 +KPX r s -25 +KPX r semicolon -88 +KPX r t 15 +KPX r u 15 +KPX r v 22 +KPX r w 21 +KPX r x 2 +KPX r y 10 +KPX r z -24 +KPX s quoteright -62 +KPX s t -14 +KPX seven colon -162 +KPX seven comma -160 +KPX seven eight -79 +KPX seven five -87 +KPX seven four -105 +KPX seven one -72 +KPX seven period -179 +KPX seven seven -69 +KPX seven six -98 +KPX seven three -78 +KPX seven two -70 +KPX six four -54 +KPX six one -60 +KPX six seven -55 +KPX t S -40 +KPX t a -21 +KPX t aacute -21 +KPX t adieresis -21 +KPX t ae 4 +KPX t aring -21 +KPX t colon -121 +KPX t e -30 +KPX t eacute -30 +KPX t h -8 +KPX t o -36 +KPX t oacute -36 +KPX t odieresis -36 +KPX t quoteright -102 +KPX t semicolon -107 +KPX three four -58 +KPX three one -79 +KPX three seven -74 +KPX two four -75 +KPX two one -73 +KPX two seven -78 +KPX u quoteright -58 +KPX v a -7 +KPX v aacute -7 +KPX v acircumflex -7 +KPX v adieresis -7 +KPX v ae 15 +KPX v agrave -7 +KPX v aring -7 +KPX v atilde -7 +KPX v c -17 +KPX v colon -86 +KPX v comma -139 +KPX v e -6 +KPX v eacute -6 +KPX v ecircumflex -6 +KPX v egrave -6 +KPX v g -2 +KPX v hyphen -28 +KPX v l -79 +KPX v o -11 +KPX v oacute -11 +KPX v odieresis -11 +KPX v ograve -11 +KPX v oslash -10 +KPX v period -159 +KPX v s -15 +KPX v semicolon -74 +KPX w a -6 +KPX w aacute -7 +KPX w acircumflex -6 +KPX w adieresis -6 +KPX w ae 22 +KPX w agrave -6 +KPX w aring -6 +KPX w atilde -6 +KPX w c -8 +KPX w colon -86 +KPX w comma -93 +KPX w e 0 +KPX w eacute 0 +KPX w ecircumflex 0 +KPX w egrave 0 +KPX w g 2 +KPX w hyphen -1 +KPX w l -51 +KPX w o -4 +KPX w oacute -4 +KPX w odieresis -4 +KPX w ograve -4 +KPX w oslash 0 +KPX w period -112 +KPX w s -13 +KPX w semicolon -74 +KPX x a -1 +KPX x c -16 +KPX x e -7 +KPX x eacute -7 +KPX x o -12 +KPX x q -9 +KPX y a -17 +KPX y aacute -18 +KPX y acircumflex -17 +KPX y adieresis -17 +KPX y ae 4 +KPX y agrave -17 +KPX y aring -17 +KPX y atilde -17 +KPX y c -25 +KPX y colon -96 +KPX y comma -137 +KPX y e -14 +KPX y eacute -14 +KPX y ecircumflex -14 +KPX y egrave -14 +KPX y g -11 +KPX y hyphen -23 +KPX y l -79 +KPX y o -20 +KPX y oacute -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y oslash -19 +KPX y period -158 +KPX y s -24 +KPX y semicolon -84 +KPX zero four -65 +KPX zero one -81 +KPX zero seven -79 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/n022024l.pfb b/PdfReader/Resources/Fonts/n022024l.pfb new file mode 100644 index 0000000000..8ff94a5b54 Binary files /dev/null and b/PdfReader/Resources/Fonts/n022024l.pfb differ diff --git a/PdfReader/Resources/Fonts/s050000l.afm b/PdfReader/Resources/Fonts/s050000l.afm new file mode 100644 index 0000000000..d8c193623f --- /dev/null +++ b/PdfReader/Resources/Fonts/s050000l.afm @@ -0,0 +1,213 @@ +StartFontMetrics 3.0 +Comment Copyright URW Software, Copyright 1997 by URW +Comment Creation Date: 10/21/1999 +Comment See the file COPYING (GNU General Public License) for license conditions. +FontName StandardSymL +FullName Standard Symbols L +FamilyName Standard Symbols L +Weight Regular +ItalicAngle 0.0 +IsFixedPitch false +UnderlinePosition -229 +UnderlineThickness 46 +Version 001.005 +Notice URW Software, Copyright 1997 by URW +EncodingScheme FontSpecific +FontBBox -180 -293 1090 1010 +CapHeight 673 +XHeight 500 +Descender -222 +Ascender 673 +StartCharMetrics 190 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 128 -13 240 686 ; +C 34 ; WX 713 ; N universal ; B 31 0 681 673 ; +C 35 ; WX 500 ; N numbersign ; B 20 0 481 631 ; +C 36 ; WX 549 ; N existential ; B 25 0 478 673 ; +C 37 ; WX 833 ; N percent ; B 63 -7 771 673 ; +C 38 ; WX 778 ; N ampersand ; B 41 -13 750 675 ; +C 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ; +C 40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ; +C 41 ; WX 333 ; N parenright ; B 30 -172 277 680 ; +C 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ; +C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; +C 44 ; WX 250 ; N comma ; B 56 -120 194 102 ; +C 45 ; WX 549 ; N minus ; B 11 239 535 294 ; +C 46 ; WX 250 ; N period ; B 69 -13 181 100 ; +C 47 ; WX 278 ; N slash ; B 0 0 254 673 ; +C 48 ; WX 500 ; N zero ; B 23 -13 471 686 ; +C 49 ; WX 500 ; N one ; B 117 0 390 673 ; +C 50 ; WX 500 ; N two ; B 25 0 475 686 ; +C 51 ; WX 500 ; N three ; B 39 -13 435 686 ; +C 52 ; WX 500 ; N four ; B 16 0 469 680 ; +C 53 ; WX 500 ; N five ; B 29 -13 443 699 ; +C 54 ; WX 500 ; N six ; B 36 -13 468 685 ; +C 55 ; WX 500 ; N seven ; B 24 -7 448 673 ; +C 56 ; WX 500 ; N eight ; B 54 -13 440 686 ; +C 57 ; WX 500 ; N nine ; B 31 -13 460 686 ; +C 58 ; WX 278 ; N colon ; B 81 -13 193 463 ; +C 59 ; WX 278 ; N semicolon ; B 83 -120 221 463 ; +C 60 ; WX 549 ; N less ; B 26 0 523 522 ; +C 61 ; WX 549 ; N equal ; B 11 142 537 391 ; +C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; +C 63 ; WX 444 ; N question ; B 70 -13 412 686 ; +C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; +C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; +C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; +C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; +C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; +C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; +C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; +C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; +C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; +C 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ; +C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; +C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; +C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; +C 78 ; WX 722 ; N Nu ; B 29 0 720 673 ; +C 79 ; WX 722 ; N Omicron ; B 41 -13 715 686 ; +C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; +C 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ; +C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; +C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; +C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; +C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; +C 86 ; WX 439 ; N sigma1 ; B 40 -222 436 513 ; +C 87 ; WX 768 ; N Omega ; B 34 0 736 686 ; +C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; +C 89 ; WX 795 ; N Psi ; B 15 0 781 686 ; +C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; +C 91 ; WX 333 ; N bracketleft ; B 86 -165 299 673 ; +C 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ; +C 93 ; WX 333 ; N bracketright ; B 33 -165 246 673 ; +C 94 ; WX 658 ; N perpendicular ; B 15 0 652 673 ; +C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ; +C 96 ; WX 500 ; N radicalex ; B 480 857 1090 913 ; +C 97 ; WX 631 ; N alpha ; B 41 -13 622 513 ; +C 98 ; WX 549 ; N beta ; B 61 -222 515 740 ; +C 99 ; WX 549 ; N chi ; B 12 -210 522 513 ; +C 100 ; WX 494 ; N delta ; B 40 -13 481 740 ; +C 101 ; WX 439 ; N epsilon ; B 22 -13 427 513 ; +C 102 ; WX 521 ; N phi ; B 27 -222 490 686 ; +C 103 ; WX 411 ; N gamma ; B 5 -219 484 513 ; +C 104 ; WX 603 ; N eta ; B 0 -222 527 513 ; +C 105 ; WX 329 ; N iota ; B 0 -13 301 513 ; +C 106 ; WX 603 ; N phi1 ; B 36 -222 587 513 ; +C 107 ; WX 549 ; N kappa ; B 33 0 558 513 ; +C 108 ; WX 549 ; N lambda ; B 24 -13 548 740 ; +C 109 ; WX 576 ; N mu ; B 33 -219 567 500 ; +C 110 ; WX 521 ; N nu ; B -9 -13 475 513 ; +C 111 ; WX 549 ; N omicron ; B 35 -13 501 513 ; +C 112 ; WX 549 ; N pi ; B 10 -13 530 500 ; +C 113 ; WX 521 ; N theta ; B 43 -13 485 686 ; +C 114 ; WX 549 ; N rho ; B 50 -220 490 513 ; +C 115 ; WX 603 ; N sigma ; B 30 -13 588 500 ; +C 116 ; WX 439 ; N tau ; B 10 -13 418 500 ; +C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ; +C 118 ; WX 713 ; N omega1 ; B 12 -13 671 583 ; +C 119 ; WX 686 ; N omega ; B 42 -13 684 513 ; +C 120 ; WX 493 ; N xi ; B 27 -222 469 766 ; +C 121 ; WX 686 ; N psi ; B 12 -222 701 513 ; +C 122 ; WX 494 ; N zeta ; B 60 -222 467 756 ; +C 123 ; WX 480 ; N braceleft ; B 58 -165 397 673 ; +C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ; +C 125 ; WX 480 ; N braceright ; B 79 -165 418 673 ; +C 126 ; WX 549 ; N similar ; B 17 196 529 325 ; +C 160 ; WX 762 ; N Euro ; B 53 -4 722 671 ; +C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 687 ; +C 162 ; WX 247 ; N minute ; B 27 476 228 735 ; +C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; +C 164 ; WX 167 ; N fraction ; B -180 0 340 673 ; +C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ; +C 166 ; WX 500 ; N florin ; B 2 -174 494 687 ; +C 167 ; WX 753 ; N club ; B 86 -26 660 544 ; +C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; +C 169 ; WX 753 ; N heart ; B 117 -33 631 528 ; +C 170 ; WX 753 ; N spade ; B 113 -36 629 591 ; +C 171 ; WX 1042 ; N arrowboth ; B 24 -16 1024 512 ; +C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; +C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; +C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; +C 176 ; WX 400 ; N degree ; B 50 380 350 686 ; +C 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ; +C 178 ; WX 411 ; N second ; B 20 476 413 735 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; +C 180 ; WX 549 ; N multiply ; B 17 9 533 525 ; +C 181 ; WX 713 ; N proportional ; B 27 114 639 416 ; +C 182 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; +C 183 ; WX 460 ; N bullet ; B 50 155 410 518 ; +C 184 ; WX 549 ; N divide ; B 10 2 536 525 ; +C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; +C 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ; +C 187 ; WX 549 ; N approxequal ; B 14 121 527 408 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ; +C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; +C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; +C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; +C 192 ; WX 823 ; N aleph ; B 175 0 662 689 ; +C 193 ; WX 686 ; N Ifraktur ; B 10 -54 578 736 ; +C 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ; +C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 574 ; +C 196 ; WX 768 ; N circlemultiply ; B 43 0 733 691 ; +C 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ; +C 198 ; WX 823 ; N emptyset ; B 39 -24 781 718 ; +C 199 ; WX 768 ; N intersection ; B 40 0 732 507 ; +C 200 ; WX 768 ; N union ; B 40 -18 732 489 ; +C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; +C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; +C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; +C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; +C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; +C 206 ; WX 713 ; N element ; B 45 0 505 470 ; +C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; +C 208 ; WX 768 ; N angle ; B 26 -1 738 672 ; +C 209 ; WX 713 ; N gradient ; B 36 0 681 687 ; +C 210 ; WX 790 ; N registerserif ; B 50 -13 740 690 ; +C 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ; +C 212 ; WX 890 ; N trademarkserif ; B 18 269 855 673 ; +C 213 ; WX 823 ; N product ; B 25 -124 803 751 ; +C 214 ; WX 549 ; N radical ; B 10 -35 515 913 ; +C 215 ; WX 250 ; N dotmath ; B 69 209 169 311 ; +C 216 ; WX 713 ; N logicalnot ; B 15 40 680 367 ; +C 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ; +C 218 ; WX 603 ; N logicalor ; B 30 -1 578 476 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506 ; +C 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ; +C 221 ; WX 603 ; N arrowdblup ; B 39 0 567 909 ; +C 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 ; +C 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ; +C 224 ; WX 494 ; N lozenge ; B 18 -1 466 740 ; +C 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ; +C 226 ; WX 790 ; N registersans ; B 50 -12 740 679 ; +C 227 ; WX 790 ; N copyrightsans ; B 49 -12 739 679 ; +C 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ; +C 229 ; WX 713 ; N summation ; B 14 -123 695 752 ; +C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ; +C 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ; +C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ; +C 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ; +C 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ; +C 239 ; WX 494 ; N braceex ; B 201 -79 255 925 ; +C 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ; +C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; +C 243 ; WX 686 ; N integraltp ; B 332 -83 715 922 ; +C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ; +C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ; +C 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ; +C 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ; +C 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ; +C 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ; +C -1 ; WX 250 ; N .notdef ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/PdfReader/Resources/Fonts/s050000l.pfb b/PdfReader/Resources/Fonts/s050000l.pfb new file mode 100644 index 0000000000..e0ab891c91 Binary files /dev/null and b/PdfReader/Resources/Fonts/s050000l.pfb differ diff --git a/PdfReader/Resources/Fonts050000l.h b/PdfReader/Resources/Fonts050000l.h new file mode 100644 index 0000000000..19d759c902 --- /dev/null +++ b/PdfReader/Resources/Fonts050000l.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_RESOURCE_FONT_s050000l_H +#define _PDF_READER_RESOURCE_FONT_s050000l_H +namespace PdfReader +{ +static const unsigned char c_arrs050000l[]={128,1,251,21,0,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,45,49,46,48,58,32,83,116,97,110,100,97,114,100,83,121,109,76,32,48,48,49,46,48,48,53,13,10,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,84,104,117,32,79,99,116,32,50,49,32,49,57,57,57,13,10,37,32,67,111,112,121,114,105,103,104,116,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,13,10,37,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,13,10,37,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,13,10,37,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,13,10,37,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,13,10,37,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,13,10,37,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,13,10,49,50,32,100,105,99,116,32,98,101,103,105,110,13,10,47,70,111,110,116,73,110,102,111,32,49,48,32,100,105,99,116,32,100,117,112,32,98,101,103,105,110,13,10,47,118,101,114,115,105,111,110,32,40,48,48,49,46,48,48,53,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,78,111,116,105,99,101,32,40,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,46,32,83,101,101,32,116,104,101,32,102,105,108,101,32,67,79,80,89,73,78,71,32,40,71,78,85,32,71,101,110,101,114,97,108,32,80,117,98,108,105,99,32,76,105,99,101,110,115,101,41,32,102,111,114,32,108,105,99,101,110,115,101,32,99,111,110,100,105,116,105,111,110,115,46,32,65,115,32,97,32,115,112,101,99,105,97,108,32,101,120,99,101,112,116,105,111,110,44,32,112,101,114,109,105,115,115,105,111,110,32,105,115,32,103,114,97,110,116,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,105,115,32,102,111,110,116,32,112,114,111,103,114,97,109,32,105,110,32,97,32,80,111,115,116,115,99,114,105,112,116,32,111,114,32,80,68,70,32,102,105,108,101,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,100,111,99,117,109,101,110,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,101,120,116,32,116,111,32,98,101,32,100,105,115,112,108,97,121,101,100,32,111,114,32,112,114,105,110,116,101,100,32,117,115,105,110,103,32,116,104,105,115,32,102,111,110,116,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,115,32,111,114,32,108,105,99,101,110,115,101,32,97,112,112,108,121,105,110,103,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,105,116,115,101,108,102,46,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,67,111,112,121,114,105,103,104,116,32,40,67,111,112,121,114,105,103,104,116,32,85,82,87,32,83,111,102,116,119,97,114,101,44,32,67,111,112,121,114,105,103,104,116,32,49,57,57,55,32,98,121,32,85,82,87,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,117,108,108,78,97,109,101,32,40,83,116,97,110,100,97,114,100,32,83,121,109,98,111,108,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,97,109,105,108,121,78,97,109,101,32,40,83,116,97,110,100,97,114,100,32,83,121,109,98,111,108,115,32,76,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,87,101,105,103,104,116,32,40,82,101,103,117,108,97,114,41,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,73,116,97,108,105,99,65,110,103,108,101,32,48,46,48,32,100,101,102,13,10,47,105,115,70,105,120,101,100,80,105,116,99,104,32,102,97,108,115,101,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,80,111,115,105,116,105,111,110,32,45,50,50,57,32,100,101,102,13,10,47,85,110,100,101,114,108,105,110,101,84,104,105,99,107,110,101,115,115,32,52,54,32,100,101,102,13,10,101,110,100,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,78,97,109,101,32,47,83,116,97,110,100,97,114,100,83,121,109,76,32,100,101,102,13,10,47,80,97,105,110,116,84,121,112,101,32,48,32,100,101,102,13,10,47,87,77,111,100,101,32,48,32,100,101,102,13,10,47,70,111,110,116,66,66,111,120,32,123,45,49,56,48,32,45,50,57,51,32,49,48,57,48,32,49,48,49,48,125,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,70,111,110,116,84,121,112,101,32,49,32,100,101,102,13,10,47,70,111,110,116,77,97,116,114,105,120,32,91,48,46,48,48,49,32,48,46,48,32,48,46,48,32,48,46,48,48,49,32,48,46,48,32,48,46,48,93,32,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,69,110,99,111,100,105,110,103,32,50,53,54,32,97,114,114,97,121,32,13,10,48,32,49,32,50,53,53,32,123,49,32,105,110,100,101,120,32,101,120,99,104,32,47,46,110,111,116,100,101,102,32,112,117,116,125,32,102,111,114,32,13,10,100,117,112,32,51,50,32,47,115,112,97,99,101,32,112,117,116,13,10,100,117,112,32,51,51,32,47,101,120,99,108,97,109,32,112,117,116,13,10,100,117,112,32,51,52,32,47,117,110,105,118,101,114,115,97,108,32,112,117,116,13,10,100,117,112,32,51,53,32,47,110,117,109,98,101,114,115,105,103,110,32,112,117,116,13,10,100,117,112,32,51,54,32,47,101,120,105,115,116,101,110,116,105,97,108,32,112,117,116,13,10,100,117,112,32,51,55,32,47,112,101,114,99,101,110,116,32,112,117,116,13,10,100,117,112,32,51,56,32,47,97,109,112,101,114,115,97,110,100,32,112,117,116,13,10,100,117,112,32,51,57,32,47,115,117,99,104,116,104,97,116,32,112,117,116,13,10,100,117,112,32,52,48,32,47,112,97,114,101,110,108,101,102,116,32,112,117,116,13,10,100,117,112,32,52,49,32,47,112,97,114,101,110,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,52,50,32,47,97,115,116,101,114,105,115,107,109,97,116,104,32,112,117,116,13,10,100,117,112,32,52,51,32,47,112,108,117,115,32,112,117,116,13,10,100,117,112,32,52,52,32,47,99,111,109,109,97,32,112,117,116,13,10,100,117,112,32,52,53,32,47,109,105,110,117,115,32,112,117,116,13,10,100,117,112,32,52,54,32,47,112,101,114,105,111,100,32,112,117,116,13,10,100,117,112,32,52,55,32,47,115,108,97,115,104,32,112,117,116,13,10,100,117,112,32,52,56,32,47,122,101,114,111,32,112,117,116,13,10,100,117,112,32,52,57,32,47,111,110,101,32,112,117,116,13,10,100,117,112,32,53,48,32,47,116,119,111,32,112,117,116,13,10,100,117,112,32,53,49,32,47,116,104,114,101,101,32,112,117,116,13,10,100,117,112,32,53,50,32,47,102,111,117,114,32,112,117,116,13,10,100,117,112,32,53,51,32,47,102,105,118,101,32,112,117,116,13,10,100,117,112,32,53,52,32,47,115,105,120,32,112,117,116,13,10,100,117,112,32,53,53,32,47,115,101,118,101,110,32,112,117,116,13,10,100,117,112,32,53,54,32,47,101,105,103,104,116,32,112,117,116,13,10,100,117,112,32,53,55,32,47,110,105,110,101,32,112,117,116,13,10,100,117,112,32,53,56,32,47,99,111,108,111,110,32,112,117,116,13,10,100,117,112,32,53,57,32,47,115,101,109,105,99,111,108,111,110,32,112,117,116,13,10,100,117,112,32,54,48,32,47,108,101,115,115,32,112,117,116,13,10,100,117,112,32,54,49,32,47,101,113,117,97,108,32,112,117,116,13,10,100,117,112,32,54,50,32,47,103,114,101,97,116,101,114,32,112,117,116,13,10,100,117,112,32,54,51,32,47,113,117,101,115,116,105,111,110,32,112,117,116,13,10,100,117,112,32,54,52,32,47,99,111,110,103,114,117,101,110,116,32,112,117,116,13,10,100,117,112,32,54,53,32,47,65,108,112,104,97,32,112,117,116,13,10,100,117,112,32,54,54,32,47,66,101,116,97,32,112,117,116,13,10,100,117,112,32,54,55,32,47,67,104,105,32,112,117,116,13,10,100,117,112,32,54,56,32,47,68,101,108,116,97,32,112,117,116,13,10,100,117,112,32,54,57,32,47,69,112,115,105,108,111,110,32,112,117,116,13,10,100,117,112,32,55,48,32,47,80,104,105,32,112,117,116,13,10,100,117,112,32,55,49,32,47,71,97,109,109,97,32,112,117,116,13,10,100,117,112,32,55,50,32,47,69,116,97,32,112,117,116,13,10,100,117,112,32,55,51,32,47,73,111,116,97,32,112,117,116,13,10,100,117,112,32,55,52,32,47,116,104,101,116,97,49,32,112,117,116,13,10,100,117,112,32,55,53,32,47,75,97,112,112,97,32,112,117,116,13,10,100,117,112,32,55,54,32,47,76,97,109,98,100,97,32,112,117,116,13,10,100,117,112,32,55,55,32,47,77,117,32,112,117,116,13,10,100,117,112,32,55,56,32,47,78,117,32,112,117,116,13,10,100,117,112,32,55,57,32,47,79,109,105,99,114,111,110,32,112,117,116,13,10,100,117,112,32,56,48,32,47,80,105,32,112,117,116,13,10,100,117,112,32,56,49,32,47,84,104,101,116,97,32,112,117,116,13,10,100,117,112,32,56,50,32,47,82,104,111,32,112,117,116,13,10,100,117,112,32,56,51,32,47,83,105,103,109,97,32,112,117,116,13,10,100,117,112,32,56,52,32,47,84,97,117,32,112,117,116,13,10,100,117,112,32,56,53,32,47,85,112,115,105,108,111,110,32,112,117,116,13,10,100,117,112,32,56,54,32,47,115,105,103,109,97,49,32,112,117,116,13,10,100,117,112,32,56,55,32,47,79,109,101,103,97,32,112,117,116,13,10,100,117,112,32,56,56,32,47,88,105,32,112,117,116,13,10,100,117,112,32,56,57,32,47,80,115,105,32,112,117,116,13,10,100,117,112,32,57,48,32,47,90,101,116,97,32,112,117,116,13,10,100,117,112,32,57,49,32,47,98,114,97,99,107,101,116,108,101,102,116,32,112,117,116,13,10,100,117,112,32,57,50,32,47,116,104,101,114,101,102,111,114,101,32,112,117,116,13,10,100,117,112,32,57,51,32,47,98,114,97,99,107,101,116,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,57,52,32,47,112,101,114,112,101,110,100,105,99,117,108,97,114,32,112,117,116,13,10,100,117,112,32,57,53,32,47,117,110,100,101,114,115,99,111,114,101,32,112,117,116,13,10,100,117,112,32,57,54,32,47,114,97,100,105,99,97,108,101,120,32,112,117,116,13,10,100,117,112,32,57,55,32,47,97,108,112,104,97,32,112,117,116,13,10,100,117,112,32,57,56,32,47,98,101,116,97,32,112,117,116,13,10,100,117,112,32,57,57,32,47,99,104,105,32,112,117,116,13,10,100,117,112,32,49,48,48,32,47,100,101,108,116,97,32,112,117,116,13,10,100,117,112,32,49,48,49,32,47,101,112,115,105,108,111,110,32,112,117,116,13,10,100,117,112,32,49,48,50,32,47,112,104,105,32,112,117,116,13,10,100,117,112,32,49,48,51,32,47,103,97,109,109,97,32,112,117,116,13,10,100,117,112,32,49,48,52,32,47,101,116,97,32,112,117,116,13,10,100,117,112,32,49,48,53,32,47,105,111,116,97,32,112,117,116,13,10,100,117,112,32,49,48,54,32,47,112,104,105,49,32,112,117,116,13,10,100,117,112,32,49,48,55,32,47,107,97,112,112,97,32,112,117,116,13,10,100,117,112,32,49,48,56,32,47,108,97,109,98,100,97,32,112,117,116,13,10,100,117,112,32,49,48,57,32,47,109,117,32,112,117,116,13,10,100,117,112,32,49,49,48,32,47,110,117,32,112,117,116,13,10,100,117,112,32,49,49,49,32,47,111,109,105,99,114,111,110,32,112,117,116,13,10,100,117,112,32,49,49,50,32,47,112,105,32,112,117,116,13,10,100,117,112,32,49,49,51,32,47,116,104,101,116,97,32,112,117,116,13,10,100,117,112,32,49,49,52,32,47,114,104,111,32,112,117,116,13,10,100,117,112,32,49,49,53,32,47,115,105,103,109,97,32,112,117,116,13,10,100,117,112,32,49,49,54,32,47,116,97,117,32,112,117,116,13,10,100,117,112,32,49,49,55,32,47,117,112,115,105,108,111,110,32,112,117,116,13,10,100,117,112,32,49,49,56,32,47,111,109,101,103,97,49,32,112,117,116,13,10,100,117,112,32,49,49,57,32,47,111,109,101,103,97,32,112,117,116,13,10,100,117,112,32,49,50,48,32,47,120,105,32,112,117,116,13,10,100,117,112,32,49,50,49,32,47,112,115,105,32,112,117,116,13,10,100,117,112,32,49,50,50,32,47,122,101,116,97,32,112,117,116,13,10,100,117,112,32,49,50,51,32,47,98,114,97,99,101,108,101,102,116,32,112,117,116,13,10,100,117,112,32,49,50,52,32,47,98,97,114,32,112,117,116,13,10,100,117,112,32,49,50,53,32,47,98,114,97,99,101,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,49,50,54,32,47,115,105,109,105,108,97,114,32,112,117,116,13,10,100,117,112,32,49,54,49,32,47,85,112,115,105,108,111,110,49,32,112,117,116,13,10,100,117,112,32,49,54,48,32,47,69,117,114,111,32,112,117,116,13,10,100,117,112,32,49,54,50,32,47,109,105,110,117,116,101,32,112,117,116,13,10,100,117,112,32,49,54,51,32,47,108,101,115,115,101,113,117,97,108,32,112,117,116,13,10,100,117,112,32,49,54,52,32,47,102,114,97,99,116,105,111,110,32,112,117,116,13,10,100,117,112,32,49,54,53,32,47,105,110,102,105,110,105,116,121,32,112,117,116,13,10,100,117,112,32,49,54,54,32,47,102,108,111,114,105,110,32,112,117,116,13,10,100,117,112,32,49,54,55,32,47,99,108,117,98,32,112,117,116,13,10,100,117,112,32,49,54,56,32,47,100,105,97,109,111,110,100,32,112,117,116,13,10,100,117,112,32,49,54,57,32,47,104,101,97,114,116,32,112,117,116,13,10,100,117,112,32,49,55,48,32,47,115,112,97,100,101,32,112,117,116,13,10,100,117,112,32,49,55,49,32,47,97,114,114,111,119,98,111,116,104,32,112,117,116,13,10,100,117,112,32,49,55,50,32,47,97,114,114,111,119,108,101,102,116,32,112,117,116,13,10,100,117,112,32,49,55,51,32,47,97,114,114,111,119,117,112,32,112,117,116,13,10,100,117,112,32,49,55,52,32,47,97,114,114,111,119,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,49,55,53,32,47,97,114,114,111,119,100,111,119,110,32,112,117,116,13,10,100,117,112,32,49,55,54,32,47,100,101,103,114,101,101,32,112,117,116,13,10,100,117,112,32,49,55,55,32,47,112,108,117,115,109,105,110,117,115,32,112,117,116,13,10,100,117,112,32,49,55,56,32,47,115,101,99,111,110,100,32,112,117,116,13,10,100,117,112,32,49,55,57,32,47,103,114,101,97,116,101,114,101,113,117,97,108,32,112,117,116,13,10,100,117,112,32,49,56,48,32,47,109,117,108,116,105,112,108,121,32,112,117,116,13,10,100,117,112,32,49,56,49,32,47,112,114,111,112,111,114,116,105,111,110,97,108,32,112,117,116,13,10,100,117,112,32,49,56,50,32,47,112,97,114,116,105,97,108,100,105,102,102,32,112,117,116,13,10,100,117,112,32,49,56,51,32,47,98,117,108,108,101,116,32,112,117,116,13,10,100,117,112,32,49,56,52,32,47,100,105,118,105,100,101,32,112,117,116,13,10,100,117,112,32,49,56,53,32,47,110,111,116,101,113,117,97,108,32,112,117,116,13,10,100,117,112,32,49,56,54,32,47,101,113,117,105,118,97,108,101,110,99,101,32,112,117,116,13,10,100,117,112,32,49,56,55,32,47,97,112,112,114,111,120,101,113,117,97,108,32,112,117,116,13,10,100,117,112,32,49,56,56,32,47,101,108,108,105,112,115,105,115,32,112,117,116,13,10,100,117,112,32,49,56,57,32,47,97,114,114,111,119,118,101,114,116,101,120,32,112,117,116,13,10,100,117,112,32,49,57,48,32,47,97,114,114,111,119,104,111,114,105,122,101,120,32,112,117,116,13,10,100,117,112,32,49,57,49,32,47,99,97,114,114,105,97,103,101,114,101,116,117,114,110,32,112,117,116,13,10,100,117,112,32,49,57,50,32,47,97,108,101,112,104,32,112,117,116,13,10,100,117,112,32,49,57,51,32,47,73,102,114,97,107,116,117,114,32,112,117,116,13,10,100,117,112,32,49,57,52,32,47,82,102,114,97,107,116,117,114,32,112,117,116,13,10,100,117,112,32,49,57,53,32,47,119,101,105,101,114,115,116,114,97,115,115,32,112,117,116,13,10,100,117,112,32,49,57,54,32,47,99,105,114,99,108,101,109,117,108,116,105,112,108,121,32,112,117,116,13,10,100,117,112,32,49,57,55,32,47,99,105,114,99,108,101,112,108,117,115,32,112,117,116,13,10,100,117,112,32,49,57,56,32,47,101,109,112,116,121,115,101,116,32,112,117,116,13,10,100,117,112,32,49,57,57,32,47,105,110,116,101,114,115,101,99,116,105,111,110,32,112,117,116,13,10,100,117,112,32,50,48,48,32,47,117,110,105,111,110,32,112,117,116,13,10,100,117,112,32,50,48,49,32,47,112,114,111,112,101,114,115,117,112,101,114,115,101,116,32,112,117,116,13,10,100,117,112,32,50,48,50,32,47,114,101,102,108,101,120,115,117,112,101,114,115,101,116,32,112,117,116,13,10,100,117,112,32,50,48,51,32,47,110,111,116,115,117,98,115,101,116,32,112,117,116,13,10,100,117,112,32,50,48,52,32,47,112,114,111,112,101,114,115,117,98,115,101,116,32,112,117,116,13,10,100,117,112,32,50,48,53,32,47,114,101,102,108,101,120,115,117,98,115,101,116,32,112,117,116,13,10,100,117,112,32,50,48,54,32,47,101,108,101,109,101,110,116,32,112,117,116,13,10,100,117,112,32,50,48,55,32,47,110,111,116,101,108,101,109,101,110,116,32,112,117,116,13,10,100,117,112,32,50,48,56,32,47,97,110,103,108,101,32,112,117,116,13,10,100,117,112,32,50,48,57,32,47,103,114,97,100,105,101,110,116,32,112,117,116,13,10,100,117,112,32,50,49,48,32,47,114,101,103,105,115,116,101,114,115,101,114,105,102,32,112,117,116,13,10,100,117,112,32,50,49,49,32,47,99,111,112,121,114,105,103,104,116,115,101,114,105,102,32,112,117,116,13,10,100,117,112,32,50,49,50,32,47,116,114,97,100,101,109,97,114,107,115,101,114,105,102,32,112,117,116,13,10,100,117,112,32,50,49,51,32,47,112,114,111,100,117,99,116,32,112,117,116,13,10,100,117,112,32,50,49,52,32,47,114,97,100,105,99,97,108,32,112,117,116,13,10,100,117,112,32,50,49,53,32,47,100,111,116,109,97,116,104,32,112,117,116,13,10,100,117,112,32,50,49,54,32,47,108,111,103,105,99,97,108,110,111,116,32,112,117,116,13,10,100,117,112,32,50,49,55,32,47,108,111,103,105,99,97,108,97,110,100,32,112,117,116,13,10,100,117,112,32,50,49,56,32,47,108,111,103,105,99,97,108,111,114,32,112,117,116,13,10,100,117,112,32,50,49,57,32,47,97,114,114,111,119,100,98,108,98,111,116,104,32,112,117,116,13,10,100,117,112,32,50,50,48,32,47,97,114,114,111,119,100,98,108,108,101,102,116,32,112,117,116,13,10,100,117,112,32,50,50,49,32,47,97,114,114,111,119,100,98,108,117,112,32,112,117,116,13,10,100,117,112,32,50,50,50,32,47,97,114,114,111,119,100,98,108,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,50,50,51,32,47,97,114,114,111,119,100,98,108,100,111,119,110,32,112,117,116,13,10,100,117,112,32,50,50,52,32,47,108,111,122,101,110,103,101,32,112,117,116,13,10,100,117,112,32,50,50,53,32,47,97,110,103,108,101,108,101,102,116,32,112,117,116,13,10,100,117,112,32,50,50,54,32,47,114,101,103,105,115,116,101,114,115,97,110,115,32,112,117,116,13,10,100,117,112,32,50,50,55,32,47,99,111,112,121,114,105,103,104,116,115,97,110,115,32,112,117,116,13,10,100,117,112,32,50,50,56,32,47,116,114,97,100,101,109,97,114,107,115,97,110,115,32,112,117,116,13,10,100,117,112,32,50,50,57,32,47,115,117,109,109,97,116,105,111,110,32,112,117,116,13,10,100,117,112,32,50,51,48,32,47,112,97,114,101,110,108,101,102,116,116,112,32,112,117,116,13,10,100,117,112,32,50,51,49,32,47,112,97,114,101,110,108,101,102,116,101,120,32,112,117,116,13,10,100,117,112,32,50,51,50,32,47,112,97,114,101,110,108,101,102,116,98,116,32,112,117,116,13,10,100,117,112,32,50,51,51,32,47,98,114,97,99,107,101,116,108,101,102,116,116,112,32,112,117,116,13,10,100,117,112,32,50,51,52,32,47,98,114,97,99,107,101,116,108,101,102,116,101,120,32,112,117,116,13,10,100,117,112,32,50,51,53,32,47,98,114,97,99,107,101,116,108,101,102,116,98,116,32,112,117,116,13,10,100,117,112,32,50,51,54,32,47,98,114,97,99,101,108,101,102,116,116,112,32,112,117,116,13,10,100,117,112,32,50,51,55,32,47,98,114,97,99,101,108,101,102,116,109,105,100,32,112,117,116,13,10,100,117,112,32,50,51,56,32,47,98,114,97,99,101,108,101,102,116,98,116,32,112,117,116,13,10,100,117,112,32,50,51,57,32,47,98,114,97,99,101,101,120,32,112,117,116,13,10,100,117,112,32,50,52,49,32,47,97,110,103,108,101,114,105,103,104,116,32,112,117,116,13,10,100,117,112,32,50,52,50,32,47,105,110,116,101,103,114,97,108,32,112,117,116,13,10,100,117,112,32,50,52,51,32,47,105,110,116,101,103,114,97,108,116,112,32,112,117,116,13,10,100,117,112,32,50,52,52,32,47,105,110,116,101,103,114,97,108,101,120,32,112,117,116,13,10,100,117,112,32,50,52,53,32,47,105,110,116,101,103,114,97,108,98,116,32,112,117,116,13,10,100,117,112,32,50,52,54,32,47,112,97,114,101,110,114,105,103,104,116,116,112,32,112,117,116,13,10,100,117,112,32,50,52,55,32,47,112,97,114,101,110,114,105,103,104,116,101,120,32,112,117,116,13,10,100,117,112,32,50,52,56,32,47,112,97,114,101,110,114,105,103,104,116,98,116,32,112,117,116,13,10,100,117,112,32,50,52,57,32,47,98,114,97,99,107,101,116,114,105,103,104,116,116,112,32,112,117,116,13,10,100,117,112,32,50,53,48,32,47,98,114,97,99,107,101,116,114,105,103,104,116,101,120,32,112,117,116,13,10,100,117,112,32,50,53,49,32,47,98,114,97,99,107,101,116,114,105,103,104,116,98,116,32,112,117,116,13,10,100,117,112,32,50,53,50,32,47,98,114,97,99,101,114,105,103,104,116,116,112,32,112,117,116,13,10,100,117,112,32,50,53,51,32,47,98,114,97,99,101,114,105,103,104,116,109,105,100,32,112,117,116,13,10,100,117,112,32,50,53,52,32,47,98,114,97,99,101,114,105,103,104,116,98,116,32,112,117,116,13,10,114,101,97,100,111,110,108,121,32,100,101,102,13,10,47,85,110,105,113,117,101,73,68,32,53,48,50,49,51,51,57,32,100,101,102,13,10,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,13,10,99,117,114,114,101,110,116,102,105,108,101,32,101,101,120,101,99,13,128,2,138,107,0,0,233,141,9,215,96,163,194,44,241,25,249,220,105,154,34,195,91,91,53,237,106,162,53,147,199,109,84,202,187,94,148,43,247,214,221,132,241,102,75,137,105,156,116,180,114,222,159,142,109,249,37,246,196,242,4,233,241,198,57,180,219,169,136,237,42,196,25,255,43,43,222,96,91,142,227,38,78,221,102,65,45,79,33,198,74,197,34,189,252,124,85,2,249,195,243,229,89,43,59,32,147,211,60,155,250,237,210,212,158,137,170,186,168,50,226,63,6,46,145,162,80,50,81,157,24,104,129,110,68,180,224,116,119,149,0,61,121,48,41,157,110,30,42,91,254,13,89,93,201,126,20,9,137,206,129,216,215,248,82,255,156,220,122,27,27,89,140,105,19,29,238,0,91,65,88,5,161,109,138,19,229,146,118,23,174,127,36,122,113,206,12,125,86,175,215,93,133,237,45,159,32,255,154,108,56,232,213,32,81,151,208,135,128,24,12,202,156,53,82,43,22,9,181,1,114,77,77,100,0,22,155,145,188,235,106,77,224,13,10,252,120,28,248,135,48,18,179,17,125,34,161,133,135,137,85,67,219,194,161,255,199,117,35,118,222,205,76,146,166,145,34,66,88,232,248,241,19,242,165,203,61,141,161,15,232,35,198,101,106,136,0,203,199,255,208,24,162,138,194,136,95,53,226,46,249,251,84,155,0,226,61,49,187,163,4,221,156,40,223,2,168,195,112,206,73,197,138,64,201,246,115,173,97,245,171,238,157,98,235,172,89,11,90,68,242,186,189,150,225,55,70,77,176,102,182,2,165,216,212,62,208,65,183,128,240,251,152,249,149,47,32,173,128,132,25,154,223,238,158,203,25,60,1,135,114,230,58,90,131,187,6,0,150,47,231,36,246,51,81,180,183,161,100,18,116,58,209,74,56,65,136,119,118,138,244,35,227,52,141,72,237,119,60,46,135,98,76,254,247,119,161,91,104,114,245,68,136,228,44,72,73,174,109,84,203,133,125,192,151,46,27,87,200,143,64,184,153,40,234,67,193,141,188,115,24,47,105,181,47,11,214,107,113,51,136,22,118,97,106,182,105,114,50,64,241,125,94,170,162,124,142,41,88,98,40,141,195,9,24,208,0,8,201,89,42,81,243,158,48,221,196,98,246,40,118,84,236,204,19,251,149,37,246,234,197,112,158,149,47,178,55,232,203,8,112,202,197,221,193,61,165,141,189,6,13,49,147,252,146,230,196,206,243,188,253,129,206,107,54,121,191,197,133,87,150,205,250,138,38,214,58,101,154,47,247,161,167,227,24,167,247,111,248,14,132,106,45,100,125,56,232,39,255,175,84,189,90,146,33,238,180,22,164,117,234,191,78,240,64,155,60,193,80,119,224,31,116,44,70,237,67,202,114,146,76,50,228,138,120,98,36,99,57,102,128,202,195,99,64,108,82,74,155,59,118,140,213,166,137,38,67,247,139,124,214,92,97,14,191,235,209,5,141,254,234,103,216,169,185,175,217,191,57,3,58,86,133,101,55,192,111,117,186,176,164,112,121,223,246,76,247,52,60,214,231,254,123,177,251,206,227,39,73,201,20,53,203,134,247,85,13,80,92,129,222,255,190,30,58,31,99,4,221,3,205,32,132,43,51,93,127,206,110,179,31,23,87,36,213,28,24,72,0,195,117,109,176,68,226,254,4,191,83,233,149,251,66,90,172,150,252,239,56,76,147,3,52,181,243,132,83,108,179,171,217,132,71,132,75,171,240,76,167,103,237,183,7,134,19,44,121,108,194,246,83,8,82,39,90,180,223,12,139,77,46,174,1,56,14,210,78,98,245,168,93,200,52,93,85,108,103,240,15,98,45,50,221,102,254,24,33,145,105,218,202,55,68,168,25,207,172,195,5,252,169,71,26,13,229,147,110,39,14,59,45,78,18,17,217,218,141,226,110,121,12,111,86,194,206,139,25,225,117,37,110,139,248,91,142,82,219,125,168,196,79,229,46,87,175,72,222,155,119,22,88,19,155,107,129,179,96,146,236,226,182,41,192,246,77,49,214,45,199,212,34,194,162,4,188,4,20,204,111,120,244,233,117,191,143,39,161,124,195,179,91,49,237,49,59,82,116,244,135,169,46,187,51,176,42,244,114,235,216,76,75,27,64,6,229,197,34,138,111,114,34,218,180,144,37,157,226,34,63,76,188,221,0,106,101,73,240,128,133,234,234,229,30,77,123,8,172,200,176,142,143,152,219,247,158,212,34,1,50,167,85,192,7,54,102,0,252,39,224,186,221,115,200,117,7,75,111,33,29,160,95,241,69,71,48,243,221,254,150,211,108,161,47,130,73,203,231,76,130,169,64,241,214,2,5,205,150,36,174,183,130,77,91,13,10,21,120,235,63,212,95,253,185,126,102,191,15,170,39,188,37,230,49,194,6,116,231,214,219,94,76,199,177,15,58,119,115,26,163,165,58,24,126,82,17,218,57,242,233,124,2,54,227,111,135,20,196,157,99,14,110,31,180,34,6,202,217,54,23,148,169,224,2,54,156,204,101,135,249,164,203,206,92,253,226,102,86,221,138,54,102,60,168,46,252,30,147,204,88,134,62,58,41,0,144,144,98,32,146,63,84,78,140,160,94,92,131,119,36,175,198,116,230,0,130,120,252,198,150,70,44,215,152,106,163,184,132,237,92,23,249,208,53,185,161,161,105,217,248,242,136,117,247,229,215,186,179,70,104,182,29,2,111,119,227,114,119,213,62,158,4,103,21,47,106,199,171,86,174,146,6,241,81,119,115,46,173,123,42,0,55,153,134,39,114,178,65,214,88,24,192,210,214,197,63,208,148,92,170,23,25,219,68,111,124,229,195,131,242,139,177,244,25,240,35,243,222,242,4,232,149,184,5,116,7,100,142,254,25,115,220,143,123,140,23,171,170,23,22,171,105,243,191,5,117,245,100,195,64,15,181,91,196,48,244,85,178,102,135,30,117,105,195,154,129,189,176,130,250,81,52,35,146,114,249,214,157,47,91,228,147,41,37,85,165,17,90,13,189,243,13,167,27,221,164,24,205,88,117,191,44,12,207,0,226,54,242,201,112,86,177,2,232,224,20,194,193,24,167,108,247,156,16,254,41,33,211,32,34,184,249,100,67,191,161,179,65,137,229,197,171,207,236,81,173,32,204,69,8,172,83,118,105,11,207,224,29,200,249,36,250,25,13,10,111,18,149,193,92,116,221,173,94,156,64,71,173,1,69,118,133,138,38,95,252,224,190,158,119,231,99,233,17,187,102,35,89,223,152,221,118,115,103,218,225,182,134,238,222,202,225,240,201,203,197,75,196,205,70,229,20,113,37,107,211,64,179,56,195,141,203,214,211,39,254,109,35,72,180,235,42,28,149,191,8,47,46,74,27,218,219,227,73,251,51,26,233,234,0,44,96,32,151,116,98,101,69,90,92,96,167,192,187,210,244,7,200,167,229,254,159,190,164,189,142,201,150,37,66,226,227,2,26,12,164,15,59,63,253,183,144,89,33,103,175,178,29,187,185,236,169,1,45,6,8,111,29,230,116,159,243,198,59,227,110,13,10,85,169,161,3,64,109,140,204,9,89,117,135,47,232,149,184,196,58,42,68,90,250,94,3,199,144,36,137,212,244,196,169,172,130,145,33,229,50,198,96,76,5,156,53,86,82,252,156,47,22,165,83,213,54,139,160,117,45,253,202,76,14,155,148,75,209,194,209,21,194,94,68,33,235,228,18,177,113,41,13,10,176,208,229,176,178,196,43,190,88,164,235,57,234,97,199,16,73,109,216,164,240,222,118,117,159,93,85,245,87,34,74,75,149,73,206,162,27,143,226,119,252,88,72,143,195,105,217,192,241,163,220,82,184,84,33,37,187,66,86,27,89,75,223,51,190,67,174,249,63,0,238,92,96,39,74,255,192,84,132,176,1,29,140,70,95,86,187,157,4,254,184,139,109,229,79,194,16,75,7,220,94,200,205,65,157,159,89,126,95,77,223,192,187,176,233,32,98,159,223,6,73,43,236,120,201,112,193,230,101,61,75,191,146,211,241,202,189,196,251,174,56,11,34,241,219,110,138,169,176,80,227,58,56,77,92,173,149,67,163,173,191,145,164,169,64,89,112,93,32,217,6,252,124,235,37,119,202,80,4,51,158,203,210,163,103,159,41,235,67,200,146,71,250,17,53,11,173,53,235,201,56,187,215,69,247,116,114,125,233,46,183,139,252,189,177,9,197,64,34,173,9,194,30,133,96,13,203,112,203,27,81,174,234,185,204,229,123,139,20,197,78,235,30,149,106,140,57,97,116,114,22,88,8,34,197,49,190,164,5,19,24,40,58,60,241,246,18,54,11,77,62,215,133,236,118,197,158,164,117,193,91,21,233,225,147,20,191,198,161,40,146,73,28,217,215,203,58,253,144,32,189,40,182,133,18,158,249,226,193,81,197,149,153,241,232,225,62,234,143,181,116,108,206,138,227,23,105,26,40,210,99,199,119,20,229,244,1,249,237,174,240,133,183,42,134,169,207,93,253,86,115,158,59,252,171,73,41,103,158,241,17,210,51,120,164,67,68,12,249,82,61,59,242,63,155,220,220,215,242,196,13,117,9,159,55,119,230,111,110,63,26,228,222,243,213,176,98,255,187,47,189,164,185,56,248,15,116,182,190,48,50,187,167,127,153,80,24,120,86,127,72,166,78,176,159,22,132,240,149,248,180,228,7,167,140,150,72,37,171,219,113,250,173,180,42,171,124,65,225,70,255,210,26,199,66,87,64,73,220,162,87,233,243,212,206,70,210,0,247,118,237,121,21,238,161,145,94,50,17,119,150,61,237,178,162,76,135,1,215,13,10,38,88,86,140,241,49,63,220,65,102,230,234,89,164,189,48,9,48,145,28,19,183,191,78,114,1,47,201,156,204,218,59,140,109,7,254,191,21,192,161,92,1,178,32,166,223,187,29,128,206,237,115,129,43,229,37,229,183,179,91,173,155,103,114,198,103,60,161,245,128,255,241,111,60,150,185,185,183,240,65,174,213,12,223,207,114,70,219,32,120,116,54,201,226,184,112,109,56,89,19,114,186,218,194,25,184,61,219,59,250,26,248,83,170,58,125,164,27,22,189,245,228,44,130,119,194,204,115,193,201,246,104,147,30,102,173,85,35,212,53,219,230,128,113,208,86,203,143,225,222,23,156,82,68,204,81,29,64,187,168,49,29,151,106,33,32,166,196,110,133,185,57,41,31,96,57,76,145,30,48,162,20,173,3,191,229,138,3,233,47,198,123,254,129,184,40,2,142,38,54,80,210,123,6,69,88,227,235,114,240,27,64,202,76,240,41,182,241,193,132,49,147,251,35,114,31,31,111,25,146,47,130,28,40,236,212,52,15,16,233,110,179,139,120,140,88,156,184,129,91,183,8,176,196,108,55,142,140,22,234,204,114,204,249,202,11,158,189,176,180,144,106,245,143,197,203,142,125,98,25,31,28,17,148,59,183,109,130,37,18,88,196,178,81,170,149,97,212,42,220,240,165,249,24,73,30,6,59,106,136,205,244,224,200,212,28,150,141,87,198,227,251,205,107,198,24,209,57,166,135,48,62,225,42,107,49,187,242,58,4,241,149,144,84,4,104,187,18,188,70,195,230,159,75,171,125,25,90,31,231,219,64,152,9,245,166,176,23,138,119,164,121,47,105,194,52,137,245,3,67,121,180,167,102,140,193,201,54,154,54,248,149,27,232,200,94,35,210,228,125,237,243,113,140,13,10,42,223,129,106,203,251,218,29,70,174,134,41,52,72,171,199,50,219,153,193,122,110,116,125,254,32,76,177,22,28,148,48,173,163,120,123,219,146,69,86,35,79,158,44,250,231,87,31,149,66,252,6,199,183,204,6,246,48,212,60,4,164,84,194,219,209,178,53,73,49,27,3,216,186,206,1,254,173,142,15,73,103,245,20,173,131,71,41,87,203,47,215,102,27,209,130,21,175,65,102,9,102,158,135,140,114,225,184,246,146,196,73,17,149,140,185,139,202,199,195,8,121,86,229,54,158,111,65,241,96,62,212,150,244,118,111,211,81,126,136,104,13,55,16,79,84,85,208,11,119,105,170,30,176,73,125,101,185,197,57,82,180,206,202,96,173,209,86,217,31,134,198,12,110,104,61,226,214,127,217,0,224,13,10,255,85,128,4,166,110,18,169,193,185,75,46,172,97,98,200,150,16,148,62,101,222,82,252,99,168,255,4,198,224,184,12,191,229,62,21,249,70,71,197,234,64,236,196,42,107,219,190,152,28,194,127,237,141,242,19,105,195,112,18,8,124,231,116,8,183,120,102,236,179,129,240,161,221,101,23,114,114,139,142,7,114,139,200,42,215,34,37,201,76,134,178,69,29,137,28,30,27,248,67,6,125,56,236,148,35,162,105,218,170,61,113,235,160,127,183,245,152,43,215,60,207,1,198,21,206,18,179,150,246,86,216,110,14,76,98,191,240,48,85,102,203,200,57,177,132,48,70,202,228,181,121,147,248,108,181,213,238,138,83,129,195,63,19,110,1,183,121,73,46,61,12,134,120,121,67,4,99,36,136,126,180,233,39,48,118,120,242,200,200,175,21,213,175,120,117,132,37,78,153,186,241,227,52,93,137,238,202,17,132,108,204,214,43,240,139,108,57,55,247,163,216,22,202,110,211,12,113,153,154,57,45,52,240,78,80,46,1,147,79,45,240,71,65,14,114,181,13,10,83,241,16,121,16,53,2,8,14,117,224,49,75,221,170,150,64,136,127,208,178,210,72,183,62,142,168,11,216,207,105,98,127,13,52,90,115,121,31,37,123,181,155,59,13,10,118,36,59,176,107,208,177,252,163,68,142,240,143,1,47,231,214,150,13,89,41,35,177,58,105,98,176,235,239,246,238,129,75,108,179,105,202,210,57,154,59,62,57,173,127,13,217,195,47,199,234,171,129,158,236,201,179,253,151,18,49,168,51,208,11,207,120,206,34,73,51,196,15,31,211,26,177,29,137,147,46,213,96,70,216,123,235,235,13,4,223,171,168,143,32,7,7,69,164,250,37,205,199,244,130,246,162,158,50,213,207,205,80,252,226,58,18,129,204,145,77,157,47,162,214,33,20,224,2,147,226,231,78,37,233,156,226,219,6,150,222,120,182,123,203,71,174,121,55,33,230,149,140,109,164,115,104,83,106,92,159,159,188,19,77,221,77,8,191,92,11,45,59,180,248,99,235,44,14,136,232,105,150,69,164,26,222,156,229,191,200,119,215,195,199,188,171,35,111,181,8,229,200,251,106,28,51,23,150,112,226,148,167,160,104,25,149,129,150,92,15,253,139,17,33,244,99,32,136,188,150,147,20,209,49,146,70,232,201,228,86,75,198,187,183,35,105,142,221,148,157,18,86,11,51,247,112,251,236,190,168,194,59,237,221,87,224,140,145,101,66,12,175,27,53,72,82,176,123,106,247,15,3,82,255,188,199,28,145,114,214,45,133,198,123,205,144,203,215,51,73,30,207,116,124,202,117,98,80,254,80,147,169,184,69,127,15,171,111,179,243,101,205,22,64,227,0,115,214,243,89,111,137,110,85,209,192,99,149,115,40,75,226,190,28,160,13,176,54,212,208,85,39,78,98,14,200,117,197,209,111,38,137,178,8,101,186,224,241,75,20,83,207,254,252,172,89,254,15,118,190,136,209,109,95,175,34,145,73,118,121,22,238,229,211,126,75,43,6,13,10,58,55,53,252,189,7,135,5,252,227,231,149,68,53,104,198,183,75,30,216,244,12,113,38,97,11,234,82,128,131,52,156,43,182,13,10,217,193,94,220,210,88,140,9,199,30,83,153,192,223,126,232,229,28,75,246,120,145,238,101,37,51,86,77,126,90,242,216,145,13,10,152,121,220,163,130,238,98,55,142,42,60,126,223,116,55,181,246,57,182,51,255,213,175,211,69,90,123,29,169,196,199,254,12,3,202,146,123,201,51,216,130,30,47,155,121,98,184,231,117,113,118,41,226,75,201,128,190,81,126,171,238,103,206,135,32,61,4,35,232,86,241,14,74,91,112,22,149,47,105,40,161,211,8,13,10,172,14,37,99,11,25,171,215,180,187,190,62,201,89,214,3,67,255,77,247,21,69,94,164,91,95,229,166,227,252,199,126,161,24,3,121,25,178,162,177,222,218,112,90,253,83,36,49,190,154,215,83,9,236,248,38,175,125,99,237,166,193,67,75,6,188,94,154,203,67,238,32,158,123,107,194,1,103,2,140,167,133,211,147,186,119,156,231,161,116,168,152,140,47,118,35,204,242,206,154,195,200,152,44,134,81,32,116,11,215,73,76,202,227,40,187,55,170,72,115,255,217,156,70,210,0,89,193,197,188,185,172,165,224,250,158,18,0,209,37,69,223,135,108,88,14,30,205,24,130,149,167,144,224,57,114,158,249,57,33,23,4,78,21,112,81,206,135,239,63,229,155,255,242,85,124,113,56,212,198,48,104,15,147,243,29,197,27,135,205,127,216,210,20,46,22,184,155,58,191,253,163,110,240,81,181,100,60,79,83,62,235,31,138,193,141,247,0,114,147,0,211,250,90,190,244,155,83,168,135,250,219,13,205,91,62,11,34,217,136,194,214,7,221,44,159,81,6,248,58,82,30,117,86,132,171,242,25,96,160,249,3,48,102,213,115,223,4,58,223,149,247,200,233,248,34,203,31,189,94,237,52,208,85,15,68,250,191,115,106,94,99,56,171,153,205,12,237,156,138,39,9,12,133,180,152,25,156,62,181,103,242,233,37,103,254,135,178,8,153,163,182,132,61,113,212,59,40,177,194,13,224,89,193,2,192,88,2,84,100,47,36,239,209,30,200,172,40,25,221,171,241,173,75,28,217,175,233,44,192,228,110,25,72,101,185,128,178,140,213,67,223,6,172,35,239,201,198,76,190,233,217,33,194,156,105,111,71,189,142,112,11,109,124,29,5,46,117,247,89,124,93,81,60,118,238,159,222,41,81,205,134,112,63,246,130,77,47,66,212,131,120,147,210,191,130,52,146,96,3,141,33,233,224,250,150,235,238,200,34,246,233,30,192,31,33,74,169,209,184,63,11,115,44,238,57,116,1,159,254,238,53,154,37,189,54,176,184,232,37,13,190,25,53,188,12,226,195,59,188,198,209,231,2,54,48,200,133,174,250,122,119,15,211,177,153,46,205,154,173,6,161,61,197,143,24,254,84,86,113,229,76,113,184,245,230,109,7,109,25,1,172,107,248,232,116,202,132,5,72,21,161,69,167,188,239,240,120,115,103,181,140,102,142,34,2,130,22,246,39,38,127,131,242,121,101,111,107,79,221,97,251,7,18,65,204,136,59,0,96,251,155,141,116,49,59,233,194,113,250,19,234,150,64,173,197,53,100,242,210,168,94,77,23,153,178,229,208,75,103,241,58,48,145,75,202,85,151,167,45,20,86,235,159,34,143,86,234,149,209,171,223,91,67,50,223,120,146,178,60,87,27,231,44,228,116,165,104,84,136,227,179,235,72,155,109,227,245,227,253,84,53,227,204,107,206,128,113,18,98,97,210,185,37,84,23,160,80,207,90,40,107,218,196,133,166,120,0,156,179,247,180,190,154,36,82,112,192,143,146,243,57,181,127,169,204,137,155,138,223,95,115,54,17,152,120,20,128,195,180,214,162,216,198,90,96,116,154,71,207,241,94,118,26,3,82,197,171,114,209,223,152,239,87,202,232,153,223,169,216,204,127,223,2,196,250,102,251,144,166,139,133,105,194,119,217,147,118,186,49,124,158,110,89,215,151,27,63,229,61,174,251,145,253,5,227,47,221,81,123,11,34,166,54,82,75,75,194,61,116,100,187,250,89,43,67,133,208,6,164,149,192,247,70,132,250,176,210,170,64,70,184,114,28,245,3,225,110,108,106,101,181,77,146,146,18,167,150,19,74,198,235,230,40,59,114,34,134,184,205,134,156,153,165,183,249,179,80,110,173,51,62,191,46,107,156,151,241,95,12,184,4,111,9,128,176,121,104,87,98,22,38,235,200,2,213,243,25,142,217,30,195,33,82,45,111,168,79,195,188,117,47,106,111,71,252,44,5,26,209,147,173,78,64,108,160,21,13,10,154,119,222,147,113,248,50,211,172,167,168,76,168,195,247,217,125,197,233,72,92,79,42,119,239,7,25,25,204,144,190,127,225,54,24,164,169,189,115,135,13,10,150,140,184,186,36,104,135,8,244,133,193,88,114,136,130,32,231,58,166,98,54,143,65,14,247,107,52,101,86,99,197,74,174,254,232,39,183,197,83,171,200,37,67,250,142,141,222,19,35,198,4,15,184,242,79,194,19,161,136,241,148,154,71,1,183,60,4,100,173,150,87,167,83,84,64,48,120,151,216,22,179,228,182,218,202,118,132,249,42,75,116,38,45,119,41,105,222,231,17,228,237,158,225,21,251,127,145,189,157,26,61,64,50,95,19,91,46,3,115,80,163,107,67,207,90,76,173,234,104,172,163,104,249,146,120,250,94,205,255,13,16,237,21,23,72,156,62,89,86,140,245,103,96,21,208,109,41,110,122,38,1,61,18,130,176,190,26,237,30,27,11,114,169,189,248,232,215,188,193,70,51,135,92,7,207,92,202,32,41,101,192,171,141,207,37,12,51,153,0,115,38,202,64,176,227,180,90,159,130,230,1,176,246,157,54,44,201,53,45,239,175,176,23,247,103,16,248,41,222,233,244,186,223,207,85,12,131,134,139,81,0,172,137,53,23,168,78,13,216,202,44,13,191,53,110,13,10,122,83,48,128,237,27,57,222,105,209,163,31,13,47,196,216,12,240,158,117,168,36,1,185,226,5,149,53,113,194,152,140,198,138,230,30,12,152,110,118,49,184,34,255,68,128,152,240,21,169,37,250,149,137,212,218,79,11,71,65,50,24,166,196,84,45,69,174,143,50,131,24,235,103,105,68,217,205,6,17,38,60,228,241,190,200,71,13,27,134,70,222,102,211,81,100,98,0,181,163,232,199,167,105,64,84,76,255,205,111,220,152,36,39,91,164,9,94,240,143,91,67,207,36,219,125,139,26,11,25,110,37,91,214,9,141,188,63,152,89,212,154,21,156,105,34,132,181,46,222,214,50,2,48,100,135,201,151,64,222,226,82,238,178,206,106,83,71,158,175,127,205,96,87,52,107,106,131,173,53,120,230,82,24,238,59,250,82,249,253,112,82,219,179,179,248,65,136,124,171,25,57,95,100,119,159,100,211,249,180,163,254,57,71,182,165,1,182,139,194,136,198,239,137,47,52,248,226,13,10,148,96,91,108,66,223,132,214,30,220,208,0,219,171,38,244,161,231,187,45,160,169,38,186,118,43,33,18,188,16,146,27,56,126,16,13,157,178,9,5,226,125,71,240,219,60,124,198,127,41,228,239,235,111,23,159,20,75,131,174,148,147,247,36,171,88,158,148,191,251,220,218,134,254,43,179,62,97,88,191,21,71,50,16,21,212,110,22,103,162,47,204,124,86,211,198,12,162,85,16,92,236,139,3,232,139,250,102,149,4,36,232,121,214,219,44,79,253,157,109,243,90,179,236,200,213,218,105,145,103,132,226,116,189,63,195,32,119,214,99,110,215,52,3,16,85,6,254,134,199,57,61,109,165,192,244,58,136,71,239,212,109,41,153,194,166,98,178,202,238,20,173,19,228,143,20,135,245,52,182,102,189,56,130,213,173,145,222,213,0,35,132,12,49,55,94,225,191,181,64,25,15,17,201,83,195,200,108,15,102,19,158,87,236,80,170,216,254,155,13,10,161,84,37,15,115,192,225,43,133,180,43,82,244,107,125,200,94,192,97,12,205,208,140,47,63,122,83,95,214,9,137,126,71,43,228,164,34,142,69,22,147,146,30,209,246,253,155,253,171,99,141,161,81,35,243,85,45,200,190,5,48,200,167,110,133,245,158,19,217,91,90,228,29,49,113,248,195,170,141,173,13,10,2,195,116,158,32,144,198,167,149,213,54,5,52,12,78,155,89,104,24,170,177,12,161,38,232,79,144,35,200,27,242,60,199,63,97,221,198,97,153,229,98,120,13,10,222,189,46,144,53,71,9,138,89,21,252,114,104,25,138,243,1,197,1,213,155,144,245,188,80,125,163,178,250,226,114,135,70,203,196,236,218,223,98,174,179,255,25,82,215,217,241,4,42,197,68,138,119,243,96,179,77,161,231,130,243,241,1,148,179,212,52,54,180,17,118,148,87,95,118,17,209,227,66,127,127,120,20,217,74,247,245,193,254,38,138,253,130,194,231,233,227,246,224,184,181,253,130,125,180,231,180,126,19,23,147,198,226,155,51,201,176,133,116,53,228,213,127,81,94,188,41,144,35,164,56,225,116,21,4,3,200,148,174,245,12,37,172,90,175,127,135,32,85,250,243,193,237,1,68,166,193,2,142,37,44,58,242,80,161,129,190,200,115,2,131,160,135,132,94,183,116,217,214,79,184,231,59,55,112,180,30,117,5,228,165,2,255,53,94,63,117,130,243,41,112,37,8,84,157,94,7,81,18,68,85,129,69,217,196,87,223,72,86,21,89,37,147,130,127,142,22,224,195,146,1,158,155,185,175,162,157,46,195,126,40,245,95,29,129,45,63,85,45,212,62,154,112,127,178,54,82,233,68,150,123,61,160,9,69,61,132,24,192,215,9,2,27,61,96,54,19,54,17,83,38,100,233,46,183,204,120,160,170,234,126,200,62,216,53,53,81,182,215,237,69,113,228,102,229,92,0,218,9,41,100,91,153,140,18,242,150,157,118,162,125,86,238,148,217,129,254,236,91,149,122,12,166,55,160,74,63,13,10,225,190,245,125,138,131,209,161,89,63,224,77,162,150,72,34,145,64,145,133,240,226,174,9,254,76,36,57,226,244,87,159,84,199,132,197,165,61,56,151,182,175,139,9,91,154,152,5,75,248,159,235,175,22,196,129,243,86,117,60,139,184,1,149,189,36,68,90,128,42,5,23,174,9,68,238,198,48,121,150,248,56,27,45,151,77,121,101,227,243,233,34,150,190,145,222,108,84,134,48,231,38,35,108,101,141,152,97,202,185,139,37,114,121,67,47,164,116,133,79,146,22,236,123,109,39,161,50,26,123,103,13,10,222,114,101,193,11,106,165,9,191,211,173,250,68,204,58,29,51,220,130,220,76,27,19,157,149,221,215,162,49,107,250,38,198,8,180,13,10,54,186,155,249,47,68,30,187,200,58,93,11,70,39,197,104,246,93,92,5,55,40,65,98,122,141,142,48,89,216,115,117,25,147,92,34,21,190,105,212,197,246,13,77,255,35,13,10,9,231,36,49,193,240,172,152,133,146,5,116,119,90,18,36,195,197,89,176,243,64,8,83,2,208,122,212,1,98,0,68,59,59,176,101,203,7,110,137,131,129,250,248,122,240,171,97,26,85,164,27,146,237,109,149,16,149,23,81,192,237,11,207,188,238,167,146,255,107,135,151,148,137,121,29,200,59,136,231,71,112,192,125,243,78,120,43,189,20,55,123,3,153,2,91,1,28,125,185,44,162,219,125,8,9,154,104,227,149,233,242,130,248,215,22,158,65,56,220,226,130,78,5,62,231,111,109,232,181,130,150,186,56,176,217,210,115,227,164,97,111,96,242,145,219,244,52,104,72,231,220,13,10,243,182,58,118,216,63,6,171,207,33,117,85,13,10,85,182,203,74,49,104,240,211,63,174,56,158,4,132,238,103,123,221,225,108,16,111,57,191,251,55,249,13,137,18,171,102,116,166,49,163,225,46,251,46,3,145,188,228,42,29,176,152,18,219,208,251,11,176,26,187,19,78,189,11,110,202,19,74,126,167,224,238,102,248,9,196,110,95,173,183,0,133,215,240,200,247,215,143,168,100,242,65,234,80,27,220,223,184,251,29,36,150,217,106,194,51,55,21,108,182,63,153,33,191,132,176,106,127,157,228,36,237,176,144,112,208,158,252,252,211,42,112,97,201,144,191,160,136,23,78,196,90,15,74,56,88,3,198,100,194,46,171,4,27,113,204,149,157,159,60,248,252,178,126,107,233,215,225,54,24,72,44,48,222,84,37,56,47,185,100,163,189,130,231,66,106,140,160,172,129,168,192,155,108,11,65,111,51,197,74,69,196,245,123,191,16,38,161,44,91,170,26,85,64,231,219,94,149,78,225,1,195,106,112,54,35,167,41,12,227,2,117,62,193,88,182,95,129,15,124,70,197,92,127,159,18,122,163,148,95,226,163,32,166,170,73,50,49,37,200,94,23,74,130,140,85,151,131,16,126,221,126,57,103,187,31,92,97,99,185,161,91,140,157,43,232,68,25,253,156,15,54,1,139,222,70,43,123,238,32,74,241,94,174,227,228,245,254,57,162,105,116,43,165,57,139,198,220,219,172,253,52,102,153,162,139,141,112,142,139,9,239,0,196,255,230,252,139,225,33,206,151,174,109,146,176,66,137,83,68,73,42,217,166,105,50,145,53,99,2,92,11,235,101,202,52,63,188,221,18,30,18,108,73,105,45,82,171,75,203,113,95,82,219,128,104,12,15,85,162,32,27,34,194,242,99,211,138,137,204,137,129,197,107,205,178,69,128,83,71,167,151,208,215,30,2,161,27,130,56,251,194,66,69,98,80,1,236,104,144,207,177,160,147,153,55,170,184,47,246,53,222,82,228,125,98,203,179,141,76,137,82,53,86,18,93,118,30,251,238,86,145,111,46,211,81,168,200,190,222,179,117,180,0,165,73,158,247,204,125,176,217,215,246,6,71,195,65,108,225,213,5,41,62,193,40,156,192,24,20,121,178,138,113,172,204,211,93,28,73,127,98,132,67,253,51,41,26,72,247,175,161,214,166,117,174,43,170,201,251,196,161,137,252,4,164,66,11,145,227,213,30,209,186,66,194,172,166,124,221,171,65,99,140,130,35,111,102,168,242,206,242,198,106,51,213,66,83,181,96,153,137,22,142,28,181,233,46,154,70,37,106,135,16,79,15,168,57,13,187,251,129,72,215,249,0,185,99,74,62,103,176,247,97,191,245,244,22,11,45,178,21,40,208,164,213,88,116,238,169,240,21,217,82,203,143,248,143,58,254,131,79,193,234,29,226,115,185,192,4,142,69,227,226,170,87,228,192,146,97,139,80,179,193,245,21,33,208,62,155,167,67,137,171,70,19,176,51,125,44,116,120,95,40,238,229,116,241,129,120,193,103,230,163,181,165,246,97,63,190,88,181,132,163,83,34,36,88,182,229,74,200,170,8,243,26,176,118,30,21,103,38,95,255,64,203,62,117,9,99,248,23,157,73,92,34,98,132,18,83,103,209,172,93,24,143,92,166,169,254,15,37,18,95,48,53,61,245,78,150,225,246,197,17,201,56,225,0,190,12,27,74,230,141,78,51,51,121,79,11,201,93,154,233,187,81,126,13,24,60,254,136,224,72,59,202,149,120,15,182,67,124,211,194,188,58,249,101,188,107,197,141,132,93,48,70,206,93,18,236,146,133,193,253,222,49,70,96,169,96,175,126,74,127,7,249,15,149,15,6,199,123,233,242,111,169,31,20,250,200,221,144,78,174,121,14,210,22,231,204,34,255,71,95,143,70,46,26,70,188,218,113,169,214,93,7,222,220,3,141,0,244,147,179,136,111,103,73,131,220,253,215,215,96,251,222,123,170,205,120,172,18,241,141,239,85,136,105,56,248,139,153,173,79,200,164,32,203,214,0,54,21,212,227,31,242,148,43,53,247,44,26,31,177,60,43,34,98,82,115,247,21,229,216,154,77,254,67,226,4,117,98,247,126,156,142,92,41,41,189,199,103,78,233,190,170,140,124,232,2,29,40,73,45,92,84,118,140,0,42,54,106,134,43,186,153,57,11,228,135,228,120,21,19,184,13,10,123,205,93,71,220,35,84,28,154,85,185,69,92,83,233,50,93,13,119,251,3,144,205,126,18,206,46,78,52,88,26,74,181,36,166,169,31,211,189,185,224,121,83,68,113,22,199,228,244,41,169,159,246,196,193,27,28,237,153,229,17,39,195,9,4,189,243,237,18,215,38,28,49,170,72,51,172,114,95,85,151,179,193,23,13,10,72,146,195,204,199,101,240,33,41,68,45,73,27,18,39,4,19,164,108,146,201,184,61,65,234,219,8,199,128,55,161,200,99,5,153,105,95,0,189,124,139,41,132,21,64,58,236,99,2,55,67,47,126,111,117,56,81,203,53,136,226,41,172,138,14,227,117,216,21,172,12,2,37,0,97,9,189,248,224,180,150,222,221,42,169,207,170,22,40,106,70,98,226,86,119,139,18,92,180,219,5,210,82,170,102,218,218,93,22,30,246,165,151,30,158,216,92,145,61,27,239,167,216,98,170,183,225,107,201,94,3,149,100,96,225,245,90,167,89,72,0,96,13,95,13,20,51,238,143,15,11,228,206,196,3,207,237,202,82,115,70,69,130,110,182,150,26,240,196,225,223,250,105,241,147,14,25,104,21,57,150,14,181,139,195,134,254,49,242,102,245,225,11,19,190,77,79,70,162,155,169,84,3,231,5,202,141,188,220,192,60,39,53,9,217,168,189,237,110,97,24,218,247,251,195,99,199,231,132,248,48,111,142,235,119,73,204,109,133,94,210,159,153,199,234,139,67,55,140,18,115,143,184,19,251,130,92,222,173,138,102,78,31,173,241,31,122,184,79,167,228,37,123,209,239,127,203,195,30,45,168,168,88,47,67,190,106,224,252,166,103,96,72,76,81,34,203,56,23,105,81,68,153,25,52,26,158,182,0,147,237,206,234,52,127,248,58,22,39,140,55,169,255,56,32,43,39,164,247,92,6,111,228,67,162,65,182,48,20,156,88,87,80,226,216,21,246,39,161,37,66,118,219,234,232,24,34,112,242,105,154,193,231,140,106,9,118,126,41,106,100,110,94,222,212,132,61,46,184,166,134,115,172,91,129,224,101,16,219,100,135,37,71,169,42,75,200,81,231,104,244,61,160,83,166,187,59,232,156,190,241,102,232,163,65,158,237,225,185,125,248,138,105,140,15,95,134,77,129,181,196,247,173,151,235,247,139,78,232,44,205,113,163,76,57,141,211,247,70,9,197,85,183,101,60,226,126,120,190,13,231,202,161,29,231,143,202,192,224,41,49,1,162,168,197,84,89,65,41,28,86,212,149,127,205,101,227,108,204,87,200,201,220,204,7,64,122,17,245,201,203,33,79,245,8,165,246,23,255,36,240,182,23,0,77,103,135,234,202,151,41,97,8,184,176,2,118,243,183,226,138,241,219,153,140,54,239,81,124,56,217,109,188,175,51,222,184,153,163,68,166,192,71,205,210,102,42,2,185,79,57,172,82,138,33,255,170,254,54,71,112,188,251,153,95,98,235,12,109,7,111,18,36,31,114,228,178,132,240,133,163,198,254,146,99,248,121,175,140,4,153,121,245,30,191,73,49,77,208,51,30,147,95,148,242,165,138,16,121,6,194,38,94,59,214,214,68,234,117,201,40,238,129,38,142,125,176,210,182,23,117,203,220,252,231,67,239,26,233,120,76,74,155,45,78,176,213,188,38,81,215,159,16,131,6,114,38,112,57,157,42,144,228,83,100,103,192,13,232,111,244,164,244,165,17,118,237,114,30,163,161,199,44,238,53,76,84,246,45,180,152,42,86,99,7,207,211,32,214,36,91,195,16,138,5,79,68,179,244,246,31,222,44,132,171,65,109,24,22,69,68,48,182,70,140,87,216,108,21,82,24,198,240,95,174,31,226,42,125,164,97,233,96,194,16,236,110,68,189,127,234,121,124,28,198,182,63,95,147,231,91,246,206,66,221,85,158,177,233,122,140,208,29,170,212,233,175,42,84,72,150,246,229,151,237,22,214,132,126,72,83,157,15,224,193,223,153,41,134,48,236,43,70,93,208,55,202,118,23,234,211,4,153,57,114,75,179,212,40,233,19,125,218,103,9,221,226,231,46,22,200,12,201,96,203,133,241,114,123,243,8,69,250,81,252,168,213,43,96,153,166,90,12,221,68,77,170,53,83,71,130,174,52,124,250,125,132,154,211,169,55,73,219,144,65,3,229,151,246,221,86,224,50,2,95,89,247,183,36,209,201,71,53,128,153,255,59,51,110,109,104,139,114,189,17,91,134,214,208,197,77,212,87,183,188,228,67,82,76,176,113,138,130,214,102,31,187,5,103,59,134,163,239,102,209,152,23,136,3,154,30,38,89,127,47,108,81,208,85,177,222,29,50,20,93,57,178,68,201,30,179,239,210,60,61,75,120,91,150,41,106,203,140,226,24,130,180,129,76,164,210,94,216,138,59,103,41,137,12,202,136,67,193,226,247,70,40,155,78,59,245,25,110,38,140,92,8,229,38,112,232,117,174,237,78,156,239,111,69,167,13,111,148,74,169,81,140,46,200,96,209,99,19,27,102,230,27,227,68,170,250,15,205,75,90,242,72,48,218,46,152,17,196,2,76,184,7,175,41,206,86,165,119,102,107,184,166,174,98,221,120,15,62,208,40,53,45,238,155,106,239,116,131,73,240,113,241,81,185,179,58,92,112,125,105,12,172,172,220,31,188,142,170,185,32,209,28,78,191,64,104,39,50,147,3,50,167,84,44,0,46,208,228,239,45,60,197,166,17,164,133,133,252,0,151,66,111,151,16,214,222,167,15,31,252,166,91,61,57,200,117,54,154,145,192,69,174,115,210,222,40,181,72,246,189,141,13,118,232,116,101,94,122,182,239,91,249,164,224,142,18,161,173,134,127,241,183,12,176,242,172,61,25,141,95,112,195,162,81,5,130,145,215,245,55,230,106,245,108,135,193,25,22,57,11,119,5,130,17,7,198,88,210,164,3,207,28,108,172,121,19,117,5,217,4,166,227,31,52,239,35,4,95,146,58,196,13,10,169,51,80,88,173,118,13,205,223,67,170,155,81,102,82,251,129,253,233,1,210,156,195,210,234,153,196,47,184,203,177,13,10,92,252,4,3,197,219,114,86,199,211,173,17,147,77,63,205,203,222,123,135,225,25,102,253,51,97,33,12,197,17,69,156,216,43,97,202,69,226,8,169,46,220,4,12,213,139,40,40,250,214,82,171,56,70,192,65,95,187,197,3,201,37,29,127,166,97,251,142,95,209,103,253,62,157,248,187,23,165,45,35,1,194,31,151,75,22,52,13,10,199,228,49,39,43,72,137,95,131,118,135,203,65,238,117,149,168,38,49,83,56,217,151,251,164,58,159,138,13,10,144,103,34,149,55,200,92,170,171,194,102,112,0,230,150,31,92,161,29,96,211,203,151,13,14,5,158,116,70,241,180,33,102,41,45,150,171,174,131,161,133,221,238,171,191,240,217,218,84,206,213,203,18,231,130,162,107,113,40,240,218,102,235,188,186,127,69,182,212,82,42,59,170,250,57,215,100,183,200,62,253,167,119,221,23,55,32,212,30,12,73,73,73,55,47,155,230,29,225,117,186,228,173,11,248,215,136,179,213,3,43,196,110,149,130,18,144,203,108,102,81,34,34,12,205,108,255,37,68,179,173,30,17,221,238,60,12,101,49,129,171,226,15,106,102,164,232,152,235,72,99,106,141,96,135,251,121,71,122,170,84,25,183,133,218,213,79,73,202,168,195,66,127,41,115,164,154,91,6,71,103,175,195,176,40,250,83,202,150,64,29,145,42,113,81,74,190,219,104,230,164,27,45,198,25,4,26,225,183,152,193,214,208,100,71,139,161,124,13,4,15,115,241,209,88,199,47,239,22,13,48,184,13,10,158,232,5,75,168,134,15,105,242,36,26,105,38,115,122,4,14,6,254,41,69,68,163,147,251,163,142,157,133,13,10,218,174,194,174,24,59,18,251,119,108,130,203,52,96,219,76,238,255,172,250,186,98,156,122,14,220,102,45,143,196,139,89,219,24,232,197,144,141,73,19,89,169,193,218,190,20,24,180,105,120,146,76,208,2,143,30,25,57,153,4,115,127,65,173,141,225,13,66,20,208,93,106,77,180,133,203,252,244,223,9,33,228,230,41,171,131,74,105,92,49,123,121,27,170,249,2,236,89,35,27,133,110,62,100,104,104,206,19,251,213,204,65,182,253,243,228,217,24,160,46,250,162,13,10,171,125,82,106,4,237,203,46,179,136,162,204,188,238,219,157,11,13,241,52,62,24,49,127,70,166,5,76,43,187,20,32,26,146,175,188,69,44,118,15,22,225,44,249,76,138,144,31,80,241,38,62,1,147,8,197,170,210,70,202,100,87,11,18,32,50,148,139,188,254,17,82,147,124,44,50,183,100,247,139,194,72,23,74,114,167,6,252,231,72,126,230,198,5,212,142,175,194,41,201,32,96,119,163,240,254,8,104,173,95,237,171,154,155,7,167,215,217,115,253,170,184,145,80,154,140,140,60,185,134,43,191,224,76,208,195,80,93,243,234,138,75,81,152,23,5,179,143,245,3,171,193,127,216,130,48,191,36,47,215,55,49,75,157,123,97,57,137,67,141,158,15,113,213,203,236,119,241,217,58,81,125,159,224,142,13,10,161,56,211,170,85,194,50,244,147,204,193,241,62,196,95,46,7,91,179,169,95,13,74,50,213,221,33,118,160,107,203,204,250,141,15,242,226,32,13,10,214,242,203,145,211,37,238,72,64,174,74,39,200,112,158,236,237,229,104,44,15,213,217,77,87,7,144,227,4,185,180,251,255,8,133,45,152,149,247,250,160,70,79,98,94,125,81,243,251,84,36,238,37,232,157,163,57,54,222,95,49,61,19,243,165,197,101,227,62,222,135,178,44,173,33,30,181,139,112,246,113,245,168,196,115,161,88,152,239,61,53,192,212,150,198,43,1,221,161,150,57,153,211,19,180,117,219,232,170,136,138,77,102,207,225,175,156,134,112,125,134,38,122,177,143,191,237,230,136,72,187,185,221,90,246,165,129,123,85,148,198,167,77,174,28,184,62,190,214,22,247,189,228,164,60,106,56,17,167,240,182,255,204,8,137,77,17,143,83,130,141,92,85,6,14,176,172,253,129,140,249,145,121,106,148,57,247,51,148,130,201,37,148,106,94,93,123,85,236,124,159,15,49,222,136,202,242,6,134,255,39,65,94,184,48,34,199,183,41,159,35,206,191,52,167,102,164,191,132,45,230,193,19,195,157,183,17,166,41,30,230,106,188,66,228,2,29,252,67,217,26,236,58,236,86,255,164,143,233,213,85,217,196,53,238,54,53,51,254,33,149,17,27,148,131,234,234,206,150,40,27,131,150,47,163,247,224,197,122,44,60,249,85,221,216,119,74,38,62,230,27,45,67,173,151,176,204,88,212,101,123,194,122,239,118,114,21,207,229,201,247,168,125,249,212,57,206,207,97,36,186,242,110,97,158,125,122,13,10,255,182,120,223,110,179,214,99,188,159,119,170,205,117,250,186,208,180,22,34,195,213,172,154,120,164,50,89,87,21,95,54,201,219,226,209,223,168,27,240,225,30,5,18,151,139,200,231,77,48,183,63,201,251,120,53,57,161,193,50,27,137,59,79,249,120,112,132,24,82,128,150,123,45,45,247,38,144,51,153,148,86,59,138,189,55,31,251,184,50,60,65,5,211,4,186,13,10,24,69,104,221,31,50,216,138,165,103,36,40,101,53,195,49,130,251,89,131,15,136,226,216,120,130,43,28,2,2,179,211,79,167,13,10,21,37,229,240,107,176,136,68,171,229,78,152,202,48,79,175,220,109,201,82,40,113,235,94,108,131,132,118,207,92,21,164,60,105,77,122,194,107,4,248,192,222,175,127,12,176,228,75,4,72,233,88,227,19,116,222,159,229,57,117,48,237,112,14,120,224,158,222,171,166,208,6,181,232,37,102,195,153,175,221,117,78,226,99,142,204,13,10,47,89,161,85,122,8,69,2,255,239,220,183,233,179,42,201,142,178,117,0,56,186,229,72,125,194,85,215,100,97,39,63,163,112,139,138,26,240,57,122,44,152,95,69,162,106,243,49,40,110,39,219,193,229,98,76,126,178,125,135,169,74,139,188,94,42,103,247,142,155,32,44,34,152,238,57,15,140,195,88,29,64,127,85,93,38,153,232,39,5,137,64,209,193,198,154,230,114,9,211,84,218,3,34,135,245,86,104,251,96,52,245,185,105,25,254,54,31,230,135,14,242,76,145,74,106,30,152,201,177,189,199,69,199,28,229,214,17,30,103,205,213,184,9,184,247,137,21,27,175,58,32,142,148,156,140,127,105,187,189,91,221,162,149,142,68,77,150,7,70,191,149,95,251,188,130,232,135,36,229,74,11,187,78,134,8,94,7,157,96,71,43,125,158,46,56,181,130,6,215,235,50,191,84,89,0,91,162,131,154,0,124,196,29,65,192,25,113,63,23,177,226,9,218,154,44,204,172,88,169,176,227,155,189,186,28,14,74,160,234,18,52,155,100,39,30,150,95,208,181,245,212,153,85,3,78,99,86,69,231,109,206,245,33,202,207,104,223,76,160,101,87,208,144,6,153,197,44,163,40,111,104,34,21,129,31,234,140,142,117,105,189,232,83,3,62,22,91,241,103,15,27,24,25,136,218,153,98,98,187,3,38,239,149,145,188,205,180,212,128,118,134,69,29,88,66,215,167,157,94,95,81,4,82,140,137,23,142,40,106,65,21,185,236,221,54,204,59,26,8,243,28,84,162,148,48,39,222,1,20,238,53,208,150,55,156,22,151,255,96,51,97,85,116,28,180,102,155,60,164,28,110,173,37,143,125,41,234,59,76,147,37,17,246,151,238,218,34,185,12,0,14,213,223,129,112,240,225,137,177,16,19,227,133,41,83,194,250,47,178,25,7,197,225,155,131,67,254,67,82,159,114,25,254,207,168,180,167,187,62,1,252,116,235,45,193,72,148,14,51,45,31,83,244,247,34,108,120,177,88,202,223,130,215,86,178,30,150,113,141,183,123,167,172,163,31,213,39,157,25,177,207,64,105,12,243,247,163,98,70,17,186,180,167,176,238,119,180,227,13,10,16,155,188,21,73,208,166,249,182,247,54,63,115,34,106,209,155,146,149,130,76,21,35,168,202,14,253,135,140,223,129,232,223,100,21,109,127,95,6,135,48,235,48,74,190,225,52,74,159,141,54,109,5,64,233,19,216,247,158,157,168,4,77,233,0,102,166,57,121,111,230,37,105,199,138,213,229,45,167,133,59,92,210,81,115,127,206,209,225,126,117,115,181,52,26,230,146,126,243,139,181,122,132,55,12,202,165,6,191,150,86,234,0,199,214,90,252,106,124,98,83,66,243,105,189,147,39,69,253,78,194,90,90,251,87,201,188,12,140,130,222,142,158,115,144,177,96,100,239,255,189,21,29,158,22,159,66,187,245,236,157,245,44,248,130,137,234,157,130,154,41,165,97,176,60,203,20,188,106,12,198,39,124,213,53,36,233,76,13,10,161,115,212,183,45,62,210,253,125,125,199,162,91,124,185,183,104,49,11,136,90,153,72,3,55,206,44,17,254,144,61,127,197,181,147,118,201,61,108,22,157,37,185,232,162,206,200,181,217,113,247,127,0,41,182,29,54,217,196,106,95,234,125,73,255,224,50,12,59,131,245,167,221,164,142,228,165,225,87,33,247,120,18,197,246,24,120,70,112,201,45,114,54,205,29,25,36,143,200,201,14,108,11,200,118,161,217,227,181,56,87,253,62,231,121,15,72,110,126,196,221,61,169,68,150,125,98,247,232,215,6,169,246,235,255,134,179,138,83,0,223,111,84,68,20,137,120,69,51,81,191,141,35,2,21,211,82,87,187,84,167,2,239,235,180,186,144,245,60,209,52,105,9,50,158,146,224,100,113,2,89,255,138,51,241,169,204,165,174,91,253,234,98,135,101,57,192,170,121,178,219,217,95,11,128,172,81,132,46,223,172,139,166,199,154,169,240,145,65,19,202,41,86,83,132,87,27,136,90,237,159,241,226,223,59,221,102,117,20,167,142,226,107,89,249,98,97,182,38,139,122,251,36,93,230,238,147,9,67,195,213,44,35,142,187,109,239,143,103,119,220,152,64,208,194,32,174,129,117,92,116,44,60,244,47,108,243,195,58,44,106,79,171,202,1,234,18,195,123,44,216,153,206,120,14,67,69,146,242,60,127,233,111,135,138,165,241,150,217,167,11,179,213,68,36,122,95,41,80,66,132,33,129,215,143,29,213,138,240,157,153,210,95,70,71,191,239,89,225,51,212,37,122,166,137,189,207,36,133,50,85,110,106,76,253,245,88,191,193,175,141,9,145,136,154,214,29,139,161,13,165,118,209,54,107,228,246,176,32,56,153,249,160,47,171,52,233,33,233,167,176,156,45,6,248,198,96,11,159,252,177,135,217,92,31,172,247,61,30,205,178,139,212,245,20,59,172,174,94,25,61,192,209,150,225,106,178,228,211,22,138,118,36,222,152,142,27,37,229,100,6,241,43,104,70,198,109,126,224,119,30,113,190,120,226,171,166,55,54,77,247,116,249,27,212,62,102,8,53,155,133,64,189,242,46,40,195,75,174,129,174,91,254,80,215,84,85,60,182,133,138,140,47,183,223,232,64,66,27,112,43,153,242,43,34,20,85,210,138,197,95,43,139,1,229,198,237,137,125,66,254,69,163,109,57,111,43,38,63,229,22,99,248,152,253,116,118,48,222,161,52,215,88,149,77,82,164,78,54,199,67,220,213,131,31,115,42,35,212,170,244,154,207,107,203,179,136,74,33,6,60,240,160,7,226,81,107,250,113,104,62,52,179,97,212,69,111,83,83,231,44,29,183,198,147,201,208,53,122,232,23,154,100,79,47,55,61,92,118,63,94,108,140,139,72,114,136,251,131,119,17,39,132,252,80,179,30,57,221,93,105,209,74,168,147,181,85,52,55,76,236,246,25,169,139,71,238,248,28,140,210,11,211,177,131,134,84,243,8,252,175,148,80,79,213,253,142,147,240,122,71,96,193,130,101,17,69,119,137,144,18,46,42,250,123,86,35,6,30,195,244,215,217,240,97,242,183,167,160,154,60,205,195,60,177,96,32,147,54,154,207,241,235,28,109,253,115,223,214,122,74,169,120,186,27,164,150,188,23,239,223,231,168,245,51,72,108,59,105,223,1,188,90,32,35,2,53,69,79,60,65,176,88,77,40,246,232,160,25,219,76,199,141,93,220,93,157,138,134,123,125,191,62,57,247,172,104,202,85,164,13,154,5,226,227,133,131,92,136,130,136,194,76,217,252,81,173,34,80,73,49,34,224,48,38,85,196,99,205,126,17,136,181,8,19,135,196,103,75,241,110,221,44,31,30,73,178,104,153,219,94,26,76,177,191,106,254,20,221,36,64,8,119,248,200,101,123,164,211,34,124,118,124,25,113,189,51,239,112,71,44,37,66,182,1,72,252,74,227,16,53,36,11,245,120,227,186,76,232,164,121,254,180,171,45,6,202,99,248,184,12,176,181,146,178,230,151,125,176,43,210,217,248,19,53,241,63,128,63,92,92,174,66,2,54,232,197,193,29,196,214,124,33,12,242,105,75,71,231,215,27,71,194,156,40,0,97,185,202,46,79,216,163,3,186,18,174,248,21,80,59,103,149,95,98,191,205,123,42,46,164,227,31,121,153,135,189,173,93,2,139,41,235,29,145,191,137,74,140,199,244,117,29,21,209,31,128,196,12,14,170,56,175,90,156,246,157,137,66,162,19,82,227,101,124,54,87,217,43,64,152,94,220,30,191,168,7,197,40,90,116,196,125,253,255,121,196,26,170,34,130,110,192,22,30,58,78,98,73,102,79,123,127,82,22,29,14,212,99,12,164,207,221,109,104,254,43,75,122,77,100,215,5,27,44,18,205,14,77,174,15,102,147,45,120,129,214,1,251,98,243,238,172,85,46,101,76,45,229,189,175,101,23,142,250,193,217,29,218,223,67,152,11,26,35,213,195,181,211,138,57,17,85,72,183,18,75,139,197,252,143,69,225,95,50,245,6,239,13,125,207,69,201,61,41,37,130,145,51,167,50,168,88,205,111,38,163,84,106,97,59,193,2,74,141,49,39,110,82,147,34,216,7,91,252,158,151,4,21,148,15,150,239,155,225,20,170,60,151,252,192,138,110,103,151,26,104,84,244,207,223,143,107,67,168,217,252,229,60,222,170,129,172,111,151,163,84,95,145,136,89,109,120,182,163,52,118,223,184,56,253,108,79,167,133,116,114,3,19,61,69,24,174,224,12,24,74,224,253,245,219,133,3,38,173,159,220,219,36,75,180,246,89,182,110,51,25,51,79,89,234,32,136,228,149,116,119,165,222,252,162,212,165,250,62,55,251,254,209,56,69,0,120,78,8,255,162,245,170,65,119,149,161,210,254,84,130,46,16,203,40,69,21,182,243,148,231,104,31,217,17,81,11,214,142,250,34,149,121,48,96,134,37,119,90,100,164,141,12,36,146,190,179,235,254,47,133,187,110,190,74,94,64,159,199,241,74,152,249,35,147,6,197,235,62,109,4,215,65,191,61,252,71,139,208,60,207,255,248,72,224,237,24,228,123,236,182,197,92,57,164,102,34,131,243,196,226,223,183,108,174,241,108,79,171,137,68,193,255,98,67,226,39,21,175,11,77,226,253,106,68,46,165,106,92,136,166,185,60,54,235,229,34,181,196,96,20,188,3,232,97,103,72,29,89,155,195,254,238,5,100,160,144,228,53,113,176,219,224,150,17,72,45,105,162,80,98,109,203,144,150,104,241,69,249,182,38,249,167,144,127,74,23,120,232,172,6,106,245,185,238,2,81,114,145,119,38,204,244,22,75,30,12,126,124,148,227,183,223,133,22,199,139,28,114,246,253,87,202,13,10,237,14,65,159,44,93,209,255,36,244,116,56,192,224,71,62,223,155,95,207,39,124,132,213,0,164,255,5,85,102,238,126,203,245,112,114,98,253,205,60,122,40,241,208,74,67,51,55,75,97,8,197,64,198,74,12,199,115,204,144,213,136,59,122,219,190,6,104,163,142,165,124,210,41,46,201,38,2,207,74,13,10,112,202,123,253,219,149,93,113,192,42,161,46,255,180,195,101,247,175,133,242,227,121,178,165,232,11,207,101,60,253,231,21,199,219,47,185,143,60,211,175,114,169,77,231,171,152,159,45,56,68,26,137,57,52,211,150,194,164,24,153,138,15,81,90,162,105,20,68,126,58,156,2,94,129,105,113,125,204,99,252,135,139,62,130,95,175,125,161,101,102,39,81,224,129,19,4,236,193,167,199,63,248,6,56,13,172,93,97,97,19,136,243,125,122,146,221,161,197,53,163,54,90,130,34,127,153,158,63,61,222,139,189,114,165,35,43,51,50,224,203,39,83,18,205,40,244,200,64,201,93,230,54,110,2,129,112,40,120,44,230,238,124,86,160,4,214,222,74,39,134,6,15,203,107,109,5,175,221,199,67,194,16,246,240,69,134,3,56,44,27,232,62,97,233,160,56,53,194,246,187,161,164,118,5,100,99,91,232,153,247,91,210,59,246,246,54,55,27,210,35,139,114,51,18,32,21,111,218,240,165,217,50,210,72,41,234,5,75,107,121,16,167,56,192,60,35,29,29,188,156,175,1,101,212,9,26,49,53,13,162,117,151,105,36,248,60,180,24,126,97,137,23,181,111,217,184,129,187,37,168,215,248,116,27,64,122,137,171,38,113,157,178,87,217,230,182,12,60,37,135,140,88,150,9,77,255,197,136,145,252,124,163,234,234,106,228,135,108,227,107,61,50,130,196,209,218,179,115,83,76,38,17,4,210,53,202,148,192,138,157,170,3,149,64,101,15,187,151,186,97,213,217,7,36,75,224,182,174,26,226,195,21,252,122,19,253,25,73,96,146,46,93,84,200,82,142,138,230,101,30,155,54,215,38,106,201,5,138,233,126,224,175,91,39,180,192,69,174,196,210,190,215,196,44,171,145,78,16,104,204,133,56,134,26,236,238,98,67,179,211,143,96,174,9,205,101,93,160,90,43,203,26,21,249,20,164,184,25,209,225,115,196,171,248,210,95,63,41,180,92,75,205,205,203,255,62,36,173,215,231,106,234,134,103,95,216,232,119,73,72,161,98,93,189,94,229,254,192,213,18,222,159,44,167,233,27,151,175,223,74,75,242,66,73,155,109,143,4,118,107,11,142,117,34,207,136,72,164,188,190,56,44,57,203,179,191,57,62,241,3,71,241,138,46,109,250,166,132,46,49,203,158,238,228,25,199,98,222,191,202,244,156,215,191,88,116,249,146,167,135,3,8,23,233,218,153,129,176,217,14,205,197,56,235,177,129,43,136,201,107,110,147,179,80,179,39,234,93,115,120,135,122,172,157,113,41,193,80,197,113,236,221,72,8,240,36,121,187,252,135,241,223,128,223,134,237,107,87,51,57,182,155,205,236,36,251,157,249,60,135,26,106,171,143,162,54,179,211,154,186,161,64,67,33,217,3,41,113,73,146,56,153,223,180,71,2,27,149,16,66,4,65,185,253,138,232,158,38,103,68,29,118,112,180,6,20,57,207,216,118,125,48,210,210,152,234,21,193,171,45,215,178,95,165,20,186,185,247,20,23,108,138,229,162,4,187,22,124,219,51,91,19,42,53,246,189,20,183,15,253,112,49,206,188,126,24,9,36,242,79,197,65,113,153,207,33,30,232,230,165,94,9,74,251,86,55,51,78,141,66,22,141,160,219,205,163,178,83,54,112,89,136,201,41,239,230,138,86,255,219,21,110,172,49,12,206,13,6,125,198,181,100,99,74,113,214,203,214,249,202,159,134,143,210,174,136,119,141,42,197,42,231,141,219,183,250,156,147,157,186,137,125,61,205,224,172,246,224,77,89,101,61,242,43,203,112,249,251,252,254,193,238,112,62,146,59,7,224,212,19,112,196,228,207,112,255,99,248,199,156,92,100,56,248,103,37,165,14,73,227,238,225,134,135,234,50,78,101,29,171,173,2,46,138,120,60,76,16,207,132,240,171,72,46,92,151,125,72,128,188,153,173,255,28,138,76,94,158,100,63,245,81,40,195,6,203,22,235,157,35,199,191,253,25,213,94,245,154,111,54,8,222,173,157,183,220,57,49,196,135,113,185,172,85,54,142,95,138,133,126,109,92,17,141,226,109,26,31,56,58,138,91,185,162,164,180,192,149,140,4,55,252,150,242,100,173,54,209,160,172,195,117,0,192,173,114,234,134,51,14,119,200,81,138,116,222,117,238,220,15,56,52,240,56,96,226,194,97,105,184,192,39,82,220,197,130,75,2,135,101,37,80,38,80,107,45,255,236,13,10,21,120,205,197,95,21,212,113,198,72,28,8,167,87,234,85,104,99,82,210,167,182,156,62,239,87,198,48,241,46,155,42,255,57,134,113,36,13,194,22,162,156,94,193,125,68,224,95,26,141,222,144,118,222,146,69,110,150,156,128,85,184,90,60,4,4,19,101,236,53,215,159,44,5,171,208,117,241,78,178,110,238,71,141,239,243,209,47,207,153,55,221,57,1,213,9,182,149,248,193,250,89,13,151,125,120,219,132,178,132,149,98,196,96,101,152,66,167,185,15,139,33,194,204,39,214,66,88,104,114,196,155,83,77,41,155,63,183,225,77,112,168,104,19,131,113,85,15,158,2,26,116,210,166,224,246,125,144,213,62,196,8,80,44,64,216,220,81,234,171,190,134,251,245,87,42,42,127,18,27,234,153,190,11,0,69,210,197,22,209,12,155,235,129,62,22,244,64,130,90,119,212,222,222,44,139,73,196,172,91,113,193,30,189,143,143,196,205,115,166,46,71,247,235,33,47,240,87,34,129,180,39,150,51,47,112,114,141,146,5,206,56,87,12,150,189,137,179,242,163,237,244,152,202,131,163,122,203,64,39,181,97,222,40,186,55,185,25,157,4,165,110,20,113,108,235,74,70,51,0,118,55,178,22,185,246,186,42,78,202,138,45,224,205,99,255,9,68,220,99,5,155,239,239,13,251,83,164,142,246,47,84,241,91,192,53,83,86,120,121,35,237,114,154,120,45,150,43,77,120,35,93,232,220,179,24,146,99,143,81,0,15,137,129,184,107,251,216,83,178,137,41,248,150,160,83,11,114,240,117,204,11,250,199,153,99,31,46,81,244,116,172,47,152,230,226,250,184,156,43,56,144,0,121,19,187,152,65,150,155,68,237,118,212,232,136,217,179,217,132,29,250,197,212,20,89,219,231,35,55,69,187,78,121,252,34,253,126,70,102,1,21,62,254,60,215,112,13,10,168,106,202,208,123,6,146,206,170,107,0,178,13,118,140,94,96,82,137,76,89,21,96,126,156,188,73,248,254,79,111,60,51,4,95,180,240,236,32,163,201,72,175,40,232,15,182,127,55,156,204,27,208,25,179,57,83,33,145,205,184,3,202,150,118,151,126,217,202,1,187,3,149,83,72,23,95,140,170,149,160,113,67,39,213,155,130,68,77,242,42,196,238,143,80,73,201,20,115,242,38,212,242,124,228,2,187,234,111,64,108,242,24,114,177,91,25,175,108,12,219,121,143,128,105,148,236,26,169,5,102,55,177,57,18,239,250,8,220,1,91,182,127,60,167,164,200,44,94,52,211,157,136,205,213,40,124,48,68,186,149,242,247,95,107,109,185,241,214,13,10,65,250,144,52,217,27,217,203,236,252,124,231,215,111,64,72,32,111,95,171,9,1,247,205,214,57,237,6,140,200,43,225,124,53,246,219,184,216,89,149,166,63,246,158,82,188,13,10,1,38,22,98,21,62,195,64,253,64,39,234,173,91,27,129,31,173,158,22,102,57,24,228,110,152,59,2,163,173,151,238,84,60,71,84,249,233,182,35,130,149,230,71,127,14,129,51,250,18,54,11,95,229,173,176,56,151,120,244,48,12,17,162,111,228,201,186,198,226,52,173,38,248,85,188,162,139,73,163,189,149,192,117,133,135,233,143,177,35,193,200,15,130,87,63,180,88,62,87,139,246,89,158,121,169,9,15,53,190,44,159,222,65,14,191,240,94,167,97,32,199,213,43,60,71,105,2,100,225,221,39,107,106,176,138,191,82,179,11,145,115,91,60,132,101,145,21,191,239,139,136,193,42,125,209,187,8,152,252,29,87,130,237,217,243,113,55,154,140,151,150,207,54,22,169,49,147,160,97,82,221,60,141,166,239,253,3,56,110,88,11,128,17,210,222,61,183,4,88,217,87,236,208,162,219,66,112,88,252,128,82,32,40,199,210,3,144,73,19,176,230,61,38,214,15,196,42,44,30,156,83,180,27,178,6,179,36,18,19,71,198,252,85,233,147,144,134,207,38,179,222,25,51,192,88,106,188,22,107,249,243,18,117,71,4,100,93,77,41,223,239,151,141,138,179,65,30,178,149,197,0,68,109,62,42,98,214,115,139,27,74,159,32,238,107,58,124,28,6,65,181,80,45,82,162,141,149,221,7,218,143,200,235,150,162,52,86,95,176,185,216,44,187,38,52,80,249,41,201,21,93,61,41,174,42,117,235,232,147,209,235,116,182,240,98,143,91,202,76,144,167,221,148,61,176,233,155,23,138,13,131,82,72,0,179,97,13,101,20,117,144,89,131,232,79,89,5,244,155,14,241,45,136,12,238,34,46,145,59,91,165,27,197,83,42,250,114,47,142,249,37,76,73,247,246,47,116,77,88,11,251,222,225,125,64,255,154,4,172,43,246,64,22,212,103,58,69,56,166,110,82,35,139,79,76,29,55,172,148,241,246,92,123,237,162,70,138,16,176,223,163,33,177,140,132,227,120,205,210,85,92,69,61,98,201,44,66,147,186,13,10,237,103,51,170,252,173,251,72,141,251,229,69,222,145,228,18,200,161,173,4,217,89,199,82,98,233,42,55,196,209,187,72,220,220,164,200,246,217,251,7,169,24,11,111,156,86,239,169,173,154,185,254,72,237,97,213,156,90,75,15,194,132,53,29,67,158,126,80,62,146,53,163,8,99,64,143,165,169,154,170,105,60,184,174,187,166,235,132,118,0,146,52,190,145,76,226,53,188,32,109,9,50,0,211,89,55,67,234,233,219,64,246,57,234,177,111,211,167,208,73,0,95,191,147,134,150,148,141,130,188,37,103,76,105,209,215,237,208,182,213,20,56,24,60,48,118,156,163,16,78,179,120,184,43,203,94,96,93,30,6,90,17,225,120,146,224,163,46,176,127,169,116,211,198,247,12,11,101,115,132,174,131,159,116,198,34,101,110,251,211,135,138,122,255,26,1,162,147,62,71,243,102,149,59,210,135,115,135,140,108,153,159,57,171,178,112,72,229,57,112,165,200,138,19,124,117,228,156,145,165,51,22,197,249,4,68,100,228,12,30,235,62,186,53,118,42,73,13,10,63,254,143,200,134,210,153,233,236,252,254,85,61,191,51,73,19,179,14,3,229,191,189,61,224,98,7,191,71,205,170,234,76,252,129,71,187,250,21,77,98,149,189,70,175,104,173,41,139,92,2,251,5,105,182,202,82,19,97,66,124,85,212,86,255,109,128,131,65,127,59,179,238,136,58,149,125,208,228,83,168,137,211,137,189,245,116,81,107,225,71,73,156,176,45,157,118,11,98,221,228,238,235,112,167,253,193,35,56,171,208,29,112,156,205,37,111,250,95,98,167,244,170,109,60,127,35,93,174,39,101,83,218,100,153,49,71,181,184,111,98,196,115,208,211,237,20,136,62,208,222,116,241,198,35,243,230,36,157,106,241,87,29,193,119,210,126,44,31,11,255,126,217,220,206,143,203,211,123,234,133,1,174,166,198,215,178,89,66,11,223,184,4,227,191,164,227,57,112,141,25,252,167,72,216,237,132,5,4,57,186,127,90,8,141,164,128,47,220,70,185,90,153,149,158,149,241,132,7,171,226,57,112,26,111,186,125,110,32,148,100,28,80,157,166,111,229,86,116,122,33,176,215,62,62,126,21,123,164,1,130,149,238,230,131,208,251,219,253,82,67,126,245,129,176,14,242,221,88,38,97,164,169,155,2,246,104,92,177,131,172,128,31,3,142,50,55,235,34,249,80,140,84,179,78,6,161,170,253,180,252,106,221,172,81,16,210,86,157,73,33,239,139,67,198,206,54,62,100,41,81,186,223,0,173,1,181,109,38,44,176,121,110,107,195,80,15,183,96,172,225,231,201,254,68,214,129,108,132,6,59,122,255,14,160,77,145,141,4,141,193,147,252,7,186,211,187,142,122,23,143,135,32,182,138,128,2,126,159,242,254,75,248,246,1,222,72,180,200,99,174,106,15,92,201,252,164,97,79,180,135,160,215,228,44,193,126,196,41,225,9,76,6,113,138,76,1,197,50,205,8,80,62,237,53,190,242,168,60,134,232,90,142,116,203,147,100,160,29,122,165,26,249,167,173,89,233,59,120,227,209,25,228,0,237,70,198,8,199,30,51,250,205,41,228,36,18,54,38,181,53,167,236,135,207,44,18,209,150,227,120,152,103,50,200,148,129,216,143,20,252,249,80,125,205,80,131,65,16,192,113,182,136,96,9,14,18,140,181,37,234,195,181,25,194,25,29,204,125,57,213,135,229,111,179,58,198,187,35,18,235,33,125,8,189,249,201,235,52,206,145,13,10,7,71,112,49,212,237,200,34,110,113,66,31,106,233,11,252,67,199,57,137,40,220,47,223,98,165,72,50,76,153,231,64,181,129,92,186,201,21,127,47,91,81,164,106,28,246,236,182,160,55,83,231,253,73,203,74,4,229,232,171,25,196,172,47,181,6,24,189,159,20,23,250,243,66,37,82,58,106,249,249,178,62,249,130,131,28,95,25,70,70,7,149,224,181,151,11,56,59,248,173,222,176,69,197,78,156,89,63,94,31,157,170,239,125,197,139,218,40,25,32,159,5,174,172,79,242,52,227,191,71,236,95,73,108,117,50,36,23,169,109,227,183,12,80,150,147,45,208,2,99,132,195,209,82,96,68,98,146,186,122,12,197,112,162,154,107,49,183,163,117,150,219,1,94,192,132,107,253,13,10,102,76,218,3,41,232,164,82,36,28,188,116,67,180,207,203,236,72,185,74,31,178,186,209,7,50,104,175,211,35,27,178,26,195,118,2,219,245,101,55,128,33,94,65,8,226,212,247,22,75,18,231,72,36,57,115,115,196,5,24,72,136,103,53,115,177,242,38,61,187,205,192,124,234,219,45,34,2,161,138,208,54,82,240,53,95,171,240,223,8,195,2,120,73,98,144,48,111,147,190,126,66,246,99,181,30,79,15,126,73,211,41,35,112,201,43,69,187,183,102,7,72,205,173,100,27,28,45,36,189,195,61,221,146,114,200,188,108,76,128,253,177,214,71,106,166,161,125,14,53,180,62,247,211,251,199,130,143,2,9,214,248,59,4,175,29,243,80,206,16,163,175,132,133,91,185,13,10,47,222,198,15,121,109,90,32,238,225,179,35,237,253,227,214,153,80,206,144,137,65,132,36,109,206,41,73,156,62,135,239,253,86,48,170,190,20,66,226,57,159,3,147,242,27,235,150,112,139,108,240,182,178,7,228,114,115,187,227,3,163,80,36,207,73,137,147,40,200,113,145,191,191,255,239,149,0,97,27,235,238,219,39,147,59,31,83,214,188,128,94,215,195,39,31,233,77,204,127,250,159,47,83,129,12,211,208,137,73,213,171,11,20,74,143,172,83,59,163,238,114,188,226,190,92,216,128,52,198,48,60,125,50,63,239,36,50,237,201,71,202,212,175,107,28,56,190,155,209,72,202,202,18,50,63,102,235,87,195,9,108,114,248,38,142,116,108,255,212,239,128,223,94,203,207,82,45,133,170,65,22,111,221,237,254,141,132,60,178,91,153,117,144,139,93,231,196,218,184,255,247,185,139,140,36,236,30,132,119,18,112,234,135,123,42,94,220,225,85,57,104,89,145,151,25,34,245,4,4,177,75,191,16,230,98,100,253,130,7,207,5,12,124,3,17,211,135,198,43,120,170,172,43,150,157,49,95,74,121,99,167,159,142,114,79,94,250,1,144,37,231,121,14,106,92,144,43,125,168,87,67,142,132,169,191,246,121,64,157,237,245,164,160,246,112,174,69,54,240,80,35,169,225,60,113,151,140,167,4,144,112,108,172,19,215,144,237,68,129,235,189,137,82,247,89,160,56,216,33,189,0,39,224,87,131,119,84,186,203,184,56,238,205,247,129,41,154,44,52,158,52,87,139,3,34,80,132,44,179,127,55,38,166,123,188,138,140,34,146,98,236,192,205,243,117,239,116,105,189,133,50,123,135,53,85,15,148,44,197,92,230,121,160,175,7,129,38,84,11,210,212,249,88,23,7,230,126,175,228,161,235,205,226,74,42,208,101,53,206,0,31,183,210,229,245,156,46,107,142,59,177,110,178,200,99,219,186,94,120,28,128,229,200,15,217,210,231,173,93,17,232,9,184,66,241,52,80,244,7,92,89,100,143,79,89,225,181,184,209,51,189,40,236,22,211,43,98,48,207,98,110,77,140,118,241,228,105,116,112,58,187,25,52,211,114,13,10,155,22,173,117,43,52,192,21,92,36,18,227,176,180,233,23,207,81,17,192,169,134,195,97,189,231,103,198,38,45,138,182,82,12,127,84,12,117,194,201,43,19,79,29,253,208,128,125,59,255,245,103,78,55,108,228,81,60,161,73,187,213,61,14,193,9,210,168,183,236,226,246,205,118,233,176,122,36,155,254,129,203,26,240,18,222,69,115,55,120,106,126,168,133,55,69,224,1,227,160,122,164,31,180,207,45,13,194,154,119,158,233,222,214,61,241,37,29,238,116,138,105,215,21,150,225,254,181,8,45,20,4,78,59,116,174,219,194,239,122,40,140,103,30,122,123,124,67,224,216,243,172,199,101,5,135,88,85,222,188,235,125,237,153,34,115,202,116,28,187,112,115,201,254,97,130,134,92,173,151,26,113,150,97,1,52,195,20,130,111,47,18,204,79,40,53,242,105,206,199,184,160,70,219,199,86,139,44,188,86,206,192,128,149,252,119,26,155,9,58,77,189,59,110,126,113,177,174,24,59,181,66,139,223,1,129,147,234,98,169,154,216,173,245,129,187,96,41,88,116,203,234,20,222,8,249,169,216,108,94,252,73,170,48,172,186,192,127,99,123,44,26,2,41,120,56,61,6,62,18,241,127,164,162,15,24,20,15,245,101,8,139,225,113,75,193,151,1,161,81,102,222,50,66,154,181,5,144,59,165,46,30,240,114,163,4,209,68,135,85,206,0,220,112,130,223,125,153,6,53,87,76,154,91,102,218,173,13,10,69,96,89,3,215,49,121,224,237,158,38,48,244,56,97,226,35,84,234,22,65,140,236,223,220,160,82,1,226,247,90,182,247,179,234,227,54,196,235,247,227,133,28,192,151,226,16,91,234,237,33,17,68,77,233,131,198,184,47,17,179,47,221,97,234,180,83,49,247,235,193,249,60,239,49,242,35,252,230,163,73,216,150,150,81,171,98,122,72,19,20,251,162,163,170,149,3,39,37,127,143,80,230,158,26,32,148,56,22,239,65,34,90,225,183,104,17,197,175,136,151,108,75,78,2,116,180,58,88,246,58,39,234,137,88,163,245,216,117,68,140,181,122,187,235,72,89,102,138,17,81,8,151,104,97,1,84,42,8,48,172,49,240,118,197,237,102,38,236,217,238,208,74,211,231,98,233,49,140,123,171,7,173,50,4,131,31,87,180,241,13,238,237,8,149,226,70,104,170,220,190,186,146,87,241,236,65,145,17,231,37,127,202,9,141,60,168,154,29,237,22,9,77,16,35,27,188,220,175,172,17,102,192,138,112,7,116,151,72,232,196,245,0,185,184,123,132,232,17,112,66,87,90,91,13,80,101,35,85,223,108,198,28,210,199,133,177,198,129,29,178,233,185,183,180,114,102,180,161,8,75,225,243,247,209,136,251,217,73,76,236,81,22,250,98,124,128,105,149,1,19,247,9,9,54,241,13,227,215,29,225,183,13,10,252,86,182,30,226,69,239,114,120,134,11,100,17,50,51,168,167,129,122,12,162,62,95,8,55,12,212,133,72,228,117,116,120,176,87,160,174,89,233,206,129,164,237,127,243,172,61,33,23,53,76,176,169,134,35,112,93,234,250,216,156,224,197,181,25,103,118,203,93,67,121,32,187,92,114,168,167,24,174,98,155,37,226,83,199,85,1,85,84,32,98,20,128,175,162,185,27,117,110,150,124,127,36,227,0,84,98,205,20,150,251,88,243,74,66,169,213,154,16,214,214,139,179,196,37,102,22,16,89,223,187,203,165,105,160,137,217,193,219,174,189,230,81,178,39,93,89,223,9,51,220,33,208,169,2,242,28,95,80,55,41,156,110,143,185,84,22,145,237,19,192,227,106,90,245,141,123,139,179,96,232,189,210,167,123,36,19,139,136,165,170,41,56,6,111,246,176,152,50,108,43,67,133,56,0,234,164,163,4,16,34,129,50,94,205,251,178,187,20,0,240,158,222,233,122,232,18,114,140,193,83,247,234,188,74,124,247,97,154,116,180,149,252,130,181,168,154,158,2,70,249,131,34,194,38,107,248,56,189,29,239,181,22,199,163,113,217,27,245,115,222,150,240,80,1,236,72,253,203,158,144,69,171,31,201,16,246,185,52,74,219,73,195,142,183,80,35,1,110,35,152,132,102,2,226,254,122,7,169,12,168,99,118,252,18,93,139,237,25,86,184,151,120,29,239,110,180,41,130,4,228,181,81,238,195,206,19,177,254,229,113,31,16,192,200,35,44,205,83,63,130,49,112,39,168,124,48,185,27,193,77,145,225,74,211,172,146,23,120,48,67,92,39,250,139,143,141,188,117,192,76,171,1,129,69,94,171,61,30,16,27,20,151,74,111,79,185,156,135,237,67,95,56,15,32,135,67,139,75,55,29,30,97,19,189,101,25,175,191,217,36,79,3,132,218,225,133,2,90,234,100,87,64,31,84,84,94,52,148,18,1,5,156,231,86,207,127,171,79,165,131,249,134,168,180,213,89,232,52,239,51,26,104,51,151,28,137,249,108,88,205,95,179,190,19,92,176,111,101,143,226,98,117,9,200,205,250,145,237,235,67,158,179,134,227,191,155,196,220,78,114,144,162,255,234,14,194,92,11,156,2,18,133,171,204,130,27,239,164,66,200,124,237,176,166,194,52,44,147,61,212,97,22,202,120,109,250,62,228,58,127,58,234,202,73,228,243,161,212,4,229,158,179,86,17,207,198,142,191,181,50,30,228,216,113,178,6,172,134,146,147,12,137,45,215,205,199,179,27,174,169,164,57,255,251,197,249,211,203,163,231,31,86,56,220,109,203,140,100,247,99,226,84,195,39,247,115,82,41,123,215,6,243,169,180,236,240,69,177,241,50,239,120,194,150,126,57,49,0,190,87,174,164,182,165,168,205,81,182,139,193,20,173,145,225,228,53,18,184,7,152,52,70,78,74,146,49,206,131,152,37,206,205,64,15,113,222,161,180,218,32,16,216,159,63,168,80,111,38,136,143,37,86,79,111,11,88,100,118,138,190,61,62,133,123,194,101,251,107,153,233,84,100,149,228,190,63,123,59,214,22,237,166,252,161,159,5,184,77,249,106,43,113,116,205,49,80,41,8,46,192,61,116,233,177,111,222,85,230,197,28,134,176,230,192,161,135,82,117,251,200,242,78,8,239,242,107,162,63,13,10,150,63,122,64,195,89,223,51,162,115,31,19,254,44,144,95,111,96,172,180,61,77,3,204,99,114,92,133,164,6,16,128,137,195,61,130,225,170,16,124,207,127,5,23,190,186,86,67,118,194,28,194,88,157,218,121,148,205,53,115,151,34,80,156,99,12,79,136,149,191,54,135,187,138,186,231,59,94,28,66,145,89,148,198,20,233,135,107,122,29,197,113,192,110,240,0,215,236,89,222,181,40,25,174,36,81,106,175,5,75,185,21,69,49,1,22,249,196,106,246,83,67,133,63,137,102,104,220,238,71,88,153,208,143,75,196,5,239,189,201,212,85,210,180,140,210,61,29,212,228,11,137,72,251,248,52,19,43,131,191,123,149,14,47,131,160,145,92,194,119,212,149,27,29,155,248,201,215,194,144,14,210,34,202,137,231,170,183,230,77,40,176,217,13,10,223,156,71,13,10,201,13,10,250,57,90,99,150,70,4,101,57,54,166,24,219,190,227,60,170,68,116,237,82,42,206,229,97,4,125,193,99,199,132,213,184,162,110,4,37,107,22,249,108,99,238,186,59,99,221,140,176,86,131,77,247,248,70,250,50,227,47,15,252,20,240,116,240,56,145,129,109,232,96,242,1,2,128,96,195,4,59,57,31,233,133,140,242,150,34,213,84,24,214,127,94,110,108,113,143,31,194,230,45,175,29,212,207,121,235,149,161,109,156,63,236,205,237,242,97,249,244,25,5,248,184,195,155,155,255,178,192,232,214,94,228,249,203,174,82,181,95,179,187,225,7,192,140,58,189,102,142,145,96,28,132,154,242,224,52,185,157,230,137,18,36,165,97,183,68,154,236,61,11,228,117,153,31,82,33,27,157,22,104,49,26,170,122,201,24,94,120,249,15,211,26,50,75,108,130,15,127,142,24,158,149,44,209,94,87,212,117,67,14,27,234,247,83,124,246,100,158,128,227,93,241,111,192,58,113,234,22,42,25,183,210,150,23,189,90,243,65,231,236,129,221,195,56,96,111,224,80,118,73,191,118,30,202,111,114,220,210,178,23,151,50,186,235,81,214,87,121,1,158,103,140,200,70,241,132,186,174,149,85,15,196,48,214,196,227,21,193,166,97,147,46,90,140,77,61,129,172,180,69,226,176,184,7,119,30,42,173,132,101,132,127,191,222,253,114,9,209,13,191,167,250,242,195,4,26,103,140,112,161,200,7,166,248,46,180,72,104,140,142,154,108,150,143,127,159,76,191,168,133,5,153,117,114,206,106,162,40,202,192,168,15,73,150,73,87,1,126,144,144,190,227,108,86,108,6,231,155,235,237,194,222,154,121,2,117,14,29,37,242,180,165,30,16,34,27,78,248,45,143,31,191,173,220,233,249,104,47,56,67,165,129,235,16,181,92,234,74,142,161,226,247,200,75,99,148,224,78,164,182,188,157,154,211,68,196,20,119,114,74,25,111,115,217,43,156,67,88,247,58,63,136,47,68,82,4,92,34,85,81,39,191,156,170,245,39,119,194,0,214,121,134,34,124,177,127,148,161,24,186,102,52,40,171,63,221,169,92,53,154,53,59,74,174,49,249,75,4,216,74,156,12,105,148,7,202,175,178,114,174,88,239,50,142,144,101,181,124,51,188,155,215,91,53,228,247,210,166,154,255,178,19,122,9,71,87,61,82,151,43,1,74,40,241,71,0,240,252,42,240,175,183,31,163,192,56,164,251,95,194,238,47,198,81,37,150,180,45,59,114,166,18,184,98,99,134,43,211,178,221,67,51,117,134,17,7,116,116,250,192,167,34,225,217,25,157,102,81,13,10,26,134,248,7,170,13,231,28,19,146,13,91,215,50,136,116,191,26,14,43,128,198,208,118,56,242,97,172,36,220,247,72,83,1,197,213,207,13,10,139,98,214,70,136,23,213,123,158,184,53,163,249,150,110,191,115,34,60,181,144,154,26,226,168,91,201,15,1,46,226,107,72,74,64,200,169,152,173,163,33,160,250,149,5,217,160,156,143,97,215,8,232,12,123,95,71,89,157,18,224,32,254,121,214,59,203,182,34,126,65,88,172,253,65,135,9,65,253,119,79,101,37,183,138,103,129,251,80,81,154,217,36,14,199,243,28,27,133,170,212,135,69,234,46,88,239,136,184,144,191,156,92,197,145,1,72,174,213,41,242,105,79,28,236,139,14,44,48,149,42,77,217,34,29,83,186,132,108,187,170,45,103,214,78,194,93,185,127,239,137,115,213,18,7,147,15,229,88,76,222,40,162,115,70,142,215,113,60,242,232,134,93,236,40,94,32,244,154,211,230,202,78,67,144,138,145,22,223,27,174,65,191,219,114,75,59,242,203,253,37,94,14,182,149,96,179,41,183,238,161,75,188,223,208,57,140,102,58,185,193,60,252,120,152,198,116,191,162,7,1,140,209,200,82,129,196,188,153,91,22,238,199,119,245,27,13,25,41,16,5,83,83,44,76,62,142,113,172,198,218,242,25,52,113,112,77,63,185,45,228,148,232,159,129,187,247,187,112,13,15,228,109,154,33,249,204,107,242,81,174,49,244,3,52,198,107,212,15,128,29,2,237,99,181,44,62,198,161,48,61,101,158,222,51,12,213,61,232,80,40,153,235,198,221,166,85,222,61,88,49,4,224,30,18,48,1,188,166,251,59,165,255,212,241,229,6,207,126,213,159,227,249,145,128,139,34,114,177,25,114,16,229,234,33,59,59,247,214,162,23,124,202,59,4,131,68,123,219,68,173,44,128,224,76,245,227,104,82,95,141,107,155,166,177,20,164,20,92,44,138,105,49,19,33,200,213,206,104,47,46,19,238,71,32,224,86,142,253,132,136,250,245,119,96,169,55,34,223,218,132,137,239,73,99,242,230,89,120,173,250,184,185,201,200,217,20,97,128,185,43,60,132,199,37,225,245,14,161,53,0,75,100,121,124,166,198,168,124,149,149,46,143,93,104,149,139,100,66,118,209,6,227,112,106,241,83,202,39,15,21,159,111,138,215,111,11,159,75,228,147,87,79,245,73,173,106,185,9,212,46,87,24,66,64,1,216,170,23,86,125,254,198,106,62,12,218,249,140,137,229,106,70,146,240,213,133,177,62,140,142,29,212,165,128,27,30,238,139,58,51,59,99,212,78,101,162,197,13,10,27,70,97,90,252,85,3,144,193,102,142,160,106,176,246,249,161,117,228,8,177,86,139,180,112,247,58,155,171,199,248,39,149,173,148,6,21,112,30,245,226,4,104,135,65,71,112,255,190,156,134,190,203,239,49,218,111,41,79,174,216,228,249,202,8,74,97,145,93,47,113,148,173,87,143,213,185,224,31,76,35,2,119,8,173,212,50,111,215,11,72,208,203,249,180,45,242,134,7,132,133,157,217,203,199,7,2,12,57,23,209,146,12,225,100,166,113,213,224,157,38,133,69,223,185,210,85,90,28,123,130,13,10,200,2,0,124,84,180,3,225,166,249,85,62,108,213,44,100,129,110,120,142,97,21,235,233,82,13,87,170,93,2,120,193,230,148,15,184,9,89,148,26,247,139,221,150,135,114,121,202,180,92,158,247,228,125,144,210,75,91,62,8,105,183,105,211,160,251,3,220,218,121,238,58,82,52,159,63,232,146,4,175,229,23,185,116,85,234,27,5,111,135,205,132,98,2,89,60,183,118,141,216,147,33,175,61,189,192,193,136,218,37,185,105,156,222,110,11,25,40,203,64,96,240,155,79,106,108,43,104,112,11,193,78,185,254,40,144,254,203,94,56,158,118,6,24,109,68,23,245,245,166,186,189,244,60,19,82,244,254,180,58,153,105,142,202,115,199,215,235,147,255,93,56,235,254,109,16,44,253,13,152,106,243,145,132,180,224,7,191,101,19,27,106,45,171,209,89,48,32,226,253,186,85,158,147,157,175,127,108,186,206,33,118,72,157,69,171,134,15,164,160,89,48,205,119,24,156,103,212,183,45,240,63,232,207,72,36,25,151,38,33,222,95,47,1,67,234,20,245,220,8,70,59,48,43,225,244,189,115,205,31,108,91,23,199,77,119,64,200,2,207,25,122,179,244,18,182,151,194,188,143,65,116,62,178,190,85,226,56,220,220,106,2,83,167,46,99,71,157,191,86,62,106,22,25,53,247,127,14,91,197,55,45,209,249,42,225,118,62,5,224,25,180,121,103,128,157,66,112,147,36,234,222,6,206,205,133,218,171,196,86,217,233,3,224,8,61,58,116,213,205,45,243,11,241,219,20,119,166,167,26,85,165,35,89,244,148,15,44,51,155,219,110,219,170,222,62,97,77,76,124,54,250,43,38,172,203,245,32,87,157,248,154,114,57,236,98,120,105,174,198,40,231,244,172,9,234,19,47,126,45,3,4,8,220,145,242,89,108,149,74,156,2,111,173,204,65,111,30,6,27,72,67,114,33,181,13,138,75,115,92,145,214,232,210,147,126,68,84,176,232,209,245,83,184,74,53,196,62,17,1,244,151,245,228,41,214,224,133,47,1,18,19,231,6,141,83,228,220,105,111,111,127,249,99,125,58,197,237,40,176,248,181,91,170,186,191,232,233,170,127,166,1,114,69,11,209,123,97,91,27,137,4,143,207,238,130,149,82,7,122,188,29,48,97,92,155,87,37,112,28,179,158,102,117,64,76,130,48,186,39,57,90,200,181,68,79,49,134,0,221,225,3,211,3,156,222,244,101,14,104,169,241,40,12,168,74,168,207,135,198,82,174,180,92,206,175,209,162,23,147,56,90,23,77,74,90,88,48,112,5,147,205,217,77,97,55,79,244,235,86,62,234,238,128,183,97,35,14,214,29,6,190,17,250,87,77,224,174,108,52,82,88,58,165,55,104,35,138,37,245,112,239,240,175,95,94,191,222,234,152,200,90,253,165,51,25,24,38,17,227,230,40,86,89,236,153,210,122,113,138,197,161,205,124,216,15,44,151,191,233,187,237,246,145,42,65,161,113,236,88,58,14,170,74,197,113,180,149,172,120,178,117,190,212,158,179,42,2,2,160,127,30,188,176,168,159,210,209,203,110,196,54,49,232,226,104,105,170,106,189,119,95,49,225,202,229,21,143,144,74,12,20,164,239,114,213,30,32,80,63,247,129,76,113,122,15,155,40,174,25,137,122,68,141,137,5,114,93,164,228,15,23,246,215,151,133,56,9,90,221,94,130,14,128,222,159,38,26,206,67,215,125,75,249,117,16,247,116,134,14,69,3,124,121,60,40,145,91,1,207,191,124,99,136,178,233,34,91,14,39,33,207,95,187,82,186,45,166,191,188,17,213,21,62,209,66,63,171,192,86,36,181,74,26,96,35,94,226,110,144,143,99,197,40,38,49,95,26,216,79,199,157,226,62,215,147,204,117,101,120,71,89,0,231,169,186,138,129,46,6,210,185,114,21,86,72,63,206,1,236,219,127,131,25,11,74,111,46,184,114,143,91,249,65,165,147,76,150,5,72,228,168,192,209,127,103,8,56,102,7,160,80,42,28,235,12,248,238,43,167,13,14,11,53,0,25,186,244,21,166,110,229,14,168,168,206,239,120,173,36,36,33,215,57,124,6,202,247,98,246,180,187,84,187,59,132,132,243,152,0,15,5,113,243,201,17,30,150,22,74,248,66,13,10,122,170,210,182,181,5,110,195,93,11,208,43,70,167,224,7,226,78,28,221,22,49,211,67,133,109,169,164,182,110,243,101,97,132,75,22,230,190,182,240,139,13,200,222,4,176,67,100,51,93,102,87,255,145,100,149,195,249,170,93,135,162,228,85,66,138,45,72,159,112,194,170,224,59,100,57,13,10,110,8,48,148,233,37,247,95,127,46,162,154,68,199,110,187,80,214,45,145,253,120,195,3,92,244,187,225,61,61,114,5,218,162,142,187,178,88,69,110,40,56,198,65,171,81,225,101,37,148,201,47,89,47,248,211,29,144,198,241,121,224,103,116,126,157,73,154,94,15,204,245,193,103,83,191,183,13,10,50,1,253,238,100,28,159,69,204,255,173,135,158,71,121,99,200,216,145,98,25,84,116,239,152,79,30,211,214,147,105,144,90,61,85,202,103,3,136,146,19,253,140,253,123,2,154,59,232,173,170,191,98,1,17,103,95,111,101,223,95,91,5,198,53,235,255,217,214,197,115,176,214,33,116,72,200,129,164,210,82,98,206,253,244,144,131,231,117,88,154,64,110,208,63,139,0,56,220,124,71,225,180,132,221,255,3,89,148,244,166,32,9,35,200,94,220,130,54,210,14,70,176,211,230,23,168,176,38,207,112,112,206,209,75,51,64,230,220,52,254,240,32,169,190,112,46,23,244,188,188,115,135,112,231,111,71,255,216,73,97,78,36,32,125,250,94,111,141,42,170,178,4,81,212,65,37,70,228,14,140,191,86,218,141,18,31,54,78,3,238,49,12,225,203,127,111,165,28,107,206,222,159,193,152,182,109,57,213,123,35,236,205,52,65,70,5,147,244,78,194,44,180,51,91,241,158,9,221,216,145,132,220,15,9,246,130,220,161,135,99,234,114,219,108,142,50,250,170,143,0,45,73,249,2,61,39,181,8,57,90,183,81,190,91,2,181,219,48,157,201,165,27,64,231,117,82,190,228,142,55,159,228,120,191,51,126,3,157,239,205,153,42,252,47,113,42,91,15,100,110,240,144,43,89,61,142,159,3,189,158,181,18,238,52,78,17,95,132,103,31,33,229,181,208,59,13,10,192,84,132,129,169,160,114,146,247,155,247,76,65,119,46,22,97,29,21,207,21,236,7,152,20,236,163,29,243,128,238,63,86,233,189,179,158,0,40,177,87,147,103,13,10,166,209,235,238,25,96,48,113,238,60,165,23,253,166,248,197,118,60,156,151,209,30,246,44,209,149,66,65,43,85,213,80,88,2,116,148,20,63,33,125,244,47,242,222,28,82,158,83,61,13,221,70,235,250,136,109,220,185,7,45,41,156,19,38,109,124,7,162,206,159,91,118,173,219,68,238,101,19,36,77,125,77,85,190,26,173,152,130,20,49,40,14,51,72,137,113,139,96,179,229,137,41,161,183,25,125,75,224,55,83,226,42,91,234,33,102,154,78,231,138,176,112,164,31,46,176,26,48,242,0,97,159,205,183,92,255,137,129,82,240,196,75,47,162,85,8,203,52,102,97,244,254,120,70,146,141,82,1,74,226,137,129,216,3,234,14,184,82,94,106,35,24,205,46,217,111,115,134,162,42,195,96,37,2,124,93,157,80,24,107,90,40,48,222,6,43,7,239,86,186,53,136,58,225,160,199,107,229,74,9,134,235,160,143,196,100,11,93,24,189,36,127,44,173,125,159,149,11,105,141,17,235,17,170,233,248,71,249,37,62,145,173,76,181,106,27,141,197,13,25,184,19,98,209,225,176,70,97,229,143,200,107,1,101,3,188,255,182,59,61,238,240,60,93,253,253,183,207,44,115,45,119,160,213,95,247,125,47,106,122,226,168,150,188,17,132,201,222,11,227,25,36,224,135,224,130,134,40,66,126,14,97,245,100,20,117,192,102,204,102,219,137,12,65,125,245,135,159,60,109,183,45,54,19,46,29,135,168,140,202,87,201,154,168,245,243,142,91,105,17,4,142,95,200,39,212,23,12,53,243,41,142,233,55,247,156,126,15,81,114,122,201,70,2,25,29,33,187,98,18,70,22,26,92,44,245,38,11,126,66,147,43,119,159,203,187,50,163,145,89,156,249,107,70,40,38,221,184,194,172,183,12,75,204,109,139,219,75,250,194,105,26,72,187,13,107,118,153,50,19,82,172,49,4,160,189,247,218,131,106,132,17,111,138,82,217,36,250,141,176,37,195,127,57,220,138,245,99,68,28,81,227,23,161,194,245,36,42,233,187,50,236,163,11,221,126,48,78,149,209,82,123,117,38,153,42,18,121,172,180,111,186,115,250,191,95,3,139,96,129,222,171,181,210,150,108,238,119,0,48,215,38,49,80,128,195,113,174,200,124,185,106,179,217,192,133,142,79,188,163,254,239,192,102,220,108,168,56,115,38,169,234,182,224,61,26,86,229,197,162,186,114,84,250,169,25,134,242,229,26,118,126,138,75,128,9,235,198,200,203,182,201,2,78,174,152,62,17,91,245,213,43,155,202,3,187,72,45,162,57,55,47,74,242,220,146,172,247,39,42,53,207,98,44,246,37,18,24,223,57,217,179,208,68,77,54,200,183,239,125,179,247,235,87,223,54,92,237,134,244,169,45,72,120,44,33,148,0,177,58,13,10,150,171,50,224,158,18,75,138,160,133,188,80,140,68,226,153,183,213,104,157,189,124,224,152,28,33,39,214,133,59,192,153,228,55,202,5,146,175,104,28,230,255,113,162,221,36,128,121,151,40,138,250,26,64,118,2,52,45,24,240,105,95,68,34,65,200,151,80,4,50,253,115,82,158,234,85,148,140,167,126,134,195,246,212,232,117,174,212,220,197,55,125,5,90,8,206,199,0,87,228,19,50,64,198,59,162,140,28,169,6,35,190,181,18,232,159,79,63,202,86,35,154,208,197,122,127,169,204,109,78,188,126,255,180,39,73,111,195,109,5,195,149,205,234,251,90,33,221,67,12,152,253,128,148,62,196,30,123,65,166,65,162,143,194,87,146,70,146,165,146,193,174,164,151,18,223,167,186,164,111,140,85,98,106,31,48,253,1,16,93,47,159,70,11,223,250,131,66,204,173,39,123,165,209,29,129,91,69,173,173,91,229,247,59,215,62,181,226,229,252,204,32,136,59,181,161,181,213,213,105,201,147,91,11,231,30,127,184,47,178,209,180,194,168,220,226,66,54,246,93,43,143,191,245,6,111,163,0,246,103,164,210,182,241,80,169,177,194,198,229,13,107,111,100,47,175,15,219,133,12,109,126,253,149,95,133,130,56,79,26,147,122,154,50,221,53,116,116,3,186,147,222,124,247,237,228,55,237,184,62,132,233,219,175,252,14,69,249,1,81,29,252,62,101,20,52,189,88,240,252,82,194,143,108,172,53,46,183,172,228,237,97,244,157,248,206,191,190,12,9,100,228,132,210,202,140,165,241,251,200,57,185,7,248,194,181,164,32,204,160,101,130,134,136,39,233,17,83,1,250,162,187,67,78,91,201,204,25,120,33,127,245,169,154,48,56,172,241,58,157,143,248,126,165,69,228,157,161,233,221,208,233,83,243,156,231,254,162,176,103,43,68,51,29,133,160,58,48,21,57,158,79,45,3,235,114,218,70,147,247,51,163,75,250,135,41,120,6,14,101,220,78,66,137,79,52,20,115,238,237,96,67,28,232,254,31,44,252,62,87,70,193,234,217,110,34,140,205,18,3,11,186,103,75,211,239,195,219,123,199,111,86,183,88,163,145,212,75,214,233,58,75,101,193,177,9,218,152,129,27,8,255,74,28,152,25,11,36,254,176,253,162,16,127,248,55,187,59,41,195,26,251,45,222,188,53,147,237,109,15,240,232,139,133,50,34,48,172,166,249,203,130,214,65,166,126,96,44,58,11,64,166,149,172,27,114,101,83,138,83,176,77,210,43,84,57,84,110,140,78,249,96,112,182,68,105,134,11,130,186,79,183,59,66,79,104,18,203,88,14,23,113,80,106,137,28,103,141,244,133,23,132,235,48,202,164,211,223,225,64,229,24,98,47,135,55,184,111,77,156,255,216,112,113,50,226,177,91,230,185,135,221,48,163,190,132,51,231,223,253,228,214,42,252,142,109,223,207,214,141,7,178,253,233,78,66,83,183,85,1,210,200,233,245,86,66,14,20,200,137,147,50,42,36,195,31,110,55,212,91,161,162,224,52,179,247,73,211,112,94,67,206,245,69,212,122,248,105,72,68,141,208,184,134,204,58,152,161,193,184,57,155,238,168,107,161,243,166,159,213,164,239,44,237,182,112,245,185,36,158,23,104,151,228,6,20,154,224,198,6,61,164,154,202,251,29,191,247,17,185,119,220,127,93,74,103,54,110,147,199,183,210,207,228,97,232,250,164,209,105,16,156,8,62,108,221,21,100,229,148,13,59,207,100,33,171,104,79,131,60,110,83,191,118,188,123,11,27,248,91,14,109,53,118,204,78,134,240,106,134,162,65,242,46,18,229,25,156,224,125,250,116,96,233,242,115,102,239,15,103,9,132,186,147,97,45,30,104,80,30,94,181,249,122,88,143,113,23,154,162,50,92,174,145,69,109,42,96,150,193,221,164,147,53,39,220,170,157,35,200,147,64,142,107,58,189,112,72,177,124,181,132,132,204,44,56,29,58,77,236,219,217,99,131,156,52,62,138,178,22,91,207,110,198,211,169,61,226,189,6,41,27,108,4,248,101,135,133,162,247,26,76,207,40,106,187,144,39,102,164,94,151,37,240,222,86,77,113,207,157,81,74,13,136,162,250,203,17,156,127,96,119,217,87,22,229,172,147,84,57,180,127,160,32,142,158,95,217,102,97,121,244,90,33,239,196,23,184,46,17,13,108,44,181,215,36,195,252,16,50,221,91,36,100,76,164,145,141,76,180,223,11,61,142,205,220,178,225,59,170,150,125,118,212,171,204,36,57,32,94,4,201,59,17,36,12,174,2,92,69,109,229,218,37,52,165,36,175,216,126,78,96,214,46,177,171,125,29,84,226,62,98,157,216,135,84,192,86,231,143,5,126,246,108,73,125,153,58,246,31,155,102,84,74,60,166,153,223,178,237,238,114,34,25,25,157,73,98,203,114,211,78,111,123,95,196,188,69,239,209,36,11,244,168,122,43,136,53,92,170,63,188,251,223,97,89,188,28,114,219,68,137,188,162,121,80,126,141,190,103,177,104,219,158,107,62,225,224,36,228,46,2,203,7,106,183,30,230,9,248,138,16,155,240,15,247,95,201,26,83,212,145,81,241,248,79,209,95,153,3,241,211,163,198,102,24,196,192,7,33,135,95,132,169,178,85,70,102,115,223,123,254,253,25,58,176,13,35,148,151,213,174,250,111,120,112,89,52,241,170,173,155,106,81,81,59,174,115,73,204,79,82,21,76,67,224,54,22,188,220,218,170,157,189,22,141,206,214,118,188,104,15,252,106,12,205,156,47,110,254,128,124,246,171,93,130,210,186,117,220,161,194,215,224,141,37,191,253,100,140,211,91,30,3,130,116,170,215,207,194,113,255,239,235,165,13,118,214,210,41,39,180,215,147,31,187,195,207,74,236,16,30,7,67,76,216,186,162,141,122,52,79,43,75,39,85,166,247,70,166,99,104,204,218,120,160,196,13,10,241,193,174,241,129,50,19,188,27,189,23,21,27,167,115,45,251,139,89,3,120,190,200,66,102,163,218,163,72,113,102,157,185,151,177,120,247,153,192,93,49,13,160,217,125,62,210,244,179,30,51,228,241,52,177,121,129,139,111,170,232,13,220,21,153,208,77,200,253,24,146,169,94,187,18,142,113,156,251,136,94,19,253,191,171,150,190,215,50,99,126,117,164,35,123,3,9,144,172,247,9,100,188,63,22,176,149,105,12,139,84,209,98,112,185,0,69,99,126,14,80,148,123,91,108,14,196,56,60,244,122,245,138,119,113,34,17,123,29,147,145,46,29,147,144,211,100,231,101,63,146,15,41,95,189,121,198,53,161,18,72,21,131,187,120,24,68,227,239,244,200,102,124,31,138,171,189,109,116,246,55,134,17,250,161,176,145,117,186,152,239,252,2,249,206,39,214,108,125,24,12,228,232,167,109,167,205,184,153,1,38,13,114,175,121,248,82,148,127,137,219,41,147,221,29,17,206,214,32,47,112,185,166,202,236,122,130,19,200,78,238,4,54,59,210,214,11,201,187,233,54,137,250,254,160,237,229,117,212,137,160,49,81,152,24,174,80,140,89,154,123,20,59,27,95,226,174,22,74,130,99,123,119,203,228,54,215,205,93,24,64,241,190,195,228,214,250,190,179,222,234,187,87,12,222,39,0,112,177,65,126,44,114,63,133,62,0,161,209,209,42,46,198,202,35,170,120,225,54,177,124,7,231,182,154,41,22,13,97,186,84,87,131,163,134,75,29,160,137,66,254,64,205,34,13,10,195,128,138,252,111,105,241,28,139,200,226,118,26,116,216,115,140,212,27,233,68,252,80,91,37,195,167,132,225,93,188,236,5,9,153,200,225,245,87,73,200,50,214,77,254,26,241,25,229,221,74,5,50,94,204,102,43,207,127,106,112,223,111,43,97,49,186,61,149,240,211,86,63,127,67,166,120,235,156,68,247,245,170,80,168,6,26,108,22,208,78,9,184,172,5,130,120,9,190,236,69,26,241,226,194,83,15,73,42,44,175,92,243,128,1,242,166,22,134,194,76,106,17,19,233,9,139,44,73,249,146,211,42,196,168,240,105,116,239,159,151,75,36,17,33,145,94,206,56,51,76,65,130,120,15,158,50,212,32,95,116,132,192,51,213,151,192,145,13,71,188,55,100,0,109,75,95,194,138,70,21,189,39,180,110,91,185,187,132,131,181,70,25,51,220,158,8,105,62,9,194,103,186,235,23,80,13,118,62,222,251,80,54,248,32,8,28,26,208,199,49,18,50,6,222,119,79,164,100,185,223,25,226,190,73,75,59,48,226,154,11,138,173,38,54,2,53,126,209,26,102,98,114,187,177,20,161,228,144,67,29,131,139,225,154,38,142,169,106,141,100,110,220,21,89,128,56,89,133,36,121,107,137,168,87,176,37,147,83,208,194,86,15,43,57,182,222,131,131,203,182,202,77,15,251,35,90,43,118,27,163,247,148,208,103,241,111,208,230,81,113,24,38,20,200,200,40,131,189,146,3,49,143,56,225,39,154,199,19,230,142,227,147,239,174,76,11,239,29,79,80,157,25,245,64,69,146,240,104,144,83,212,7,241,112,106,63,97,238,240,206,29,110,188,255,73,1,216,119,21,99,176,228,251,7,133,151,249,197,144,36,176,198,122,239,2,1,87,192,148,81,239,251,95,186,117,169,194,120,13,135,168,101,116,93,12,232,209,245,53,221,7,254,13,10,23,213,116,187,20,87,181,209,238,157,197,220,65,236,65,138,163,24,50,14,90,188,7,11,43,103,93,28,70,63,119,215,39,83,28,120,124,235,180,102,7,45,15,218,242,36,161,144,63,24,223,70,233,139,180,204,82,136,241,31,136,111,87,13,119,11,52,107,224,5,152,249,146,9,235,197,242,204,94,212,175,136,169,109,108,99,36,196,110,150,73,178,252,55,181,107,13,10,7,43,173,178,199,248,175,75,225,202,89,120,217,219,154,69,201,157,65,105,1,207,140,48,144,45,61,79,212,19,105,95,24,4,52,69,136,142,145,167,107,213,114,204,76,62,216,234,191,242,150,254,138,142,211,50,5,39,238,12,152,130,237,244,156,110,184,57,161,170,250,203,130,172,219,135,212,161,64,151,13,10,106,96,60,223,232,190,231,45,138,117,81,14,67,209,105,0,26,219,41,44,198,182,45,6,147,82,196,207,249,6,110,18,216,34,108,20,54,42,48,166,40,142,56,81,89,55,252,84,29,29,94,202,184,163,41,16,152,211,60,250,248,147,57,196,56,68,248,78,227,197,127,23,21,53,79,210,171,143,239,161,13,62,4,244,49,182,103,71,233,26,238,44,147,95,103,210,85,107,235,75,22,65,139,60,168,24,200,184,95,131,181,146,202,153,21,211,65,20,29,197,42,102,118,77,176,187,116,16,64,136,217,49,89,200,207,49,85,131,52,224,191,212,192,26,18,46,90,176,111,53,183,81,247,254,166,79,63,7,225,6,67,129,79,56,53,112,51,179,77,130,231,28,249,158,148,129,189,68,240,92,155,58,176,221,208,201,2,141,91,37,30,243,188,22,125,109,193,55,117,135,28,173,41,218,31,217,30,70,1,80,245,21,6,180,254,19,4,84,242,231,163,228,201,164,162,215,230,196,50,145,247,217,65,141,135,114,245,117,86,96,97,15,164,144,155,84,93,89,77,11,249,8,200,16,146,121,57,156,235,41,51,209,236,187,221,177,133,184,65,114,97,15,91,11,231,18,218,126,50,79,147,56,186,124,86,100,68,73,15,131,41,50,253,179,63,208,158,57,123,224,106,13,14,192,110,148,111,240,103,115,163,56,237,228,227,190,159,200,172,249,139,201,129,225,175,12,65,47,192,189,115,88,147,36,54,189,220,67,176,124,6,25,9,217,41,104,46,125,233,135,42,251,109,155,87,233,109,239,127,249,221,190,74,100,239,33,209,65,137,247,0,90,100,210,19,96,122,190,72,198,112,34,152,12,179,104,23,65,214,51,220,193,93,95,211,72,76,172,234,245,6,107,175,221,134,62,62,174,100,182,130,110,215,215,72,116,171,172,175,40,206,150,34,177,184,212,52,42,45,131,54,8,119,95,151,208,165,89,206,66,51,0,140,65,47,176,17,126,114,228,83,7,176,153,198,71,36,20,21,6,178,169,197,101,237,84,29,71,143,73,174,93,152,204,154,155,117,17,3,239,203,185,240,151,153,250,135,79,211,201,190,171,14,89,124,230,235,66,95,147,244,184,53,96,219,135,247,81,130,167,85,204,163,221,221,184,112,118,101,168,190,1,13,10,64,236,97,23,4,108,145,229,51,127,183,202,55,126,201,111,6,59,165,225,249,123,254,28,18,20,113,113,3,96,108,211,115,133,54,38,253,70,6,32,19,13,176,32,176,95,78,161,211,100,75,42,141,161,28,221,44,108,42,6,81,23,39,128,152,99,11,199,15,220,224,101,27,197,22,133,132,29,130,79,164,45,240,234,181,66,124,64,129,152,219,9,39,201,17,102,180,108,157,137,167,96,238,219,147,8,165,21,12,118,117,188,5,236,204,188,0,81,234,141,161,253,232,19,44,192,100,18,241,214,220,224,43,199,111,252,238,184,135,5,100,7,134,32,249,250,127,218,134,120,17,163,48,79,0,164,22,157,150,229,207,236,46,191,169,13,129,221,224,121,73,101,157,49,63,247,248,64,43,219,30,234,76,224,22,99,227,190,192,4,0,170,51,246,184,22,105,106,19,200,219,195,56,170,25,47,204,62,6,196,91,118,234,65,239,21,107,54,69,191,195,238,95,31,43,21,239,143,239,118,34,0,113,150,249,216,39,144,151,145,154,34,84,49,230,104,59,179,202,187,113,223,248,216,165,121,209,116,178,6,63,72,214,59,127,225,106,156,131,223,241,255,174,191,211,62,156,162,147,168,195,230,249,80,30,115,144,11,15,63,92,105,134,235,46,122,116,48,123,109,134,184,72,6,39,195,156,45,1,33,92,79,149,186,237,4,35,5,215,32,221,231,17,107,147,25,14,135,213,245,5,13,10,160,219,208,232,214,152,138,152,46,125,42,27,112,179,183,245,248,184,6,244,157,54,38,221,30,92,183,3,56,3,93,245,83,171,219,76,230,190,75,95,151,125,184,114,40,153,206,70,195,208,170,131,49,67,143,28,34,225,105,121,131,184,42,58,107,18,143,42,229,19,80,159,198,109,138,86,244,247,73,85,113,109,0,8,30,79,29,207,218,52,64,143,252,5,202,70,129,55,151,37,24,131,120,52,63,135,94,115,75,245,221,206,153,24,108,149,50,153,152,0,205,75,66,99,16,94,243,20,184,206,16,42,62,199,181,236,8,56,230,97,140,192,22,216,218,181,196,89,118,244,145,207,193,245,66,182,2,12,144,125,100,248,34,187,98,106,160,63,4,52,72,4,218,68,77,225,77,226,85,133,50,119,221,22,120,175,170,248,42,179,133,26,175,210,200,255,182,183,162,94,181,161,22,89,54,172,2,165,63,202,91,106,36,197,176,201,136,77,1,181,72,149,205,198,230,76,79,48,97,210,234,118,167,180,247,176,22,79,175,3,172,205,63,190,155,206,122,18,210,163,122,243,244,76,46,134,79,190,132,34,212,97,171,85,60,16,31,158,33,165,11,189,203,109,223,57,78,47,128,249,74,44,114,31,253,186,3,118,136,240,22,201,190,200,220,27,187,105,202,145,176,72,35,202,162,253,7,170,11,31,16,113,33,50,81,210,71,83,252,122,142,21,38,40,226,63,91,191,203,174,203,15,97,202,200,220,198,168,255,202,3,17,72,61,39,152,69,12,74,242,31,87,152,118,63,91,78,197,78,153,204,37,204,240,1,158,149,199,184,153,103,239,240,224,2,245,118,88,59,248,255,166,104,80,0,110,159,235,15,70,24,60,65,24,100,118,255,193,14,25,60,105,18,255,133,23,172,33,92,203,191,33,7,98,196,211,49,138,131,160,137,71,183,243,128,114,23,250,141,21,90,62,171,59,242,168,205,101,207,233,118,78,141,153,152,177,217,114,202,207,17,39,56,215,128,76,77,47,84,85,41,3,31,129,48,111,95,187,233,116,6,57,53,117,76,141,138,85,204,206,53,254,248,13,187,99,25,164,12,36,132,218,149,199,119,217,171,48,222,86,240,113,236,50,152,227,22,51,88,197,242,215,208,184,150,140,164,223,114,123,140,124,126,87,18,54,183,252,48,141,108,154,237,130,74,126,163,82,127,204,242,98,110,234,213,129,13,69,223,128,26,183,92,217,88,203,66,160,15,249,115,74,230,169,216,112,164,57,45,98,73,150,47,129,187,20,93,98,63,95,56,4,6,2,93,78,58,73,21,9,67,156,165,201,85,121,56,97,98,170,2,212,87,64,128,170,175,218,32,3,162,204,104,1,101,116,159,213,220,234,169,27,244,123,216,56,241,106,33,225,22,163,150,233,230,247,88,212,29,245,13,63,22,16,247,216,166,82,87,174,0,242,206,222,108,171,13,10,218,155,22,217,173,220,48,203,122,6,139,53,142,36,122,181,193,129,9,34,167,14,35,214,15,203,93,60,103,8,157,212,2,76,91,156,187,174,171,28,232,132,118,113,115,32,38,236,26,96,67,227,138,226,40,207,194,123,11,91,39,178,48,78,225,173,183,188,130,137,237,186,52,147,91,202,148,246,128,250,94,236,45,212,95,16,207,19,115,43,134,152,216,74,162,187,95,93,184,51,214,114,205,117,6,218,143,163,150,176,132,93,137,148,185,190,105,165,21,185,160,153,243,20,146,71,143,130,68,19,164,13,215,108,134,40,48,248,157,178,242,21,49,20,29,94,173,89,127,165,216,22,187,1,92,200,238,135,186,89,75,207,12,113,117,68,243,46,182,149,233,17,245,133,245,147,175,104,82,205,39,174,107,37,224,99,41,231,87,106,152,85,208,215,207,118,232,29,200,182,164,42,49,150,209,120,17,46,197,182,41,148,175,103,255,185,219,69,38,199,111,4,155,67,162,81,248,36,38,160,2,215,96,234,23,16,76,197,112,44,245,192,221,32,69,79,184,51,210,71,211,131,82,201,81,228,18,212,213,104,140,25,145,228,229,112,221,195,245,20,33,141,209,213,234,100,54,160,148,241,74,150,152,62,19,181,229,153,124,178,209,21,171,221,53,200,216,214,78,193,186,12,11,29,168,111,196,11,177,164,86,192,61,121,190,99,168,112,233,168,130,194,53,149,11,235,171,115,59,90,80,173,176,124,53,189,140,127,136,7,246,3,253,7,52,180,150,225,167,131,229,24,169,6,155,194,44,232,244,143,41,185,5,161,143,17,15,218,142,228,58,207,34,190,223,153,178,235,177,230,7,209,171,146,13,194,144,227,13,4,28,70,138,12,242,125,148,131,81,213,12,114,5,117,82,100,220,106,221,82,121,202,23,42,191,39,186,27,147,166,35,242,228,121,100,9,89,44,232,76,26,228,16,46,75,146,33,198,168,200,70,99,25,230,191,224,137,117,157,104,221,88,247,76,25,179,223,158,20,13,10,163,26,194,107,117,68,168,73,115,101,80,123,53,248,85,134,182,2,85,129,184,15,102,71,255,247,19,57,172,221,1,194,254,54,198,183,230,21,202,35,48,74,130,143,183,157,137,21,69,171,140,245,209,81,41,185,117,170,102,19,43,137,189,24,232,154,145,6,183,169,93,224,74,59,180,240,128,37,113,136,108,92,56,208,90,208,154,59,227,187,41,96,18,139,242,43,112,168,16,42,44,32,99,131,76,150,156,240,80,165,175,60,5,13,10,51,71,53,142,0,253,176,57,29,195,224,190,253,177,229,33,120,36,58,13,222,93,200,63,199,168,84,235,161,152,44,231,255,101,231,80,185,196,221,134,221,183,255,74,231,183,39,2,211,203,199,160,179,105,16,45,36,124,174,25,103,125,153,143,123,85,15,144,26,218,121,168,35,25,242,78,24,6,244,77,216,37,50,109,127,93,246,169,192,187,149,70,235,40,225,214,219,219,44,193,139,163,212,99,171,216,56,178,8,65,156,22,138,45,230,143,37,40,37,250,244,37,254,57,127,133,47,191,180,211,121,105,110,115,184,75,154,135,100,88,245,38,166,35,165,160,35,138,33,12,213,187,113,92,51,211,168,180,131,82,144,44,45,131,209,137,82,197,95,167,73,136,81,50,171,107,126,109,183,148,177,89,136,185,213,17,67,129,36,216,221,227,103,138,116,101,79,146,83,208,184,181,112,59,208,211,91,63,126,162,148,253,217,180,70,1,168,231,60,203,63,219,217,128,194,57,29,76,121,40,180,27,70,233,173,22,56,134,172,194,182,140,92,76,42,6,145,26,127,179,110,204,84,75,125,136,108,117,218,203,82,48,142,224,239,234,94,63,22,161,16,40,165,57,41,247,180,149,56,150,1,189,202,21,134,9,185,216,190,26,93,104,229,206,56,39,24,154,15,74,126,24,45,176,235,129,250,13,205,108,88,112,152,242,100,163,208,226,4,159,132,200,164,232,255,80,58,104,232,16,43,67,106,75,201,86,235,144,129,20,60,242,203,144,58,186,115,7,15,139,60,71,33,195,97,253,57,143,125,23,179,99,223,255,223,206,102,192,47,42,123,17,13,10,150,38,168,253,155,127,5,59,40,106,125,122,196,213,122,192,25,183,127,144,81,255,9,114,25,15,220,9,104,248,213,39,175,198,216,231,13,156,99,140,51,191,234,117,30,98,209,212,73,0,39,198,78,96,203,233,197,174,179,149,188,109,105,39,150,221,161,103,189,91,187,210,51,237,1,206,87,168,223,111,174,191,149,198,199,83,147,57,243,19,151,193,88,45,71,250,0,164,14,35,107,123,202,58,59,218,160,110,83,53,15,102,76,18,225,15,75,23,65,149,152,110,148,201,134,153,186,251,211,16,90,255,34,168,47,141,84,225,164,136,228,72,66,188,88,222,219,186,206,80,142,58,105,221,53,219,161,240,240,214,158,52,101,27,176,120,35,37,25,219,238,211,178,157,45,206,228,180,73,190,95,57,164,29,46,12,132,171,82,96,159,139,176,179,184,93,12,188,254,133,169,221,217,188,229,241,99,107,77,215,231,199,124,223,106,2,95,204,32,107,145,4,234,211,101,216,181,47,66,119,214,74,211,236,73,172,161,187,96,184,123,159,57,212,6,120,227,178,200,173,105,209,181,211,250,109,9,145,191,243,250,173,193,34,86,23,65,31,180,186,107,121,179,239,248,243,224,128,45,0,146,86,127,28,61,67,17,142,211,13,61,144,128,116,116,128,138,155,181,240,127,49,55,31,58,76,174,158,222,47,117,136,117,20,95,31,75,231,46,140,122,143,26,115,63,145,199,97,3,144,37,39,93,21,247,109,170,103,127,180,71,121,92,166,57,165,201,249,228,188,243,194,192,107,190,2,2,24,124,204,95,44,255,187,194,8,100,26,82,218,97,29,64,176,137,8,80,3,117,130,155,140,235,140,147,199,57,131,137,38,75,56,33,222,109,55,172,202,4,252,188,208,36,153,132,123,66,151,253,205,177,92,162,111,191,134,141,94,51,90,62,15,57,128,206,178,136,20,148,36,150,139,193,13,10,178,70,106,21,206,219,223,85,14,234,98,60,22,42,58,121,99,214,87,206,209,25,16,22,2,137,139,35,215,203,153,97,139,91,61,89,134,143,90,195,28,226,137,239,29,245,107,164,197,195,152,6,141,90,146,138,74,165,51,37,217,91,209,199,116,240,209,213,3,98,139,161,84,111,70,67,3,224,244,84,204,106,202,152,208,50,172,240,88,114,218,149,169,24,141,15,34,75,135,92,5,21,124,47,201,147,214,85,33,167,112,230,150,36,7,162,44,15,42,20,184,0,100,187,199,79,73,108,97,180,66,85,196,12,81,189,246,13,191,167,144,15,119,41,109,89,171,246,31,150,79,239,182,175,243,245,220,205,215,168,18,251,94,195,12,109,200,6,59,216,40,246,173,234,210,66,220,13,10,110,114,177,0,166,148,172,36,8,157,21,11,135,41,222,90,50,42,215,125,132,231,244,166,37,112,161,120,240,169,236,13,211,42,123,144,145,120,217,165,68,67,12,255,48,226,229,112,219,187,100,157,158,25,85,75,57,84,103,19,4,126,224,134,27,138,13,150,15,105,13,46,46,22,15,36,241,82,246,240,169,63,107,19,177,235,36,119,164,22,251,243,193,82,150,221,177,58,61,9,247,113,216,97,138,133,222,194,54,47,136,209,23,241,187,23,78,130,159,150,249,190,150,91,23,83,33,163,187,7,70,55,107,149,38,11,130,207,52,19,77,41,186,100,37,217,184,110,118,71,145,214,153,120,65,81,191,38,212,220,91,1,204,15,136,38,29,248,142,60,171,179,113,211,52,225,162,245,246,9,82,236,112,56,64,63,32,69,247,9,37,233,216,180,158,204,51,11,217,15,86,61,56,148,177,92,230,41,230,134,227,186,229,148,229,194,81,47,121,130,234,185,95,212,60,213,149,216,236,95,223,150,47,94,82,119,228,22,169,28,39,145,120,189,152,208,130,206,213,101,80,21,201,244,37,192,72,174,193,53,245,191,65,38,13,234,116,252,28,22,152,76,61,184,222,170,13,10,101,193,66,107,122,94,145,172,95,103,226,34,144,94,252,221,41,124,28,170,29,252,23,250,26,61,228,98,211,32,13,10,20,145,212,27,38,247,153,71,93,174,211,214,227,177,254,146,61,60,172,80,88,35,161,231,124,230,176,124,12,46,254,194,7,52,122,142,68,211,197,209,150,55,108,123,126,220,231,201,190,208,81,157,161,145,166,63,171,66,122,185,48,193,21,111,81,200,213,172,91,217,208,98,224,224,64,137,53,93,241,97,148,80,196,13,0,80,190,207,16,55,189,201,182,45,125,76,144,183,98,25,153,29,33,90,55,179,16,145,207,216,50,214,169,86,105,221,2,185,4,13,10,194,182,4,25,220,240,100,170,112,163,201,26,16,229,228,8,112,147,36,111,185,86,69,130,138,117,141,131,95,81,220,199,171,19,59,54,13,187,0,60,238,170,161,16,45,252,7,147,31,14,226,56,39,61,157,196,201,200,184,255,8,146,50,191,130,63,253,215,163,61,13,126,20,32,112,242,64,208,120,253,245,144,218,253,136,184,150,41,176,39,90,244,34,235,84,188,18,133,234,229,140,173,6,188,43,18,213,160,194,191,229,28,77,16,130,170,35,234,175,51,66,113,192,82,62,49,147,214,170,75,106,48,188,202,98,237,182,98,211,13,147,245,245,83,162,17,97,44,194,234,125,161,209,145,18,203,152,23,39,237,244,65,54,239,53,142,218,2,68,70,73,0,138,142,157,176,152,90,206,52,165,107,204,212,147,55,129,56,175,63,22,50,205,136,82,89,240,31,151,163,139,24,84,67,227,180,64,138,170,6,192,149,41,64,53,69,220,118,139,225,246,228,180,232,94,194,240,148,171,6,212,237,120,98,4,137,222,144,20,237,61,74,118,175,25,167,92,61,101,199,60,248,179,174,218,153,62,151,40,155,186,65,103,88,213,97,214,220,18,35,243,165,167,64,194,166,79,228,170,2,168,175,46,255,240,163,253,140,13,172,197,182,169,240,234,232,131,51,89,191,107,239,16,208,59,217,49,240,91,234,92,193,23,226,26,164,227,164,134,132,83,87,162,86,175,26,194,130,150,113,105,116,91,206,69,146,180,80,28,244,16,228,4,90,138,196,123,247,47,128,44,233,62,86,41,72,176,8,72,115,243,63,135,35,64,180,147,9,84,169,122,226,94,156,116,103,113,23,235,186,204,24,229,207,157,162,137,97,230,68,44,84,95,126,225,13,6,137,202,214,123,94,126,154,188,186,217,52,103,46,1,58,98,43,205,229,65,162,186,234,98,249,87,193,153,252,62,235,27,184,9,30,216,172,21,159,90,251,97,211,88,147,175,186,165,136,60,90,151,176,218,178,178,196,186,47,247,163,9,53,136,32,17,36,143,141,158,109,35,180,163,217,26,113,223,102,192,57,140,101,190,76,199,28,186,88,189,25,203,201,213,247,189,179,13,254,159,168,20,201,216,181,5,178,188,48,152,162,32,76,93,53,243,83,230,101,118,224,50,252,13,35,210,162,212,158,210,125,78,160,228,224,193,126,108,252,227,204,151,71,14,146,146,250,237,161,59,102,71,218,124,100,199,167,23,98,9,128,222,19,35,198,4,15,184,242,46,37,55,36,4,34,226,36,139,239,13,204,230,252,34,59,135,32,252,157,254,60,71,128,155,49,253,223,128,121,214,56,248,105,15,68,30,234,81,27,156,248,24,251,232,114,255,62,42,13,10,41,80,249,172,219,184,141,72,185,215,100,128,145,91,13,217,133,7,76,4,41,233,244,236,53,108,109,31,65,128,150,234,209,140,183,102,157,206,118,232,178,26,107,12,241,157,186,241,231,158,44,112,161,136,143,252,174,118,23,69,24,195,85,195,247,51,182,208,81,217,55,27,121,105,8,192,155,161,203,159,227,199,225,110,69,41,145,33,38,181,37,62,255,106,206,205,163,195,127,204,199,97,249,215,129,240,199,94,183,7,92,18,28,104,84,7,6,149,142,38,22,110,25,225,192,178,158,224,141,44,35,130,249,154,199,14,228,238,74,98,150,164,255,236,85,47,61,182,71,26,164,45,59,56,133,114,35,254,81,29,13,10,163,90,132,177,193,32,90,48,75,45,11,252,149,255,251,214,3,232,230,244,46,96,1,122,40,8,186,190,0,194,112,206,186,111,147,184,59,185,196,28,119,135,153,39,52,23,31,194,164,240,180,111,6,198,240,41,200,44,204,152,91,124,60,132,234,101,84,120,255,121,232,171,143,230,204,229,145,236,179,156,53,58,128,1,20,2,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,13,99,108,101,97,114,116,111,109,97,114,107,13,10,128,3}; +static const unsigned int c_nSizes050000l=34022; +} +#endif //_PDF_READER_RESOURCE_FONT_s050000l_H diff --git a/PdfReader/Src/Annot.cpp b/PdfReader/Src/Annot.cpp new file mode 100644 index 0000000000..5e9d9c24ac --- /dev/null +++ b/PdfReader/Src/Annot.cpp @@ -0,0 +1,1791 @@ +#include +#include +#include "MemoryUtils.h" +#include "List.h" +#include "Object.h" +#include "Catalog.h" +#include "Graphics.h" +#include "GFont.h" +#include "Lexer.h" +#include "Annot.h" +#include "Dict.h" + +//------------------------------------------------------------------------------------------------------------------------------- + +#define annotFlagHidden 0x0002 +#define annotFlagPrint 0x0004 +#define annotFlagNoView 0x0020 + +#define fieldFlagReadOnly 0x00000001 +#define fieldFlagRequired 0x00000002 +#define fieldFlagNoExport 0x00000004 +#define fieldFlagMultiline 0x00001000 +#define fieldFlagPassword 0x00002000 +#define fieldFlagNoToggleToOff 0x00004000 +#define fieldFlagRadio 0x00008000 +#define fieldFlagPushbutton 0x00010000 +#define fieldFlagCombo 0x00020000 +#define fieldFlagEdit 0x00040000 +#define fieldFlagSort 0x00080000 +#define fieldFlagFileSelect 0x00100000 +#define fieldFlagMultiSelect 0x00200000 +#define fieldFlagDoNotSpellCheck 0x00400000 +#define fieldFlagDoNotScroll 0x00800000 +#define fieldFlagComb 0x01000000 +#define fieldFlagRichText 0x02000000 +#define fieldFlagRadiosInUnison 0x02000000 +#define fieldFlagCommitOnSelChange 0x04000000 + +#define fieldQuadLeft 0 +#define fieldQuadCenter 1 +#define fieldQuadRight 2 + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // AnnotBorderStyle + //------------------------------------------------------------------------------------------------------------------------------- + AnnotBorderStyle::AnnotBorderStyle(AnnotBorderType eType, double dWidth, double *pDash, int nDashLength, double dR, double dG, double dB) + { + m_eType = eType; + m_dWidth = dWidth; + m_pDash = pDash; + m_nDashLength = nDashLength; + m_dR = dR; + m_dG = dG; + m_dB = dB; + } + AnnotBorderStyle::~AnnotBorderStyle() + { + MemUtilsFree(m_pDash); + } + //------------------------------------------------------------------------------------------------------------------------------- + // Annot + //------------------------------------------------------------------------------------------------------------------------------- + Annot::Annot(GlobalParams *pGlobalParams, XRef *pXref, Dict *pAcroForm, Dict *pDict, Ref *pRef) + { + m_pGlobalParams = pGlobalParams; + + m_bValid = true; + m_pXref = pXref; + m_oRef = *pRef; + m_seType = NULL; + m_seAppBuffer = NULL; + m_pBorderStyle = NULL; + + // SubType + Object oDictItem; + if (pDict->Search("Subtype", &oDictItem)->IsName()) + { + m_seType = new StringExt(oDictItem.GetName()); + } + oDictItem.Free(); + + // Rect + if (pDict->Search("Rect", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 4) + { + Object oTemp; + m_dMinX = m_dMinY = m_dMaxX = m_dMaxY = 0; + if (oDictItem.ArrayGet(0, &oTemp)->IsNum()) + { + m_dMinX = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.ArrayGet(1, &oTemp)->IsNum()) + { + m_dMinY = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.ArrayGet(2, &oTemp)->IsNum()) + { + m_dMaxX = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.ArrayGet(3, &oTemp)->IsNum()) + { + m_dMaxY = oTemp.GetNum(); + } + oTemp.Free(); + + if (m_dMinX > m_dMaxX) + { + double dTemp = m_dMinX; + m_dMinX = m_dMaxX; + m_dMaxX = dTemp; + } + + if (m_dMinY > m_dMaxY) + { + double dTemp = m_dMinY; + m_dMinY = m_dMaxY; + m_dMaxY = dTemp; + } + } + else + { + // TO DO: Error "Bad bounding box for annotation" + m_bValid = false; + } + oDictItem.Free(); + + // F (flags) + if (pDict->Search("F", &oDictItem)->IsInt()) + { + m_nFlags = oDictItem.GetInt(); + } + else + { + m_nFlags = 0; + } + oDictItem.Free(); + + //Border style + + AnnotBorderType eBorderType = annotBorderSolid; + double dBorderWidth = 1; + double *pBorderDash = NULL; + int nBorderDashLength = 0; + double dBorderR = 0; + double dBorderG = 0; + double dBorderB = 1; + if (pDict->Search("BS", &oDictItem)->IsDict()) + { + Object oTemp; + if (oDictItem.DictLookup("S", &oTemp)->IsName()) + { + if (oTemp.IsName("S")) + { + eBorderType = annotBorderSolid; + } + else if (oTemp.IsName("D")) + { + eBorderType = annotBorderDashed; + } + else if (oTemp.IsName("B")) + { + eBorderType = annotBorderBeveled; + } + else if (oTemp.IsName("I")) + { + eBorderType = annotBorderInset; + } + else if (oTemp.IsName("U")) + { + eBorderType = annotBorderUnderlined; + } + } + oTemp.Free(); + + if (oDictItem.DictLookup("W", &oTemp)->IsNum()) + { + dBorderWidth = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.DictLookup("D", &oTemp)->IsArray()) + { + nBorderDashLength = oTemp.ArrayGetLength(); + pBorderDash = (double *)MemUtilsMallocArray(nBorderDashLength, sizeof(double)); + + for (int nIndex = 0; nIndex < nBorderDashLength; ++nIndex) + { + Object oArrayItem; + if (oTemp.ArrayGet(nIndex, &oArrayItem)->IsNum()) + { + pBorderDash[nIndex] = oArrayItem.GetNum(); + } + else + { + pBorderDash[nIndex] = 1; + } + oArrayItem.Free(); + } + } + oTemp.Free(); + } + else + { + oDictItem.Free(); + if (pDict->Search("Border", &oDictItem)->IsArray()) + { + Object oTemp; + if (oDictItem.ArrayGetLength() >= 3) + { + if (oDictItem.ArrayGet(2, &oTemp)->IsNum()) + { + dBorderWidth = oTemp.GetNum(); + } + oTemp.Free(); + if (oDictItem.ArrayGetLength() >= 4) + { + if (oDictItem.ArrayGet(3, &oTemp)->IsArray()) + { + eBorderType = annotBorderDashed; + nBorderDashLength = oTemp.ArrayGetLength(); + pBorderDash = (double *)MemUtilsMallocArray(nBorderDashLength, sizeof(double)); + + for (int nIndex = 0; nIndex < nBorderDashLength; ++nIndex) + { + Object oArrayItem; + if (oTemp.ArrayGet(nIndex, &oArrayItem)->IsNum()) + { + pBorderDash[nIndex] = oArrayItem.GetNum(); + } + else + { + pBorderDash[nIndex] = 1; + } + oArrayItem.Free(); + } + } + else + { + dBorderWidth = 0; + } + oTemp.Free(); + } + } + } + } + oDictItem.Free(); + + // C (border color) + // TO DO: надо сделать чтение случаев, когда в массике не только 3 элемента, а 0, 1, 3, 4 + if (pDict->Search("C", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 3) + { + Object oTemp; + if (oDictItem.ArrayGet(0, &oTemp)->IsNum()) + { + dBorderR = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.ArrayGet(1, &oTemp)->IsNum()) + { + dBorderG = oTemp.GetNum(); + } + oTemp.Free(); + + if (oDictItem.ArrayGet(2, &oTemp)->IsNum()) + { + dBorderB = oTemp.GetNum(); + } + oTemp.Free(); + } + oDictItem.Free(); + + m_pBorderStyle = new AnnotBorderStyle(eBorderType, dBorderWidth, pBorderDash, nBorderDashLength, dBorderR, dBorderG, dBorderB); + + // AP (appereance) + Object oAP; + if (pDict->Search("AP", &oAP)->IsDict()) + { + Object oAS; + if (pDict->Search("AS", &oAS)->IsName()) + { + Object oItem; + if (oAP.DictLookup("N", &oItem)->IsDict()) + { + Object oTemp; + if (oItem.DictLookupAndCopy(oAS.GetName(), &oTemp)->IsRef()) + { + oTemp.Copy(&m_oAppearance); + m_bValid = true; + } + else + { + oTemp.Free(); + if (oItem.DictLookupAndCopy("Off", &oTemp)->IsRef()) + { + oTemp.Copy(&m_oAppearance); + } + } + oTemp.Free(); + } + oItem.Free(); + } + else + { + Object oItem; + if (oAP.DictLookupAndCopy("N", &oItem)->IsRef()) + { + oItem.Copy(&m_oAppearance); + } + oItem.Free(); + } + oAS.Free(); + } + oAP.Free(); + } + Annot::~Annot() + { + if (m_seType) + { + delete m_seType; + } + m_oAppearance.Free(); + + if (m_seAppBuffer) + { + delete m_seAppBuffer; + } + if (m_pBorderStyle) + { + delete m_pBorderStyle; + } + } + void Annot::GenerateFieldAppearance(Dict *pField, Dict *pAnnot, Dict *pAcroForm) + { + // Тип Annotation должен быть Widget + if (m_seType->Compare("Widget")) + { + return; + } + + m_seAppBuffer = new StringExt(); + + // Appearance characteristics (MK) dictionary + Object oMKObject; + Dict *pMKDict; + if (pAnnot->Search("MK", &oMKObject)->IsDict()) + { + pMKDict = oMKObject.GetDict(); + } + else + { + pMKDict = NULL; + } + + // Рисуем фон (BackGround) + Object oDictItem; + if (pMKDict) + { + if (pMKDict->Search("BG", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() > 0) + { + SetColor(oDictItem.GetArray(), true, 0); + m_seAppBuffer->AppendFormat("0 0 {0:.2f} {1:.2f} re f\n", m_dMaxX - m_dMinX, m_dMaxY - m_dMinY); + } + oDictItem.Free(); + } + + // Считываем тип поля + // FT (File Type) + Object oFTobject; + FieldLookup(pField, "FT", &oFTobject); + + // Ff (Filed flags) + int nFiledFlags = 0; + if (FieldLookup(pField, "Ff", &oDictItem)->IsInt()) + { + nFiledFlags = oDictItem.GetInt(); + } + else + { + nFiledFlags = 0; + } + oDictItem.Free(); + + // Рисуем рамку + if (pMKDict) + { + double dWidth = m_pBorderStyle->GetWidth(); + if (dWidth > 0) + { + // BC (Border Color), если такого поля нет, тогда используем цвет из BG + pMKDict->Search("BC", &oDictItem); + if (!(oDictItem.IsArray() && oDictItem.ArrayGetLength() > 0)) + { + pMKDict->Search("BG", &oDictItem); + } + if (oDictItem.IsArray() && oDictItem.ArrayGetLength() > 0) + { + double dDx = m_dMaxX - m_dMinX; + double dDy = m_dMaxY - m_dMinY; + double *pDash; + int nDashLength = 0; + + Object oTemp; + bool bHasCaption = pMKDict->Search("CA", &oTemp)->IsString(); + oTemp.Free(); + + if (oFTobject.IsName("Btn") && (nFiledFlags & fieldFlagRadio) && !bHasCaption) + { + double dRad = 0.5 * (dDx < dDy ? dDx : dDy); + switch (m_pBorderStyle->GetType()) + { + case annotBorderDashed: + m_seAppBuffer->Append("["); + m_pBorderStyle->GetDash(&pDash, &nDashLength); + for (int nIndex = 0; nIndex < nDashLength; ++nIndex) + { + m_seAppBuffer->AppendFormat(" {0:.2f}", pDash[nIndex]); + } + m_seAppBuffer->Append("] 0 d\n"); + // Дальше как в случае не пунктирной линии + case annotBorderSolid: + case annotBorderUnderlined: + m_seAppBuffer->AppendFormat("{0:.2f} w\n", dWidth); + SetColor(oDictItem.GetArray(), false, 0); + DrawCircle(0.5 * dDx, 0.5 * dDy, dRad - 0.5 * dWidth, false); + break; + case annotBorderBeveled: + case annotBorderInset: + m_seAppBuffer->AppendFormat("{0:.2f} w\n", 0.5 * dWidth); + + SetColor(oDictItem.GetArray(), false, 0); + DrawCircle(0.5 * dDx, 0.5 * dDy, dRad - 0.25 * dWidth, false); + + SetColor(oDictItem.GetArray(), false, m_pBorderStyle->GetType() == annotBorderBeveled ? 1 : -1); + DrawCircleTopLeft(0.5 * dDx, 0.5 * dDy, dRad - 0.75 * dWidth); + + SetColor(oDictItem.GetArray(), false, m_pBorderStyle->GetType() == annotBorderBeveled ? -1 : 1); + DrawCircleBottomRight(0.5 * dDx, 0.5 * dDy, dRad - 0.75 * dWidth); + break; + } + } + else + { + switch (m_pBorderStyle->GetType()) + { + case annotBorderDashed: + m_seAppBuffer->Append("["); + m_pBorderStyle->GetDash(&pDash, &nDashLength); + for (int nIndex = 0; nIndex < nDashLength; ++nIndex) + { + m_seAppBuffer->AppendFormat(" {0:.2f}", pDash[nIndex]); + } + m_seAppBuffer->Append("] 0 d\n"); + // Дальше как в случае не пунктирной линии + case annotBorderSolid: + m_seAppBuffer->AppendFormat("{0:.2f} w\n", dWidth); + SetColor(oDictItem.GetArray(), false, 0); + m_seAppBuffer->AppendFormat("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n", 0.5 * dWidth, dDx - dWidth, dDy - dWidth); + break; + case annotBorderBeveled: + case annotBorderInset: + + SetColor(oDictItem.GetArray(), true, m_pBorderStyle->GetType() == annotBorderBeveled ? 1 : -1); + m_seAppBuffer->Append("0 0 m\n"); + m_seAppBuffer->AppendFormat("0 {0:.2f} l\n", dDy); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dDx, dDy); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dDx - dWidth, dDy - dWidth); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dWidth, dDy - dWidth); + m_seAppBuffer->AppendFormat("{0:.2f} {0:.2f} l\n", dWidth); + m_seAppBuffer->Append("f\n"); + + SetColor(oDictItem.GetArray(), true, m_pBorderStyle->GetType() == annotBorderBeveled ? -1 : 1); + m_seAppBuffer->Append("0 0 m\n"); + m_seAppBuffer->AppendFormat("{0:.2f} 0 l\n", dDx); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dDx, dDy); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dDx - dWidth, dDy - dWidth); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} l\n", dDx - dWidth, dWidth); + m_seAppBuffer->AppendFormat("{0:.2f} {0:.2f} l\n", dWidth); + m_seAppBuffer->Append("f\n"); + break; + case annotBorderUnderlined: + m_seAppBuffer->AppendFormat("{0:.2f} w\n", dWidth); + SetColor(oDictItem.GetArray(), false, 0); + m_seAppBuffer->AppendFormat("0 0 m {0:.2f} 0 l s\n", dDx); + break; + } + m_seAppBuffer->AppendFormat("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", dWidth, dDx - 2 * dWidth, dDy - 2 * dWidth); + } + } + oDictItem.Free(); + } + } + + // DR + Object oDRobject; + pAcroForm->Search("DR", &oDRobject); + + // Font dictionary + GrFontDict *pFontDict; + if (oDRobject.IsDict() && oDRobject.DictLookup("Font", &oDictItem)->IsDict()) + { + pFontDict = new GrFontDict(m_pXref, NULL, oDictItem.GetDict(), m_pGlobalParams); + } + else + { + pFontDict = NULL; + } + oDictItem.Free(); + + // DA (Default appereance string) + StringExt *seDA; + if (FieldLookup(pField, "DA", &oDictItem)->IsNull()) + { + oDictItem.Free(); + pAcroForm->Search("DA", &oDictItem); + } + if (oDictItem.IsString()) + { + seDA = oDictItem.GetString()->Copy(); + } + else + { + seDA = NULL; + } + oDictItem.Free(); + + // Рисуем содержимео Filed + if (oFTobject.IsName("Btn")) + { + StringExt *seCaption = NULL; + if (pMKDict) + { + if (pMKDict->Search("CA", &oDictItem)->IsString()) + { + seCaption = oDictItem.GetString()->Copy(); + } + oDictItem.Free(); + } + + // Radio button + if (nFiledFlags & fieldFlagRadio) + { + // Акробат не рисует Caption, если нет AP + if (FieldLookup(pField, "V", &oDictItem)->IsName()) + { + Object oAppStream; + if (pAnnot->Search("AS", &oAppStream)->IsName(oDictItem.GetName())) + { + if (seCaption) + { + DrawText(seCaption, seDA, pFontDict, false, 0, fieldQuadCenter, false, true); + } + else + { + if (pMKDict) + { + Object oTemp; + if (pMKDict->Search("BC", &oTemp)->IsArray() && oTemp.ArrayGetLength() > 0) + { + double dDx = m_dMaxX - m_dMinX; + double dDy = m_dMaxY - m_dMinY; + SetColor(oTemp.GetArray(), true, 0); + DrawCircle(0.5 * dDx, 0.5 * dDy, 0.2 * (dDx < dDy ? dDx : dDy), true); + } + oTemp.Free(); + } + } + } + oAppStream.Free(); + } + oDictItem.Free(); + } + else if (nFiledFlags & fieldFlagPushbutton) // PushButton + { + if (seCaption) + { + DrawText(seCaption, seDA, pFontDict, false, 0, fieldQuadCenter, false, false); + } + } + else // CheckBox + { + // "Yes" - для включенного состояние, "off" - для выключенного. + if (FieldLookup(pField, "V", &oDictItem)->IsName("Yes")) + { + if (!seCaption) + { + seCaption = new StringExt("3"); // ZapfDingbats checkmark + } + DrawText(seCaption, seDA, pFontDict, false, 0, fieldQuadCenter, false, true); + } + oDictItem.Free(); + } + if (seCaption) + { + delete seCaption; + } + } + else if (oFTobject.IsName("Tx")) + { + // Строковые значения могут быть юникодными + Object oValue; + if (FieldLookup(pField, "V", &oValue)->IsString()) + { + Object oTemp; + int nQuadding = 0; + if (FieldLookup(pField, "Q", &oTemp)->IsInt()) + { + nQuadding = oTemp.GetInt(); + } + else + { + nQuadding = fieldQuadLeft; + } + oTemp.Free(); + int nComb = 0; + if (nFiledFlags & fieldFlagComb) + { + if (FieldLookup(pField, "MaxLen", &oTemp)->IsInt()) + { + nComb = oTemp.GetInt(); + } + oTemp.Free(); + } + DrawText(oValue.GetString(), seDA, pFontDict, 0 != (nFiledFlags & fieldFlagMultiline), nComb, nQuadding, true, false); + } + oValue.Free(); + } + else if (oFTobject.IsName("Ch")) + { + // Строковые значения могут быть юникодными + int nQuadding = 0; + Object oTemp; + if (FieldLookup(pField, "Q", &oTemp)->IsInt()) + { + nQuadding = oTemp.GetInt(); + } + else + { + nQuadding = fieldQuadLeft; + } + oTemp.Free(); + + // ComboBox + if (nFiledFlags & fieldFlagCombo) + { + Object oValue; + if (FieldLookup(pField, "V", &oValue)->IsString()) + { + DrawText(oValue.GetString(), seDA, pFontDict, false, 0, nQuadding, true, false); + //~ Acrobat draws a popup icon on the right side + } + oValue.Free(); + } + else // ListBox + { + Object oOptions; + if (pField->Search("Opt", &oOptions)->IsArray()) + { + int nOptionsCount = oOptions.ArrayGetLength(); + // Option text + StringExt **ppText = (StringExt **)MemUtilsMallocArray(nOptionsCount, sizeof(StringExt *)); + for (int nIndex = 0; nIndex < nOptionsCount; ++nIndex) + { + ppText[nIndex] = NULL; + Object oTemp; + oOptions.ArrayGet(nIndex, &oTemp); + if (oTemp.IsString()) + { + ppText[nIndex] = oTemp.GetString()->Copy(); + } + else if (oTemp.IsArray() && oTemp.ArrayGetLength() == 2) + { + Object oArrayItem; + if (oTemp.ArrayGet(1, &oArrayItem)->IsString()) + { + ppText[nIndex] = oArrayItem.GetString()->Copy(); + } + oArrayItem.Free(); + } + oTemp.Free(); + if (!ppText[nIndex]) + { + ppText[nIndex] = new StringExt(); + } + } + // Selected option(s) + bool *pSelection = (bool *)MemUtilsMallocArray(nOptionsCount, sizeof(bool)); + //~ need to use the I field in addition to the V field + Object oValue; + FieldLookup(pField, "V", &oValue); + for (int nIndex = 0; nIndex < nOptionsCount; ++nIndex) + { + pSelection[nIndex] = false; + if (oValue.IsString()) + { + if (!oValue.GetString()->Compare(ppText[nIndex])) + { + pSelection[nIndex] = true; + } + } + else if (oValue.IsArray()) + { + for (int nJ = 0; nJ < oValue.ArrayGetLength(); ++nJ) + { + Object oTemp; + if (oValue.ArrayGet(nJ, &oTemp)->IsString() && !oTemp.GetString()->Compare(ppText[nIndex])) + { + pSelection[nIndex] = true; + } + oTemp.Free(); + } + } + } + oValue.Free(); + + // TI (Top Index) + int nTopIndex = 0; + if (pField->Search("TI", &oValue)->IsInt()) + { + nTopIndex = oValue.GetInt(); + } + else + { + nTopIndex = 0; + } + oValue.Free(); + + DrawListBox(ppText, pSelection, nOptionsCount, nTopIndex, seDA, pFontDict, nQuadding); + for (int nIndex = 0; nIndex < nOptionsCount; ++nIndex) + { + delete ppText[nIndex]; + } + MemUtilsFree(ppText); + MemUtilsFree(pSelection); + } + oOptions.Free(); + } + } + else if (oFTobject.IsName("Sig")) + { + //~unimp + } + else + { + // TO DO: Error "Unknown field type" + } + + if (seDA) + { + delete seDA; + } + + // Appearance stream dictionary + Object oAppearanceDict; + + oAppearanceDict.InitDict(m_pXref); + oAppearanceDict.DictAdd(CopyString("Length"), oDictItem.InitInt(m_seAppBuffer->GetLength())); + oAppearanceDict.DictAdd(CopyString("Subtype"), oDictItem.InitName("Form")); + oDictItem.InitArray(m_pXref); + Object oTemp; + oDictItem.ArrayAdd(oTemp.InitReal(0)); + oDictItem.ArrayAdd(oTemp.InitReal(0)); + oDictItem.ArrayAdd(oTemp.InitReal(m_dMaxX - m_dMinX)); + oDictItem.ArrayAdd(oTemp.InitReal(m_dMaxY - m_dMinY)); + oAppearanceDict.DictAdd(CopyString("BBox"), &oDictItem); + + // Resource dictionary + if (oDRobject.IsDict()) + { + oAppearanceDict.DictAdd(CopyString("Resources"), oDRobject.Copy(&oDictItem)); + } + oDRobject.Free(); + + // Appearance stream + MemoryStream *pAppearStream = new MemoryStream(m_seAppBuffer->GetBuffer(), 0, m_seAppBuffer->GetLength(), &oAppearanceDict); + m_oAppearance.Free(); + m_oAppearance.InitStream(pAppearStream); + + if (pFontDict) + { + delete pFontDict; + } + oFTobject.Free(); + oMKObject.Free(); + } + + // Устанавливаем цвет для заливки или обводки; цвет здается массиом (в котором должно быть + // 1, 3, или 4 элемента). Если равно +1, цвет color is высветляется, если равно + // -1, цвет затемняется, в противном случае, цвет не меняется. + void Annot::SetColor(Array *pArray, bool bFill, int nAdjust) + { + double arrColor[4]; + + int nComponentsCount = pArray->GetCount(); + if (nComponentsCount > 4) + { + nComponentsCount = 4; + } + for (int nIndex = 0; nIndex < nComponentsCount && nIndex < 4; ++nIndex) + { + Object oTemp; + if (pArray->Get(nIndex, &oTemp)->IsNum()) + { + arrColor[nIndex] = oTemp.GetNum(); + } + else + { + arrColor[nIndex] = 0; + } + oTemp.Free(); + } + if (4 == nComponentsCount) + { + nAdjust = -nAdjust; + } + if (nAdjust > 0) + { + for (int nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + arrColor[nIndex] = 0.5 * arrColor[nIndex] + 0.5; + } + } + else if (nAdjust < 0) + { + for (int nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + arrColor[nIndex] = 0.5 * arrColor[nIndex]; + } + } + if (4 == nComponentsCount) + { + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n", arrColor[0], arrColor[1], arrColor[2], arrColor[3], bFill ? 'k' : 'K'); + } + else if (3 == nComponentsCount) + { + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:s}\n", arrColor[0], arrColor[1], arrColor[2], bFill ? "rg" : "RG"); + } + else + { + m_seAppBuffer->AppendFormat("{0:.2f} {1:c}\n", arrColor[0], bFill ? 'g' : 'G'); + } + } + + // Рисуем текст или название для Field. + void Annot::DrawText(StringExt *seText, StringExt *seDA, GrFontDict *pFontDict, bool bMultiline, int nComb, int nQuadding, bool bTextField, bool bForceZapfDingbats) + { + CList *pListDA; + StringExt *seToken; + double dX, dY, dWidth; + int i, j, k, nChar; + + // Парсим Default Appearance string + + int nTfPos = -1, nTmPos = -1; + if (seDA) + { + pListDA = new CList(); + i = 0; + while (i < seDA->GetLength()) + { + while (i < seDA->GetLength() && Lexer::IsSpace(seDA->GetAt(i))) + { + ++i; + } + if (i < seDA->GetLength()) + { + for (j = i + 1; j < seDA->GetLength() && !Lexer::IsSpace(seDA->GetAt(j)); ++j); + pListDA->Append(new StringExt(seDA, i, j - i)); + i = j; + } + } + for (i = 2; i < pListDA->GetLength(); ++i) + { + if (i >= 2 && !((StringExt *)pListDA->GetByIndex(i))->Compare("Tf")) + { + nTfPos = i - 2; + } + else if (i >= 6 && !((StringExt *)pListDA->GetByIndex(i))->Compare("Tm")) + { + nTmPos = i - 6; + } + } + } + else + { + pListDA = NULL; + } + + // ZapfDingbats + if (bForceZapfDingbats) + { + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos); + if (seToken->Compare("/ZaDb")) + { + seToken->Clear(); + seToken->Append("/ZaDb"); + } + } + } + + // Считываем шрифт и размер шрифта + GrFont *pFont = NULL; + double dFontSize = 0; + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos); + if (seToken->GetLength() >= 1 && seToken->GetAt(0) == '/') + { + if (!pFontDict || !(pFont = pFontDict->Search(seToken->GetBuffer() + 1))) + { + // TO DO: Error "Unknown font in field's DA string" + } + } + else + { + // TO DO: Error "Invalid font name in 'Tf' operator in field's DA string" + } + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + dFontSize = atof(seToken->GetBuffer()); + } + else + { + // TO DO: Error "Missing 'Tf' operator in field's DA string" + } + + // Border Width + double dBorderWidth = m_pBorderStyle->GetWidth(); + + if (bTextField) + { + m_seAppBuffer->Append("/Tx BMC\n"); + } + m_seAppBuffer->Append("q\n"); + m_seAppBuffer->Append("BT\n"); + + // Многострочный текст + if (bMultiline) + { + // Флаги nComb игнорируются в многострочном тексте + + double dWMax = m_dMaxX - m_dMinX - 2 * dBorderWidth - 4; + + // Вычислим размер шрифта (если он не был установлен) + if (0 == dFontSize) + { + for (dFontSize = 20; dFontSize > 1; --dFontSize) + { + dY = m_dMaxY - m_dMinY; + double dMaxLineWidth = 0; + i = 0; + while (i < seText->GetLength()) + { + GetNextLine(seText, i, pFont, dFontSize, dWMax, &j, &dWidth, &k); + if (dWidth > dMaxLineWidth) + { + dMaxLineWidth = dWidth; + } + i = k; + dY -= dFontSize; + } + + if (dY >= 0.33 * dFontSize) + { + break; + } + } + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dFontSize); + } + } + + // Начальная координата Y + // (Каждая новая линий начинается с оператора Td) + dY = m_dMaxY - m_dMinY; + + // Font Matrix + if (nTmPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 4); + seToken->Clear(); + seToken->Append('0'); + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 5); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dY); + } + + // Пишем DA-string + if (pListDA) + { + for (i = 0; i < pListDA->GetLength(); ++i) + { + m_seAppBuffer->Append((StringExt *)pListDA->GetByIndex(i))->Append(' '); + } + } + + // Пишем Font Matrix (если она не была уже в DA-string) + if (nTmPos < 0) + { + m_seAppBuffer->AppendFormat("1 0 0 1 0 {0:.2f} Tm\n", dY); + } + + i = 0; + double dPrevX = 0; + while (i < seText->GetLength()) + { + GetNextLine(seText, i, pFont, dFontSize, dWMax, &j, &dWidth, &k); + // Вычислим начальную позицию текста + switch (nQuadding) + { + case fieldQuadLeft: + default: + dX = dBorderWidth + 2; + break; + case fieldQuadCenter: + dX = (m_dMaxX - m_dMinX - dWidth) / 2; + break; + case fieldQuadRight: + dX = m_dMaxX - m_dMinX - dBorderWidth - 2 - dWidth; + break; + } + + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} Td\n", dX - dPrevX, -dFontSize); + m_seAppBuffer->Append('('); + for (; i < j; ++i) + { + nChar = seText->GetAt(i) & 0xff; + if (nChar == '(' || nChar == ')' || nChar == '\\') + { + m_seAppBuffer->Append('\\'); + m_seAppBuffer->Append(nChar); + } + else if (nChar < 0x20 || nChar >= 0x80) + { + m_seAppBuffer->AppendFormat("\\{0:03o}", nChar); + } + else + { + m_seAppBuffer->Append(nChar); + } + } + m_seAppBuffer->Append(") Tj\n"); + + // Следующая строка + i = k; + dPrevX = dX; + } + + } + else // Однострочный текст + { + if (nComb > 0) + { + dWidth = (m_dMaxX - m_dMinX - 2 * dBorderWidth) / nComb; + + // Вычислим размер шрифта (если он не был установлен) + if (0 == dFontSize) + { + dFontSize = m_dMaxY - m_dMinY - 2 * dBorderWidth; + if (dWidth < dFontSize) + { + dFontSize = dWidth; + } + dFontSize = floor(dFontSize); + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dFontSize); + } + } + + // Вычислим начальную позицию текста + switch (nQuadding) + { + case fieldQuadLeft: + default: + dX = dBorderWidth + 2; + break; + case fieldQuadCenter: + dX = dBorderWidth + 2 + 0.5 * (nComb - seText->GetLength()) * dWidth; + break; + case fieldQuadRight: + dX = dBorderWidth + 2 + (nComb - seText->GetLength()) * dWidth; + break; + } + dY = 0.5 * (m_dMaxY - m_dMinY) - 0.4 * dFontSize; + + // Font Matrix + if (nTmPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 4); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dX); + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 5); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dY); + } + + // DA-string + if (pListDA) + { + for (i = 0; i < pListDA->GetLength(); ++i) + { + m_seAppBuffer->Append((StringExt *)pListDA->GetByIndex(i))->Append(' '); + } + } + + // Пишем Font Matrix (если она не была уже в DA-string) + if (nTmPos < 0) + { + m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); + } + + // write the text string + //~ this should center (instead of left-justify) each character within + //~ its comb cell + for (i = 0; i < seText->GetLength(); ++i) + { + if (i > 0) + { + m_seAppBuffer->AppendFormat("{0:.2f} 0 Td\n", dWidth); + } + m_seAppBuffer->Append('('); + nChar = seText->GetAt(i) & 0xff; + if (nChar == '(' || nChar == ')' || nChar == '\\') + { + m_seAppBuffer->Append('\\'); + m_seAppBuffer->Append(nChar); + } + else if (nChar < 0x20 || nChar >= 0x80) + { + m_seAppBuffer->AppendFormat("{0:.2f} 0 Td\n", dWidth); + } + else + { + m_seAppBuffer->Append(nChar); + } + m_seAppBuffer->Append(") Tj\n"); + } + } + else // обычное форматирование (non-comb) + { + // Вычислим ширину строки + if (pFont && !pFont->IsCIDFont()) + { + dWidth = 0; + for (i = 0; i < seText->GetLength(); ++i) + { + dWidth += ((Gr8BitFont *)pFont)->GetWidth(seText->GetAt(i)); + } + } + else + { + dWidth = seText->GetLength() * 0.5; + } + + // Вычислим размер шрифта (если он не был установлен) + if (0 == dFontSize) + { + dFontSize = m_dMaxY - m_dMinY - 2 * dBorderWidth; + double dTempFontSize = (m_dMaxX - m_dMinX - 4 - 2 * dBorderWidth) / dWidth; + if (dTempFontSize < dFontSize) + { + dFontSize = dTempFontSize; + } + dFontSize = floor(dFontSize); + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dFontSize); + } + } + + // Вычислим начальную позицию текста + dWidth *= dFontSize; + switch (nQuadding) + { + case fieldQuadLeft: + default: + dX = dBorderWidth + 2; + break; + case fieldQuadCenter: + dX = (m_dMaxX - m_dMinX - dWidth) / 2; + break; + case fieldQuadRight: + dX = m_dMaxX - m_dMinX - dBorderWidth - 2 - dWidth; + break; + } + dY = 0.5 * (m_dMaxY - m_dMinY) - 0.4 * dFontSize; + + // Font Matrix + if (nTmPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 4); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dX); + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 5); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dY); + } + + // DA-string + if (pListDA) + { + for (i = 0; i < pListDA->GetLength(); ++i) + { + m_seAppBuffer->Append((StringExt *)pListDA->GetByIndex(i))->Append(' '); + } + } + + // Пишем Font Matrix (если она не была уже в DA-string) + if (nTmPos < 0) + { + m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); + } + + // Пишем текст + m_seAppBuffer->Append('('); + for (i = 0; i < seText->GetLength(); ++i) + { + nChar = seText->GetAt(i) & 0xff; + if (nChar == '(' || nChar == ')' || nChar == '\\') + { + m_seAppBuffer->Append('\\'); + m_seAppBuffer->Append(nChar); + } + else if (nChar < 0x20 || nChar >= 0x80) + { + m_seAppBuffer->AppendFormat("\\{0:03o}", nChar); + } + else + { + m_seAppBuffer->Append(nChar); + } + } + m_seAppBuffer->Append(") Tj\n"); + } + } + + m_seAppBuffer->Append("ET\n"); + m_seAppBuffer->Append("Q\n"); + + if (bTextField) + { + m_seAppBuffer->Append("EMC\n"); + } + + if (pListDA) + { + DeleteCList(pListDA, StringExt); + } + } + + // Рисуем текст или название для Field. + void Annot::DrawListBox(StringExt **ppText, bool *pSelection, int nOptionsCount, int nTopIndex, StringExt *seDA, GrFontDict *pFontDict, int nQuadding) + { + CList *pListDA; + StringExt *seToken; + int i, j; + + // Парсим Default appearance string + int nTfPos = -1, nTmPos = -1; + if (seDA) + { + pListDA = new CList(); + i = 0; + while (i < seDA->GetLength()) + { + while (i < seDA->GetLength() && Lexer::IsSpace(seDA->GetAt(i))) + { + ++i; + } + if (i < seDA->GetLength()) + { + for (j = i + 1; j < seDA->GetLength() && !Lexer::IsSpace(seDA->GetAt(j)); ++j); + pListDA->Append(new StringExt(seDA, i, j - i)); + i = j; + } + } + for (i = 2; i < pListDA->GetLength(); ++i) + { + if (i >= 2 && !((StringExt *)pListDA->GetByIndex(i))->Compare("Tf")) + { + nTfPos = i - 2; + } + else if (i >= 6 && !((StringExt *)pListDA->GetByIndex(i))->Compare("Tm")) + { + nTmPos = i - 6; + } + } + } + else + { + pListDA = NULL; + } + + // Считываем шрифт и размер шрифта + GrFont *pFont = NULL; + double dFontSize = 0; + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos); + if (seToken->GetLength() >= 1 && seToken->GetAt(0) == '/') + { + if (!pFontDict || !(pFont = pFontDict->Search(seToken->GetBuffer() + 1))) + { + // TO DO: Error "Unknown font in field's DA string" + } + } + else + { + // TO DO: Error "Invalid font name in 'Tf' operator in field's DA string" + } + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + dFontSize = atof(seToken->GetBuffer()); + } + else + { + // TO DO: Error "Missing 'Tf' operator in field's DA string" + } + + // Border width + double dBorder = m_pBorderStyle->GetWidth(); + + // Вычислим размер фонта, если он не был задан + double dWidth = 0; + if (0 == dFontSize) + { + double dMaxW = 0; + for (i = 0; i < nOptionsCount; ++i) + { + if (pFont && !pFont->IsCIDFont()) + { + dWidth = 0; + for (j = 0; j < ppText[i]->GetLength(); ++j) + { + dWidth += ((Gr8BitFont *)pFont)->GetWidth(ppText[i]->GetAt(j)); + } + } + else + { + // грубая оценка + dWidth = ppText[i]->GetLength() * 0.5; + } + if (dWidth > dMaxW) + { + dMaxW = dWidth; + } + } + dFontSize = m_dMaxY - m_dMinY - 2 * dBorder; + double dFontSize2 = (m_dMaxX - m_dMinX - 4 - 2 * dBorder) / dMaxW; + + if (dFontSize2 < dFontSize) + { + dFontSize = dFontSize2; + } + dFontSize = floor(dFontSize); + + if (nTfPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTfPos + 1); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dFontSize); + } + } + + // Рисуем текст + double dY = m_dMaxY - m_dMinY - 1.1 * dFontSize; + + for (i = nTopIndex; i < nOptionsCount; ++i) + { + m_seAppBuffer->Append("q\n"); + + // Background + if (pSelection[i]) + { + m_seAppBuffer->Append("0 g f\n"); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re f\n", dBorder, dY - 0.2 * dFontSize, m_dMaxX - m_dMinX - 2 * dBorder, 1.1 * dFontSize); + } + + m_seAppBuffer->Append("BT\n"); + + // Вычислим ширину строки + if (pFont && !pFont->IsCIDFont()) + { + dWidth = 0; + for (j = 0; j < ppText[i]->GetLength(); ++j) + { + dWidth += ((Gr8BitFont *)pFont)->GetWidth(ppText[i]->GetAt(j)); + } + } + else + { + // грубая оценка + dWidth = ppText[i]->GetLength() * 0.5; + } + + // Вычислим начальную позицию текста + double dX = 0; + dWidth *= dFontSize; + switch (nQuadding) + { + case fieldQuadLeft: + default: + dX = dBorder + 2; + break; + case fieldQuadCenter: + dX = (m_dMaxX - m_dMinX - dWidth) / 2; + break; + case fieldQuadRight: + dX = m_dMaxX - m_dMinX - dBorder - 2 - dWidth; + break; + } + + // Font Matrix + if (nTmPos >= 0) + { + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 4); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dX); + seToken = (StringExt *)pListDA->GetByIndex(nTmPos + 5); + seToken->Clear(); + seToken->AppendFormat("{0:.2f}", dY); + } + + // DA string + if (pListDA) + { + for (j = 0; j < pListDA->GetLength(); ++j) + { + m_seAppBuffer->Append((StringExt *)pListDA->GetByIndex(j))->Append(' '); + } + } + + // Пишем Font Matrix (если он не был частью DA-string) + if (nTmPos < 0) + { + m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); + } + + if (pSelection[i]) + { + m_seAppBuffer->Append("1 g\n"); + } + + // Пишем текст + m_seAppBuffer->Append('('); + for (j = 0; j < ppText[i]->GetLength(); ++j) + { + int nChar = ppText[i]->GetAt(j) & 0xff; + if (nChar == '(' || nChar == ')' || nChar == '\\') + { + m_seAppBuffer->Append('\\'); + m_seAppBuffer->Append(nChar); + } + else if (nChar < 0x20 || nChar >= 0x80) + { + m_seAppBuffer->AppendFormat("\\{0:03o}", nChar); + } + else + { + m_seAppBuffer->Append(nChar); + } + } + m_seAppBuffer->Append(") Tj\n"); + + m_seAppBuffer->Append("ET\n"); + m_seAppBuffer->Append("Q\n"); + + // Следующая строка + dY -= 1.1 * dFontSize; + } + + if (pListDA) + { + DeleteCList(pListDA, StringExt); + } + } + + void Annot::GetNextLine(StringExt *seText, int nStart, GrFont *pFont, double dFontSize, double dMaxW, int *pEnd, double *pWidth, int *pNext) + { + double dWidth = 0, dTempWidth; + int j, k; + + + for (j = nStart; j < seText->GetLength() && dWidth <= dMaxW; ++j) + { + int nChar = seText->GetAt(j) & 0xff; + if (nChar == 0x0a || nChar == 0x0d) + { + break; + } + if (pFont && !pFont->IsCIDFont()) + { + dTempWidth = ((Gr8BitFont *)pFont)->GetWidth(nChar) * dFontSize; + } + else + { + // грубая оценка + dTempWidth = 0.5 * dFontSize; + } + dWidth += dTempWidth; + } + if (dWidth > dMaxW) + { + for (k = j; k > nStart && seText->GetAt(k - 1) != ' '; --k); + for (; k > nStart && seText->GetAt(k - 1) == ' '; --k); + if (k > nStart) + { + j = k; + } + + if (j == nStart) + { + // Обрабатываем странный случай, когда первый символ слишком широкий для первой строки + j = nStart + 1; + } + } + *pEnd = j; + + // Вычисляем ширину + dWidth = 0; + for (k = nStart; k < j; ++k) + { + if (pFont && !pFont->IsCIDFont()) + { + dTempWidth = ((Gr8BitFont *)pFont)->GetWidth(seText->GetAt(k)) * dFontSize; + } + else + { + dTempWidth = 0.5 * dFontSize; + } + dWidth += dTempWidth; + } + *pWidth = dWidth; + + while (j < seText->GetLength() && seText->GetAt(j) == ' ') + { + ++j; + } + if (j < seText->GetLength() && seText->GetAt(j) == 0x0d) + { + ++j; + } + if (j < seText->GetLength() && seText->GetAt(j) == 0x0a) + { + ++j; + } + *pNext = j; + } + + + // Расстояние от центра до контрольных точек кривой Безье + // = (4 * (sqrt(2) - 1) / 3) * r + #define Kappa 0.55228475 + + // Рисуем окружность с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. + // bFill - будем заливать или обводить? + void Annot::DrawCircle(double dX, double dY, double dRad, bool bFill) + { + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} m\n", dX + dRad, dY); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX + dRad, dY + Kappa * dRad, dX + Kappa * dRad, dY + dRad, dX, dY + dRad); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX - Kappa * dRad, dY + dRad, dX - dRad, dY + Kappa * dRad, dX - dRad, dY); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX - dRad, dY - Kappa * dRad, dX - Kappa * dRad, dY - dRad, dX, dY - dRad); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX + Kappa * dRad, dY - dRad, dX + dRad, dY - Kappa * dRad, dX + dRad, dY); + m_seAppBuffer->Append(bFill ? "f\n" : "s\n"); + } + + // Рисуем половину окружности (левую верхнюю) с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. + void Annot::DrawCircleTopLeft(double dX, double dY, double dRad) + { + double dRad2 = dRad / sqrt(2.0); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} m\n", dX + dRad2, dY + dRad2); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX + (1 - Kappa) * dRad2, dY + (1 + Kappa) * dRad2, dX - (1 - Kappa) * dRad2, dY + (1 + Kappa) * dRad2, dX - dRad2, dY + dRad2); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX - (1 + Kappa) * dRad2, dY + (1 - Kappa) * dRad2, dX - (1 + Kappa) * dRad2, dY - (1 - Kappa) * dRad2, dX - dRad2, dY - dRad2); + m_seAppBuffer->Append("S\n"); + } + + // Рисуем половину окружности (правую нижнюю) с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. + void Annot::DrawCircleBottomRight(double dX, double dY, double dRad) + { + double dRad2 = dRad / sqrt(2.0); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} m\n", dX - dRad2, dY - dRad2); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX - (1 - Kappa) * dRad2, dY - (1 + Kappa) * dRad2, dX + (1 - Kappa) * dRad2, dY - (1 + Kappa) * dRad2, dX + dRad2, dY - dRad2); + m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", dX + (1 + Kappa) * dRad2, dY - (1 - Kappa) * dRad2, dX + (1 + Kappa) * dRad2, dY + (1 - Kappa) * dRad2, dX + dRad2, dY + dRad2); + m_seAppBuffer->Append("S\n"); + } + + Object *Annot::FieldLookup(Dict *pField, char *sKey, Object *pObject) + { + Dict *pDict = pField; + if (!pDict->Search(sKey, pObject)->IsNull()) + { + return pObject; + } + pObject->Free(); + + Object oParent; + if (pDict->Search("Parent", &oParent)->IsDict()) + { + FieldLookup(oParent.GetDict(), sKey, pObject); + } + else + { + pObject->InitNull(); + } + oParent.Free(); + return pObject; + } + + void Annot::Draw(Graphics *pGraphics, bool bPrinting) + { + // Flags + if ((m_nFlags & annotFlagHidden) || (bPrinting && !(m_nFlags & annotFlagPrint)) || (!bPrinting && (m_nFlags & annotFlagNoView))) + { + return; + } + + // Appearance stream + bool bIsLink = m_seType && !m_seType->Compare("Link"); + + Object oTemp; + m_oAppearance.Fetch(m_pXref, &oTemp); + pGraphics->DrawAnnotation(&oTemp, (bIsLink ? m_pBorderStyle : (AnnotBorderStyle *)NULL), m_dMinX, m_dMinY, m_dMaxX, m_dMaxY); + oTemp.Free(); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Annots + //------------------------------------------------------------------------------------------------------------------------------- + + Annots::Annots(GlobalParams *pGlobalParams, XRef *pXref, Catalog *pCatalog, Object *pAnnotsObject) + { + m_pGlobalParams = pGlobalParams; + + Annot *pAnnot = NULL; + Ref oRef; + + m_ppAnnots = NULL; + int nSize = 0; + m_nAnnotsCount = 0; + + Dict *pAcroForm = (pCatalog->GetAcroForm()->IsDict() ? pCatalog->GetAcroForm()->GetDict() : NULL); + if (pAnnotsObject->IsArray()) + { + for (int nIndex = 0; nIndex < pAnnotsObject->ArrayGetLength(); ++nIndex) + { + Object oTemp; + if (pAnnotsObject->ArrayGetCopy(nIndex, &oTemp)->IsRef()) + { + oRef = oTemp.GetRef(); + oTemp.Free(); + pAnnotsObject->ArrayGet(nIndex, &oTemp); + } + else + { + oRef.nNum = oRef.nGen = -1; + } + if (oTemp.IsDict()) + { + pAnnot = new Annot(m_pGlobalParams, pXref, pAcroForm, oTemp.GetDict(), &oRef); + if (pAnnot->CheckValidation()) + { + if (m_nAnnotsCount >= nSize) + { + nSize += 16; + m_ppAnnots = (Annot **)MemUtilsReallocArray(m_ppAnnots, nSize, sizeof(Annot *)); + } + m_ppAnnots[m_nAnnotsCount++] = pAnnot; + } + else + { + delete pAnnot; + } + } + oTemp.Free(); + } + } + } + + Annots::~Annots() + { + for (int nIndex = 0; nIndex < m_nAnnotsCount; ++nIndex) + { + delete m_ppAnnots[nIndex]; + } + MemUtilsFree(m_ppAnnots); + } + + void Annots::GenerateAppearances(Dict *pAcroForm) + { + Ref oRef; + + Object oField; + if (pAcroForm->Search("Fields", &oField)->IsArray()) + { + for (int nIndex = 0; nIndex < oField.ArrayGetLength(); ++nIndex) + { + Object oItem; + if (oField.ArrayGetCopy(nIndex, &oItem)->IsRef()) + { + oRef = oItem.GetRef(); + oItem.Free(); + oField.ArrayGet(nIndex, &oItem); + } + else + { + oRef.nNum = oRef.nGen = -1; + } + if (oItem.IsDict()) + { + ScanFieldAppearances(oItem.GetDict(), &oRef, NULL, pAcroForm); + } + oItem.Free(); + } + } + oField.Free(); + } + + void Annots::ScanFieldAppearances(Dict *pNode, Ref *pRef, Dict *pParent, Dict *pAcroForm) + { + Annot *pAnnot = NULL; + Ref oRef2; + + Object oNodeItem; + if (pNode->Search("Kids", &oNodeItem)->IsArray()) + { + for (int nIndex = 0; nIndex < oNodeItem.ArrayGetLength(); ++nIndex) + { + Object oTemp; + if (oNodeItem.ArrayGetCopy(nIndex, &oTemp)->IsRef()) + { + oRef2 = oTemp.GetRef(); + oTemp.Free(); + oNodeItem.ArrayGet(nIndex, &oTemp); + } + else + { + oRef2.nNum = oRef2.nGen = -1; + } + if (oTemp.IsDict()) + { + ScanFieldAppearances(oTemp.GetDict(), &oRef2, pNode, pAcroForm); + } + oTemp.Free(); + } + oNodeItem.Free(); + return; + } + oNodeItem.Free(); + + if ((pAnnot = FindAnnot(pRef))) + { + pNode->SearchAndCopy("Parent", &oNodeItem); + if (!pParent || !oNodeItem.IsNull()) + { + pAnnot->GenerateFieldAppearance(pNode, pNode, pAcroForm); + } + else + { + pAnnot->GenerateFieldAppearance(pParent, pNode, pAcroForm); + } + oNodeItem.Free(); + } + } + + Annot *Annots::FindAnnot(Ref *pRef) + { + for (int nIndex = 0; nIndex < m_nAnnotsCount; ++nIndex) + { + if (m_ppAnnots[nIndex]->Match(pRef)) + { + return m_ppAnnots[nIndex]; + } + } + return NULL; + } +} diff --git a/PdfReader/Src/Annot.h b/PdfReader/Src/Annot.h new file mode 100644 index 0000000000..c38ff690ed --- /dev/null +++ b/PdfReader/Src/Annot.h @@ -0,0 +1,164 @@ +#ifndef _PDF_READER_ANNOT_H +#define _PDF_READER_ANNOT_H + +namespace PdfReader +{ + class XRef; + class Catalog; + class Graphics; + class GrFontDict; + + //------------------------------------------------------------------------------------------------------------------------------- + // AnnotBorderStyle + //------------------------------------------------------------------------------------------------------------------------------- + + enum AnnotBorderType + { + annotBorderSolid, + annotBorderDashed, + annotBorderBeveled, + annotBorderInset, + annotBorderUnderlined + }; + + class AnnotBorderStyle + { + public: + + AnnotBorderStyle(AnnotBorderType eType, double dWidth, double *pDash, int nDashLength, double dR, double dG, double dB); + ~AnnotBorderStyle(); + + AnnotBorderType GetType() + { + return m_eType; + } + double GetWidth() + { + return m_dWidth; + } + void GetDash(double **ppDash, int *pnDashLength) + { + *ppDash = m_pDash; + *pnDashLength = m_nDashLength; + } + void GetColor(double *pdR, double *pdG, double *pdB) + { + *pdR = m_dR; + *pdG = m_dG; + *pdB = m_dB; + } + + private: + + AnnotBorderType m_eType; // Тип + double m_dWidth; // Ширина рамки + double *m_pDash; // Если линия пунктирная, тогда определяем длину штриха + int m_nDashLength; // Количество элементов в массиве m_pDash + double m_dR; // + double m_dG; // Цвет + double m_dB; // + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Annot + //------------------------------------------------------------------------------------------------------------------------------- + + class Annot + { + public: + + Annot(GlobalParams *pGlobalParams, XRef *pXref, Dict *pAcroForm, Dict *pDict, Ref *pRef); + ~Annot(); + bool CheckValidation() + { + return m_bValid; + } + + void Draw(Graphics *pGraphics, bool pBrinting); + Object *GetAppearance(Object *pObject) + { + return m_oAppearance.Fetch(m_pXref, pObject); + } + + AnnotBorderStyle *GetBorderStyle() + { + return m_pBorderStyle; + } + + bool Match(Ref *pRef) + { + return m_oRef.nNum == pRef->nNum && m_oRef.nGen == pRef->nGen; + } + + void GenerateFieldAppearance(Dict *pField, Dict *pAnnot, Dict *pAcroForm); + + private: + + void SetColor(Array *pArray, bool bFill, int nAdjust); + void DrawText(StringExt *seText, StringExt *seDA, GrFontDict *pFontDict, bool bMultiline, int nComb, int nQuadding, bool bTextField, bool bForceZapfDingbats); + void DrawListBox(StringExt **ppText, bool *pSelection, int nOptionsCount, int nTopIndex, StringExt *seDA, GrFontDict *pFontDict, int nQuadding); + void GetNextLine(StringExt *seText, int nStart, GrFont *pFont, double dFontSize, double dMaxW, int *pEnd, double *pWidth, int *pNext); + void DrawCircle(double dX, double dY, double dRad, bool bFill); + void DrawCircleTopLeft(double dX, double dY, double dRad); + void DrawCircleBottomRight(double dX, double dY, double dRad); + Object *FieldLookup(Dict *pField, char *sKey, Object *pObject); + + private: + + XRef *m_pXref; // Таблица XRef для данного PDF-документа + Ref m_oRef; // Ссылка на объект, определяющий данной Annotation + StringExt *m_seType; // Тип Annotation + Object m_oAppearance; // Ссылка на Form XObject-поток + StringExt *m_seAppBuffer; + + double m_dMinX; // + double m_dMinY; // Прямоугольник, ограничивающий данную Annotation + double m_dMaxX; // + double m_dMaxY; // + + unsigned int m_nFlags; + AnnotBorderStyle *m_pBorderStyle; + + bool m_bValid; + + GlobalParams *m_pGlobalParams; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Annots + //------------------------------------------------------------------------------------------------------------------------------- + + class Annots + { + public: + + Annots(GlobalParams *pGlobalParams, XRef *pXref, Catalog *pCatalog, Object *pAnnotsObject); + + ~Annots(); + + int GetAnnotsCount() + { + return m_nAnnotsCount; + } + Annot *GetAnnot(int nIndex) + { + return m_ppAnnots[nIndex]; + } + + + void GenerateAppearances(Dict *pAcroForm); + + private: + + void ScanFieldAppearances(Dict *pNode, Ref *pRef, Dict *pParent, Dict *pAcroForm); + Annot *FindAnnot(Ref *pRef); + + private: + Annot **m_ppAnnots; // Список Annotations + int m_nAnnotsCount; // Количество элементов + + GlobalParams *m_pGlobalParams; + }; +} + +#endif // _PDF_READER_ANNOT_H diff --git a/PdfReader/Src/Array.cpp b/PdfReader/Src/Array.cpp new file mode 100644 index 0000000000..c450dec5db --- /dev/null +++ b/PdfReader/Src/Array.cpp @@ -0,0 +1,63 @@ +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "Array.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Array + //------------------------------------------------------------------------ + + Array::Array(XRef *pXRef) + { + m_pXRef = pXRef; + m_arrItems = NULL; + m_nItemSize = m_nCount = 0; + m_nRef = 1; + } + + Array::~Array() + { + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + m_arrItems[nIndex].Free(); + MemUtilsFree(m_arrItems); + } + + void Array::Add(Object *pItem) + { + if (m_nCount == m_nItemSize) + { + if (m_nCount == 0) + { + m_nItemSize = 8; + } + else + { + m_nItemSize *= 2; + } + m_arrItems = (Object *)MemUtilsReallocArray(m_arrItems, m_nItemSize, sizeof(Object)); + } + m_arrItems[m_nCount] = *pItem; + ++m_nCount; + } + + Object *Array::Get(int nIndex, Object *pObject) + { + if (nIndex < 0 || nIndex >= m_nCount) + { + return pObject->InitNull(); + } + return m_arrItems[nIndex].Fetch(m_pXRef, pObject); + } + + Object *Array::GetCopy(int nIndex, Object *pObject) + { + if (nIndex < 0 || nIndex >= m_nCount) + { + return pObject->InitNull(); + } + return m_arrItems[nIndex].Copy(pObject); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Array.h b/PdfReader/Src/Array.h new file mode 100644 index 0000000000..d3bd3c997b --- /dev/null +++ b/PdfReader/Src/Array.h @@ -0,0 +1,55 @@ +#ifndef _PDF_READER_ARRAY_H +#define _PDF_READER_ARRAY_H + +#include "Object.h" + +namespace PdfReader +{ + class Object; + class XRef; + + //------------------------------------------------------------------------ + // Array + //------------------------------------------------------------------------ + + class Array + { + public: + + Array(XRef *pXRef); + + ~Array(); + + int AddRef() + { + return ++m_nRef; + } + int Release() + { + return --m_nRef; + } + + + int GetCount() + { + return m_nCount; + } + + + void Add(Object *pItem); + + Object *Get(int nIndex, Object *pObject); + Object *GetCopy(int nIndex, Object *pObject); + + private: + + XRef *m_pXRef; // Таблица Xref для данного PDF документа + Object *m_arrItems; // Массив элементов + int m_nItemSize; // Размер элемента + int m_nCount; // Чилсо элементов в массиве + + int m_nRef; // Счетчик ссылок + }; +} + +#endif // _PDF_READER_ARRAY_H diff --git a/PdfReader/Src/BuiltinFont.h b/PdfReader/Src/BuiltinFont.h new file mode 100644 index 0000000000..65eef161f1 --- /dev/null +++ b/PdfReader/Src/BuiltinFont.h @@ -0,0 +1,45 @@ +#ifndef _PDF_READER_BUILT_INFONT_H +#define _PDF_READER_BUILT_INFONT_H + +namespace PdfReader +{ + struct BuiltinFont; + class BuiltinFontWidths; + + //------------------------------------------------------------------------ + struct BuiltinFontWidth + { + char *sName; + unsigned short unWidth; + BuiltinFontWidth *pNext; + }; + + struct BuiltinFont + { + char *sName; + char **ppDefaultBaseEncoding; + short nAscent; + short nDescent; + short arrBBox[4]; + BuiltinFontWidth *pWidths; + int nSize; + }; + + //------------------------------------------------------------------------ + + static bool BuiltinFontGetWidth(BuiltinFont *pFont, char *sName, unsigned short *punWidth) + { + for (int nIndex = 0; nIndex < pFont->nSize; nIndex++) + { + BuiltinFontWidth oWitdh = pFont->pWidths[nIndex]; + if (!strcmp(oWitdh.sName, sName)) + { + *punWidth = oWitdh.unWidth; + return true; + } + } + return false; + } +} + +#endif // _PDF_READER_BUILT_INFONT_H diff --git a/PdfReader/Src/BuiltinFontTables.h b/PdfReader/Src/BuiltinFontTables.h new file mode 100644 index 0000000000..dc778f262a --- /dev/null +++ b/PdfReader/Src/BuiltinFontTables.h @@ -0,0 +1,4276 @@ +#ifndef _PDF_READER_BUILTIN_FONT_TABLES_H +#define _PDF_READER_BUILTIN_FONT_TABLES_H + +#include "BuiltinFont.h" +#include "EncodingTables.h" + +#define BuiltinFontsCount 14 +#define BuiltinFontSubsetsCount 12 + +namespace PdfReader +{ + static BuiltinFontWidth c_arrCourierWidthsTable[] = + { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "L", 600, NULL }, + { "backslash", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "equal", 600, NULL }, + { "question", 600, NULL }, + { "X", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "hyphen", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "five", 600, NULL }, + { "nine", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "zero", 600, NULL }, + { "multiply", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Racute", 600, NULL }, + { "Ograve", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "scedilla", 600, NULL }, + { "Oacute", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "ampersand", 600, NULL }, + { "Iacute", 600, NULL }, + { "lacute", 600, NULL }, + { "igrave", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "iacute", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "seven", 600, NULL }, + { "Amacron", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "braceright", 600, NULL }, + { "icircumflex", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } + }; + + static BuiltinFontWidth c_arrCourierBoldWidthsTable[] = + { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } + }; + + static BuiltinFontWidth c_arrCourierBoldObliqueWidthsTable[] = + { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } + }; + + static BuiltinFontWidth c_arrCourierObliqueWidthsTable[] = + { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } + }; + + static BuiltinFontWidth c_arrHelveticaWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } + }; + + static BuiltinFontWidth c_arrHelveticaBoldWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "dbldaggerumlaut", 556, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } + }; + + static BuiltinFontWidth c_arrHelveticaBoldObliqueWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } + }; + + static BuiltinFontWidth c_arrHelveticaObliqueWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } + }; + + static BuiltinFontWidth c_arrSymbolWidthsTable[] = + { + { "bracketleftex", 384, NULL }, + { "alpha", 631, NULL }, + { "union", 768, NULL }, + { "infinity", 713, NULL }, + { "comma", 250, NULL }, + { "copyrightsans", 790, NULL }, + { "plusminus", 549, NULL }, + { "arrowup", 603, NULL }, + { "apple", 790, NULL }, + { "parenleftbt", 384, NULL }, + { "notelement", 713, NULL }, + { "colon", 278, NULL }, + { "beta", 549, NULL }, + { "braceleftbt", 494, NULL }, + { "Lambda", 686, NULL }, + { "Phi", 763, NULL }, + { "minus", 549, NULL }, + { "space", 250, NULL }, + { "Sigma", 592, NULL }, + { "approxequal", 549, NULL }, + { "minute", 247, NULL }, + { "circleplus", 768, NULL }, + { "Omicron", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lambda", 549, NULL }, + { "phi", 521, NULL }, + { "aleph", 823, NULL }, + { "Tau", 611, NULL }, + { "spade", 753, NULL }, + { "logicaland", 603, NULL }, + { "sigma", 603, NULL }, + { "propersuperset", 713, NULL }, + { "omicron", 549, NULL }, + { "question", 444, NULL }, + { "equal", 549, NULL }, + { "Epsilon", 611, NULL }, + { "emptyset", 823, NULL }, + { "diamond", 753, NULL }, + { "four", 500, NULL }, + { "Mu", 889, NULL }, + { "parenlefttp", 384, NULL }, + { "club", 753, NULL }, + { "bullet", 460, NULL }, + { "Omega", 768, NULL }, + { "tau", 439, NULL }, + { "Upsilon", 690, NULL }, + { "bracelefttp", 494, NULL }, + { "heart", 753, NULL }, + { "divide", 549, NULL }, + { "epsilon", 439, NULL }, + { "logicalor", 603, NULL }, + { "parenleftex", 384, NULL }, + { "greaterequal", 549, NULL }, + { "mu", 576, NULL }, + { "Nu", 722, NULL }, + { "therefore", 863, NULL }, + { "notsubset", 713, NULL }, + { "omega", 686, NULL }, + { "semicolon", 278, NULL }, + { "element", 713, NULL }, + { "upsilon", 576, NULL }, + { "existential", 549, NULL }, + { "integralbt", 686, NULL }, + { "lessequal", 549, NULL }, + { "phi1", 603, NULL }, + { "lozenge", 494, NULL }, + { "trademarkserif", 890, NULL }, + { "parenright", 333, NULL }, + { "reflexsuperset", 713, NULL }, + { "sigma1", 439, NULL }, + { "nu", 521, NULL }, + { "Gamma", 603, NULL }, + { "angleright", 329, NULL }, + { "ellipsis", 1000, NULL }, + { "Rho", 556, NULL }, + { "parenrightbt", 384, NULL }, + { "radicalex", 500, NULL }, + { "eight", 500, NULL }, + { "angleleft", 329, NULL }, + { "arrowdbldown", 603, NULL }, + { "congruent", 549, NULL }, + { "Theta", 741, NULL }, + { "intersection", 768, NULL }, + { "Pi", 768, NULL }, + { "slash", 278, NULL }, + { "registerserif", 790, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "gamma", 411, NULL }, + { "bracketleft", 333, NULL }, + { "rho", 549, NULL }, + { "circlemultiply", 768, NULL }, + { "Chi", 722, NULL }, + { "theta", 521, NULL }, + { "pi", 549, NULL }, + { "integraltp", 686, NULL }, + { "Eta", 722, NULL }, + { "product", 823, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "propersubset", 713, NULL }, + { "bracketrightbt", 384, NULL }, + { "trademarksans", 786, NULL }, + { "dotmath", 250, NULL }, + { "integralex", 686, NULL }, + { "chi", 549, NULL }, + { "parenrighttp", 384, NULL }, + { "eta", 603, NULL }, + { "underscore", 500, NULL }, + { "Euro", 750, NULL }, + { "multiply", 549, NULL }, + { "zero", 500, NULL }, + { "partialdiff", 494, NULL }, + { "angle", 768, NULL }, + { "arrowdblleft", 987, NULL }, + { "braceleft", 480, NULL }, + { "parenrightex", 384, NULL }, + { "Rfraktur", 795, NULL }, + { "Zeta", 611, NULL }, + { "braceex", 494, NULL }, + { "arrowdblup", 603, NULL }, + { "arrowdown", 603, NULL }, + { "Ifraktur", 686, NULL }, + { "degree", 400, NULL }, + { "Iota", 333, NULL }, + { "perpendicular", 658, NULL }, + { "radical", 549, NULL }, + { "asteriskmath", 500, NULL }, + { "percent", 833, NULL }, + { "zeta", 494, NULL }, + { "six", 500, NULL }, + { "two", 500, NULL }, + { "weierstrass", 987, NULL }, + { "summation", 713, NULL }, + { "bracketrighttp", 384, NULL }, + { "carriagereturn", 658, NULL }, + { "suchthat", 439, NULL }, + { "arrowvertex", 603, NULL }, + { "Delta", 612, NULL }, + { "iota", 329, NULL }, + { "arrowhorizex", 1000, NULL }, + { "bracketrightex", 384, NULL }, + { "bracketright", 333, NULL }, + { "ampersand", 778, NULL }, + { "plus", 549, NULL }, + { "proportional", 713, NULL }, + { "delta", 494, NULL }, + { "copyrightserif", 790, NULL }, + { "bracerightmid", 494, NULL }, + { "arrowleft", 987, NULL }, + { "second", 411, NULL }, + { "arrowdblboth", 1042, NULL }, + { "florin", 500, NULL }, + { "Psi", 795, NULL }, + { "bracerightbt", 494, NULL }, + { "bracketleftbt", 384, NULL }, + { "seven", 500, NULL }, + { "braceleftmid", 494, NULL }, + { "notequal", 549, NULL }, + { "psi", 686, NULL }, + { "equivalence", 549, NULL }, + { "universal", 713, NULL }, + { "arrowdblright", 987, NULL }, + { "braceright", 480, NULL }, + { "reflexsubset", 713, NULL }, + { "Xi", 645, NULL }, + { "theta1", 631, NULL }, + { "logicalnot", 713, NULL }, + { "Kappa", 722, NULL }, + { "similar", 549, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 549, NULL }, + { "registersans", 790, NULL }, + { "omega1", 713, NULL }, + { "exclam", 333, NULL }, + { "Upsilon1", 620, NULL }, + { "bracerighttp", 494, NULL }, + { "xi", 493, NULL }, + { "period", 250, NULL }, + { "Alpha", 722, NULL }, + { "arrowright", 987, NULL }, + { "greater", 549, NULL }, + { "bracketlefttp", 384, NULL }, + { "kappa", 549, NULL }, + { "gradient", 713, NULL }, + { "integral", 274, NULL }, + { "arrowboth", 1042, NULL }, + { "Beta", 667, NULL } + }; + + static BuiltinFontWidth c_arrTimesBoldWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 444, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 667, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 520, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 667, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 570, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 394, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 778, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 667, NULL }, + { "periodcentered", 250, NULL }, + { "M", 944, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 667, NULL }, + { "O", 778, NULL }, + { "P", 611, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 667, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 722, NULL }, + { "W", 1000, NULL }, + { "X", 722, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 722, NULL }, + { "Z", 667, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 444, NULL }, + { "d", 556, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 500, NULL }, + { "j", 333, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 300, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 444, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 667, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 667, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 930, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 394, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 444, NULL }, + { "Tcaron", 667, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 1000, NULL }, + { "six", 500, NULL }, + { "paragraph", 540, NULL }, + { "dcaron", 672, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 667, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 667, NULL }, + { "tcaron", 416, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 581, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 833, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 556, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 330, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 444, NULL }, + { "Zdotaccent", 667, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 394, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 570, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 778, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } + }; + + static BuiltinFontWidth c_arrTimesBoldItalicWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 570, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 606, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 382, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 667, NULL }, + { "G", 722, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 667, NULL }, + { "W", 889, NULL }, + { "X", 667, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 611, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 266, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 500, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 576, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 944, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 611, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 832, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 348, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 667, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 500, NULL }, + { "dcaron", 608, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 366, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 570, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 611, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 667, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 300, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 348, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 606, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 389, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } + }; + + static BuiltinFontWidth c_arrTimesItalicWidthsTable[] = + { + { "Ntilde", 667, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 444, NULL }, + { "Ncommaaccent", 667, NULL }, + { "Zacute", 556, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 675, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 611, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 675, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 889, NULL }, + { "Agrave", 611, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 300, NULL }, + { "A", 611, NULL }, + { "B", 611, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 444, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 250, NULL }, + { "M", 833, NULL }, + { "N", 667, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 556, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 611, NULL }, + { "Aacute", 611, NULL }, + { "caron", 333, NULL }, + { "S", 500, NULL }, + { "T", 556, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 611, NULL }, + { "W", 833, NULL }, + { "X", 611, NULL }, + { "question", 500, NULL }, + { "equal", 675, NULL }, + { "Y", 556, NULL }, + { "Z", 556, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 278, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 444, NULL }, + { "l", 278, NULL }, + { "m", 722, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 675, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 444, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 667, NULL }, + { "quotedbl", 420, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 500, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 889, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 556, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 214, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 667, NULL }, + { "Abreve", 611, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 611, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 389, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 556, NULL }, + { "umacron", 500, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 556, NULL }, + { "Scommaaccent", 500, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 920, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 675, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 500, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 611, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 400, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 556, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 611, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 523, NULL }, + { "dcaron", 544, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 300, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 422, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 389, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 667, NULL }, + { "plus", 675, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 556, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 556, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 611, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 611, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 611, NULL }, + { "seven", 500, NULL }, + { "Sacute", 500, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 556, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 400, NULL }, + { "quotedblright", 556, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 675, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 611, NULL }, + { "breve", 333, NULL }, + { "bar", 275, NULL }, + { "fraction", 167, NULL }, + { "less", 675, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 611, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 675, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 275, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } + }; + + static BuiltinFontWidth c_arrTimesRomanWidthsTable[] = + { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 564, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 278, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 564, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 444, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 344, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 444, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 556, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 389, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 556, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 444, NULL }, + { "V", 722, NULL }, + { "W", 944, NULL }, + { "X", 722, NULL }, + { "question", 444, NULL }, + { "equal", 564, NULL }, + { "Y", 722, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 444, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 333, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 444, NULL }, + { "s", 389, NULL }, + { "OE", 889, NULL }, + { "t", 278, NULL }, + { "divide", 564, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 408, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 444, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 180, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 500, NULL }, + { "abreve", 444, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 444, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 921, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 564, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 480, NULL }, + { "Thorn", 556, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 722, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 453, NULL }, + { "dcaron", 588, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 326, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 444, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 564, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 444, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 444, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 480, NULL }, + { "quotedblright", 444, NULL }, + { "amacron", 444, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 564, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 564, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 564, NULL }, + { "atilde", 444, NULL }, + { "brokenbar", 200, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } + }; + + static BuiltinFontWidth c_arrZapfDingbatsWidthsTable[] = + { + { "a81", 438, NULL }, + { "a82", 138, NULL }, + { "a83", 277, NULL }, + { "a84", 415, NULL }, + { "a85", 509, NULL }, + { "a86", 410, NULL }, + { "a87", 234, NULL }, + { "a88", 234, NULL }, + { "a89", 390, NULL }, + { "a140", 788, NULL }, + { "a141", 788, NULL }, + { "a142", 788, NULL }, + { "a143", 788, NULL }, + { "a144", 788, NULL }, + { "a145", 788, NULL }, + { "a146", 788, NULL }, + { "a147", 788, NULL }, + { "a148", 788, NULL }, + { "a149", 788, NULL }, + { "a90", 390, NULL }, + { "a91", 276, NULL }, + { "a92", 276, NULL }, + { "space", 278, NULL }, + { "a93", 317, NULL }, + { "a94", 317, NULL }, + { "a95", 334, NULL }, + { "a96", 334, NULL }, + { "a97", 392, NULL }, + { "a98", 392, NULL }, + { "a99", 668, NULL }, + { "a150", 788, NULL }, + { "a151", 788, NULL }, + { "a152", 788, NULL }, + { "a153", 788, NULL }, + { "a154", 788, NULL }, + { "a155", 788, NULL }, + { "a156", 788, NULL }, + { "a157", 788, NULL }, + { "a158", 788, NULL }, + { "a159", 788, NULL }, + { "a160", 894, NULL }, + { "a161", 838, NULL }, + { "a162", 924, NULL }, + { "a163", 1016, NULL }, + { "a164", 458, NULL }, + { "a165", 924, NULL }, + { "a166", 918, NULL }, + { "a167", 927, NULL }, + { "a168", 928, NULL }, + { "a169", 928, NULL }, + { "a170", 834, NULL }, + { "a171", 873, NULL }, + { "a172", 828, NULL }, + { "a173", 924, NULL }, + { "a174", 917, NULL }, + { "a175", 930, NULL }, + { "a176", 931, NULL }, + { "a177", 463, NULL }, + { "a178", 883, NULL }, + { "a179", 836, NULL }, + { "a180", 867, NULL }, + { "a181", 696, NULL }, + { "a182", 874, NULL }, + { "a183", 760, NULL }, + { "a184", 946, NULL }, + { "a185", 865, NULL }, + { "a186", 967, NULL }, + { "a187", 831, NULL }, + { "a188", 873, NULL }, + { "a189", 927, NULL }, + { "a1", 974, NULL }, + { "a2", 961, NULL }, + { "a3", 980, NULL }, + { "a4", 719, NULL }, + { "a5", 789, NULL }, + { "a6", 494, NULL }, + { "a7", 552, NULL }, + { "a8", 537, NULL }, + { "a9", 577, NULL }, + { "a190", 970, NULL }, + { "a191", 918, NULL }, + { "a192", 748, NULL }, + { "a193", 836, NULL }, + { "a194", 771, NULL }, + { "a195", 888, NULL }, + { "a196", 748, NULL }, + { "a197", 771, NULL }, + { "a198", 888, NULL }, + { "a199", 867, NULL }, + { "a10", 692, NULL }, + { "a11", 960, NULL }, + { "a12", 939, NULL }, + { "a13", 549, NULL }, + { "a14", 855, NULL }, + { "a15", 911, NULL }, + { "a16", 933, NULL }, + { "a17", 945, NULL }, + { "a18", 974, NULL }, + { "a19", 755, NULL }, + { "a20", 846, NULL }, + { "a21", 762, NULL }, + { "a22", 761, NULL }, + { "a23", 571, NULL }, + { "a24", 677, NULL }, + { "a25", 763, NULL }, + { "a26", 760, NULL }, + { "a27", 759, NULL }, + { "a28", 754, NULL }, + { "a29", 786, NULL }, + { "a30", 788, NULL }, + { "a31", 788, NULL }, + { "a32", 790, NULL }, + { "a33", 793, NULL }, + { "a34", 794, NULL }, + { "a35", 816, NULL }, + { "a36", 823, NULL }, + { "a37", 789, NULL }, + { "a38", 841, NULL }, + { "a39", 823, NULL }, + { "a40", 833, NULL }, + { "a41", 816, NULL }, + { "a42", 831, NULL }, + { "a43", 923, NULL }, + { "a44", 744, NULL }, + { "a45", 723, NULL }, + { "a46", 749, NULL }, + { "a47", 790, NULL }, + { "a48", 792, NULL }, + { "a49", 695, NULL }, + { "a100", 668, NULL }, + { "a101", 732, NULL }, + { "a102", 544, NULL }, + { "a103", 544, NULL }, + { "a104", 910, NULL }, + { "a105", 911, NULL }, + { "a106", 667, NULL }, + { "a107", 760, NULL }, + { "a108", 760, NULL }, + { "a109", 626, NULL }, + { "a50", 776, NULL }, + { "a51", 768, NULL }, + { "a52", 792, NULL }, + { "a53", 759, NULL }, + { "a54", 707, NULL }, + { "a55", 708, NULL }, + { "a56", 682, NULL }, + { "a57", 701, NULL }, + { "a58", 826, NULL }, + { "a59", 815, NULL }, + { "a110", 694, NULL }, + { "a111", 595, NULL }, + { "a112", 776, NULL }, + { "a117", 690, NULL }, + { "a118", 791, NULL }, + { "a119", 790, NULL }, + { "a60", 789, NULL }, + { "a61", 789, NULL }, + { "a62", 707, NULL }, + { "a63", 687, NULL }, + { "a64", 696, NULL }, + { "a65", 689, NULL }, + { "a66", 786, NULL }, + { "a67", 787, NULL }, + { "a68", 713, NULL }, + { "a69", 791, NULL }, + { "a200", 696, NULL }, + { "a201", 874, NULL }, + { "a120", 788, NULL }, + { "a121", 788, NULL }, + { "a202", 974, NULL }, + { "a122", 788, NULL }, + { "a203", 762, NULL }, + { "a123", 788, NULL }, + { "a204", 759, NULL }, + { "a124", 788, NULL }, + { "a205", 509, NULL }, + { "a125", 788, NULL }, + { "a206", 410, NULL }, + { "a126", 788, NULL }, + { "a127", 788, NULL }, + { "a128", 788, NULL }, + { "a129", 788, NULL }, + { "a70", 785, NULL }, + { "a71", 791, NULL }, + { "a72", 873, NULL }, + { "a73", 761, NULL }, + { "a74", 762, NULL }, + { "a75", 759, NULL }, + { "a76", 892, NULL }, + { "a77", 892, NULL }, + { "a78", 788, NULL }, + { "a79", 784, NULL }, + { "a130", 788, NULL }, + { "a131", 788, NULL }, + { "a132", 788, NULL }, + { "a133", 788, NULL }, + { "a134", 788, NULL }, + { "a135", 788, NULL }, + { "a136", 788, NULL }, + { "a137", 788, NULL }, + { "a138", 788, NULL }, + { "a139", 788, NULL } + }; + + static BuiltinFont c_arrBuiltinFonts[] = + { + { "Courier", c_arrStandardEncoding, 629, -157, { -23, -250, 715, 805}, c_arrCourierWidthsTable, 315 }, + { "Courier-Bold", c_arrStandardEncoding, 629, -157, {-113, -250, 749, 801}, c_arrCourierBoldWidthsTable, 315 }, + { "Courier-BoldOblique", c_arrStandardEncoding, 629, -157, { -57, -250, 869, 801}, c_arrCourierBoldObliqueWidthsTable, 315 }, + { "Courier-Oblique", c_arrStandardEncoding, 629, -157, { -27, -250, 849, 805}, c_arrCourierObliqueWidthsTable, 315 }, + { "Helvetica", c_arrStandardEncoding, 718, -207, {-166, -225, 1000, 931}, c_arrHelveticaWidthsTable, 315 }, + { "Helvetica-Bold", c_arrStandardEncoding, 718, -207, {-170, -228, 1003, 962}, c_arrHelveticaBoldWidthsTable, 316 }, + { "Helvetica-BoldOblique", c_arrStandardEncoding, 718, -207, {-174, -228, 1114, 962}, c_arrHelveticaBoldObliqueWidthsTable, 315 }, + { "Helvetica-Oblique", c_arrStandardEncoding, 718, -207, {-170, -225, 1116, 931}, c_arrHelveticaObliqueWidthsTable, 315 }, + { "Symbol", c_arrSymbolEncoding, 1010, -293, {-180, -293, 1090, 1010}, c_arrSymbolWidthsTable, 190 }, + { "Times-Bold", c_arrStandardEncoding, 683, -217, {-168, -218, 1000, 935}, c_arrTimesBoldWidthsTable, 315 }, + { "Times-BoldItalic", c_arrStandardEncoding, 683, -217, {-200, -218, 996, 921}, c_arrTimesBoldItalicWidthsTable, 315 }, + { "Times-Italic", c_arrStandardEncoding, 683, -217, {-169, -217, 1010, 883}, c_arrTimesItalicWidthsTable, 315 }, + { "Times-Roman", c_arrStandardEncoding, 683, -217, {-168, -218, 1000, 898}, c_arrTimesRomanWidthsTable, 315 }, + { "ZapfDingbats", c_arrZapfDingbatsEncoding, 820, -143, { -1, -143, 981, 820}, c_arrZapfDingbatsWidthsTable, 202 } + }; + + static BuiltinFont *c_arrBuiltinFontSubset[] = + { + &c_arrBuiltinFonts[0], + &c_arrBuiltinFonts[3], + &c_arrBuiltinFonts[1], + &c_arrBuiltinFonts[2], + &c_arrBuiltinFonts[4], + &c_arrBuiltinFonts[7], + &c_arrBuiltinFonts[5], + &c_arrBuiltinFonts[6], + &c_arrBuiltinFonts[12], + &c_arrBuiltinFonts[11], + &c_arrBuiltinFonts[9], + &c_arrBuiltinFonts[10] + }; +} + +#endif // _PDF_READER_BUILTIN_FONT_TABLES_H diff --git a/PdfReader/Src/CCITT-Tables.h b/PdfReader/Src/CCITT-Tables.h new file mode 100644 index 0000000000..6d6b6332f8 --- /dev/null +++ b/PdfReader/Src/CCITT-Tables.h @@ -0,0 +1,508 @@ +#ifndef _PDF_READER_CCIT_TABLES_H +#define _PDF_READER_CCIT_TABLES_H + +namespace PdfReader +{ + struct CCITTCode + { + short nBitsCount; + short nCode; + }; + + #define ccittEOL -2 + + //------------------------------------------------------------------------ + // 2D коды + //------------------------------------------------------------------------ + + #define Pass_2D 0 + #define Horiz_2D 1 + #define Vert0_2D 2 + #define VertR1_2D 3 + #define VertL1_2D 4 + #define VertR2_2D 5 + #define VertL2_2D 6 + #define VertR3_2D 7 + #define VertL3_2D 8 + + // коды 1-7 бит + static CCITTCode c_arrTable2D[128] = + { + { -1, -1 }, { -1, -1 }, // 000000x + { 7, VertL3_2D }, // 0000010 + { 7, VertR3_2D }, // 0000011 + { 6, VertL2_2D }, { 6, VertL2_2D }, // 000010x + { 6, VertR2_2D }, { 6, VertR2_2D }, // 000011x + + { 4, Pass_2D }, { 4, Pass_2D }, // 0001xxx + { 4, Pass_2D }, { 4, Pass_2D }, + { 4, Pass_2D }, { 4, Pass_2D }, + { 4, Pass_2D }, { 4, Pass_2D }, + + { 3, Horiz_2D }, { 3, Horiz_2D }, // 001xxxx + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + { 3, Horiz_2D }, { 3, Horiz_2D }, + + { 3, VertL1_2D }, { 3, VertL1_2D }, // 010xxxx + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + { 3, VertL1_2D }, { 3, VertL1_2D }, + + { 3, VertR1_2D }, { 3, VertR1_2D }, // 011xxxx + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + { 3, VertR1_2D }, { 3, VertR1_2D }, + + { 1, Vert0_2D }, { 1, Vert0_2D }, // 1xxxxxx + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D }, + { 1, Vert0_2D }, { 1, Vert0_2D } + }; + + //------------------------------------------------------------------------ + // White run lengths + //------------------------------------------------------------------------ + + // коды 11-12 бит (верхние 7 бит установлены в 0) + static CCITTCode c_arrWhiteTable1[32] = + { + { -1, -1 }, // 00000 + { 12, ccittEOL }, // 00001 + { -1, -1 }, { -1, -1 }, // 0001x + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 001xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 010xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 011xx + { 11, 1792 }, { 11, 1792 }, // 1000x + { 12, 1984 }, // 10010 + { 12, 2048 }, // 10011 + { 12, 2112 }, // 10100 + { 12, 2176 }, // 10101 + { 12, 2240 }, // 10110 + { 12, 2304 }, // 10111 + { 11, 1856 }, { 11, 1856 }, // 1100x + { 11, 1920 }, { 11, 1920 }, // 1101x + { 12, 2368 }, // 11100 + { 12, 2432 }, // 11101 + { 12, 2496 }, // 11110 + { 12, 2560 } // 11111 + }; + + // коды 1-9 бит + static CCITTCode c_arrWhiteTable2[512] = + { + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 0000000xx + { 8, 29 }, { 8, 29 }, // 00000010x + { 8, 30 }, { 8, 30 }, // 00000011x + { 8, 45 }, { 8, 45 }, // 00000100x + { 8, 46 }, { 8, 46 }, // 00000101x + { 7, 22 }, { 7, 22 }, { 7, 22 }, { 7, 22 }, // 0000011xx + { 7, 23 }, { 7, 23 }, { 7, 23 }, { 7, 23 }, // 0000100xx + { 8, 47 }, { 8, 47 }, // 00001010x + { 8, 48 }, { 8, 48 }, // 00001011x + + { 6, 13 }, { 6, 13 }, { 6, 13 }, { 6, 13 }, // 000011xxx + { 6, 13 }, { 6, 13 }, { 6, 13 }, { 6, 13 }, + + { 7, 20 }, { 7, 20 }, { 7, 20 }, { 7, 20 }, // 0001000xx + { 8, 33 }, { 8, 33 }, // 00010010x + { 8, 34 }, { 8, 34 }, // 00010011x + { 8, 35 }, { 8, 35 }, // 00010100x + { 8, 36 }, { 8, 36 }, // 00010101x + { 8, 37 }, { 8, 37 }, // 00010110x + { 8, 38 }, { 8, 38 }, // 00010111x + { 7, 19 }, { 7, 19 }, { 7, 19 }, { 7, 19 }, // 0001100xx + { 8, 31 }, { 8, 31 }, // 00011010x + { 8, 32 }, { 8, 32 }, // 00011011x + + { 6, 1 }, { 6, 1 }, { 6, 1 }, { 6, 1 }, // 000111xxx + { 6, 1 }, { 6, 1 }, { 6, 1 }, { 6, 1 }, + + { 6, 12 }, { 6, 12 }, { 6, 12 }, { 6, 12 }, // 001000xxx + { 6, 12 }, { 6, 12 }, { 6, 12 }, { 6, 12 }, + + { 8, 53 }, { 8, 53 }, // 00100100x + { 8, 54 }, { 8, 54 }, // 00100101x + { 7, 26 }, { 7, 26 }, { 7, 26 }, { 7, 26 }, // 0010011xx + { 8, 39 }, { 8, 39 }, // 00101000x + { 8, 40 }, { 8, 40 }, // 00101001x + + { 8, 41 }, { 8, 41 }, // 00101010x + { 8, 42 }, { 8, 42 }, // 00101011x + { 8, 43 }, { 8, 43 }, // 00101100x + { 8, 44 }, { 8, 44 }, // 00101101x + { 7, 21 }, { 7, 21 }, { 7, 21 }, { 7, 21 }, // 0010111xx + { 7, 28 }, { 7, 28 }, { 7, 28 }, { 7, 28 }, // 0011000xx + { 8, 61 }, { 8, 61 }, // 00110010x + { 8, 62 }, { 8, 62 }, // 00110011x + { 8, 63 }, { 8, 63 }, // 00110100x + { 8, 0 }, { 8, 0 }, // 00110101x + { 8, 320 }, { 8, 320 }, // 00110110x + { 8, 384 }, { 8, 384 }, // 00110111x + + { 5, 10 }, { 5, 10 }, { 5, 10 }, { 5, 10 }, // 00111xxxx + { 5, 10 }, { 5, 10 }, { 5, 10 }, { 5, 10 }, + { 5, 10 }, { 5, 10 }, { 5, 10 }, { 5, 10 }, + { 5, 10 }, { 5, 10 }, { 5, 10 }, { 5, 10 }, + + { 5, 11 }, { 5, 11 }, { 5, 11 }, { 5, 11 }, // 01000xxxx + { 5, 11 }, { 5, 11 }, { 5, 11 }, { 5, 11 }, + { 5, 11 }, { 5, 11 }, { 5, 11 }, { 5, 11 }, + { 5, 11 }, { 5, 11 }, { 5, 11 }, { 5, 11 }, + + { 7, 27 }, { 7, 27 }, { 7, 27 }, { 7, 27 }, // 0100100xx + { 8, 59 }, { 8, 59 }, // 01001010x + { 8, 60 }, { 8, 60 }, // 01001011x + { 9, 1472 }, // 010011000 + { 9, 1536 }, // 010011001 + { 9, 1600 }, // 010011010 + { 9, 1728 }, // 010011011 + { 7, 18 }, { 7, 18 }, { 7, 18 }, { 7, 18 }, // 0100111xx + { 7, 24 }, { 7, 24 }, { 7, 24 }, { 7, 24 }, // 0101000xx + { 8, 49 }, { 8, 49 }, // 01010010x + { 8, 50 }, { 8, 50 }, // 01010011x + { 8, 51 }, { 8, 51 }, // 01010100x + { 8, 52 }, { 8, 52 }, // 01010101x + { 7, 25 }, { 7, 25 }, { 7, 25 }, { 7, 25 }, // 0101011xx + { 8, 55 }, { 8, 55 }, // 01011000x + { 8, 56 }, { 8, 56 }, // 01011001x + { 8, 57 }, { 8, 57 }, // 01011010x + { 8, 58 }, { 8, 58 }, // 01011011x + + { 6, 192 }, { 6, 192 }, { 6, 192 }, { 6, 192 }, // 010111xxx + { 6, 192 }, { 6, 192 }, { 6, 192 }, { 6, 192 }, + + { 6, 1664 }, { 6, 1664 }, { 6, 1664 }, { 6, 1664 }, // 011000xxx + { 6, 1664 }, { 6, 1664 }, { 6, 1664 }, { 6, 1664 }, + + { 8, 448 }, { 8, 448 }, // 01100100x + { 8, 512 }, { 8, 512 }, // 01100101x + { 9, 704 }, // 011001100 + { 9, 768 }, // 011001101 + { 8, 640 }, { 8, 640 }, // 01100111x + { 8, 576 }, { 8, 576 }, // 01101000x + { 9, 832 }, // 011010010 + { 9, 896 }, // 011010011 + { 9, 960 }, // 011010100 + { 9, 1024 }, // 011010101 + { 9, 1088 }, // 011010110 + { 9, 1152 }, // 011010111 + { 9, 1216 }, // 011011000 + { 9, 1280 }, // 011011001 + { 9, 1344 }, // 011011010 + { 9, 1408 }, // 011011011 + { 7, 256 }, { 7, 256 }, { 7, 256 }, { 7, 256 }, // 0110111xx + + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, // 0111xxxxx + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + { 4, 2 }, { 4, 2 }, { 4, 2 }, { 4, 2 }, + + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, // 1000xxxxx + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, + + { 5, 128 }, { 5, 128 }, { 5, 128 }, { 5, 128 }, // 10010xxxx + { 5, 128 }, { 5, 128 }, { 5, 128 }, { 5, 128 }, + { 5, 128 }, { 5, 128 }, { 5, 128 }, { 5, 128 }, + { 5, 128 }, { 5, 128 }, { 5, 128 }, { 5, 128 }, + + { 5, 8 }, { 5, 8 }, { 5, 8 }, { 5, 8 }, // 10011xxxx + { 5, 8 }, { 5, 8 }, { 5, 8 }, { 5, 8 }, + { 5, 8 }, { 5, 8 }, { 5, 8 }, { 5, 8 }, + { 5, 8 }, { 5, 8 }, { 5, 8 }, { 5, 8 }, + + { 5, 9 }, { 5, 9 }, { 5, 9 }, { 5, 9 }, // 10100xxxx + { 5, 9 }, { 5, 9 }, { 5, 9 }, { 5, 9 }, + { 5, 9 }, { 5, 9 }, { 5, 9 }, { 5, 9 }, + { 5, 9 }, { 5, 9 }, { 5, 9 }, { 5, 9 }, + + { 6, 16 }, { 6, 16 }, { 6, 16 }, { 6, 16 }, // 101010xxx + { 6, 16 }, { 6, 16 }, { 6, 16 }, { 6, 16 }, + + { 6, 17 }, { 6, 17 }, { 6, 17 }, { 6, 17 }, // 101011xxx + { 6, 17 }, { 6, 17 }, { 6, 17 }, { 6, 17 }, + + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, // 1011xxxxx + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + { 4, 4 }, { 4, 4 }, { 4, 4 }, { 4, 4 }, + + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, // 1100xxxxx + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, + + { 6, 14 }, { 6, 14 }, { 6, 14 }, { 6, 14 }, // 110100xxx + { 6, 14 }, { 6, 14 }, { 6, 14 }, { 6, 14 }, + + { 6, 15 }, { 6, 15 }, { 6, 15 }, { 6, 15 }, // 110101xxx + { 6, 15 }, { 6, 15 }, { 6, 15 }, { 6, 15 }, + + { 5, 64 }, { 5, 64 }, { 5, 64 }, { 5, 64 }, // 11011xxxx + { 5, 64 }, { 5, 64 }, { 5, 64 }, { 5, 64 }, + { 5, 64 }, { 5, 64 }, { 5, 64 }, { 5, 64 }, + { 5, 64 }, { 5, 64 }, { 5, 64 }, { 5, 64 }, + + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, // 1110xxxxx + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, + + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, // 1111xxxxx + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 }, + { 4, 7 }, { 4, 7 }, { 4, 7 }, { 4, 7 } + }; + + //------------------------------------------------------------------------ + // Black run lengths + //------------------------------------------------------------------------ + + // коды 10-13 бит (верхние 6 бит установлены в 0) + static CCITTCode c_arrBlackTable1[128] = + { + { -1, -1 }, { -1, -1 }, // 000000000000x + { 12, ccittEOL }, { 12, ccittEOL }, // 000000000001x + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000001xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000010xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000011xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000100xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000101xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000110xx + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 00000000111xx + { 11, 1792 }, { 11, 1792 }, { 11, 1792 }, { 11, 1792 }, // 00000001000xx + { 12, 1984 }, { 12, 1984 }, // 000000010010x + { 12, 2048 }, { 12, 2048 }, // 000000010011x + { 12, 2112 }, { 12, 2112 }, // 000000010100x + { 12, 2176 }, { 12, 2176 }, // 000000010101x + { 12, 2240 }, { 12, 2240 }, // 000000010110x + { 12, 2304 }, { 12, 2304 }, // 000000010111x + { 11, 1856 }, { 11, 1856 }, { 11, 1856 }, { 11, 1856 }, // 00000001100xx + { 11, 1920 }, { 11, 1920 }, { 11, 1920 }, { 11, 1920 }, // 00000001101xx + { 12, 2368 }, { 12, 2368 }, // 000000011100x + { 12, 2432 }, { 12, 2432 }, // 000000011101x + { 12, 2496 }, { 12, 2496 }, // 000000011110x + { 12, 2560 }, { 12, 2560 }, // 000000011111x + + { 10, 18 }, { 10, 18 }, { 10, 18 }, { 10, 18 }, // 0000001000xxx + { 10, 18 }, { 10, 18 }, { 10, 18 }, { 10, 18 }, + + { 12, 52 }, { 12, 52 }, // 000000100100x + { 13, 640 }, // 0000001001010 + { 13, 704 }, // 0000001001011 + { 13, 768 }, // 0000001001100 + { 13, 832 }, // 0000001001101 + { 12, 55 }, { 12, 55 }, // 000000100111x + { 12, 56 }, { 12, 56 }, // 000000101000x + { 13, 1280 }, // 0000001010010 + { 13, 1344 }, // 0000001010011 + { 13, 1408 }, // 0000001010100 + { 13, 1472 }, // 0000001010101 + { 12, 59 }, { 12, 59 }, // 000000101011x + { 12, 60 }, { 12, 60 }, // 000000101100x + { 13, 1536 }, // 0000001011010 + { 13, 1600 }, // 0000001011011 + { 11, 24 }, { 11, 24 }, { 11, 24 }, { 11, 24 }, // 00000010111xx + { 11, 25 }, { 11, 25 }, { 11, 25 }, { 11, 25 }, // 00000011000xx + { 13, 1664 }, // 0000001100100 + { 13, 1728 }, // 0000001100101 + { 12, 320 }, { 12, 320 }, // 000000110011x + { 12, 384 }, { 12, 384 }, // 000000110100x + { 12, 448 }, { 12, 448 }, // 000000110101x + { 13, 512 }, // 0000001101100 + { 13, 576 }, // 0000001101101 + { 12, 53 }, { 12, 53 }, // 000000110111x + { 12, 54 }, { 12, 54 }, // 000000111000x + { 13, 896 }, // 0000001110010 + { 13, 960 }, // 0000001110011 + { 13, 1024 }, // 0000001110100 + { 13, 1088 }, // 0000001110101 + { 13, 1152 }, // 0000001110110 + { 13, 1216 }, // 0000001110111 + { 10, 64 }, { 10, 64 }, { 10, 64 }, { 10, 64 }, // 0000001111xxx + { 10, 64 }, { 10, 64 }, { 10, 64 }, { 10, 64 } + }; + + // коды 7-12 быит (верхние 4 бита установлены в 0) + static CCITTCode c_arrBlackTable2[192] = + { + { 8, 13 }, { 8, 13 }, { 8, 13 }, { 8, 13 }, // 00000100xxxx + { 8, 13 }, { 8, 13 }, { 8, 13 }, { 8, 13 }, + { 8, 13 }, { 8, 13 }, { 8, 13 }, { 8, 13 }, + { 8, 13 }, { 8, 13 }, { 8, 13 }, { 8, 13 }, + + { 11, 23 }, { 11, 23 }, // 00000101000x + { 12, 50 }, // 000001010010 + { 12, 51 }, // 000001010011 + { 12, 44 }, // 000001010100 + { 12, 45 }, // 000001010101 + { 12, 46 }, // 000001010110 + { 12, 47 }, // 000001010111 + { 12, 57 }, // 000001011000 + { 12, 58 }, // 000001011001 + { 12, 61 }, // 000001011010 + { 12, 256 }, // 000001011011 + { 10, 16 }, { 10, 16 }, { 10, 16 }, { 10, 16 },// 0000010111xx + { 10, 17 }, { 10, 17 }, { 10, 17 }, { 10, 17 },// 0000011000xx + { 12, 48 }, // 000001100100 + { 12, 49 }, // 000001100101 + { 12, 62 }, // 000001100110 + { 12, 63 }, // 000001100111 + { 12, 30 }, // 000001101000 + { 12, 31 }, // 000001101001 + { 12, 32 }, // 000001101010 + { 12, 33 }, // 000001101011 + { 12, 40 }, // 000001101100 + { 12, 41 }, // 000001101101 + { 11, 22 }, { 11, 22 }, // 00000110111x + + { 8, 14 }, { 8, 14 }, { 8, 14 }, { 8, 14 }, // 00000111xxxx + { 8, 14 }, { 8, 14 }, { 8, 14 }, { 8, 14 }, + { 8, 14 }, { 8, 14 }, { 8, 14 }, { 8, 14 }, + { 8, 14 }, { 8, 14 }, { 8, 14 }, { 8, 14 }, + + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, // 0000100xxxxx + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + { 7, 10 }, { 7, 10 }, { 7, 10 }, { 7, 10 }, + + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, // 0000101xxxxx + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + { 7, 11 }, { 7, 11 }, { 7, 11 }, { 7, 11 }, + + { 9, 15 }, { 9, 15 }, { 9, 15 }, { 9, 15 }, // 000011000xxx + { 9, 15 }, { 9, 15 }, { 9, 15 }, { 9, 15 }, + + { 12, 128 }, // 000011001000 + { 12, 192 }, // 000011001001 + { 12, 26 }, // 000011001010 + { 12, 27 }, // 000011001011 + { 12, 28 }, // 000011001100 + { 12, 29 }, // 000011001101 + { 11, 19 }, { 11, 19 }, // 00001100111x + { 11, 20 }, { 11, 20 }, // 00001101000x + { 12, 34 }, // 000011010010 + { 12, 35 }, // 000011010011 + { 12, 36 }, // 000011010100 + { 12, 37 }, // 000011010101 + { 12, 38 }, // 000011010110 + { 12, 39 }, // 000011010111 + { 11, 21 }, { 11, 21 }, // 00001101100x + { 12, 42 }, // 000011011010 + { 12, 43 }, // 000011011011 + { 10, 0 }, { 10, 0 }, { 10, 0 }, { 10, 0 }, // 0000110111xx + + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, // 0000111xxxxx + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 }, + { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 } + }; + + // коды 2-6 бит + static CCITTCode c_arrBlackTable3[64] = + { + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 0000xx + { 6, 9 }, // 000100 + { 6, 8 }, // 000101 + { 5, 7 }, { 5, 7 }, // 00011x + { 4, 6 }, { 4, 6 }, { 4, 6 }, { 4, 6 }, // 0010xx + { 4, 5 }, { 4, 5 }, { 4, 5 }, { 4, 5 }, // 0011xx + + { 3, 1 }, { 3, 1 }, { 3, 1 }, { 3, 1 }, // 010xxx + { 3, 1 }, { 3, 1 }, { 3, 1 }, { 3, 1 }, + + { 3, 4 }, { 3, 4 }, { 3, 4 }, { 3, 4 }, // 011xxx + { 3, 4 }, { 3, 4 }, { 3, 4 }, { 3, 4 }, + + { 2, 3 }, { 2, 3 }, { 2, 3 }, { 2, 3 }, // 10xxxx + { 2, 3 }, { 2, 3 }, { 2, 3 }, { 2, 3 }, + { 2, 3 }, { 2, 3 }, { 2, 3 }, { 2, 3 }, + { 2, 3 }, { 2, 3 }, { 2, 3 }, { 2, 3 }, + + { 2, 2 }, { 2, 2 }, { 2, 2 }, { 2, 2 }, // 11xxxx + { 2, 2 }, { 2, 2 }, { 2, 2 }, { 2, 2 }, + { 2, 2 }, { 2, 2 }, { 2, 2 }, { 2, 2 }, + { 2, 2 }, { 2, 2 }, { 2, 2 }, { 2, 2 } + }; +} + +#endif // _PDF_READER_CCIT_TABLES_H \ No newline at end of file diff --git a/PdfReader/Src/CMap.cpp b/PdfReader/Src/CMap.cpp new file mode 100644 index 0000000000..ce1137843f --- /dev/null +++ b/PdfReader/Src/CMap.cpp @@ -0,0 +1,499 @@ +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "File.h" +#include "StringExt.h" +#include "GlobalParams.h" +#include "PSLexer.h" +#include "CMap.h" + +namespace PdfReader +{ + struct CMapVectorEntry + { + bool bIsVector; + CID nCID; + CMapVectorEntry *pVector; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + + static int GetCharFromFile(void *pFile) + { + return fgetc((FILE *)pFile); + } + + //------------------------------------------------------------------------------------------------------------------------------- + + CMap *CMap::Parse(CMapCache *pCache, StringExt *seCollection, StringExt *seCMapName, GlobalParams *pGlobalParams, wchar_t *wsFilePath) + { + FILE *pFile = NULL; + char sToken1[256], sToken2[256], sToken3[256]; + int nLen1, nLen2, nLen3; + + if (NULL != wsFilePath) + { + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(wsFilePath)) + return NULL; + + pFile = oFile.GetFileNative(); + } + else + { + if (pGlobalParams && !(pFile = pGlobalParams->FindCMapFile(seCollection, seCMapName))) + { + // Проверяем на Identity CMap. + if (!seCMapName->Compare("Identity") || !seCMapName->Compare("Identity-H")) + { + return new CMap(pGlobalParams, seCollection->Copy(), seCMapName->Copy(), 0); + } + if (!seCMapName->Compare("Identity-V")) + { + return new CMap(pGlobalParams, seCollection->Copy(), seCMapName->Copy(), 1); + } + + // TO DO: Error "Couldn't find CMap file for collection" + return NULL; + } + } + + CMap *pCMap = new CMap(pGlobalParams, seCollection->Copy(), seCMapName->Copy()); + + PSLexer *Lexer = new PSLexer(&GetCharFromFile, pFile); + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + + while (Lexer->GetToken(sToken2, sizeof(sToken2), &nLen2)) + { + if (!strcmp(sToken2, "usecmap")) + { + if (sToken1[0] == '/') + { + pCMap->UseCMap(pCache, sToken1 + 1); + } + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken1, "/WMode")) + { + pCMap->m_nWMode = atoi(sToken2); + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken2, "begincodespacerange")) + { + while (Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1)) + { + if (!strcmp(sToken1, "endcodespacerange")) + { + break; + } + if (!Lexer->GetToken(sToken2, sizeof(sToken2), &nLen2) || !strcmp(sToken2, "endcodespacerange")) + { + // TO DO: Error "Illegal entry in codespacerange block in CMap" + break; + } + if (sToken1[0] == '<' && sToken2[0] == '<' && nLen1 == nLen2 && nLen1 >= 4 && (nLen1 & 1) == 0) + { + unsigned int unStart = 0, unEnd = 0; + sToken1[nLen1 - 1] = sToken2[nLen1 - 1] = '\0'; + sscanf(sToken1 + 1, "%x", &unStart); + sscanf(sToken2 + 1, "%x", &unEnd); + nLen1 = (nLen1 - 2) / 2; + pCMap->AddCodeSpace(pCMap->m_pVector, unStart, unEnd, nLen1); + } + } + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken2, "begincidchar")) + { + while (Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1)) + { + if (!strcmp(sToken1, "endcidchar")) + { + break; + } + if (!Lexer->GetToken(sToken2, sizeof(sToken2), &nLen2) || !strcmp(sToken2, "endcidchar")) + { + // TO DO: Error "Illegal entry in cidchar block in CMap" + break; + } + if (!(sToken1[0] == '<' && sToken1[nLen1 - 1] == '>' && nLen1 >= 4 && (nLen1 & 1) == 0)) + { + // TO DO: Error "Illegal entry in cidchar block in CMap" + continue; + } + sToken1[nLen1 - 1] = '\0'; + unsigned int unCode = 0; + if (sscanf(sToken1 + 1, "%x", &unCode) != 1) + { + // TO DO: Error "Illegal entry in cidchar block in CMap" + continue; + } + nLen1 = (nLen1 - 2) / 2; + pCMap->AddCIDs(unCode, unCode, nLen1, (CID)atoi(sToken2)); + } + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken2, "begincidrange")) + { + while (Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1)) + { + if (!strcmp(sToken1, "endcidrange")) + { + break; + } + if (!Lexer->GetToken(sToken2, sizeof(sToken2), &nLen2) || !strcmp(sToken2, "endcidrange") || !Lexer->GetToken(sToken3, sizeof(sToken3), &nLen3) || !strcmp(sToken3, "endcidrange")) + { + // TO DO: Error "Illegal entry in cidrange block in CMap" + break; + } + if (sToken1[0] == '<' && sToken2[0] == '<' && nLen1 == nLen2 && nLen1 >= 4 && (nLen1 & 1) == 0) + { + unsigned int unStart = 0, unEnd = 0; + sToken1[nLen1 - 1] = sToken2[nLen1 - 1] = '\0'; + sscanf(sToken1 + 1, "%x", &unStart); + sscanf(sToken2 + 1, "%x", &unEnd); + nLen1 = (nLen1 - 2) / 2; + pCMap->AddCIDs(unStart, unEnd, nLen1, (CID)atoi(sToken3)); + } + } + Lexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else + { + strcpy(sToken1, sToken2); + } + } + delete Lexer; + + fclose(pFile); + + return pCMap; + } + + CMap::CMap(GlobalParams *pGlobalParams, StringExt *seCollection, StringExt *seCMapName) + { + m_pGlobalParams = pGlobalParams; + + m_seCollection = seCollection; + m_seCMapName = seCMapName; + m_nWMode = 0; + m_pVector = (CMapVectorEntry *)MemUtilsMallocArray(256, sizeof(CMapVectorEntry)); + + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + m_pVector[nIndex].bIsVector = false; + m_pVector[nIndex].nCID = 0; + } + m_nRef = 1; + + m_oCS.InitializeCriticalSection(); + } + + CMap::CMap(GlobalParams *pGlobalParams, StringExt *seCollection, StringExt *seCMapName, int nWMode) + { + m_pGlobalParams = pGlobalParams; + + m_seCollection = seCollection; + m_seCMapName = seCMapName; + m_nWMode = nWMode; + m_pVector = NULL; + m_nRef = 1; + + m_oCS.InitializeCriticalSection(); + } + + void CMap::UseCMap(CMapCache *pCache, char *sUseName) + { + StringExt *pUseNameStr = new StringExt(sUseName); + if (!pUseNameStr) + return; + CMap *pSubCMap = pCache->GetCMap(m_seCollection, pUseNameStr, m_pGlobalParams); + delete pUseNameStr; + if (!pSubCMap) + return; + CopyVector(m_pVector, pSubCMap->m_pVector); + pSubCMap->Release(); + } + + void CMap::CopyVector(CMapVectorEntry *pDest, CMapVectorEntry *pSrc) + { + for (int nSrcIndex = 0; nSrcIndex < 256; ++nSrcIndex) + { + if (pSrc[nSrcIndex].bIsVector) + { + if (!pDest[nSrcIndex].bIsVector) + { + pDest[nSrcIndex].bIsVector = true; + pDest[nSrcIndex].pVector = (CMapVectorEntry *)MemUtilsMallocArray(256, sizeof(CMapVectorEntry)); + for (int pDstIndex = 0; pDstIndex < 256; ++pDstIndex) + { + pDest[nSrcIndex].pVector[pDstIndex].bIsVector = false; + pDest[nSrcIndex].pVector[pDstIndex].nCID = 0; + } + } + CopyVector(pDest[nSrcIndex].pVector, pSrc[nSrcIndex].pVector); + } + else + { + if (pDest[nSrcIndex].bIsVector) + { + // TO DO: Error "Collision in usecmap" + } + else + { + pDest[nSrcIndex].nCID = pSrc[nSrcIndex].nCID; + } + } + } + } + + void CMap::AddCodeSpace(CMapVectorEntry *pVector, unsigned int unStart, unsigned int unEnd, unsigned int unBytesCount) + { + if (unBytesCount > 1) + { + int nStartByte = (unStart >> (8 * (unBytesCount - 1))) & 0xff; + int nEndByte = (unEnd >> (8 * (unBytesCount - 1))) & 0xff; + unsigned int unStart2 = unStart & ((1 << (8 * (unBytesCount - 1))) - 1); + unsigned int unEnd2 = unEnd & ((1 << (8 * (unBytesCount - 1))) - 1); + for (int nI = nStartByte; nI <= nEndByte; ++nI) + { + if (!pVector[nI].bIsVector) + { + pVector[nI].bIsVector = true; + pVector[nI].pVector = (CMapVectorEntry *)MemUtilsMallocArray(256, sizeof(CMapVectorEntry)); + for (int nJ = 0; nJ < 256; ++nJ) + { + pVector[nI].pVector[nJ].bIsVector = false; + pVector[nI].pVector[nJ].nCID = 0; + } + } + AddCodeSpace(pVector[nI].pVector, unStart2, unEnd2, unBytesCount - 1); + } + } + } + + void CMap::AddCIDs(unsigned int unStart, unsigned int unEnd, unsigned int unBytesCount, CID nFirstCID) + { + CMapVectorEntry *pVector = m_pVector; + for (unsigned int nIndex = unBytesCount - 1; nIndex >= 1; --nIndex) + { + int nByte = (unStart >> (8 * nIndex)) & 0xff; + if (!pVector[nByte].bIsVector) + { + // TO DO: Error "Invalid CID in CMap" + return; + } + pVector = pVector[nByte].pVector; + } + CID nCID = nFirstCID; + for (int nByte = (int)(unStart & 0xff); nByte <= (int)(unEnd & 0xff); ++nByte) + { + if (pVector[nByte].bIsVector) + { + // TO DO: Error "Invalid CID in CMap" + } + else + { + pVector[nByte].nCID = nCID; + } + ++nCID; + } + } + + CMap::~CMap() + { + if (m_seCollection) + delete m_seCollection; + + if (m_seCMapName) + delete m_seCMapName; + if (m_pVector) + { + FreeCMapVector(m_pVector); + } + + m_oCS.DeleteCriticalSection(); + } + + void CMap::FreeCMapVector(CMapVectorEntry *pVector) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (pVector[nIndex].bIsVector) + { + FreeCMapVector(pVector[nIndex].pVector); + } + } + MemUtilsFree(pVector); + } + + void CMap::AddRef() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + ++m_nRef; + + RELEASEOBJECT(pCS); + } + + void CMap::Release() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + + bool bDelete = (--m_nRef == 0); + + RELEASEOBJECT(pCS); + + if (bDelete) + { + delete this; + } + } + + bool CMap::Match(StringExt *seCollection, StringExt *seCMapName) + { + return !m_seCollection->Compare(seCollection) && !m_seCMapName->Compare(seCMapName); + } + + CID CMap::GetCID(char *sChar, int nLen, int *pnUsed) + { + CMapVectorEntry *pVector; + + if (!(pVector = m_pVector)) + { + // Identity CMap + *pnUsed = 2; + if (nLen < 2) + { + return 0; + } + return ((sChar[0] & 0xff) << 8) + (sChar[1] & 0xff); + } + int nUsedCount = 0; + while (1) + { + if (nUsedCount >= nLen) + { + *pnUsed = nUsedCount; + return 0; + } + int nIndex = sChar[nUsedCount++] & 0xff; + if (!pVector[nIndex].bIsVector) + { + *pnUsed = nUsedCount; + return pVector[nIndex].nCID; + } + pVector = pVector[nIndex].pVector; + } + } + + void CMap::ToXml(std::wstring wsFilePath) + { + CXmlWriter oWriter; + oWriter.WriteNodeBegin(L"PDF-CMap", true); + oWriter.WriteAttribute(L"collection", m_seCollection->GetWString()); + oWriter.WriteAttribute(L"name", m_seCMapName->GetWString()); + oWriter.WriteNodeEnd(L"PDF-CMap", true, false); + + if (!m_seCMapName->Compare("Identity") || !m_seCMapName->Compare("Identity-H") || !m_seCMapName->Compare("Identity-V")) + WriteVectorToXml(&oWriter, m_pVector); + + oWriter.WriteNodeEnd(L"PDF-CMap", false, true); + oWriter.SaveToFile(wsFilePath); + } + + void CMap::WriteVectorToXml(CXmlWriter *pWriter, CMapVectorEntry *pVector) + { + if (NULL == pVector) + return; + + for (int nIndex = 0; nIndex < 256; nIndex++) + { + if (0 != pVector[nIndex].nCID || false != pVector[nIndex].bIsVector) + { + if (pVector[nIndex].bIsVector) + { + pWriter->WriteNodeBegin(L"Vector", true); + pWriter->WriteAttribute(L"index", nIndex); + pWriter->WriteAttribute(L"isvector", 1); + pWriter->WriteAttribute(L"cid", (int)pVector[nIndex].nCID); + pWriter->WriteNodeEnd(L"Vector", true, false); + + WriteVectorToXml(pWriter, pVector[nIndex].pVector); + + pWriter->WriteNodeEnd(L"Vector", false, true); + } + else + { + pWriter->WriteNodeBegin(L"Vector", true); + pWriter->WriteAttribute(L"index", nIndex); + pWriter->WriteAttribute(L"isvector", 0); + pWriter->WriteAttribute(L"cid", (int)pVector[nIndex].nCID); + pWriter->WriteNodeEnd(L"Vector", true, true); + } + } + } + } + //------------------------------------------------------------------------------------------------------------------------------- + + CMapCache::CMapCache() + { + for (int nIndex = 0; nIndex < CMapCacheSize; ++nIndex) + { + m_ppCache[nIndex] = NULL; + } + } + + CMapCache::~CMapCache() + { + for (int nIndex = 0; nIndex < CMapCacheSize; ++nIndex) + { + if (m_ppCache[nIndex]) + { + m_ppCache[nIndex]->Release(); + } + } + } + + CMap *CMapCache::GetCMap(StringExt *seCollection, StringExt *seCMapName, GlobalParams* pGlobalParams, wchar_t *wsFilePath) + { + CMap *pCMap = NULL; + + if (m_ppCache[0] && m_ppCache[0]->Match(seCollection, seCMapName)) + { + m_ppCache[0]->AddRef(); + return m_ppCache[0]; + } + + for (int nIndex = 1; nIndex < CMapCacheSize; ++nIndex) + { + if (m_ppCache[nIndex] && m_ppCache[nIndex]->Match(seCollection, seCMapName)) + { + pCMap = m_ppCache[nIndex]; + for (int nJ = nIndex; nJ >= 1; --nJ) + { + m_ppCache[nJ] = m_ppCache[nJ - 1]; + } + m_ppCache[0] = pCMap; + pCMap->AddRef(); + return pCMap; + } + } + if ((pCMap = CMap::Parse(this, seCollection, seCMapName, pGlobalParams, wsFilePath))) + { + if (m_ppCache[CMapCacheSize - 1]) + { + m_ppCache[CMapCacheSize - 1]->Release(); + } + for (int nJ = CMapCacheSize - 1; nJ >= 1; --nJ) + { + m_ppCache[nJ] = m_ppCache[nJ - 1]; + } + m_ppCache[0] = pCMap; + pCMap->AddRef(); + return pCMap; + } + return NULL; + } +} diff --git a/PdfReader/Src/CMap.h b/PdfReader/Src/CMap.h new file mode 100644 index 0000000000..95662c51e4 --- /dev/null +++ b/PdfReader/Src/CMap.h @@ -0,0 +1,95 @@ +#ifndef _PDF_READER_CMAP_H +#define _PDF_READER_CMAP_H + +#include "CharTypes.h" +#include "GlobalParams.h" +#include "XmlUtils.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" + +namespace PdfReader +{ + + class StringExt; + struct CMapVectorEntry; + class CMapCache; + + //------------------------------------------------------------------------------------------------------------------------------- + + class CMap + { + public: + + // Создаем карту CMap определенную по и . + // Устанавливаем счетчик ссылок на 1. + static CMap *Parse(CMapCache *pCache, StringExt *seCollection, StringExt *seCMapName, GlobalParams *pGlobalParams, wchar_t *wsFilePath = NULL); + + ~CMap(); + + // Считаем ссылки + void AddRef(); + void Release(); + + // Название коллекции возвращаем в следующем формате: registry-ordering. + StringExt *GetCollection() + { + return m_seCollection; + } + + // Возвращаем true, если параметры CMap совпадают с заданными и . + bool Match(StringExt *seCollection, StringExt *seCMapName); + + // Возвращаем CID соответствующий коду символа, который начинается в , + // и содержит байт. + CID GetCID(char *sChar, int nLen, int *pnUsed); + + // Writing mode (0 = horizontal, 1 = vertical). + int GetWMode() + { + return m_nWMode; + } + void ToXml(std::wstring wsFilePath); + + private: + + CMap(GlobalParams *pGlobalParams, StringExt *seCollection, StringExt *seCMapName); + CMap(GlobalParams *pGlobalParams, StringExt *seCollection, StringExt *seCMapName, int nWMode); + void UseCMap(CMapCache *pCache, char *sUseName); + void CopyVector(CMapVectorEntry *pDest, CMapVectorEntry *pSrc); + void AddCodeSpace(CMapVectorEntry *pVector, unsigned int unStart, unsigned int unEnd, unsigned int unBytesCount); + void AddCIDs(unsigned int unStart, unsigned int unEnd, unsigned int unBytesCount, CID nFirstCID); + void FreeCMapVector(CMapVectorEntry *pVector); + void WriteVectorToXml(CXmlWriter *pWriter, CMapVectorEntry *pVector); + + private: + + StringExt *m_seCollection; // + StringExt *m_seCMapName; // + int m_nWMode; // writing mode (0=horizontal, 1=vertical) + CMapVectorEntry *m_pVector; // vector for first byte (NULL for identity CMap) + int m_nRef; // Счетчик ссылок + + GlobalParams *m_pGlobalParams; + + NSCriticalSection::CRITICAL_SECTION m_oCS; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + +#define CMapCacheSize 4 + + class CMapCache + { + public: + + CMapCache(); + ~CMapCache(); + + CMap *GetCMap(StringExt *seCollection, StringExt *seCMapName, GlobalParams *pGlobalParams, wchar_t *wsFilePath = NULL); + + private: + + CMap *m_ppCache[CMapCacheSize]; + }; +} + +#endif // _PDF_READER_CMAP_H diff --git a/PdfReader/Src/Catalog.cpp b/PdfReader/Src/Catalog.cpp new file mode 100644 index 0000000000..d8e508c765 --- /dev/null +++ b/PdfReader/Src/Catalog.cpp @@ -0,0 +1,429 @@ +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "XRef.h" +#include "Array.h" +#include "Dict.h" +#include "Page.h" +#include "Link.h" +#include "Catalog.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Catalog + //------------------------------------------------------------------------ + + Catalog::Catalog(GlobalParams *pGlobalParams, XRef *pXref) + { + m_pGlobalParams = pGlobalParams; + + m_bValid = true; + m_pXref = pXref; + m_ppPages = NULL; + m_pPageRefs = NULL; + m_nPagesCount = m_nPagesSize = 0; + m_seBaseURI = NULL; + + Object oCatalogDict; + m_pXref->GetCatalog(&oCatalogDict); + + if (!oCatalogDict.IsDict()) + { + // TO DO: Error "Catalog object is wrong type " + oCatalogDict.Free(); + m_oDests.InitNull(); + m_oNameTree.InitNull(); + m_bValid = false; + + return; + } + + // Считываем Pages + Object oPagesDict; + oCatalogDict.DictLookup("Pages", &oPagesDict); + + if (!oPagesDict.IsDict()) + { + // TO DO: Error "Top-level pages object is wrong type " + oPagesDict.Free(); + oCatalogDict.Free(); + m_oDests.InitNull(); + m_oNameTree.InitNull(); + m_bValid = false; + + return; + } + + // Считываем количество страниц + Object oTemp; + oPagesDict.DictLookup("Count", &oTemp); + if (!oTemp.IsNum()) // почему-то иногда количество страниц пишется как вещественное число(поэтому IsNum, а не IsInt) + { + // TO DO: Error "Page count in top-level pages object is wrong type" + oTemp.Free(); + oPagesDict.Free(); + oCatalogDict.Free(); + m_oDests.InitNull(); + m_oNameTree.InitNull(); + m_bValid = false; + + return; + } + + int nPagesCount = 0; + m_nPagesSize = nPagesCount = (int)oTemp.GetNum(); + oTemp.Free(); + + // выделяем место под соответствующее количество страниц + m_ppPages = (Page**)MemUtilsMallocArray(m_nPagesSize, sizeof(Page*)); + m_pPageRefs = (Ref*)MemUtilsMallocArray(m_nPagesSize, sizeof(Ref)); + + for (int nIndex = 0; nIndex < m_nPagesSize; ++nIndex) + { + m_ppPages[nIndex] = NULL; + m_pPageRefs[nIndex].nNum = -1; + m_pPageRefs[nIndex].nGen = -1; + } + + char* sAlreadyRead = (char *)MemUtilsMalloc(m_pXref->GetObjectsCount()); + memset(sAlreadyRead, 0, m_pXref->GetObjectsCount()); + + Object oPagesDictRef; + if (oCatalogDict.DictLookupAndCopy("Pages", &oPagesDictRef)->IsRef() && oPagesDictRef.GetRefNum() >= 0 && oPagesDictRef.GetRefNum() < m_pXref->GetObjectsCount()) + { + sAlreadyRead[oPagesDictRef.GetRefNum()] = 1; + } + oPagesDictRef.Free(); + + m_nPagesCount = ReadPageTree(oPagesDict.GetDict(), NULL, 0, sAlreadyRead); + MemUtilsFree(sAlreadyRead); + + if (m_nPagesCount != nPagesCount) + { + // TO DO: Error "Page count in top-level pages object is incorrect" + } + oPagesDict.Free(); + + // Считываем Named destination + oCatalogDict.DictLookup("Dests", &m_oDests); + + if (oCatalogDict.DictLookup("Names", &oTemp)->IsDict()) + oTemp.DictLookup("Dests", &m_oNameTree); + else + m_oNameTree.InitNull(); + oTemp.Free(); + + // URI + if (oCatalogDict.DictLookup("URI", &oTemp)->IsDict()) + { + Object oBase; + if (oTemp.DictLookup("Base", &oBase)->IsString()) + { + m_seBaseURI = oBase.GetString()->Copy(); + } + oBase.Free(); + } + oTemp.Free(); + + // Metadata + oCatalogDict.DictLookup("Metadata", &m_oMetadata); + + // StructTreeRoot + oCatalogDict.DictLookup("StructTreeRoot", &m_oStructTreeRoot); + + // Outlines + oCatalogDict.DictLookup("Outlines", &m_oOutline); + + // AcroForm + oCatalogDict.DictLookup("AcroForm", &m_oAcroForm); + + oCatalogDict.Free(); + return; + } + + Catalog::~Catalog() + { + if (m_ppPages) + { + for (int nIndex = 0; nIndex < m_nPagesSize; ++nIndex) + { + if (m_ppPages[nIndex]) + { + delete m_ppPages[nIndex]; + } + } + MemUtilsFree(m_ppPages); + MemUtilsFree(m_pPageRefs); + } + m_oDests.Free(); + m_oNameTree.Free(); + + if (m_seBaseURI) + { + delete m_seBaseURI; + } + + m_oMetadata.Free(); + m_oStructTreeRoot.Free(); + m_oOutline.Free(); + m_oAcroForm.Free(); + } + + StringExt *Catalog::ReadMetadata() + { + if (!m_oMetadata.IsStream()) + { + return NULL; + } + Dict *pDict = m_oMetadata.StreamGetDict(); + Object oTemp; + if (!pDict->Search("Subtype", &oTemp)->IsName("XML")) + { + // TO DO: Error "Unknown Metadata type" + } + oTemp.Free(); + StringExt *seResult = new StringExt(); + + m_oMetadata.StreamReset(); + int nChar = 0; + // TO DO: Вообще здесь выводится вся xml как она есть, надо бы ее более детально разобрать + while ((nChar = m_oMetadata.StreamGetChar()) != EOF) + { + seResult->Append(nChar); + } + m_oMetadata.StreamClose(); + return seResult; + } + + int Catalog::ReadPageTree(Dict *pPagesDict, PageAttrs *pAttrs, int nStart, char *sAlreadyRead) + { + PageAttrs *pPageAttrs = new PageAttrs(pAttrs, pPagesDict); + Object oKids; + pPagesDict->Search("Kids", &oKids); + + if (!oKids.IsArray()) + { + // TO DO: Error "Kids object is wrong type" + oKids.Free(); + delete pPageAttrs; + m_bValid = false; + return -1; + } + + for (int nIndex = 0; nIndex < oKids.ArrayGetLength(); ++nIndex) + { + Object oKidRef; + oKids.ArrayGetCopy(nIndex, &oKidRef); + if (oKidRef.IsRef() && oKidRef.GetRefNum() >= 0 && oKidRef.GetRefNum() < m_pXref->GetObjectsCount()) + { + if (sAlreadyRead[oKidRef.GetRefNum()]) + { + // TO DO: Error "Loop in Pages tree" + oKidRef.Free(); + continue; + } + sAlreadyRead[oKidRef.GetRefNum()] = 1; + } + Object oKid; + oKids.ArrayGet(nIndex, &oKid); + if (oKid.IsDict("Page")) + { + PageAttrs *pCurPageAttrs = new PageAttrs(pPageAttrs, oKid.GetDict()); + Page *pCurPage = new Page(m_pGlobalParams, m_pXref, nStart + 1, oKid.GetDict(), pCurPageAttrs); + if (!pCurPage->IsValid()) + { + ++nStart; + MemUtilsFree(pCurPage); + oKid.Free(); + oKids.Free(); + MemUtilsFree(pPageAttrs); + m_bValid = false; + return -1; + } + if (nStart >= m_nPagesSize) + { + m_nPagesSize += 32; + // выделяем дополнительную память + m_ppPages = (Page**)MemUtilsReallocArray(m_ppPages, m_nPagesSize, sizeof(Page *)); + m_pPageRefs = (Ref*)MemUtilsReallocArray(m_pPageRefs, m_nPagesSize, sizeof(Ref)); + + for (int nJ = m_nPagesSize - 32; nJ < m_nPagesSize; ++nJ) + { + m_ppPages[nJ] = NULL; + m_pPageRefs[nJ].nNum = -1; + m_pPageRefs[nJ].nGen = -1; + } + } + m_ppPages[nStart] = pCurPage; + if (oKidRef.IsRef()) + { + m_pPageRefs[nStart].nNum = oKidRef.GetRefNum(); + m_pPageRefs[nStart].nGen = oKidRef.GetRefGen(); + } + ++nStart; + } + else if (oKid.IsDict()) // иногда почему-то пропускают ключ /Type + { + if ((nStart = ReadPageTree(oKid.GetDict(), pPageAttrs, nStart, sAlreadyRead)) < 0) + { + oKid.Free(); + oKids.Free(); + MemUtilsFree(pPageAttrs); + m_bValid = false; + return -1; + } + } + else + { + // TO DO: Error "Kid object is wrong type" + } + oKid.Free(); + oKidRef.Free(); + } + + delete pPageAttrs; + oKids.Free(); + return nStart; + } + + int Catalog::FindPage(int nNum, int nGen) + { + for (int nIndex = 0; nIndex < m_nPagesCount; ++nIndex) + { + if (m_pPageRefs[nIndex].nNum == nNum && m_pPageRefs[nIndex].nGen == nGen) + return nIndex + 1; + } + return 0; + } + + LinkDestination *Catalog::FindDest(StringExt *seName) + { + bool bFound = false; + + Object oDestDict; + if (m_oDests.IsDict()) + { + if (!m_oDests.DictLookup(seName->GetBuffer(), &oDestDict)->IsNull()) + bFound = true; + else + oDestDict.Free(); + } + + if (!bFound && m_oNameTree.IsDict()) + { + if (!FindDestInTree(&m_oNameTree, seName, &oDestDict)->IsNull()) + bFound = true; + else + oDestDict.Free(); + } + + if (!bFound) + return NULL; + + // construct LinkDest + LinkDestination *pLinkDest = NULL; + + if (oDestDict.IsArray()) + { + pLinkDest = new LinkDestination(oDestDict.GetArray()); + } + else if (oDestDict.IsDict()) + { + Object oTemp; + if (oDestDict.DictLookup("D", &oTemp)->IsArray()) + pLinkDest = new LinkDestination(oTemp.GetArray()); + else + { + // TO DO: Error "Bad named destination value" + } + oTemp.Free(); + } + else + { + // TO DO: Error "Bad named destination value" + } + oDestDict.Free(); + if (pLinkDest && !pLinkDest->CheckValidate()) + { + delete pLinkDest; + pLinkDest = NULL; + } + + return pLinkDest; + } + + Object *Catalog::FindDestInTree(Object *pTree, StringExt *seName, Object *pObject) + { + bool bDone = false, bFound = false; + + Object oNames; + if (pTree->DictLookup("Names", &oNames)->IsArray()) + { + bDone = bFound = false; + + for (int nIndex = 0; !bDone && nIndex < oNames.ArrayGetLength(); nIndex += 2) + { + Object oCurName; + if (oNames.ArrayGet(nIndex, &oCurName)->IsString()) + { + int nCompareRes = seName->Compare(oCurName.GetString()); + if (nCompareRes == 0) + { + oNames.ArrayGet(nIndex + 1, pObject); + bFound = true; + bDone = true; + } + else if (nCompareRes < 0) + { + bDone = true; + } + } + oCurName.Free(); + } + oNames.Free(); + if (!bFound) + pObject->InitNull(); + return pObject; + } + oNames.Free(); + + bDone = false; + + Object oKids; + if (pTree->DictLookup("Kids", &oKids)->IsArray()) + { + for (int nIndex = 0; !bDone && nIndex < oKids.ArrayGetLength(); ++nIndex) + { + Object oKid; + if (oKids.ArrayGet(nIndex, &oKid)->IsDict()) + { + Object oLimits; + if (oKid.DictLookup("Limits", &oLimits)->IsArray()) + { + Object oLow; + if (oLimits.ArrayGet(0, &oLow)->IsString() && seName->Compare(oLow.GetString()) >= 0) + { + Object oHigh; + if (oLimits.ArrayGet(1, &oHigh)->IsString() && seName->Compare(oHigh.GetString()) <= 0) + { + FindDestInTree(&oKid, seName, pObject); + bDone = true; + } + oHigh.Free(); + } + oLow.Free(); + } + oLimits.Free(); + } + oKid.Free(); + } + } + oKids.Free(); + + if (!bDone) + pObject->InitNull(); + + return pObject; + } +} diff --git a/PdfReader/Src/Catalog.h b/PdfReader/Src/Catalog.h new file mode 100644 index 0000000000..2495fa8dc5 --- /dev/null +++ b/PdfReader/Src/Catalog.h @@ -0,0 +1,111 @@ +#ifndef _PDF_READER_CATALOG_H +#define _PDF_READER_CATALOG_H + +#include "GlobalParams.h" + +namespace PdfReader +{ + class XRef; + class Object; + class Page; + class PageAttrs; + struct Ref; + class LinkDestination; + + //------------------------------------------------------------------------ + // Catalog + //------------------------------------------------------------------------ + + class Catalog + { + public: + + Catalog(GlobalParams *pGlobalParams, XRef *pXref); + + ~Catalog(); + + bool CheckValidation() + { + return m_bValid; + } + + int GetPagesCount() + { + return m_nPagesCount; + } + + Page *GetPage(int nIndex) + { + return m_ppPages[nIndex - 1]; + } + + Ref *GetPageRef(int nIndex) + { + return &m_pPageRefs[nIndex - 1]; + } + + StringExt *GetBaseURI() + { + return m_seBaseURI; + } + + StringExt *ReadMetadata(); + + Object *GetStructTreeRoot() + { + return &m_oStructTreeRoot; + } + + // Ищем номер страницы в списке, по ее объектным номерам. + int FindPage(int nNum, int nGen); + + // Ищем Named destination. + LinkDestination *FindDest(StringExt *seName); + + Object *GetDests() + { + return &m_oDests; + } + + Object *GetNameTree() + { + return &m_oNameTree; + } + + Object *GetOutline() + { + return &m_oOutline; + } + + Object *GetAcroForm() + { + return &m_oAcroForm; + } + + private: + + int ReadPageTree(Dict *pPages, PageAttrs *pAttrs, int nStart, char *sAlreadyRead); + Object *FindDestInTree(Object *pTree, StringExt *seName, Object *pObject); + + private: + + XRef *m_pXref; // Таблица xref для данного PDF файла + Page **m_ppPages; // Массив страниц + Ref *m_pPageRefs; // Объектные номера всех страниц + int m_nPagesCount; // Число страниц + int m_nPagesSize; // Размер массива страниц(в байтах) + Object m_oDests; // Destination dictionary + Object m_oNameTree; // Name tree + StringExt *m_seBaseURI; // Для ссылок URI + Object m_oMetadata; // Metadata + Object m_oStructTreeRoot; // Структура страниц + Object m_oOutline; // Outline + Object m_oAcroForm; // AcroForm + + bool m_bValid; // True, если Сatalog - корретный + + GlobalParams *m_pGlobalParams; + }; +} + +#endif // _PDF_READER_CATALOG_H diff --git a/PdfReader/Src/CharCodeToUnicode.cpp b/PdfReader/Src/CharCodeToUnicode.cpp new file mode 100644 index 0000000000..350307c717 --- /dev/null +++ b/PdfReader/Src/CharCodeToUnicode.cpp @@ -0,0 +1,580 @@ +#include +#include +#include "MemoryUtils.h" +#include "File.h" +#include "StringExt.h" +#include "GlobalParams.h" +#include "PSLexer.h" +#include "CharCodeToUnicode.h" + +namespace PdfReader +{ + #define MaxUnicodeString 8 + + struct CharCodeToUnicodeString + { + CharCode nCode; + Unicode pUnicodeString[MaxUnicodeString]; + int nLen; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + + static int GetCharFromString(void *pData) + { + int nChar = 0; + + char *sString = *(char **)pData; + + if (*sString) + { + nChar = *sString++; + *(char **)pData = sString; + } + else + { + nChar = EOF; + } + return nChar; + } + + static int GetCharFromFile(void *pData) + { + return fgetc((FILE *)pData); + } + + //------------------------------------------------------------------------------------------------------------------------------- + + CharCodeToUnicode *CharCodeToUnicode::ParseCIDToUnicode(StringExt *seFileName, StringExt *seCollection) + { + char sBuffer[64]; + Unicode nUnicode = 0; + + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(seFileName->GetWString())) + { + // TO DO: Error "Couldn't open cidToUnicode file" + return NULL; + } + + FILE* pFile = oFile.GetFileNative(); + unsigned int nSize = 32768; + Unicode *pMap = (Unicode *)MemUtilsMallocArray(nSize, sizeof(Unicode)); + unsigned int nMapLen = 0; + + while (GetLine(sBuffer, sizeof(sBuffer), pFile)) + { + if (nMapLen == nSize) + { + nSize *= 2; + pMap = (Unicode *)MemUtilsReallocArray(pMap, nSize, sizeof(Unicode)); + } + if (sscanf(sBuffer, "%x", &nUnicode) == 1) + { + pMap[nMapLen] = nUnicode; + } + else + { + // TO DO: Error "Bad line in cidToUnicode file" + pMap[nMapLen] = 0; + } + ++nMapLen; + } + fclose(pFile); + + CharCodeToUnicode *pCharCodeToUnicode = new CharCodeToUnicode(seCollection->Copy(), pMap, nMapLen, true, NULL, 0, 0); + MemUtilsFree(pMap); + return pCharCodeToUnicode; + } + + CharCodeToUnicode *CharCodeToUnicode::ParseUnicodeToUnicode(StringExt *seFileName) + { + char sBuffer[256]; + char *sToken; + Unicode nUnicode0; + Unicode arrUnicodeBuffer[MaxUnicodeString]; + + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(seFileName->GetWString())) + { + // TO DO: Error ""Couldn't open unicodeToUnicode file" + return NULL; + } + + FILE* pFile = oFile.GetFileNative(); + unsigned int nSize = 4096; + Unicode *pMap = (Unicode *)MemUtilsMallocArray(nSize, sizeof(Unicode)); + memset(pMap, 0, nSize * sizeof(Unicode)); + unsigned int nLen = 0; + CharCodeToUnicodeString *pSMap = NULL; + unsigned int nSMapSize = 0, nSMapLen = 0; + + int nLine = 0; + while (GetLine(sBuffer, sizeof(sBuffer), pFile)) + { + ++nLine; + if (!(sToken = strtok(sBuffer, " \t\r\n")) || sscanf(sToken, "%x", &nUnicode0) != 1) + { + // TO DO: Error "Bad line in unicodeToUnicode file" + continue; + } + int nCount = 0; + while (nCount < MaxUnicodeString) + { + if (!(sToken = strtok(NULL, " \t\r\n"))) + { + break; + } + if (sscanf(sToken, "%x", &arrUnicodeBuffer[nCount]) != 1) + { + // TO DO: Error "Bad line in unicodeToUnicode file" + break; + } + ++nCount; + } + if (nCount < 1) + { + // TO DO: Error "Bad line in unicodeToUnicode file" + continue; + } + if (nUnicode0 >= nSize) + { + unsigned int nOldSize = nSize; + while (nUnicode0 >= nSize) + { + nSize *= 2; + } + pMap = (Unicode *)MemUtilsReallocArray(pMap, nSize, sizeof(Unicode)); + memset(pMap + nOldSize, 0, (nSize - nOldSize) * sizeof(Unicode)); + } + if (nCount == 1) + { + pMap[nUnicode0] = arrUnicodeBuffer[0]; + } + else + { + pMap[nUnicode0] = 0; + if (nSMapLen == nSMapSize) + { + nSMapSize += 16; + pSMap = (CharCodeToUnicodeString *)MemUtilsReallocArray(pSMap, nSMapSize, sizeof(CharCodeToUnicodeString)); + } + pSMap[nSMapLen].nCode = nUnicode0; + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + pSMap[nSMapLen].pUnicodeString[nIndex] = arrUnicodeBuffer[nIndex]; + } + pSMap[nSMapLen].nLen = nCount; + ++nSMapLen; + } + if (nUnicode0 >= nLen) + { + nLen = nUnicode0 + 1; + } + } + fclose(pFile); + + CharCodeToUnicode *pCharCodeToUnicode = new CharCodeToUnicode(seFileName->Copy(), pMap, nLen, true, pSMap, nSMapLen, nSMapSize); + MemUtilsFree(pMap); + return pCharCodeToUnicode; + } + + CharCodeToUnicode *CharCodeToUnicode::Make8BitToUnicode(Unicode *pToUnicode) + { + return new CharCodeToUnicode(NULL, pToUnicode, 256, true, NULL, 0, 0); + } + + CharCodeToUnicode *CharCodeToUnicode::ParseCMap(StringExt *seBuffer, int nBitCount, GlobalParams *pGlobalParams) + { + CharCodeToUnicode *pCharCodeToUnicode = new CharCodeToUnicode(NULL); + char *pData = seBuffer->GetBuffer(); + pCharCodeToUnicode->ParseCMap1(&GetCharFromString, &pData, nBitCount, pGlobalParams); + return pCharCodeToUnicode; + } + + void CharCodeToUnicode::MergeCMap(StringExt *seBuffer, int nBitCount, GlobalParams *pGlobalParams) + { + char *pData = seBuffer->GetBuffer(); + ParseCMap1(&GetCharFromString, &pData, nBitCount, pGlobalParams); + } + + void CharCodeToUnicode::ParseCMap1(int(*GetCharFunc)(void *), void *pData, int nBitCount, GlobalParams *pGlobalParams) + { + char sToken1[256], sToken2[256], sToken3[256]; + int nLen1, nLen2, nLen3; + CharCode nCode1, nCode2; + + + int nDigitCount = nBitCount / 4; + PSLexer *pLexer = new PSLexer(GetCharFunc, pData); + pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + + while (pLexer->GetToken(sToken2, sizeof(sToken2), &nLen2)) + { + if (!strcmp(sToken2, "usecmap")) + { + if (sToken1[0] == '/') + { + StringExt *seName = new StringExt(sToken1 + 1); + FILE *pFile = NULL; + if (pGlobalParams && (pFile = pGlobalParams->FindToUnicodeFile(seName))) + { + ParseCMap1(&GetCharFromFile, pFile, nBitCount, pGlobalParams); + fclose(pFile); + } + else + { + // TO DO: Error "Couldn't find ToUnicode CMap file" + } + delete seName; + } + pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken2, "beginbfchar")) + { + while (pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1)) + { + if (!strcmp(sToken1, "endbfchar")) + { + break; + } + if (!pLexer->GetToken(sToken2, sizeof(sToken2), &nLen2) || !strcmp(sToken2, "endbfchar")) + { + // TO DO: Error "Illegal entry in bfchar block in ToUnicode CMap" + break; + } + if (!(nLen1 == 2 + nDigitCount && sToken1[0] == '<' && sToken1[nLen1 - 1] == '>' && sToken2[0] == '<' && sToken2[nLen2 - 1] == '>')) + { + // TO DO: Error "Illegal entry in bfchar block in ToUnicode CMap" + continue; + } + sToken1[nLen1 - 1] = sToken2[nLen2 - 1] = '\0'; + if (sscanf(sToken1 + 1, "%x", &nCode1) != 1) + { + // TO DO: Error "Illegal entry in bfchar block in ToUnicode CMap" + continue; + } + AddMapping(nCode1, sToken2 + 1, nLen2 - 2, 0); + } + pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else if (!strcmp(sToken2, "beginbfrange")) + { + while (pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1)) + { + if (!strcmp(sToken1, "endbfrange")) + { + break; + } + if (!pLexer->GetToken(sToken2, sizeof(sToken2), &nLen2) || !strcmp(sToken2, "endbfrange") || !pLexer->GetToken(sToken3, sizeof(sToken3), &nLen3) || !strcmp(sToken3, "endbfrange")) + { + // TO DO: Error "Illegal entry in bfrange block in ToUnicode CMap" + break; + } + if (!(nLen1 == 2 + nDigitCount && sToken1[0] == '<' && sToken1[nLen1 - 1] == '>' && nLen2 == 2 + nDigitCount && sToken2[0] == '<' && sToken2[nLen2 - 1] == '>')) + { + // TO DO: Error "Illegal entry in bfrange block in ToUnicode CMap" + continue; + } + sToken1[nLen1 - 1] = sToken2[nLen2 - 1] = '\0'; + if (sscanf(sToken1 + 1, "%x", &nCode1) != 1 || sscanf(sToken2 + 1, "%x", &nCode2) != 1) + { + // TO DO: Error "Illegal entry in bfrange block in ToUnicode CMap" + continue; + } + if (!strcmp(sToken3, "[")) + { + int nIndex = 0; + while (pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1) && nCode1 + nIndex <= nCode2) + { + if (!strcmp(sToken1, "]")) + { + break; + } + if (sToken1[0] == '<' && sToken1[nLen1 - 1] == '>') + { + sToken1[nLen1 - 1] = '\0'; + AddMapping(nCode1 + nIndex, sToken1 + 1, nLen1 - 2, 0); + } + else + { + // TO DO: Error "Illegal entry in bfrange block in ToUnicode CMap" + } + ++nIndex; + } + } + else if (sToken3[0] == '<' && sToken3[nLen3 - 1] == '>') + { + sToken3[nLen3 - 1] = '\0'; + for (int nIndex = 0; nCode1 <= nCode2; ++nCode1, ++nIndex) + { + AddMapping(nCode1, sToken3 + 1, nLen3 - 2, nIndex); + } + } + else + { + // TO DO: Error "Illegal entry in bfrange block in ToUnicode CMap" + } + } + pLexer->GetToken(sToken1, sizeof(sToken1), &nLen1); + } + else + { + strcpy(sToken1, sToken2); + } + } + delete pLexer; + } + + void CharCodeToUnicode::AddMapping(CharCode nCode, char *sUnicodeString, int nLen, int nOffset) + { + + if (nCode >= m_nMapLen) + { + unsigned int unOldLen = m_nMapLen; + m_nMapLen = (nCode + 256) & ~255; + m_pMap = (Unicode *)MemUtilsReallocArray(m_pMap, m_nMapLen, sizeof(Unicode)); + for (unsigned int unIndex = unOldLen; unIndex < m_nMapLen; ++unIndex) + { + m_pMap[unIndex] = 0; + } + } + if (nLen <= 4) + { + Unicode nUnicode = 0; + if (sscanf(sUnicodeString, "%x", &nUnicode) != 1) + { + // TO DO: Error Illegal entry in ToUnicode CMap" + return; + } + m_pMap[nCode] = nUnicode + nOffset; + } + else + { + if (m_nSMapLen >= m_nSMapSize) + { + m_nSMapSize = m_nSMapSize + 16; + m_pSMap = (CharCodeToUnicodeString *)MemUtilsReallocArray(m_pSMap, m_nSMapSize, sizeof(CharCodeToUnicodeString)); + } + m_pMap[nCode] = 0; + m_pSMap[m_nSMapLen].nCode = nCode; + m_pSMap[m_nSMapLen].nLen = nLen / 4; + for (int nIndex = 0; nIndex < m_pSMap[m_nSMapLen].nLen && nIndex < MaxUnicodeString; ++nIndex) + { + char pUnicodeHex[5]; + strncpy(pUnicodeHex, sUnicodeString + nIndex * 4, 4); + pUnicodeHex[4] = '\0'; + if (sscanf(pUnicodeHex, "%x", &m_pSMap[m_nSMapLen].pUnicodeString[nIndex]) != 1) + { + // TO DO: Error "Illegal entry in ToUnicode CMap" + } + } + m_pSMap[m_nSMapLen].pUnicodeString[m_pSMap[m_nSMapLen].nLen - 1] += nOffset; + ++m_nSMapLen; + } + } + + CharCodeToUnicode::CharCodeToUnicode(StringExt *seTag) + { + m_seTag = seTag; + m_nMapLen = 256; + m_pMap = (Unicode *)MemUtilsMallocArray(m_nMapLen, sizeof(Unicode)); + for (unsigned int unIndex = 0; unIndex < m_nMapLen; ++unIndex) + { + m_pMap[unIndex] = 0; + } + m_pSMap = NULL; + m_nSMapLen = m_nSMapSize = 0; + m_nRef = 1; + + m_oCS.InitializeCriticalSection(); + } + + CharCodeToUnicode::CharCodeToUnicode(StringExt *seTag, Unicode *pMap, CharCode unMapLen, bool bCopyMap, CharCodeToUnicodeString *pSMap, int nSMapLen, int nSMapSize) + { + m_seTag = seTag; + m_nMapLen = unMapLen; + if (bCopyMap) + { + m_pMap = (Unicode *)MemUtilsMallocArray(m_nMapLen, sizeof(Unicode)); + memcpy(m_pMap, pMap, m_nMapLen * sizeof(Unicode)); + } + else + { + m_pMap = pMap; + } + m_pSMap = pSMap; + m_nSMapLen = nSMapLen; + m_nSMapSize = nSMapSize; + + m_nRef = 1; + + m_oCS.InitializeCriticalSection(); + } + + CharCodeToUnicode::~CharCodeToUnicode() + { + if (m_seTag) + { + delete m_seTag; + } + MemUtilsFree(m_pMap); + MemUtilsFree(m_pSMap); + + m_oCS.DeleteCriticalSection(); + } + + void CharCodeToUnicode::AddRef() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + + ++m_nRef; + + RELEASEOBJECT(pCS); + } + + void CharCodeToUnicode::Release() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + + bool bDelete = (--m_nRef == 0); + + RELEASEOBJECT(pCS); + + if (bDelete) + { + delete this; + } + } + + bool CharCodeToUnicode::Match(StringExt *seTag) + { + return m_seTag && !m_seTag->Compare(seTag); + } + + void CharCodeToUnicode::SetMapping(CharCode nCode, Unicode *pUnicode, int nLen) + { + if (nLen == 1) + { + m_pMap[nCode] = pUnicode[0]; + } + else + { + int nIndex = 0; + for (nIndex = 0; nIndex < m_nSMapLen; ++nIndex) + { + if (m_pSMap[nIndex].nCode == nCode) + { + break; + } + } + if (nIndex == m_nSMapLen) + { + if (m_nSMapLen == m_nSMapSize) + { + m_nSMapSize += 8; + m_pSMap = (CharCodeToUnicodeString *)MemUtilsReallocArray(m_pSMap, m_nSMapSize, sizeof(CharCodeToUnicodeString)); + } + ++m_nSMapLen; + } + m_pMap[nCode] = 0; + m_pSMap[nIndex].nCode = nCode; + m_pSMap[nIndex].nLen = nLen; + + for (int nJ = 0; nJ < nLen && nJ < MaxUnicodeString; ++nJ) + { + m_pSMap[nIndex].pUnicodeString[nJ] = pUnicode[nJ]; + } + } + } + + int CharCodeToUnicode::MapToUnicode(CharCode nCode, Unicode *pUnicode, int size) + { + if (nCode >= m_nMapLen) + { + return 0; + } + if (m_pMap[nCode]) + { + pUnicode[0] = m_pMap[nCode]; + return 1; + } + for (int nIndex = 0; nIndex < m_nSMapLen; ++nIndex) + { + if (m_pSMap[nIndex].nCode == nCode) + { + int nJ = 0; + for (nJ = 0; nJ < m_pSMap[nIndex].nLen && nJ < size; ++nJ) + { + pUnicode[nJ] = m_pSMap[nIndex].pUnicodeString[nJ]; + } + return nJ; + } + } + return 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + + CharCodeToUnicodeCache::CharCodeToUnicodeCache(int nSize) + { + m_nSize = nSize; + m_ppCache = (CharCodeToUnicode **)MemUtilsMallocArray(m_nSize, sizeof(CharCodeToUnicode *)); + for (int nIndex = 0; nIndex < m_nSize; ++nIndex) + { + m_ppCache[nIndex] = NULL; + } + } + + CharCodeToUnicodeCache::~CharCodeToUnicodeCache() + { + for (int nIndex = 0; nIndex < m_nSize; ++nIndex) + { + if (m_ppCache[nIndex]) + { + m_ppCache[nIndex]->Release(); + } + } + MemUtilsFree(m_ppCache); + } + + CharCodeToUnicode *CharCodeToUnicodeCache::GetCharCodeToUnicode(StringExt *seTag) + { + if (m_ppCache[0] && m_ppCache[0]->Match(seTag)) + { + m_ppCache[0]->AddRef(); + return m_ppCache[0]; + } + + for (int nIndex = 1; nIndex < m_nSize; ++nIndex) + { + if (m_ppCache[nIndex] && m_ppCache[nIndex]->Match(seTag)) + { + CharCodeToUnicode *pCharCodeToUnicode = m_ppCache[nIndex]; + for (int nJ = nIndex; nJ >= 1; --nJ) + { + m_ppCache[nJ] = m_ppCache[nJ - 1]; + } + m_ppCache[0] = pCharCodeToUnicode; + pCharCodeToUnicode->AddRef(); + return pCharCodeToUnicode; + } + } + return NULL; + } + + void CharCodeToUnicodeCache::Add(CharCodeToUnicode *pCharCodeToUnicode) + { + if (m_ppCache[m_nSize - 1]) + { + m_ppCache[m_nSize - 1]->Release(); + } + + for (int nIndex = m_nSize - 1; nIndex >= 1; --nIndex) + { + m_ppCache[nIndex] = m_ppCache[nIndex - 1]; + } + m_ppCache[0] = pCharCodeToUnicode; + pCharCodeToUnicode->AddRef(); + } +} \ No newline at end of file diff --git a/PdfReader/Src/CharCodeToUnicode.h b/PdfReader/Src/CharCodeToUnicode.h new file mode 100644 index 0000000000..1e0ff8115b --- /dev/null +++ b/PdfReader/Src/CharCodeToUnicode.h @@ -0,0 +1,87 @@ +#ifndef _PDF_READER_CHARCODE_TO_UNICODE_H +#define _PDF_READER_CHARCODE_TO_UNICODE_H + +#include "CharTypes.h" +#include "GlobalParams.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" + +namespace PdfReader +{ + struct CharCodeToUnicodeString; + + //------------------------------------------------------------------------------------------------------------------------------- + + class CharCodeToUnicode + { + public: + + static CharCodeToUnicode *ParseCIDToUnicode(StringExt *sFileName, StringExt *seCollection); + + static CharCodeToUnicode *ParseUnicodeToUnicode(StringExt *sFileName); + + static CharCodeToUnicode *Make8BitToUnicode(Unicode *pToUnicode); + + static CharCodeToUnicode *ParseCMap(StringExt *sBuffer, int nBitCount, GlobalParams *pGlobalParams); + + void MergeCMap(StringExt *sBuffer, int nBitCount, GlobalParams *pGlobalParams); + + ~CharCodeToUnicode(); + + // Считаем ссылки + void AddRef(); + void Release(); + + // Сравниваем по данному тэгу + bool Match(StringExt *seTag); + + void SetMapping(CharCode nCode, Unicode *pUnicode, int nLen); + + int MapToUnicode(CharCode nCode, Unicode *pUnicode, int nSize); + + CharCode GetLength() + { + return m_nMapLen; + } + + private: + + void ParseCMap1(int(*GetCharFunc)(void *), void *pData, int nBitCount, GlobalParams *pGlobalParams); + void AddMapping(CharCode nCode, char *sUnicodeString, int nLen, int nOffset); + CharCodeToUnicode(StringExt *sTag); + CharCodeToUnicode(StringExt *sTag, Unicode *pMap, CharCode nMapLen, bool bCopyMap, CharCodeToUnicodeString *pSMap, int nSMapLen, int nSMapSize); + + private: + + StringExt *m_seTag; + Unicode *m_pMap; + CharCode m_nMapLen; + CharCodeToUnicodeString*m_pSMap; + int m_nSMapLen; + int m_nSMapSize; + + int m_nRef; + + NSCriticalSection::CRITICAL_SECTION m_oCS; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + + class CharCodeToUnicodeCache + { + public: + + CharCodeToUnicodeCache(int nSize); + ~CharCodeToUnicodeCache(); + + CharCodeToUnicode *GetCharCodeToUnicode(StringExt *seTag); + + void Add(CharCodeToUnicode *pCharCodeToUnicode); + + private: + + CharCodeToUnicode **m_ppCache; + int m_nSize; + }; +} + +#endif // _PDF_READER_CHARCODE_TO_UNICODE_H diff --git a/PdfReader/Src/CharTypes.h b/PdfReader/Src/CharTypes.h new file mode 100644 index 0000000000..268075b55b --- /dev/null +++ b/PdfReader/Src/CharTypes.h @@ -0,0 +1,19 @@ +#ifndef _PDF_READER_CHARTYPES_H +#define _PDF_READER_CHARTYPES_H + +namespace PdfReader +{ + // Unicode-символы. + typedef unsigned int Unicode; + + // Для элементов CID. + typedef unsigned int CID; + + // Общий тип, рассчитан наодин из следюущих вариантов: + // - 8-битные символы + // - 16-битный CID + // - Unicode + typedef unsigned int CharCode; +} + +#endif // _PDF_READER_CHARTYPES_H diff --git a/PdfReader/Src/Constants.h b/PdfReader/Src/Constants.h new file mode 100644 index 0000000000..e3a2e5666d --- /dev/null +++ b/PdfReader/Src/Constants.h @@ -0,0 +1,38 @@ +#ifndef _PDF_READER_CONSTANTS_H +#define _PDF_READER_CONSTANTS_H + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + + // Поддерживаемая версия PDF файла +#define SupportedPDFVersionStr "1.7" +#define SupportedPDFVersionNum 1.7 + + //------------------------------------------------------------------------------------------------------------------------------- + // Paper size + //------------------------------------------------------------------------------------------------------------------------------- + + // Стандартные размеры страницы (в пикселях (72dpi)) +#ifndef A4_PAPER +#define DefaultPaperWidth 595 // ISO A4 (210x297 mm) +#define DefaultPaperHeight 842 +#else +#define DefaultPaperWidth 612 // American letter (8.5x11") +#define DefaultPaperHeight 792 +#endif + + //------------------------------------------------------------------------------------------------------------------------------- + // Config file path + //------------------------------------------------------------------------------------------------------------------------------- + +#if defined(VMS) || (defined(WIN32) && !defined(__CYGWIN32__)) +#define UserConfigFile "pdfrc" +#define SysConfigFile "pdfrc" +#else +#define UserConfigFile ".pdfrc" +#define SysConfigFile ".pdfrc" +#endif +} + +#endif // _PDF_READER_CONSTANTS_H diff --git a/PdfReader/Src/Decrypt.cpp b/PdfReader/Src/Decrypt.cpp new file mode 100644 index 0000000000..202a613c6b --- /dev/null +++ b/PdfReader/Src/Decrypt.cpp @@ -0,0 +1,818 @@ +#include +#include "MemoryUtils.h" +#include "Decrypt.h" + +namespace PdfReader +{ + static void RC4InitKey(unsigned char *sKey, int nKeyLen, unsigned char *sState); + static unsigned char RC4DecryptByte(unsigned char *sState, unsigned char *pX, unsigned char *pY, unsigned char nChar); + + static void AESKeyExpansion(DecryptAESState *pState, unsigned char *sObjectKey, int nObjectKeyLen); + static void AESDecryptBlock(DecryptAESState *pState, unsigned char *sIn, bool bLast); + static void MD5(unsigned char *sMessage, int nMessageLen, unsigned char *sDigest); + + static unsigned char passwordPad[32] = + { + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Decrypt + //------------------------------------------------------------------------------------------------------------------------------- + + bool Decrypt::MakeFileKey(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seOwnerPassword, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata, bool *pbOwnerPasswordValid) + { + // Попытаемся, используя пароль владельца, сгенерировать пользовательский пароль + *pbOwnerPasswordValid = false; + if (seOwnerPassword) + { + int nLen = seOwnerPassword->GetLength(); + unsigned char arrOwnerPass[32]; + if (nLen < 32) + { + memcpy(arrOwnerPass, seOwnerPassword->GetBuffer(), nLen); + memcpy(arrOwnerPass + nLen, passwordPad, 32 - nLen); + } + else + { + memcpy(arrOwnerPass, seOwnerPassword->GetBuffer(), 32); + } + MD5(arrOwnerPass, 32, arrOwnerPass); + + if (nEncRevision == 3) + { + for (int nIndex = 0; nIndex < 50; ++nIndex) + { + MD5(arrOwnerPass, 16, arrOwnerPass); + } + } + + unsigned char arrOwnerKey[32]; + unsigned char arrFState[256]; + if (nEncRevision == 2) + { + RC4InitKey(arrOwnerPass, nKeyLength, arrFState); + unsigned char unFX = 0, unFY = 0; + for (int nIndex = 0; nIndex < 32; ++nIndex) + { + arrOwnerKey[nIndex] = RC4DecryptByte(arrFState, &unFX, &unFY, seOwnerKey->GetAt(nIndex)); + } + } + else + { + memcpy(arrOwnerKey, seOwnerKey->GetBuffer(), 32); + for (int nIndex = 19; nIndex >= 0; --nIndex) + { + unsigned char arrTempKey[16]; + for (int nJ = 0; nJ < nKeyLength; ++nJ) + { + arrTempKey[nJ] = arrOwnerPass[nJ] ^ nIndex; + } + RC4InitKey(arrTempKey, nKeyLength, arrFState); + unsigned char unFX = 0, unFY = 0; + for (int nJ = 0; nJ < 32; ++nJ) + { + arrOwnerKey[nJ] = RC4DecryptByte(arrFState, &unFX, &unFY, arrOwnerKey[nJ]); + } + } + } + StringExt *seUserPassword2 = new StringExt((char *)arrOwnerKey, 32); + if (MakeFileKey2(nEncVersion, nEncRevision, nKeyLength, seOwnerKey, seUserKey, nPermissions, seFileID, seUserPassword2, sFileKey, bEncryptMetadata)) + { + *pbOwnerPasswordValid = true; + delete seUserPassword2; + return true; + } + delete seUserPassword2; + } + + // Попытаемся использовать пользовательский пароль + return MakeFileKey2(nEncVersion, nEncRevision, nKeyLength, seOwnerKey, seUserKey, nPermissions, seFileID, seUserPassword, sFileKey, bEncryptMetadata); + } + + bool Decrypt::MakeFileKey2(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata) + { + unsigned char sTest[32]; + unsigned char sFState[256]; + unsigned char sTempKey[16]; + unsigned char unFx, unFy; + int nLen = 0; + bool bResult = true; + + unsigned char *pBuffer = (unsigned char *)MemUtilsMalloc(72 + seFileID->GetLength()); + if (seUserPassword) + { + nLen = seUserPassword->GetLength(); + if (nLen < 32) + { + memcpy(pBuffer, seUserPassword->GetBuffer(), nLen); + memcpy(pBuffer + nLen, passwordPad, 32 - nLen); + } + else + { + memcpy(pBuffer, seUserPassword->GetBuffer(), 32); + } + } + else + { + memcpy(pBuffer, passwordPad, 32); + } + + memcpy(pBuffer + 32, seOwnerKey->GetBuffer(), 32); + pBuffer[64] = nPermissions & 0xff; + pBuffer[65] = (nPermissions >> 8) & 0xff; + pBuffer[66] = (nPermissions >> 16) & 0xff; + pBuffer[67] = (nPermissions >> 24) & 0xff; + + memcpy(pBuffer + 68, seFileID->GetBuffer(), seFileID->GetLength()); + nLen = 68 + seFileID->GetLength(); + if (!bEncryptMetadata) + { + pBuffer[nLen++] = 0xff; + pBuffer[nLen++] = 0xff; + pBuffer[nLen++] = 0xff; + pBuffer[nLen++] = 0xff; + } + MD5(pBuffer, nLen, sFileKey); + if (nEncRevision == 3) + { + for (int nIndex = 0; nIndex < 50; ++nIndex) + { + MD5(sFileKey, nKeyLength, sFileKey); + } + } + + if (nEncRevision == 2) + { + RC4InitKey(sFileKey, nKeyLength, sFState); + unFx = unFy = 0; + for (int nJ = 0; nJ < 32; ++nJ) + { + sTest[nJ] = RC4DecryptByte(sFState, &unFx, &unFy, seUserKey->GetAt(nJ)); + } + bResult = (memcmp(sTest, passwordPad, 32) == 0); + } + else if (nEncRevision == 3) + { + memcpy(sTest, seUserKey->GetBuffer(), 32); + for (int nIndex = 19; nIndex >= 0; --nIndex) + { + for (int nJ = 0; nJ < nKeyLength; ++nJ) + { + sTempKey[nJ] = sFileKey[nJ] ^ nIndex; + } + RC4InitKey(sTempKey, nKeyLength, sFState); + unFx = unFy = 0; + for (int nJ = 0; nJ < 32; ++nJ) + { + sTest[nJ] = RC4DecryptByte(sFState, &unFx, &unFy, sTest[nJ]); + } + } + memcpy(pBuffer, passwordPad, 32); + memcpy(pBuffer + 32, seFileID->GetBuffer(), seFileID->GetLength()); + MD5(pBuffer, 32 + seFileID->GetLength(), pBuffer); + bResult = (memcmp(sTest, pBuffer, 16) == 0); + } + else + { + bResult = false; + } + + MemUtilsFree(pBuffer); + return bResult; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // DecryptStream + //------------------------------------------------------------------------------------------------------------------------------- + + DecryptStream::DecryptStream(Stream *pStream, unsigned char *sFileKey, CryptAlgorithm eType, int nKeyLength, int nObjectNum, int nObjectGen) : + FilterStream(pStream) + { + m_eCryptType = eType; + + for (int nIndex = 0; nIndex < nKeyLength; ++nIndex) + { + m_sObjectKey[nIndex] = sFileKey[nIndex]; + } + + m_sObjectKey[nKeyLength + 0] = nObjectNum & 0xff; + m_sObjectKey[nKeyLength + 1] = (nObjectNum >> 8) & 0xff; + m_sObjectKey[nKeyLength + 2] = (nObjectNum >> 16) & 0xff; + m_sObjectKey[nKeyLength + 3] = nObjectGen & 0xff; + m_sObjectKey[nKeyLength + 4] = (nObjectGen >> 8) & 0xff; + + int nLen = 0; + if (m_eCryptType == cryptAES) + { + m_sObjectKey[nKeyLength + 5] = 0x73; // 's' + m_sObjectKey[nKeyLength + 6] = 0x41; // 'A' + m_sObjectKey[nKeyLength + 7] = 0x6c; // 'l' + m_sObjectKey[nKeyLength + 8] = 0x54; // 'T' + nLen = nKeyLength + 9; + } + else + { + nLen = nKeyLength + 5; + } + MD5(m_sObjectKey, nLen, m_sObjectKey); + + if ((m_nObjectKeyLength = nKeyLength + 5) > 16) + { + m_nObjectKeyLength = 16; + } + } + + DecryptStream::~DecryptStream() + { + delete m_pStream; + } + + void DecryptStream::Reset() + { + m_pStream->Reset(); + switch (m_eCryptType) + { + case cryptRC4: + m_oState.oRC4.unX = m_oState.oRC4.unY = 0; + RC4InitKey(m_sObjectKey, m_nObjectKeyLength, m_oState.oRC4.sState); + m_oState.oRC4.nBuffer = EOF; + break; + case cryptAES: + AESKeyExpansion(&m_oState.oAES, m_sObjectKey, m_nObjectKeyLength); + for (int nIndex = 0; nIndex < 16; ++nIndex) + { + m_oState.oAES.sCBC[nIndex] = m_pStream->GetChar(); + } + m_oState.oAES.nBufferIndex = 16; + break; + } + } + + int DecryptStream::GetChar() + { + unsigned char sIn[16]; + int nChar = EOF; + + switch (m_eCryptType) + { + case cryptRC4: + if (m_oState.oRC4.nBuffer == EOF) + { + nChar = m_pStream->GetChar(); + if (nChar != EOF) + { + m_oState.oRC4.nBuffer = RC4DecryptByte(m_oState.oRC4.sState, &m_oState.oRC4.unX, &m_oState.oRC4.unY, (unsigned char)nChar); + } + } + nChar = m_oState.oRC4.nBuffer; + m_oState.oRC4.nBuffer = EOF; + break; + case cryptAES: + if (m_oState.oAES.nBufferIndex == 16) + { + for (int nIndex = 0; nIndex < 16; ++nIndex) + { + if ((nChar = m_pStream->GetChar()) == EOF) + { + return EOF; + } + sIn[nIndex] = (unsigned char)nChar; + } + AESDecryptBlock(&m_oState.oAES, sIn, m_pStream->LookChar() == EOF); + } + if (m_oState.oAES.nBufferIndex == 16) + { + nChar = EOF; + } + else + { + nChar = m_oState.oAES.sBuffer[m_oState.oAES.nBufferIndex++]; + } + break; + } + return nChar; + } + + int DecryptStream::LookChar() + { + unsigned char sIn[16]; + int nChar = EOF; + switch (m_eCryptType) + { + case cryptRC4: + if (m_oState.oRC4.nBuffer == EOF) + { + nChar = m_pStream->GetChar(); + if (nChar != EOF) + { + m_oState.oRC4.nBuffer = RC4DecryptByte(m_oState.oRC4.sState, &m_oState.oRC4.unX, &m_oState.oRC4.unY, (unsigned char)nChar); + } + } + nChar = m_oState.oRC4.nBuffer; + break; + case cryptAES: + if (m_oState.oAES.nBufferIndex == 16) + { + for (int nIndex = 0; nIndex < 16; ++nIndex) + { + if ((nChar = m_pStream->GetChar()) == EOF) + { + return EOF; + } + sIn[nIndex] = nChar; + } + AESDecryptBlock(&m_oState.oAES, sIn, m_pStream->LookChar() == EOF); + } + if (m_oState.oAES.nBufferIndex == 16) + { + nChar = EOF; + } + else + { + nChar = m_oState.oAES.sBuffer[m_oState.oAES.nBufferIndex]; + } + break; + } + return nChar; + } + + bool DecryptStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(bLast); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // RC4 + //------------------------------------------------------------------------------------------------------------------------------- + + static void RC4InitKey(unsigned char *sKey, int nKeyLen, unsigned char *sState) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + sState[nIndex] = nIndex; + + //unsigned char unIndex1 = 0, unIndex2 = 0; + //for ( int nIndex = 0; nIndex < 256; ++nIndex ) + //{ + // unIndex2 = ( sKey[unIndex1] + sState[nIndex] + unIndex2 ) % 256; + // unsigned char unTemp = sState[nIndex]; + // sState[nIndex] = sState[unIndex2]; + // sState[unIndex2] = nIndex; + // unIndex1 = (unIndex1 + 1) % nKeyLen; + //} + + for (int i = 0, j = 0; i < 256; i++) + { + j = (j + sKey[i % nKeyLen] + sState[i]) % 256; + unsigned char unTemp = sState[i]; + sState[i] = sState[j]; + sState[j] = unTemp; + } + } + + static unsigned char RC4DecryptByte(unsigned char *sState, unsigned char *pX, unsigned char *pY, unsigned char nChar) + { + unsigned char unX1 = *pX = (*pX + 1) % 256; + unsigned char unY1 = *pY = (sState[*pX] + *pY) % 256; + unsigned char unTempX = sState[unX1]; + unsigned char unTempY = sState[unY1]; + sState[unX1] = unTempY; + sState[unY1] = unTempX; + return nChar ^ sState[(unTempX + unTempY) % 256]; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // AES + //------------------------------------------------------------------------------------------------------------------------------- + + static unsigned char c_sSbox[256] = + { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + }; + + static unsigned char c_sInvSbox[256] = + { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d + }; + + static unsigned int c_arrRCon[11] = + { + 0x00000000, // не используется + 0x01000000, + 0x02000000, + 0x04000000, + 0x08000000, + 0x10000000, + 0x20000000, + 0x40000000, + 0x80000000, + 0x1b000000, + 0x36000000 + }; + + static inline unsigned int SubWord(unsigned int unValue) + { + return (c_sSbox[unValue >> 24] << 24) | (c_sSbox[(unValue >> 16) & 0xff] << 16) | (c_sSbox[(unValue >> 8) & 0xff] << 8) | c_sSbox[unValue & 0xff]; + } + + static inline unsigned int RotWord(unsigned int unValue) + { + return ((unValue << 8) & 0xffffffff) | (unValue >> 24); + } + + static inline void InvSubBytes(unsigned char *sState) + { + for (int nIndex = 0; nIndex < 16; ++nIndex) + { + sState[nIndex] = c_sInvSbox[sState[nIndex]]; + } + } + + static inline void InvShiftRows(unsigned char *sState) + { + unsigned char unTemp = 0; + + unTemp = sState[7]; + sState[7] = sState[6]; + sState[6] = sState[5]; + sState[5] = sState[4]; + sState[4] = unTemp; + + unTemp = sState[8]; + sState[8] = sState[10]; + sState[10] = unTemp; + + unTemp = sState[9]; + sState[9] = sState[11]; + sState[11] = unTemp; + + unTemp = sState[12]; + sState[12] = sState[13]; + sState[13] = sState[14]; + sState[14] = sState[15]; + sState[15] = unTemp; + } + + // 09 ... nChar + static inline unsigned char Mult09(unsigned char nChar) + { + unsigned char nChar2 = (nChar & 0x80) ? ((nChar << 1) ^ 0x1b) : (nChar << 1); + unsigned char nChar4 = (nChar2 & 0x80) ? ((nChar2 << 1) ^ 0x1b) : (nChar2 << 1); + unsigned char nChar8 = (nChar4 & 0x80) ? ((nChar4 << 1) ^ 0x1b) : (nChar4 << 1); + + return nChar ^ nChar8; + } + + // 0b ... nChar + static inline unsigned char Mult0b(unsigned char nChar) + { + unsigned char nChar2 = (nChar & 0x80) ? ((nChar << 1) ^ 0x1b) : (nChar << 1); + unsigned char nChar4 = (nChar2 & 0x80) ? ((nChar2 << 1) ^ 0x1b) : (nChar2 << 1); + unsigned char nChar8 = (nChar4 & 0x80) ? ((nChar4 << 1) ^ 0x1b) : (nChar4 << 1); + return nChar ^ nChar2 ^ nChar8; + } + + // 0d ... nChar + static inline unsigned char Mult0d(unsigned char nChar) + { + unsigned char nChar2 = (nChar & 0x80) ? ((nChar << 1) ^ 0x1b) : (nChar << 1); + unsigned char nChar4 = (nChar2 & 0x80) ? ((nChar2 << 1) ^ 0x1b) : (nChar2 << 1); + unsigned char nChar8 = (nChar4 & 0x80) ? ((nChar4 << 1) ^ 0x1b) : (nChar4 << 1); + return nChar ^ nChar4 ^ nChar8; + } + + // 0e ... nChar + static inline unsigned char Mult0e(unsigned char nChar) + { + unsigned char nChar2 = (nChar & 0x80) ? ((nChar << 1) ^ 0x1b) : (nChar << 1); + unsigned char nChar4 = (nChar2 & 0x80) ? ((nChar2 << 1) ^ 0x1b) : (nChar2 << 1); + unsigned char nChar8 = (nChar4 & 0x80) ? ((nChar4 << 1) ^ 0x1b) : (nChar4 << 1); + return nChar2 ^ nChar4 ^ nChar8; + } + + static inline void InvMixColumns(unsigned char *sState) + { + for (int nChar = 0; nChar < 4; ++nChar) + { + unsigned char unS0 = sState[nChar + 0]; + unsigned char unS4 = sState[nChar + 4]; + unsigned char unS8 = sState[nChar + 8]; + unsigned char unS12 = sState[nChar + 12]; + sState[nChar + 0] = Mult0e(unS0) ^ Mult0b(unS4) ^ Mult0d(unS8) ^ Mult09(unS12); + sState[nChar + 4] = Mult09(unS0) ^ Mult0e(unS4) ^ Mult0b(unS8) ^ Mult0d(unS12); + sState[nChar + 8] = Mult0d(unS0) ^ Mult09(unS4) ^ Mult0e(unS8) ^ Mult0b(unS12); + sState[nChar + 12] = Mult0b(unS0) ^ Mult0d(unS4) ^ Mult09(unS8) ^ Mult0e(unS12); + } + } + + static inline void InvMixColumnsW(unsigned int *pW) + { + + for (int nChar = 0; nChar < 4; ++nChar) + { + unsigned char unS0 = pW[nChar] >> 24; + unsigned char unS1 = pW[nChar] >> 16; + unsigned char unS2 = pW[nChar] >> 8; + unsigned char unS3 = pW[nChar]; + pW[nChar] = ((Mult0e(unS0) ^ Mult0b(unS1) ^ Mult0d(unS2) ^ Mult09(unS3)) << 24) + | ((Mult09(unS0) ^ Mult0e(unS1) ^ Mult0b(unS2) ^ Mult0d(unS3)) << 16) + | ((Mult0d(unS0) ^ Mult09(unS1) ^ Mult0e(unS2) ^ Mult0b(unS3)) << 8) + | (Mult0b(unS0) ^ Mult0d(unS1) ^ Mult09(unS2) ^ Mult0e(unS3)); + } + } + + static inline void AddRoundKey(unsigned char *sState, unsigned int *pW) + { + for (int nChar = 0; nChar < 4; ++nChar) + { + sState[nChar + 0] ^= pW[nChar] >> 24; + sState[nChar + 4] ^= pW[nChar] >> 16; + sState[nChar + 8] ^= pW[nChar] >> 8; + sState[nChar + 12] ^= pW[nChar]; + } + } + + static void AESKeyExpansion(DecryptAESState *pState, unsigned char *sObjectKey, int nObjectKeyLen) + { + //Предполагается, что nObjectKeyLen == 16 + + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + pState->arrW[nIndex] = (sObjectKey[4 * nIndex] << 24) + (sObjectKey[4 * nIndex + 1] << 16) + (sObjectKey[4 * nIndex + 2] << 8) + sObjectKey[4 * nIndex + 3]; + } + for (int nIndex = 4; nIndex < 44; ++nIndex) + { + unsigned int unTemp = pState->arrW[nIndex - 1]; + if (!(nIndex & 3)) + { + unTemp = SubWord(RotWord(unTemp)) ^ c_arrRCon[nIndex / 4]; + } + pState->arrW[nIndex] = pState->arrW[nIndex - 4] ^ unTemp; + } + for (int nRound = 1; nRound <= 9; ++nRound) + { + InvMixColumnsW(&pState->arrW[nRound * 4]); + } + } + + static void AESDecryptBlock(DecryptAESState *pState, unsigned char *sIn, bool bLast) + { + // Начальное состояние + for (int nChar = 0; nChar < 4; ++nChar) + { + pState->sState[nChar + 0] = sIn[4 * nChar + 0]; + pState->sState[nChar + 4] = sIn[4 * nChar + 1]; + pState->sState[nChar + 8] = sIn[4 * nChar + 2]; + pState->sState[nChar + 12] = sIn[4 * nChar + 3]; + } + + // Round 0 + AddRoundKey(pState->sState, &pState->arrW[10 * 4]); + + // Round 1-9 + for (int nRound = 9; nRound >= 1; --nRound) + { + InvSubBytes(pState->sState); + InvShiftRows(pState->sState); + InvMixColumns(pState->sState); + AddRoundKey(pState->sState, &pState->arrW[nRound * 4]); + } + + // Round 10 + InvSubBytes(pState->sState); + InvShiftRows(pState->sState); + AddRoundKey(pState->sState, &pState->arrW[0]); + + // CBC + for (int nChar = 0; nChar < 4; ++nChar) + { + pState->sBuffer[4 * nChar + 0] = pState->sState[nChar + 0] ^ pState->sCBC[4 * nChar + 0]; + pState->sBuffer[4 * nChar + 1] = pState->sState[nChar + 4] ^ pState->sCBC[4 * nChar + 1]; + pState->sBuffer[4 * nChar + 2] = pState->sState[nChar + 8] ^ pState->sCBC[4 * nChar + 2]; + pState->sBuffer[4 * nChar + 3] = pState->sState[nChar + 12] ^ pState->sCBC[4 * nChar + 3]; + } + + // сохраняем блок с следующий CBC + for (int nIndex = 0; nIndex < 16; ++nIndex) + { + pState->sCBC[nIndex] = sIn[nIndex]; + } + + // remove padding + pState->nBufferIndex = 0; + if (bLast) + { + int nLen = pState->sBuffer[15]; + for (int nIndex = 15; nIndex >= nLen; --nIndex) + { + pState->sBuffer[nIndex] = pState->sBuffer[nIndex - nLen]; + } + pState->nBufferIndex = nLen; + } + } + + //------------------------------------------------------------------------ + // MD5 message digest + //------------------------------------------------------------------------ + + static inline unsigned long RotateLeft(unsigned long x, int r) + { + x &= 0xffffffff; + return ((x << r) | (x >> (32 - r))) & 0xffffffff; + } + + static inline unsigned long MD5Round1(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long Xk, unsigned long s, unsigned long Ti) + { + return b + RotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s); + } + + static inline unsigned long MD5Round2(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long Xk, unsigned long s, unsigned long Ti) + { + return b + RotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s); + } + + static inline unsigned long MD5Round3(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long Xk, unsigned long s, unsigned long Ti) + { + return b + RotateLeft((a + (b ^ c ^ d) + Xk + Ti), s); + } + + static inline unsigned long MD5Round4(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long Xk, unsigned long s, unsigned long Ti) + { + return b + RotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s); + } + + static void MD5(unsigned char *sMessage, int nMessageLen, unsigned char *sDigest) + { + unsigned long x[16]; + unsigned long a, b, c, d, aa, bb, cc, dd; + int i, j, k; + + // Вычислим количество блоков 64x64 + // ( nMessageLen + pad byte (0x80) + 8 bytes for length ) + int nBlocksCount = (nMessageLen + 1 + 8 + 63) / 64; + + // Инициализируем a, b, c, d + a = 0x67452301; + b = 0xefcdab89; + c = 0x98badcfe; + d = 0x10325476; + + k = 0; + for (i = 0; i < nBlocksCount; ++i) + { + // Считываем один блок + for (j = 0; j < 16 && k < nMessageLen - 3; ++j, k += 4) + x[j] = (((((sMessage[k + 3] << 8) + sMessage[k + 2]) << 8) + sMessage[k + 1]) << 8) + sMessage[k]; + if (i == nBlocksCount - 1) + { + if (k == nMessageLen - 3) + x[j] = 0x80000000 + (((sMessage[k + 2] << 8) + sMessage[k + 1]) << 8) + sMessage[k]; + else if (k == nMessageLen - 2) + x[j] = 0x800000 + (sMessage[k + 1] << 8) + sMessage[k]; + else if (k == nMessageLen - 1) + x[j] = 0x8000 + sMessage[k]; + else + x[j] = 0x80; + ++j; + while (j < 16) + x[j++] = 0; + x[14] = nMessageLen << 3; + } + + // Сохраняем a, b, c, d + aa = a; + bb = b; + cc = c; + dd = d; + + // Round 1 + a = MD5Round1(a, b, c, d, x[0], 7, 0xd76aa478); + d = MD5Round1(d, a, b, c, x[1], 12, 0xe8c7b756); + c = MD5Round1(c, d, a, b, x[2], 17, 0x242070db); + b = MD5Round1(b, c, d, a, x[3], 22, 0xc1bdceee); + a = MD5Round1(a, b, c, d, x[4], 7, 0xf57c0faf); + d = MD5Round1(d, a, b, c, x[5], 12, 0x4787c62a); + c = MD5Round1(c, d, a, b, x[6], 17, 0xa8304613); + b = MD5Round1(b, c, d, a, x[7], 22, 0xfd469501); + a = MD5Round1(a, b, c, d, x[8], 7, 0x698098d8); + d = MD5Round1(d, a, b, c, x[9], 12, 0x8b44f7af); + c = MD5Round1(c, d, a, b, x[10], 17, 0xffff5bb1); + b = MD5Round1(b, c, d, a, x[11], 22, 0x895cd7be); + a = MD5Round1(a, b, c, d, x[12], 7, 0x6b901122); + d = MD5Round1(d, a, b, c, x[13], 12, 0xfd987193); + c = MD5Round1(c, d, a, b, x[14], 17, 0xa679438e); + b = MD5Round1(b, c, d, a, x[15], 22, 0x49b40821); + + // Round 2 + a = MD5Round2(a, b, c, d, x[1], 5, 0xf61e2562); + d = MD5Round2(d, a, b, c, x[6], 9, 0xc040b340); + c = MD5Round2(c, d, a, b, x[11], 14, 0x265e5a51); + b = MD5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa); + a = MD5Round2(a, b, c, d, x[5], 5, 0xd62f105d); + d = MD5Round2(d, a, b, c, x[10], 9, 0x02441453); + c = MD5Round2(c, d, a, b, x[15], 14, 0xd8a1e681); + b = MD5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8); + a = MD5Round2(a, b, c, d, x[9], 5, 0x21e1cde6); + d = MD5Round2(d, a, b, c, x[14], 9, 0xc33707d6); + c = MD5Round2(c, d, a, b, x[3], 14, 0xf4d50d87); + b = MD5Round2(b, c, d, a, x[8], 20, 0x455a14ed); + a = MD5Round2(a, b, c, d, x[13], 5, 0xa9e3e905); + d = MD5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8); + c = MD5Round2(c, d, a, b, x[7], 14, 0x676f02d9); + b = MD5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a); + + // Round 3 + a = MD5Round3(a, b, c, d, x[5], 4, 0xfffa3942); + d = MD5Round3(d, a, b, c, x[8], 11, 0x8771f681); + c = MD5Round3(c, d, a, b, x[11], 16, 0x6d9d6122); + b = MD5Round3(b, c, d, a, x[14], 23, 0xfde5380c); + a = MD5Round3(a, b, c, d, x[1], 4, 0xa4beea44); + d = MD5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9); + c = MD5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60); + b = MD5Round3(b, c, d, a, x[10], 23, 0xbebfbc70); + a = MD5Round3(a, b, c, d, x[13], 4, 0x289b7ec6); + d = MD5Round3(d, a, b, c, x[0], 11, 0xeaa127fa); + c = MD5Round3(c, d, a, b, x[3], 16, 0xd4ef3085); + b = MD5Round3(b, c, d, a, x[6], 23, 0x04881d05); + a = MD5Round3(a, b, c, d, x[9], 4, 0xd9d4d039); + d = MD5Round3(d, a, b, c, x[12], 11, 0xe6db99e5); + c = MD5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8); + b = MD5Round3(b, c, d, a, x[2], 23, 0xc4ac5665); + + // Round 4 + a = MD5Round4(a, b, c, d, x[0], 6, 0xf4292244); + d = MD5Round4(d, a, b, c, x[7], 10, 0x432aff97); + c = MD5Round4(c, d, a, b, x[14], 15, 0xab9423a7); + b = MD5Round4(b, c, d, a, x[5], 21, 0xfc93a039); + a = MD5Round4(a, b, c, d, x[12], 6, 0x655b59c3); + d = MD5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92); + c = MD5Round4(c, d, a, b, x[10], 15, 0xffeff47d); + b = MD5Round4(b, c, d, a, x[1], 21, 0x85845dd1); + a = MD5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f); + d = MD5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0); + c = MD5Round4(c, d, a, b, x[6], 15, 0xa3014314); + b = MD5Round4(b, c, d, a, x[13], 21, 0x4e0811a1); + a = MD5Round4(a, b, c, d, x[4], 6, 0xf7537e82); + d = MD5Round4(d, a, b, c, x[11], 10, 0xbd3af235); + c = MD5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); + b = MD5Round4(b, c, d, a, x[9], 21, 0xeb86d391); + + // Увеличиваем a, b, c, d + a += aa; + b += bb; + c += cc; + d += dd; + } + + // Разбиваем sDigest на байты + sDigest[0] = (unsigned char)(a & 0xff); + sDigest[1] = (unsigned char)((a >>= 8) & 0xff); + sDigest[2] = (unsigned char)((a >>= 8) & 0xff); + sDigest[3] = (unsigned char)((a >>= 8) & 0xff); + sDigest[4] = (unsigned char)(b & 0xff); + sDigest[5] = (unsigned char)((b >>= 8) & 0xff); + sDigest[6] = (unsigned char)((b >>= 8) & 0xff); + sDigest[7] = (unsigned char)((b >>= 8) & 0xff); + sDigest[8] = (unsigned char)(c & 0xff); + sDigest[9] = (unsigned char)((c >>= 8) & 0xff); + sDigest[10] = (unsigned char)((c >>= 8) & 0xff); + sDigest[11] = (unsigned char)((c >>= 8) & 0xff); + sDigest[12] = (unsigned char)(d & 0xff); + sDigest[13] = (unsigned char)((d >>= 8) & 0xff); + sDigest[14] = (unsigned char)((d >>= 8) & 0xff); + sDigest[15] = (unsigned char)((d >>= 8) & 0xff); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Decrypt.h b/PdfReader/Src/Decrypt.h new file mode 100644 index 0000000000..2db06f7995 --- /dev/null +++ b/PdfReader/Src/Decrypt.h @@ -0,0 +1,80 @@ +#ifndef _PDF_READER_DECRYPT_H +#define _PDF_READER_DECRYPT_H + +#include "StringExt.h" +#include "Object.h" +#include "Stream.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // Decrypt + //------------------------------------------------------------------------------------------------------------------------------- + + class Decrypt + { + public: + + // Строим FileKey. Параметр должен иметь место как минимум под 16 байт. Проверяем и + // и возвращаем true, если какой-нибудь корректен. Пишем = true, если был правильный. + // Один какой-нибудь или оба пароля могут быть NULL, что мы будем понимать как пустую строку. + static bool MakeFileKey(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seOwnerPassword, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata, bool *pbOwnerPasswordValid); + + private: + + static bool MakeFileKey2(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata); + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // DecryptStream + //------------------------------------------------------------------------------------------------------------------------------- + + struct DecryptRC4State + { + unsigned char sState[256]; + unsigned char unX; + unsigned char unY; + int nBuffer; + }; + + struct DecryptAESState + { + unsigned int arrW[44]; + unsigned char sState[16]; + unsigned char sCBC[16]; + unsigned char sBuffer[16]; + int nBufferIndex; + }; + + class DecryptStream : public FilterStream + { + + public: + + DecryptStream(Stream *pStream, unsigned char *sFileKey, CryptAlgorithm eType, int nKeyLength, int nObjectNum, int nObjectGen); + virtual ~DecryptStream(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual int GetChar(); + virtual int LookChar(); + virtual bool IsBinary(bool bLast); + virtual Stream *getUndecodedStream() { return this; } + + private: + + CryptAlgorithm m_eCryptType; + int m_nObjectKeyLength; + unsigned char m_sObjectKey[16 + 9]; + + union + { + DecryptRC4State oRC4; + DecryptAESState oAES; + } m_oState; + }; +} + +#endif // _PDF_READER_DECRYPT_H diff --git a/PdfReader/Src/Dict.cpp b/PdfReader/Src/Dict.cpp new file mode 100644 index 0000000000..f1e0d8d228 --- /dev/null +++ b/PdfReader/Src/Dict.cpp @@ -0,0 +1,96 @@ +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "XRef.h" +#include "Dict.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Dict + //------------------------------------------------------------------------ + + Dict::Dict(XRef *pXref) + { + m_pXref = pXref; + m_arrEntries = NULL; + m_nEntriesSize = m_nEntriesCount = 0; + m_nRef = 1; + } + + Dict::~Dict() + { + for (int nIndex = 0; nIndex < m_nEntriesCount; ++nIndex) + { + MemUtilsFree(m_arrEntries[nIndex].sKey); + m_arrEntries[nIndex].oValue.Free(); + } + MemUtilsFree(m_arrEntries); + } + + void Dict::AddItem(char *sKey, Object *pValue) + { + if (m_nEntriesCount == m_nEntriesSize) + { + if (0 == m_nEntriesCount) + { + m_nEntriesSize = 8; + } + else + { + m_nEntriesSize *= 2; + } + m_arrEntries = (DictEntry *)MemUtilsReallocArray(m_arrEntries, m_nEntriesSize, sizeof(DictEntry)); + } + m_arrEntries[m_nEntriesCount].sKey = sKey; + m_arrEntries[m_nEntriesCount].oValue = *pValue; + ++m_nEntriesCount; + } + + inline DictEntry *Dict::Find(char *sKey) + { + for (int nIndex = 0; nIndex < m_nEntriesCount; ++nIndex) + { + if (!strcmp(sKey, m_arrEntries[nIndex].sKey)) + return &m_arrEntries[nIndex]; + } + return NULL; + } + + bool Dict::CheckType(char *sType) + { + DictEntry *pEntry = NULL; + + return (pEntry = Find("Type")) && pEntry->oValue.IsName(sType); + } + + Object *Dict::Search(char *sKey, Object *pObj) + { + DictEntry *pEntry = NULL; + + return (pEntry = Find(sKey)) ? pEntry->oValue.Fetch(m_pXref, pObj) : pObj->InitNull(); + } + + Object *Dict::SearchAndCopy(char *sKey, Object *pObj) + { + DictEntry *pEntry = NULL; + + return (pEntry = Find(sKey)) ? pEntry->oValue.Copy(pObj) : pObj->InitNull(); + } + + char *Dict::GetKey(int nIndex) + { + return m_arrEntries[nIndex].sKey; + } + + Object *Dict::GetValue(int nIndex, Object *pObj) + { + return m_arrEntries[nIndex].oValue.Fetch(m_pXref, pObj); + } + + Object *Dict::GetValueCopy(int nIndex, Object *pObj) + { + return m_arrEntries[nIndex].oValue.Copy(pObj); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Dict.h b/PdfReader/Src/Dict.h new file mode 100644 index 0000000000..fc4195eb5a --- /dev/null +++ b/PdfReader/Src/Dict.h @@ -0,0 +1,80 @@ +#ifndef _PDF_READER_DICT_H +#define _PDF_READER_DICT_H + +#include "Object.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Dict + //------------------------------------------------------------------------ + struct DictEntry + { + char *sKey; + Object oValue; + }; + + class Dict + { + public: + + Dict(XRef *pXref); + + ~Dict(); + + // Счетчик ссылок. + int AddRef() + { + return ++m_nRef; + } + int Release() + { + return --m_nRef; + } + + + int GetEntryCount() + { + return m_nEntriesCount; + } + + // Добавляем элемент в словарь. При этом имя не копируется. + void AddItem(char *sKey, Object *pValue); + + // Проверяем тип обэекта по имени sType. + bool CheckType(char *sType); + + // Ищем элемент словаря. Возвращается указатель на объект. + Object *Search(char *sKey, Object *pObject); + // Ищем элемент словаря. Возвращается копия объекта. + Object *SearchAndCopy(char *sKey, Object *pObject); + + + char *GetKey(int nIndex); + Object *GetValue(int nIndex, Object *pObj); + Object *GetValueCopy(int nIndex, Object *pObj); + + // Устанавливаем указатель на таблицу Xref. Данная функция используется + // только в одном случае: словарь Trailer читается до таблицы Xref, поэтому + // для данного словаря этот указатель нужно устанавливать. + void SetXRef(XRef *pXref) + { + m_pXref = pXref; + } + + private: + + DictEntry *Find(char *sKey); + + private: + + XRef *m_pXref; // таблица Xref текущего PDF файла + DictEntry *m_arrEntries; // Соержимое словаря + int m_nEntriesSize; // размер элемента в словаре + int m_nEntriesCount; // количество элементов в словаре + + int m_nRef; // Счетчик ссылок + }; +} + +#endif // _PDF_READER_DICT_H diff --git a/PdfReader/Src/EncodingTables.h b/PdfReader/Src/EncodingTables.h new file mode 100644 index 0000000000..cb234419cc --- /dev/null +++ b/PdfReader/Src/EncodingTables.h @@ -0,0 +1,1828 @@ +#ifndef _PDF_READER_ENCODING_TABLES_H +#define _PDF_READER_ENCODING_TABLES_H + +namespace PdfReader +{ + + static char *c_arrMacRomanEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "space", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron" + }; + + static char *c_arrMacExpertEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + "centoldstyle", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + NULL, + "threequartersemdash", + NULL, + "questionsmall", + NULL, + NULL, + NULL, + NULL, + "Ethsmall", + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hypheninferior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + "asuperior", + "centsuperior", + NULL, + NULL, + NULL, + NULL, + "Aacutesmall", + "Agravesmall", + "Acircumflexsmall", + "Adieresissmall", + "Atildesmall", + "Aringsmall", + "Ccedillasmall", + "Eacutesmall", + "Egravesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Iacutesmall", + "Igravesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ntildesmall", + "Oacutesmall", + "Ogravesmall", + "Ocircumflexsmall", + "Odieresissmall", + "Otildesmall", + "Uacutesmall", + "Ugravesmall", + "Ucircumflexsmall", + "Udieresissmall", + NULL, + "eightsuperior", + "fourinferior", + "threeinferior", + "sixinferior", + "eightinferior", + "seveninferior", + "Scaronsmall", + NULL, + "centinferior", + "twoinferior", + NULL, + "Dieresissmall", + NULL, + "Caronsmall", + "osuperior", + "fiveinferior", + NULL, + "commainferior", + "periodinferior", + "Yacutesmall", + NULL, + "dollarinferior", + NULL, + NULL, + "Thornsmall", + NULL, + "nineinferior", + "zeroinferior", + "Zcaronsmall", + "AEsmall", + "Oslashsmall", + "questiondownsmall", + "oneinferior", + "Lslashsmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Cedillasmall", + NULL, + NULL, + NULL, + NULL, + NULL, + "OEsmall", + "figuredash", + "hyphensuperior", + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + NULL, + "Ydieresissmall", + NULL, + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "ninesuperior", + "zerosuperior", + NULL, + "esuperior", + "rsuperior", + "tsuperior", + NULL, + NULL, + "isuperior", + "ssuperior", + "dsuperior", + NULL, + NULL, + NULL, + NULL, + NULL, + "lsuperior", + "Ogoneksmall", + "Brevesmall", + "Macronsmall", + "bsuperior", + "nsuperior", + "msuperior", + "commasuperior", + "periodsuperior", + "Dotaccentsmall", + "Ringsmall", + NULL, + NULL, + NULL, + NULL + }; + + static char *c_arrWinAnsiEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "bullet", + "Euro", + "bullet", + "quotesinglbase", + "florin", + "quotedblbase", + "ellipsis", + "dagger", + "daggerdbl", + "circumflex", + "perthousand", + "Scaron", + "guilsinglleft", + "OE", + "bullet", + "Zcaron", + "bullet", + "bullet", + "quoteleft", + "quoteright", + "quotedblleft", + "quotedblright", + "bullet", + "endash", + "emdash", + "tilde", + "trademark", + "scaron", + "guilsinglright", + "oe", + "bullet", + "zcaron", + "Ydieresis", + "space", + "exclamdown", + "cent", + "sterling", + "currency", + "yen", + "brokenbar", + "section", + "dieresis", + "copyright", + "ordfeminine", + "guillemotleft", + "logicalnot", + "hyphen", + "registered", + "macron", + "degree", + "plusminus", + "twosuperior", + "threesuperior", + "acute", + "mu", + "paragraph", + "periodcentered", + "cedilla", + "onesuperior", + "ordmasculine", + "guillemotright", + "onequarter", + "onehalf", + "threequarters", + "questiondown", + "Agrave", + "Aacute", + "Acircumflex", + "Atilde", + "Adieresis", + "Aring", + "AE", + "Ccedilla", + "Egrave", + "Eacute", + "Ecircumflex", + "Edieresis", + "Igrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Eth", + "Ntilde", + "Ograve", + "Oacute", + "Ocircumflex", + "Otilde", + "Odieresis", + "multiply", + "Oslash", + "Ugrave", + "Uacute", + "Ucircumflex", + "Udieresis", + "Yacute", + "Thorn", + "germandbls", + "agrave", + "aacute", + "acircumflex", + "atilde", + "adieresis", + "aring", + "ae", + "ccedilla", + "egrave", + "eacute", + "ecircumflex", + "edieresis", + "igrave", + "iacute", + "icircumflex", + "idieresis", + "eth", + "ntilde", + "ograve", + "oacute", + "ocircumflex", + "otilde", + "odieresis", + "divide", + "oslash", + "ugrave", + "uacute", + "ucircumflex", + "udieresis", + "yacute", + "thorn", + "ydieresis" + }; + + static char *c_arrStandardEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL + }; + + static char *c_arrExpertEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" + }; + + static char *c_arrSymbolEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "universal", + "numbersign", + "existential", + "percent", + "ampersand", + "suchthat", + "parenleft", + "parenright", + "asteriskmath", + "plus", + "comma", + "minus", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "congruent", + "Alpha", + "Beta", + "Chi", + "Delta", + "Epsilon", + "Phi", + "Gamma", + "Eta", + "Iota", + "theta1", + "Kappa", + "Lambda", + "Mu", + "Nu", + "Omicron", + "Pi", + "Theta", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "sigma1", + "Omega", + "Xi", + "Psi", + "Zeta", + "bracketleft", + "therefore", + "bracketright", + "perpendicular", + "underscore", + "radicalex", + "alpha", + "beta", + "chi", + "delta", + "epsilon", + "phi", + "gamma", + "eta", + "iota", + "phi1", + "kappa", + "lambda", + "mu", + "nu", + "omicron", + "pi", + "theta", + "rho", + "sigma", + "tau", + "upsilon", + "omega1", + "omega", + "xi", + "psi", + "zeta", + "braceleft", + "bar", + "braceright", + "similar", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Upsilon1", + "minute", + "lessequal", + "fraction", + "infinity", + "florin", + "club", + "diamond", + "heart", + "spade", + "arrowboth", + "arrowleft", + "arrowup", + "arrowright", + "arrowdown", + "degree", + "plusminus", + "second", + "greaterequal", + "multiply", + "proportional", + "partialdiff", + "bullet", + "divide", + "notequal", + "equivalence", + "approxequal", + "ellipsis", + "arrowvertex", + "arrowhorizex", + "carriagereturn", + "aleph", + "Ifraktur", + "Rfraktur", + "weierstrass", + "circlemultiply", + "circleplus", + "emptyset", + "intersection", + "union", + "propersuperset", + "reflexsuperset", + "notsubset", + "propersubset", + "reflexsubset", + "element", + "notelement", + "angle", + "gradient", + "registerserif", + "copyrightserif", + "trademarkserif", + "product", + "radical", + "dotmath", + "logicalnot", + "logicaland", + "logicalor", + "arrowdblboth", + "arrowdblleft", + "arrowdblup", + "arrowdblright", + "arrowdbldown", + "lozenge", + "angleleft", + "registersans", + "copyrightsans", + "trademarksans", + "summation", + "parenlefttp", + "parenleftex", + "parenleftbt", + "bracketlefttp", + "bracketleftex", + "bracketleftbt", + "bracelefttp", + "braceleftmid", + "braceleftbt", + "braceex", + NULL, + "angleright", + "integral", + "integraltp", + "integralex", + "integralbt", + "parenrighttp", + "parenrightex", + "parenrightbt", + "bracketrighttp", + "bracketrightex", + "bracketrightbt", + "bracerighttp", + "bracerightmid", + "bracerightbt", + NULL + }; + + static char *c_arrZapfDingbatsEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "a1", + "a2", + "a202", + "a3", + "a4", + "a5", + "a119", + "a118", + "a117", + "a11", + "a12", + "a13", + "a14", + "a15", + "a16", + "a105", + "a17", + "a18", + "a19", + "a20", + "a21", + "a22", + "a23", + "a24", + "a25", + "a26", + "a27", + "a28", + "a6", + "a7", + "a8", + "a9", + "a10", + "a29", + "a30", + "a31", + "a32", + "a33", + "a34", + "a35", + "a36", + "a37", + "a38", + "a39", + "a40", + "a41", + "a42", + "a43", + "a44", + "a45", + "a46", + "a47", + "a48", + "a49", + "a50", + "a51", + "a52", + "a53", + "a54", + "a55", + "a56", + "a57", + "a58", + "a59", + "a60", + "a61", + "a62", + "a63", + "a64", + "a65", + "a66", + "a67", + "a68", + "a69", + "a70", + "a71", + "a72", + "a73", + "a74", + "a203", + "a75", + "a204", + "a76", + "a77", + "a78", + "a79", + "a81", + "a82", + "a83", + "a84", + "a97", + "a98", + "a99", + "a100", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "a101", + "a102", + "a103", + "a104", + "a106", + "a107", + "a108", + "a112", + "a111", + "a110", + "a109", + "a120", + "a121", + "a122", + "a123", + "a124", + "a125", + "a126", + "a127", + "a128", + "a129", + "a130", + "a131", + "a132", + "a133", + "a134", + "a135", + "a136", + "a137", + "a138", + "a139", + "a140", + "a141", + "a142", + "a143", + "a144", + "a145", + "a146", + "a147", + "a148", + "a149", + "a150", + "a151", + "a152", + "a153", + "a154", + "a155", + "a156", + "a157", + "a158", + "a159", + "a160", + "a161", + "a163", + "a164", + "a196", + "a165", + "a192", + "a166", + "a167", + "a168", + "a169", + "a170", + "a171", + "a172", + "a173", + "a162", + "a174", + "a175", + "a176", + "a177", + "a178", + "a179", + "a193", + "a180", + "a199", + "a181", + "a200", + "a182", + NULL, + "a201", + "a183", + "a184", + "a197", + "a185", + "a194", + "a198", + "a186", + "a195", + "a187", + "a188", + "a189", + "a190", + "a191", + NULL + }; +} + +#endif // _PDF_READER_ENCODING_TABLES_H diff --git a/PdfReader/Src/ErrorConstants.h b/PdfReader/Src/ErrorConstants.h new file mode 100644 index 0000000000..587c41a1b4 --- /dev/null +++ b/PdfReader/Src/ErrorConstants.h @@ -0,0 +1,22 @@ +#ifndef _PDF_READER_ERROR_CONSTANTS_H +#define _PDF_READER_ERROR_CONSTANTS_H + +namespace PdfReader +{ + typedef enum + { + errorNone = 0, // Нет ошибок + errorOpenFile = 1, // Ошибка при открытии PDF файла + errorBadCatalog = 2, // couldn't read the page catalog + errorDamaged = 3, // PDF файл был поврежден и его невозможно восстановить + errorEncrypted = 4, // Файл зашифрован, авторизация не пройдена + errorHighlightFile = 5, // nonexistent or invalid highlight file + errorBadPrinter = 6, // плохой принтер + errorPrinting = 7, // ошибка во время печати + errorPermission = 8, // Ошибка связанная с ограничениями наложенными на файл + errorBadPageNum = 9, // Неверное количество страниц + errorFileIO = 10 // Ошибка при чтении/записи + } EError; +} + +#endif // _PDF_READER_ERROR_CONSTANTS_H diff --git a/PdfReader/Src/ExtractImageOutputDev.cpp b/PdfReader/Src/ExtractImageOutputDev.cpp new file mode 100644 index 0000000000..ad38a34e97 --- /dev/null +++ b/PdfReader/Src/ExtractImageOutputDev.cpp @@ -0,0 +1,443 @@ +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "Constants.h" +#include "GState.h" +#include "Object.h" +#include "Stream.h" +#include "ExtractImageOutputDev.h" + +#include "../../DesktopEditor/common/File.h" + +namespace PdfReader +{ +#pragma pack(push, 1) + + struct ColorTableEntry + { + unsigned char nRed; + unsigned char nGreen; + unsigned char nBlue; + unsigned char nReserved; + }; + +#pragma pack(pop) + + typedef struct + { + unsigned short bfType; + unsigned int bfSize; + unsigned short bfReserved1; + unsigned short bfReserved2; + unsigned int bfOffBits; + } TBitmapFileHeader; + + typedef struct + { + unsigned int biSize; + int biWidth; + int biHeight; + unsigned short biPlanes; + unsigned short biBitCount; + unsigned int biCompression; + unsigned int biSizeImage; + int biXPelsPerMeter; + int biYPelsPerMeter; + unsigned int biClrUsed; + unsigned int biClrImportant; + } TBitmapInfoHeader; + + typedef struct + { + unsigned int bcSize; + unsigned short bcWidth; + unsigned short bcHeight; + unsigned short bcPlanes; + unsigned short bcBitCount; + } TBitmapCoreHeader; + + //------------------------------------------------------------------------------------------------------------------------------- + // ExtractImageOutputDev + //------------------------------------------------------------------------------------------------------------------------------- + + + ExtractImageOutputDev::ExtractImageOutputDev(GlobalParams *pGlobalParams, char *sFilePrefix, bool bDumpJPEG, bool bCountImages) + { + m_pGlobalParams = pGlobalParams; + if (sFilePrefix) + m_sFilePrefix = CopyString(sFilePrefix); + else + m_sFilePrefix = NULL; + + if (m_sFilePrefix) + m_sFileName = (char *)MemUtilsMalloc(strlen(m_sFilePrefix) + 20); + else + m_sFileName = NULL; + + m_bDumpJPEG = bDumpJPEG; + m_nImageCount = 0; + m_bValid = true; + + m_bCountImages = bCountImages; + } + + ExtractImageOutputDev::~ExtractImageOutputDev() + { + MemUtilsFree(m_sFileName); + MemUtilsFree(m_sFilePrefix); + } + + void ExtractImageOutputDev::DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage) + { + FILE *pFile = NULL; + + // JPEG + if (m_bDumpJPEG && pStream->GetType() == strDCT && !bInlineImage) + { + ++m_nImageCount; + if (m_bCountImages || !m_sFileName || !m_sFilePrefix) + return; + + sprintf(m_sFileName, "%s\\%04d.jpg", m_sFilePrefix, m_nImageCount); + + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(AStringToWString(m_sFileName))) + { + // TO DO: Error "Couldn't open image file" + return; + } + pFile = oFile.GetFileNative(); + + pStream = ((DCTStream *)pStream)->GetRawStream(); + pStream->Reset(); + + // Копируем поток в файл + int nChar = 0; + while ((nChar = pStream->GetChar()) != EOF) + fputc(nChar, pFile); + + pStream->Close(); + fclose(pFile); + } + else + { + int nLeftBytes = 0; + while (div_t(div(((nWidth + 7) / 8), 4)).rem != 0) + { + nWidth -= 8; + nLeftBytes++; + if (nWidth <= 0) + { + // TO DO: Error "To small picture" + return; + } + } + + ++m_nImageCount; + if (m_bCountImages || !m_sFileName || !m_sFilePrefix) + return; + + sprintf(m_sFileName, "%s\\%04d.bmp", m_sFilePrefix, m_nImageCount); + + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(AStringToWString(m_sFileName))) + { + // TO DO: Error "Couldn't open image file" + return; + } + pFile = oFile.GetFileNative(); + + TBitmapFileHeader oFileHeader; + oFileHeader.bfType = 'M' * 256 + 'B'; + oFileHeader.bfSize = sizeof(TBitmapFileHeader) + sizeof(TBitmapInfoHeader) + 2 * sizeof(ColorTableEntry) + nHeight * ((nWidth + 7) / 8); + oFileHeader.bfReserved1 = 0; + oFileHeader.bfReserved2 = 0; + oFileHeader.bfOffBits = sizeof(TBitmapFileHeader) + sizeof(TBitmapInfoHeader) + 2 * sizeof(ColorTableEntry); + + + TBitmapInfoHeader oInfoHeader; + oInfoHeader.biSize = sizeof(TBitmapInfoHeader); + oInfoHeader.biWidth = nWidth; + oInfoHeader.biHeight = nHeight; + oInfoHeader.biPlanes = 1; + oInfoHeader.biBitCount = 1; + oInfoHeader.biCompression = 0; + oInfoHeader.biSizeImage = nHeight * ((nWidth + 7) / 8); + oInfoHeader.biXPelsPerMeter = 0; + oInfoHeader.biYPelsPerMeter = 0; + oInfoHeader.biClrUsed = 256; + oInfoHeader.biClrImportant = 0; + + ColorTableEntry oFirstColor, oSecondColor; + oFirstColor.nRed = 255; + oFirstColor.nGreen = 255; + oFirstColor.nBlue = 255; + oFirstColor.nReserved = 0; + + oSecondColor.nRed = 0; + oSecondColor.nGreen = 0; + oSecondColor.nBlue = 0; + oSecondColor.nReserved = 0; + + ::fwrite(&oFileHeader, 1, sizeof(TBitmapFileHeader), pFile); + ::fwrite(&oInfoHeader, 1, sizeof(TBitmapInfoHeader), pFile); + ::fwrite(&oFirstColor, 1, sizeof(ColorTableEntry), pFile); + ::fwrite(&oSecondColor, 1, sizeof(ColorTableEntry), pFile); + + long lPos = ::ftell(pFile); + + pStream->Reset(); + + // Копируем поток в файл + int nSize = nHeight * ((nWidth + 7) / 8); + + unsigned char *pBuffer = new unsigned char[nSize]; + if (!pBuffer) + { + // TO DO: Error "Not enough memory" + return; + } + unsigned char *pBufPointer = pBuffer; + for (int nY = 0; nY < nHeight; nY++) + { + for (int nX = 0; nX < (nWidth + 7) / 8; nX++, pBufPointer++) + { + *pBufPointer = pStream->GetChar() ^ 0xff; + } + for (int nIndex = 0; nIndex < nLeftBytes; nIndex++) + { + pStream->GetChar(); + } + } + pBufPointer = pBuffer; + int nStride = ((nWidth + 7) / 8); + pBufPointer += (nHeight - 1) * nStride; + nStride = -nStride; + + for (int nRow = nHeight; nRow > 0; --nRow, pBufPointer += nStride) + { + ::fwrite(pBufPointer, 1, abs(nStride), pFile); + } + pStream->Close(); + ::fclose(pFile); + delete[]pBuffer; + } + } + + void ExtractImageOutputDev::DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pnMaskColors, bool bInlineImage) + { + FILE *pFile = NULL; + // JPEG + if (m_bDumpJPEG && pStream->GetType() == strDCT && (pColorMap->GetComponentsCount() == 1 || pColorMap->GetComponentsCount() == 3) && !bInlineImage) + { + ++m_nImageCount; + if (m_bCountImages || !m_sFileName || !m_sFilePrefix) + return; + sprintf(m_sFileName, "%s\\%04d.jpg", m_sFilePrefix, m_nImageCount); + + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(AStringToWString(m_sFileName))) + { + // TO DO: Error "Couldn't open image file" + return; + } + pFile = oFile.GetFileNative(); + + pStream = ((DCTStream *)pStream)->GetRawStream(); + pStream->Reset(); + + // Копируем поток в файл + int nChar = 0; + while ((nChar = pStream->GetChar()) != EOF) + fputc(nChar, pFile); + + pStream->Close(); + fclose(pFile); + } + else if (pColorMap->GetComponentsCount() == 1 && pColorMap->GetBitsPerComponent() == 1) + { + int nLeftBytes = 0; + while (div_t(div(((nWidth + 7) / 8), 4)).rem != 0) + { + nWidth -= 8; + nLeftBytes++; + if (nWidth <= 0) + { + // TO DO: Error "To small picture" + return; + } + } + + ++m_nImageCount; + if (m_bCountImages || !m_sFileName || !m_sFilePrefix) + return; + + sprintf(m_sFileName, "%s\\%04d.bmp", m_sFilePrefix, m_nImageCount); + + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(AStringToWString(m_sFileName))) + { + // TO DO: Error "Couldn't open image file" + return; + } + pFile = oFile.GetFileNative(); + + TBitmapFileHeader oFileHeader; + oFileHeader.bfType = 'M' * 256 + 'B'; + oFileHeader.bfSize = sizeof(TBitmapFileHeader) + sizeof(TBitmapInfoHeader) + 2 * sizeof(ColorTableEntry) + nHeight * ((nWidth + 7) / 8); + oFileHeader.bfReserved1 = 0; + oFileHeader.bfReserved2 = 0; + oFileHeader.bfOffBits = sizeof(TBitmapFileHeader) + sizeof(TBitmapInfoHeader) + 2 * sizeof(ColorTableEntry); + + + TBitmapInfoHeader oInfoHeader; + oInfoHeader.biSize = sizeof(TBitmapInfoHeader); + oInfoHeader.biWidth = nWidth; + oInfoHeader.biHeight = nHeight; + oInfoHeader.biPlanes = 1; + oInfoHeader.biBitCount = 1; + oInfoHeader.biCompression = 0; + oInfoHeader.biSizeImage = nHeight * ((nWidth + 7) / 8); + oInfoHeader.biXPelsPerMeter = 0; + oInfoHeader.biYPelsPerMeter = 0; + oInfoHeader.biClrUsed = 0; + oInfoHeader.biClrImportant = 0; + + ColorTableEntry oFirstColor, oSecondColor; + oFirstColor.nRed = 255; + oFirstColor.nGreen = 255; + oFirstColor.nBlue = 255; + oFirstColor.nReserved = 0; + + oSecondColor.nRed = 0; + oSecondColor.nGreen = 0; + oSecondColor.nBlue = 0; + oSecondColor.nReserved = 0; + + ::fwrite(&oFileHeader, 1, sizeof(TBitmapFileHeader), pFile); + ::fwrite(&oInfoHeader, 1, sizeof(TBitmapInfoHeader), pFile); + ::fwrite(&oFirstColor, 1, sizeof(ColorTableEntry), pFile); + ::fwrite(&oSecondColor, 1, sizeof(ColorTableEntry), pFile); + + pStream->Reset(); + + // Копируем поток в файл + int nSize = nHeight * ((nWidth + 7) / 8); + + unsigned char *pBuffer = new unsigned char[nSize]; + if (!pBuffer) + { + // TO DO: Error "Not enough memory" + return; + } + unsigned char *pBufPointer = pBuffer; + for (int nY = 0; nY < nHeight; nY++) + { + for (int nX = 0; nX < (nWidth + 7) / 8; nX++, pBufPointer++) + { + *pBufPointer = pStream->GetChar() ^ 0xff; + } + for (int nIndex = 0; nIndex < nLeftBytes; nIndex++) + { + pStream->GetChar(); + } + } + pBufPointer = pBuffer; + int nStride = ((nWidth + 7) / 8); + pBufPointer += (nHeight - 1) * nStride; + nStride = -nStride; + + for (int nRow = nHeight; nRow > 0; --nRow, pBufPointer += nStride) + { + ::fwrite(pBufPointer, 1, -nStride, pFile); + } + pStream->Close(); + ::fclose(pFile); + delete[]pBuffer; + } + else + { + ++m_nImageCount; + if (m_bCountImages || !m_sFileName || !m_sFilePrefix) + return; + + sprintf(m_sFileName, "%s\\%04d.bmp", m_sFilePrefix, m_nImageCount); + + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(AStringToWString(m_sFileName))) + { + // TO DO: Error "Couldn't open image file" + return; + } + pFile = oFile.GetFileNative(); + + TBitmapFileHeader oFileHeader; + oFileHeader.bfType = 'M' * 256 + 'B'; + oFileHeader.bfSize = sizeof(TBitmapFileHeader) + sizeof(TBitmapCoreHeader) + nWidth * nHeight * 4; + oFileHeader.bfReserved1 = 0; + oFileHeader.bfReserved2 = 0; + oFileHeader.bfOffBits = sizeof(TBitmapFileHeader) + sizeof(TBitmapCoreHeader); + + TBitmapCoreHeader oCoreHeader; + oCoreHeader.bcSize = sizeof(TBitmapCoreHeader); + oCoreHeader.bcWidth = nWidth; + oCoreHeader.bcHeight = nHeight; + oCoreHeader.bcPlanes = 1; + oCoreHeader.bcBitCount = 32; + + ::fwrite(&oFileHeader, 1, sizeof(TBitmapFileHeader), pFile); + ::fwrite(&oCoreHeader, 1, sizeof(TBitmapCoreHeader), pFile); + + ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); + if (!pImageStream) + { + // TO DO: Error "Not enough memory" + return; + } + + pImageStream->Reset(); + + unsigned char *pBuffer = new unsigned char[nWidth * nHeight * 4]; + if (!pBuffer) + { + // TO DO: Error "Not enough memory" + delete pImageStream; + return; + } + + unsigned char *pBufPointer = pBuffer; + for (int nY = 0; nY < nHeight; nY++) + { + unsigned char *pImageLine = pImageStream->GetNextLine(); + for (int nX = 0; nX < nWidth; nX++, pBufPointer += 4) + { + GrRGB oRGB; + pColorMap->GetRGB(pImageLine, &oRGB); + + pBufPointer[0] = ColorToByte(oRGB.b); + pBufPointer[1] = ColorToByte(oRGB.g); + pBufPointer[2] = ColorToByte(oRGB.r); + pBufPointer[3] = 255; + + pImageLine += pColorMap->GetComponentsCount(); + } + } + delete pImageStream; + + pBufPointer = pBuffer; + int nStride = nWidth * 4; + pBufPointer += (nHeight - 1) * nStride; + nStride = -nStride; + + for (int nRow = nHeight; nRow > 0; --nRow, pBufPointer += nStride) + { + ::fwrite(pBufPointer, 1, -nStride, pFile); + } + + ::fclose(pFile); + delete[]pBuffer; + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/ExtractImageOutputDev.h b/PdfReader/Src/ExtractImageOutputDev.h new file mode 100644 index 0000000000..44c0edf41b --- /dev/null +++ b/PdfReader/Src/ExtractImageOutputDev.h @@ -0,0 +1,72 @@ +#ifndef _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H +#define _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H + +#include +#include "OutputDevice.h" + +namespace PdfReader +{ + class GrState; + + //------------------------------------------------------------------------------------------------------------------------------- + // ExtractImageOutputDev + //------------------------------------------------------------------------------------------------------------------------------- + + class ExtractImageOutputDev : public OutputDev + { + public: + + ExtractImageOutputDev(GlobalParams *pGlobalParams, char *sFilePrefix, bool bDumpJPEG, bool bCountImages = false); + + virtual ~ExtractImageOutputDev(); + + virtual bool CheckValidate() + { + return m_bValid; + } + + virtual bool InterpretType3Chars() + { + return false; + } + + virtual bool NeedNonText() + { + return true; + } + + + // Информация об устройстве. + virtual bool UpSideDown() + { + return false; + } + + virtual bool UseDrawChar() + { + return false; + } + + virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage); + virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pnMaskColors, bool bInlineImage); + + // + + int ExtractImageOutputDev::GetImagesCount() + { + return m_nImageCount; + } + + private: + + char *m_sFilePrefix; // + char *m_sFileName; // + bool m_bDumpJPEG; // + int m_nImageCount; // Текущее количество изображений + bool m_bCountImages; // Считаем картинки + + bool m_bValid; + }; +} + +#endif // _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H diff --git a/PdfReader/Src/File.h b/PdfReader/Src/File.h new file mode 100644 index 0000000000..eb2ed2ec6b --- /dev/null +++ b/PdfReader/Src/File.h @@ -0,0 +1,60 @@ +#ifndef _PDF_READER_FILE_H +#define _PDF_READER_FILE_H + +#include +#include + +#include "StringExt.h" +#include "../../DesktopEditor/common/File.h" + +using namespace std; + +namespace PdfReader +{ + static void SpitPathExt(std::wstring& wsFullPath, std::wstring* pwsFilePath, std::wstring* pwsExt) + { + // Ищем '.' начиная с конца пути, и разделяем путь на расширение и остальную часть + unsigned int nPos = wsFullPath.find_last_of(L"."); + *pwsFilePath = wsFullPath.substr(0, nPos); + *pwsExt = wsFullPath.substr(nPos + 1); + } + static bool OpenTempFile(wstring* pwsName, FILE **ppFile, wchar_t *wsMode, wchar_t *wsExt, wchar_t *wsFolder, wchar_t *wsName = NULL) + { + return NSFile::CFileBinary::OpenTempFile(pwsName, ppFile, wsMode, wsExt, wsFolder, wsName); + } + static char*GetLine(char *sBuffer, int nSize, FILE *pFile) + { + int nChar, nCurIndex = 0; + + while (nCurIndex < nSize - 1) + { + if ((nChar = fgetc(pFile)) == EOF) + break; + + sBuffer[nCurIndex++] = (char)nChar; + if ('\x0a' == nChar) + { + break; + } + if ('\x0d' == nChar) + { + nChar = fgetc(pFile); + if ('\x0a' == nChar && nCurIndex < nSize - 1) + { + sBuffer[nCurIndex++] = (char)nChar; + } + else if (EOF != nChar) + { + ungetc(nChar, pFile); + } + break; + } + } + sBuffer[nCurIndex] = '\0'; + if (0 == nCurIndex) + return NULL; + return sBuffer; + } +} + +#endif // _PDF_READER_FILE_H diff --git a/PdfReader/Src/FontFileBase.cpp b/PdfReader/Src/FontFileBase.cpp new file mode 100644 index 0000000000..5a884ac688 --- /dev/null +++ b/PdfReader/Src/FontFileBase.cpp @@ -0,0 +1,160 @@ +#include +#include "MemoryUtils.h" +#include "FontFileBase.h" +#include "../../DesktopEditor/common/File.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // CFontFileBase + //------------------------------------------------------------------------ + + CFontFileBase::CFontFileBase(char *sFile, int nLen, bool bFreeFileData) + { + m_sFileData = m_sFile = (unsigned char *)sFile; + m_nLen = nLen; + m_bFreeFileData = bFreeFileData; + } + + CFontFileBase::~CFontFileBase() + { + if (m_bFreeFileData) + MemUtilsFree(m_sFileData); + } + + char *CFontFileBase::ReadFile(wchar_t *wsFileName, int *pnFileLen) + { + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(wsFileName)) + return NULL; + + FILE* pFile = oFile.GetFileNative(); + + fseek(pFile, 0, SEEK_END); + int nLen = (int)ftell(pFile); + fseek(pFile, 0, SEEK_SET); + char *sBuffer = (char *)MemUtilsMalloc(nLen); + if ((int)fread(sBuffer, 1, nLen, pFile) != nLen) + { + MemUtilsFree(sBuffer); + fclose(pFile); + return NULL; + } + + fclose(pFile); + *pnFileLen = nLen; + return sBuffer; + } + + int CFontFileBase::GetS8(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos >= m_nLen) + { + *pbSuccess = false; + return 0; + } + int nRes = m_sFile[nPos]; + if (nRes & 0x80) + nRes |= ~0xff; + return nRes; + } + + int CFontFileBase::GetU8(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + if (nPos < 0 || nPos >= m_nLen) + { + *pbSuccess = false; + return 0; + } + return m_sFile[nPos]; + } + + int CFontFileBase::GetS16BE(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos + 1 >= m_nLen) + { + *pbSuccess = false; + return 0; + } + int nRes = m_sFile[nPos]; + nRes = (nRes << 8) + m_sFile[nPos + 1]; + if (nRes & 0x8000) + nRes |= ~0xffff; + return nRes; + } + + int CFontFileBase::GetU16BE(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos + 1 >= m_nLen) + { + *pbSuccess = false; + return 0; + } + int nRes = m_sFile[nPos]; + nRes = (nRes << 8) + m_sFile[nPos + 1]; + return nRes; + } + + int CFontFileBase::GetS32BE(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos + 3 >= m_nLen) + { + *pbSuccess = false; + return 0; + } + int nRes = m_sFile[nPos]; + nRes = (nRes << 8) + m_sFile[nPos + 1]; + nRes = (nRes << 8) + m_sFile[nPos + 2]; + nRes = (nRes << 8) + m_sFile[nPos + 3]; + if (nRes & 0x80000000) + nRes |= ~0xffffffff; + + return nRes; + } + + unsigned int CFontFileBase::GetU32BE(int nPos, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos + 3 >= m_nLen) + { + *pbSuccess = false; + return 0; + } + unsigned int nRes = m_sFile[nPos]; + nRes = (nRes << 8) + m_sFile[nPos + 1]; + nRes = (nRes << 8) + m_sFile[nPos + 2]; + nRes = (nRes << 8) + m_sFile[nPos + 3]; + return nRes; + } + + unsigned int CFontFileBase::GetUVarBE(int nPos, int nSize, bool *pbSuccess) + { + *pbSuccess = true; + + if (nPos < 0 || nPos + nSize > m_nLen) + { + *pbSuccess = false; + return 0; + } + unsigned int nRes = 0; + for (int nIndex = 0; nIndex < nSize; ++nIndex) + nRes = (nRes << 8) + m_sFile[nPos + nIndex]; + + return nRes; + } + + bool CFontFileBase::CheckRegion(int nPos, int nSize) + { + return (nPos >= 0 && nPos + nSize >= nPos && nPos + nSize <= m_nLen); + } +} \ No newline at end of file diff --git a/PdfReader/Src/FontFileBase.h b/PdfReader/Src/FontFileBase.h new file mode 100644 index 0000000000..b875c4608c --- /dev/null +++ b/PdfReader/Src/FontFileBase.h @@ -0,0 +1,47 @@ +#ifndef _PDF_READER_FONT_FILE_BASE_H +#define _PDF_READER_FONT_FILE_BASE_H + +namespace PdfReader +{ + typedef void(*FontFileOutputFunc)(void *pStream, char *sData, int nLen); + + //------------------------------------------------------------------------ + // CFontFileBase + //------------------------------------------------------------------------ + + class CFontFileBase + { + public: + + virtual ~CFontFileBase(); + + protected: + + CFontFileBase(char *sFile, int nLen, bool bFreeFileData); + + static char *ReadFile(wchar_t *wsFileName, int *pnFileLen); + + // S = signed / U = unsigned + // 8/16/32/Var = word length, in bytes + // BE = big endian + int GetS8(int nPos, bool *pbSuccess); + int GetU8(int nPos, bool *pbSuccess); + int GetS16BE(int nPos, bool *pbSuccess); + int GetU16BE(int nPos, bool *pbSuccess); + int GetS32BE(int nPos, bool *pbSuccess); + unsigned int GetU32BE(int nPos, bool *pbSuccess); + unsigned int GetUVarBE(int nPos, int nSize, bool *pbSuccess); + + bool CheckRegion(int nPos, int nSize); + + protected: + + unsigned char *m_sFileData; + unsigned char *m_sFile; + int m_nLen; + bool m_bFreeFileData; + + }; +} + +#endif // _PDF_READER_FONT_FILE_BASE_H diff --git a/PdfReader/Src/FontFileEncodings.h b/PdfReader/Src/FontFileEncodings.h new file mode 100644 index 0000000000..fae9b50be0 --- /dev/null +++ b/PdfReader/Src/FontFileEncodings.h @@ -0,0 +1,993 @@ +#ifndef _PDF_READER_FONT_FILE_ENCODINGS_H +#define _PDF_READER_FONT_FILE_ENCODINGS_H + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Type 1 and 1C font data + //------------------------------------------------------------------------ + + static char *c_arrsFontFileType1StandardEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL + }; + + static char *c_arrsFontFileType1ExpertEncoding[256] = + { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" + }; + + + //------------------------------------------------------------------------ + // Type 1C font data + //------------------------------------------------------------------------ + + static char *c_arrsFontFileType1CStandardStrings[391] = + { + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "lslash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold" + }; + + static unsigned short c_arrnFontFileType1CISOAdobeCharset[229] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228 + }; + + static unsigned short c_arrnFontFileType1CExpertCharset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static unsigned short c_arrnFontFileType1CExpertSubsetCharset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, + 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, + 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, + 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + +} +#endif // _PDF_READER_FONT_FILE_ENCODINGS_H diff --git a/PdfReader/Src/FontFileTrueType.cpp b/PdfReader/Src/FontFileTrueType.cpp new file mode 100644 index 0000000000..3643a165bc --- /dev/null +++ b/PdfReader/Src/FontFileTrueType.cpp @@ -0,0 +1,2123 @@ +#include +#include +#include "MemoryUtils.h" +#include "StringExt.h" +#include "Hash.h" +#include "FontFileType1C.h" +#include "FontFileTrueType.h" + +namespace PdfReader +{ + // + // Терминология + // ----------- + // + // character code = номер, используемый как элемент текстовой строки + // + // character name = glyph name = имя определенного символа фонта + // + // glyph index = GID = позиция (в предела некоторой внутренней таблицы + // в фонте), где приведены инструкции как рисовать + // данный символ + // + // Type 1 fonts + // ------------ + // + // Type 1 fonts contain: + // + // Encoding: char code -> glyph name + // + // Encoding[charCode] = charName + // + // CharStrings: dictionary of instructions, keyed by character names, + // maps character name to glyph data + // + // CharStrings[charName] = glyphData + // + // TrueType fonts + // -------------- + // + // TrueType fonts contain: + // + // 'cmap' table: character code -> GID; + // + // cmap[charCode] = gid + // + // 'post' table: GID -> glyph name + // + // post[gid] = glyphName + // + // Type 42 fonts + // ------------- + // + // Type 42 fonts contain: + // + // Encoding: char code -> glyph name + // + // Encoding[charCode] = charName + // + // CharStrings: dictionary of glyph indexes, keyed by character names, + // maps character name to glyph index + // + // CharStrings[charName] = gid + // + + //------------------------------------------------------------------------ + +#define ttcfTag 0x74746366 + + //------------------------------------------------------------------------ + + struct TrueTypeTable + { + unsigned int unTag; + unsigned int unChecksum; + int nOffset; + int nOrigOffset; + int nLen; + }; + + struct TrueTypeCmap + { + int nPlatform; + int nEncoding; + int nOffset; + int nLen; + int nFormat; + }; + + struct TrueTypeLoca + { + int nIndex; + int nOrigOffset; + int nNewOffset; + int nLen; + }; + +#define cmapTag 0x636d6170 +#define glyfTag 0x676c7966 +#define headTag 0x68656164 +#define hheaTag 0x68686561 +#define hmtxTag 0x686d7478 +#define locaTag 0x6c6f6361 +#define nameTag 0x6e616d65 +#define os2Tag 0x4f532f32 +#define postTag 0x706f7374 + + static int CompareTrueTypeLocaOffset(const void *pL1, const void *pL2) + { + TrueTypeLoca *pLoca1 = (TrueTypeLoca *)pL1; + TrueTypeLoca *pLoca2 = (TrueTypeLoca *)pL2; + + if (pLoca1->nOrigOffset == pLoca2->nOrigOffset) + return pLoca1->nIndex - pLoca2->nIndex; + + return pLoca1->nOrigOffset - pLoca2->nOrigOffset; + } + + static int CompareTrueTypeLocaIndex(const void *pL1, const void *pL2) + { + TrueTypeLoca *pLoca1 = (TrueTypeLoca *)pL1; + TrueTypeLoca *pLoca2 = (TrueTypeLoca *)pL2; + + return pLoca1->nIndex - pLoca2->nIndex; + } + + static int CompareTrueTypeTableTag(const void *pTab1, const void *pTab2) + { + TrueTypeTable *pTable1 = (TrueTypeTable *)pTab1; + TrueTypeTable *pTable2 = (TrueTypeTable *)pTab2; + + return (int)pTable1->unTag - (int)pTable2->unTag; + } + + //------------------------------------------------------------------------ + + struct T42Table + { + char *sTag; // 4-байтовое название + bool bRequired; // Требуется ли по спецификации TrueType? + }; + + // TrueType tables to be embedded in Type 42 fonts. + // NB: the table names must be in alphabetical order here. +#define nT42Tables 11 + static T42Table t42Tables[nT42Tables] = + { + { "cvt ", true }, + { "fpgm", true }, + { "glyf", true }, + { "head", true }, + { "hhea", true }, + { "hmtx", true }, + { "loca", true }, + { "maxp", true }, + { "prep", true }, + { "vhea", false }, + { "vmtx", false } + }; +#define t42HeadTable 3 +#define t42LocaTable 6 +#define t42GlyfTable 2 +#define t42VheaTable 9 +#define t42VmtxTable 10 + + //------------------------------------------------------------------------ + + // Названия символов в стандартном порядке, который использует Apple для + // своих TrueType фонтов. + static char *c_arrAppleGlyphNames[258] = + { + ".notdef", "null", "CR", "space", + "exclam", "quotedbl", "numbersign", "dollar", + "percent", "ampersand", "quotesingle", "parenleft", + "parenright", "asterisk", "plus", "comma", + "hyphen", "period", "slash", "zero", + "one", "two", "three", "four", + "five", "six", "seven", "eight", + "nine", "colon", "semicolon", "less", + "equal", "greater", "question", "at", + "A", "B", "C", "D", + "E", "F", "G", "H", + "I", "J", "K", "L", + "M", "N", "O", "P", + "Q", "R", "S", "T", + "U", "V", "W", "X", + "Y", "Z", "bracketleft", "backslash", + "bracketright", "asciicircum", "underscore", "grave", + "a", "b", "c", "d", + "e", "f", "g", "h", + "i", "j", "k", "l", + "m", "n", "o", "p", + "q", "r", "s", "t", + "u", "v", "w", "x", + "y", "z", "braceleft", "bar", + "braceright", "asciitilde", "Adieresis", "Aring", + "Ccedilla", "Eacute", "Ntilde", "Odieresis", + "Udieresis", "aacute", "agrave", "acircumflex", + "adieresis", "atilde", "aring", "ccedilla", + "eacute", "egrave", "ecircumflex", "edieresis", + "iacute", "igrave", "icircumflex", "idieresis", + "ntilde", "oacute", "ograve", "ocircumflex", + "odieresis", "otilde", "uacute", "ugrave", + "ucircumflex", "udieresis", "dagger", "degree", + "cent", "sterling", "section", "bullet", + "paragraph", "germandbls", "registered", "copyright", + "trademark", "acute", "dieresis", "notequal", + "AE", "Oslash", "infinity", "plusminus", + "lessequal", "greaterequal", "yen", "mu1", + "partialdiff", "summation", "product", "pi", + "integral", "ordfeminine", "ordmasculine", "Ohm", + "ae", "oslash", "questiondown", "exclamdown", + "logicalnot", "radical", "florin", "approxequal", + "increment", "guillemotleft", "guillemotright", "ellipsis", + "nbspace", "Agrave", "Atilde", "Otilde", + "OE", "oe", "endash", "emdash", + "quotedblleft", "quotedblright", "quoteleft", "quoteright", + "divide", "lozenge", "ydieresis", "Ydieresis", + "fraction", "currency", "guilsinglleft", "guilsinglright", + "fi", "fl", "daggerdbl", "periodcentered", + "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + "Ecircumflex", "Aacute", "Edieresis", "Egrave", + "Iacute", "Icircumflex", "Idieresis", "Igrave", + "Oacute", "Ocircumflex", "applelogo", "Ograve", + "Uacute", "Ucircumflex", "Ugrave", "dotlessi", + "circumflex", "tilde", "overscore", "breve", + "dotaccent", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "Lslash", "lslash", + "Scaron", "scaron", "Zcaron", "zcaron", + "brokenbar", "Eth", "eth", "Yacute", + "yacute", "Thorn", "thorn", "minus", + "multiply", "onesuperior", "twosuperior", "threesuperior", + "onehalf", "onequarter", "threequarters", "franc", + "Gbreve", "gbreve", "Idot", "Scedilla", + "scedilla", "Cacute", "cacute", "Ccaron", + "ccaron", "dmacron" + }; + + //------------------------------------------------------------------------ + // CFontFileTrueType + //------------------------------------------------------------------------ + + CFontFileTrueType *CFontFileTrueType::LoadFromBuffer(char *sBuffer, int nLen) + { + CFontFileTrueType *pTTF = new CFontFileTrueType(sBuffer, nLen, false); + if (!pTTF->m_bSuccess) + { + delete pTTF; + return NULL; + } + return pTTF; + } + + CFontFileTrueType *CFontFileTrueType::LoadFromFile(wchar_t *wsFileName) + { + char *sBuffer; + int nLen = 0; + + if (!(sBuffer = CFontFileBase::ReadFile(wsFileName, &nLen))) + return NULL; + + CFontFileTrueType *pTTF = new CFontFileTrueType(sBuffer, nLen, true); + if (!pTTF->m_bSuccess) + { + delete pTTF; + return NULL; + } + return pTTF; + } + + CFontFileTrueType::CFontFileTrueType(char *sBuffer, int nLen, bool bFreeFileData) : + CFontFileBase(sBuffer, nLen, bFreeFileData) + { + m_pTables = NULL; + m_nTablesCount = 0; + m_pCMaps = NULL; + m_nCMapsCount = 0; + m_pNameToGID = NULL; + m_bSuccess = false; + + Parse(); + } + + CFontFileTrueType::~CFontFileTrueType() + { + MemUtilsFree(m_pTables); + MemUtilsFree(m_pCMaps); + if (m_pNameToGID) + delete m_pNameToGID; + } + + int CFontFileTrueType::GetCmapsCount() + { + return m_nCMapsCount; + } + + int CFontFileTrueType::GetCmapPlatform(int nIndex) + { + return m_pCMaps[nIndex].nPlatform; + } + + int CFontFileTrueType::GetCmapEncoding(int nIndex) + { + return m_pCMaps[nIndex].nEncoding; + } + + int CFontFileTrueType::FindCmap(int nPlatform, int nEncoding) + { + for (int nIndex = 0; nIndex < m_nCMapsCount; ++nIndex) + { + if (m_pCMaps[nIndex].nPlatform == nPlatform && m_pCMaps[nIndex].nEncoding == nEncoding) + return nIndex; + } + return -1; + } + + unsigned short CFontFileTrueType::MapCodeToGID(int nCMapIndex, int nChar) + { + unsigned short unGid = 0; + int nSegmentCount = 0, nSegmentEnd = 0, nSegmentStart = 0, nSegmentDelta = 0, nSegmentOffset = 0; + int nCMapFirst = 0, nCMapLen = 0; + int a, b, m; + bool bSuccess = true; + + if (nCMapIndex < 0 || nCMapIndex >= m_nCMapsCount) + return 0; + + int nPos = m_pCMaps[nCMapIndex].nOffset; + switch (m_pCMaps[nCMapIndex].nFormat) + { + case 0: + if (nChar < 0 || nChar >= m_pCMaps[nCMapIndex].nLen - 6) + return 0; + unGid = GetU8(m_pCMaps[nCMapIndex].nOffset + 6 + nChar, &bSuccess); + break; + case 4: + nSegmentCount = GetU16BE(nPos + 6, &bSuccess) / 2; + a = -1; + b = nSegmentCount - 1; + nSegmentEnd = GetU16BE(nPos + 14 + 2 * b, &bSuccess); + if (nChar > nSegmentEnd) + return 0; + + while (b - a > 1 && bSuccess) + { + m = (a + b) / 2; + nSegmentEnd = GetU16BE(nPos + 14 + 2 * m, &bSuccess); + if (nSegmentEnd < nChar) + { + a = m; + } + else + { + b = m; + } + } + nSegmentStart = GetU16BE(nPos + 16 + 2 * nSegmentCount + 2 * b, &bSuccess); + nSegmentDelta = GetU16BE(nPos + 16 + 4 * nSegmentCount + 2 * b, &bSuccess); + nSegmentOffset = GetU16BE(nPos + 16 + 6 * nSegmentCount + 2 * b, &bSuccess); + if (nChar < nSegmentStart) + return 0; + if (0 == nSegmentOffset) + { + unGid = (nChar + nSegmentDelta) & 0xffff; + } + else + { + unGid = GetU16BE(nPos + 16 + 6 * nSegmentCount + 2 * b + nSegmentOffset + 2 * (nChar - nSegmentStart), &bSuccess); + if (0 != unGid) + unGid = (unGid + nSegmentDelta) & 0xffff; + } + break; + case 6: + nCMapFirst = GetU16BE(nPos + 6, &bSuccess); + nCMapLen = GetU16BE(nPos + 8, &bSuccess); + if (nChar < nCMapFirst || nChar >= nCMapFirst + nCMapLen) + return 0; + unGid = GetU16BE(nPos + 10 + 2 * (nChar - nCMapFirst), &bSuccess); + break; + default: + return 0; + } + + if (!bSuccess) + return 0; + + return unGid; + } + + int CFontFileTrueType::MapNameToGID(char *sName) + { + if (!m_pNameToGID) + return 0; + + return m_pNameToGID->LookupInt(sName); + } + + unsigned short *CFontFileTrueType::GetCIDToGIDMap(int *pnCIDs) + { + CFontFileType1C *pC1FF; + + *pnCIDs = 0; + if (!m_bOpenTypeCFF) + return NULL; + + int nIndex = SeekTable("CFF "); + + if (!CheckRegion(m_pTables[nIndex].nOffset, m_pTables[nIndex].nLen)) + return NULL; + + if (!(pC1FF = CFontFileType1C::LoadFromBuffer((char *)m_sFile + m_pTables[nIndex].nOffset, m_pTables[nIndex].nLen))) + return NULL; + + unsigned short *pMap = pC1FF->GetCIDToGIDMap(pnCIDs); + delete pC1FF; + return pMap; + } + + int CFontFileTrueType::GetEmbeddingRestrictions() + { + int nIndex = -1; + + if ((nIndex = SeekTable("OS/2")) < 0) + return 4; + + bool bSuccess = true; + int nType = GetU16BE(m_pTables[nIndex].nOffset + 8, &bSuccess); + + if (!bSuccess) + return 4; + + if (0x0008 & nType) + return 2; + + if (0x0004 & nType) + return 1; + if (0x0002 & nType) + return 0; + + return 3; + } + + void CFontFileTrueType::ToType42(char *sPSName, char **ppEncoding, unsigned short *pCodeToGID, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + StringExt *seBuffer; + + if (m_bOpenTypeCFF) + return; + + // пишем заголовок + bool bSuccess = true; + seBuffer = StringExt::Format("%!PS-TrueTypeFont-{0:2g}\n", (double)GetS32BE(0, &bSuccess) / 65536.0); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "10 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, " def\n", 5); + (*pOutputFunc)(pOutputStream, "/FontType 42 def\n", 17); + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + seBuffer = StringExt::Format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", m_arrBBox[0], m_arrBBox[1], m_arrBBox[2], m_arrBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, "/PaintType 0 def\n", 17); + + // записываем содержимое библиотеки шрифта + ConvertEncoding(ppEncoding, pOutputFunc, pOutputStream); + ConvertCharStrings(ppEncoding, pCodeToGID, pOutputFunc, pOutputStream); + ConvertSfnts(pOutputFunc, pOutputStream, NULL, false); + + // закончили запись библиотеки + (*pOutputFunc)(pOutputStream, "FontName currentdict end definefont pop\n", 40); + } + + void CFontFileTrueType::ToType1(char *sPSName, char **ppNewEncoding, bool bASKII, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + CFontFileType1C *pT1CFF; + + if (!m_bOpenTypeCFF) + return; + + int nTableIndex = SeekTable("CFF "); + if (!CheckRegion(m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen)) + return; + + if (!(pT1CFF = CFontFileType1C::LoadFromBuffer((char *)m_sFile + m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen))) + return; + + pT1CFF->ToType1(sPSName, ppNewEncoding, bASKII, pOutputFunc, pOutputStream); + delete pT1CFF; + } + + void CFontFileTrueType::ToCIDType2(char *sPSName, unsigned short *pCIDMap, int nCIDCount, bool bNeedVerticalMetrics, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + unsigned short nCID = 0; + + if (m_bOpenTypeCFF) + return; + + // write the header + bool bSuccess = true; + StringExt *seBuffer = StringExt::Format("%!PS-TrueTypeFont-{0:2g}\n", (double)GetS32BE(0, &bSuccess) / 65536.0); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + // begin the font dictionary + (*pOutputFunc)(pOutputStream, "20 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/CIDFontName /", 14); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, " def\n", 5); + (*pOutputFunc)(pOutputStream, "/CIDFontType 2 def\n", 19); + (*pOutputFunc)(pOutputStream, "/FontType 42 def\n", 17); + (*pOutputFunc)(pOutputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + (*pOutputFunc)(pOutputStream, " /Registry (Adobe) def\n", 24); + (*pOutputFunc)(pOutputStream, " /Ordering (Identity) def\n", 27); + (*pOutputFunc)(pOutputStream, " /Supplement 0 def\n", 20); + (*pOutputFunc)(pOutputStream, " end def\n", 10); + (*pOutputFunc)(pOutputStream, "/GDBytes 2 def\n", 15); + if (pCIDMap) + { + seBuffer = StringExt::Format("/CIDCount {0:d} def\n", nCIDCount); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + if (nCIDCount > 32767) + { + (*pOutputFunc)(pOutputStream, "/CIDMap [", 9); + for (int nI = 0; nI < nCIDCount; nI += 32768 - 16) + { + (*pOutputFunc)(pOutputStream, "<\n", 2); + for (int nJ = 0; nJ < 32768 - 16 && nI + nJ < nCIDCount; nJ += 16) + { + (*pOutputFunc)(pOutputStream, " ", 2); + for (int nK = 0; nK < 16 && nI + nJ + nK < nCIDCount; ++nK) + { + nCID = pCIDMap[nI + nJ + nK]; + seBuffer = StringExt::Format("{0:02x}{1:02x}", (nCID >> 8) & 0xff, nCID & 0xff); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "\n", 1); + } + (*pOutputFunc)(pOutputStream, " >", 3); + } + (*pOutputFunc)(pOutputStream, "\n", 1); + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + else + { + (*pOutputFunc)(pOutputStream, "/CIDMap <\n", 10); + for (int nI = 0; nI < nCIDCount; nI += 16) + { + (*pOutputFunc)(pOutputStream, " ", 2); + for (int nJ = 0; nJ < 16 && nI + nJ < nCIDCount; ++nJ) + { + nCID = pCIDMap[nI + nJ]; + seBuffer = StringExt::Format("{0:02x}{1:02x}", (nCID >> 8) & 0xff, nCID & 0xff); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "\n", 1); + } + (*pOutputFunc)(pOutputStream, "> def\n", 6); + } + } + else + { + // direct mapping - just fill the string(s) with s[i]=i + seBuffer = StringExt::Format("/CIDCount {0:d} def\n", m_nGlyphs); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + if (m_nGlyphs > 32767) + { + (*pOutputFunc)(pOutputStream, "/CIDMap [\n", 10); + for (int nI = 0; nI < m_nGlyphs; nI += 32767) + { + int nTemp = m_nGlyphs - nI < 32767 ? m_nGlyphs - nI : 32767; + seBuffer = StringExt::Format(" {0:d} string 0 1 {1:d} {{\n", 2 * nTemp, nTemp - 1); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + seBuffer = StringExt::Format(" 2 copy dup 2 mul exch {0:d} add -8 bitshift put\n", nI); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + seBuffer = StringExt::Format(" 1 index exch dup 2 mul 1 add exch {0:d} add 255 and put\n", nI); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, " } for\n", 8); + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + else + { + seBuffer = StringExt::Format("/CIDMap {0:d} string\n", 2 * m_nGlyphs); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + seBuffer = StringExt::Format(" 0 1 {0:d} {{\n", m_nGlyphs - 1); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, " 2 copy dup 2 mul exch -8 bitshift put\n", 42); + (*pOutputFunc)(pOutputStream, " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50); + (*pOutputFunc)(pOutputStream, " } for\n", 8); + (*pOutputFunc)(pOutputStream, "def\n", 4); + } + } + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + seBuffer = StringExt::Format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", m_arrBBox[0], m_arrBBox[1], m_arrBBox[2], m_arrBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, "/PaintType 0 def\n", 17); + (*pOutputFunc)(pOutputStream, "/Encoding [] readonly def\n", 26); + (*pOutputFunc)(pOutputStream, "/CharStrings 1 dict dup begin\n", 30); + (*pOutputFunc)(pOutputStream, " /.notdef 0 def\n", 17); + (*pOutputFunc)(pOutputStream, " end readonly def\n", 19); + + // write the guts of the dictionary + ConvertSfnts(pOutputFunc, pOutputStream, NULL, bNeedVerticalMetrics); + + // end the dictionary and define the font + (*pOutputFunc)(pOutputStream, "CIDFontName currentdict end /CIDFont defineresource pop\n", 56); + } + + void CFontFileTrueType::ToCIDType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + CFontFileType1C *pT1CFF; + + if (!m_bOpenTypeCFF) + return; + + int nTableIndex = SeekTable("CFF "); + if (!CheckRegion(m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen)) + return; + + if (!(pT1CFF = CFontFileType1C::LoadFromBuffer((char *)m_sFile + m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen))) + return; + + pT1CFF->ToCIDType0(sPSName, pOutputFunc, pOutputStream); + delete pT1CFF; + } + + void CFontFileTrueType::ToType0(char *sPSName, unsigned short *pCIDMap, int nCIDCount, bool bNeedVerticalMetrics, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + StringExt *seBuffer; + + if (m_bOpenTypeCFF) + return; + + // write the Type 42 sfnts array + StringExt *seSfntsName = (new StringExt(sPSName))->Append("_sfnts"); + ConvertSfnts(pOutputFunc, pOutputStream, seSfntsName, bNeedVerticalMetrics); + delete seSfntsName; + + // write the descendant Type 42 fonts + int nCount = pCIDMap ? nCIDCount : m_nGlyphs; + for (int nIndex = 0; nIndex < nCount; nIndex += 256) + { + (*pOutputFunc)(pOutputStream, "10 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + seBuffer = StringExt::Format("_{0:02x} def\n", nIndex >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, "/FontType 42 def\n", 17); + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + seBuffer = StringExt::Format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", m_arrBBox[0], m_arrBBox[1], m_arrBBox[2], m_arrBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, "/PaintType 0 def\n", 17); + (*pOutputFunc)(pOutputStream, "/sfnts ", 7); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, "_sfnts def\n", 11); + (*pOutputFunc)(pOutputStream, "/Encoding 256 array\n", 20); + for (int nJ = 0; nJ < 256 && nIndex + nJ < nCount; ++nJ) + { + seBuffer = StringExt::Format("dup {0:d} /c{1:02x} put\n", nJ, nJ); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "readonly def\n", 13); + (*pOutputFunc)(pOutputStream, "/CharStrings 257 dict dup begin\n", 32); + (*pOutputFunc)(pOutputStream, "/.notdef 0 def\n", 15); + for (int nJ = 0; nJ < 256 && nIndex + nJ < nCount; ++nJ) + { + seBuffer = StringExt::Format("/c{0:02x} {1:d} def\n", nJ, pCIDMap ? pCIDMap[nIndex + nJ] : nIndex + nJ); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "end readonly def\n", 17); + (*pOutputFunc)(pOutputStream, + "FontName currentdict end definefont pop\n", 40); + } + + // write the Type 0 parent font + (*pOutputFunc)(pOutputStream, "16 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, " def\n", 5); + (*pOutputFunc)(pOutputStream, "/FontType 0 def\n", 16); + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + (*pOutputFunc)(pOutputStream, "/FMapType 2 def\n", 16); + (*pOutputFunc)(pOutputStream, "/Encoding [\n", 12); + for (int nIndex = 0; nIndex < nCount; nIndex += 256) + { + seBuffer = StringExt::Format("{0:d}\n", nIndex >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + (*pOutputFunc)(pOutputStream, "/FDepVector [\n", 14); + for (int nIndex =0; nIndex < nCount; nIndex += 256) + { + (*pOutputFunc)(pOutputStream, "/", 1); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + seBuffer = StringExt::Format("_{0:02x} findfont\n", nIndex >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + (*pOutputFunc)(pOutputStream, "FontName currentdict end definefont pop\n", 40); + } + + void CFontFileTrueType::ToType0(char *psName, FontFileOutputFunc outputFunc, void *outputStream) + { + CFontFileType1C *pT1CFF; + + if (!m_bOpenTypeCFF) + return; + + int nTableIndex = SeekTable("CFF "); + if (!CheckRegion(m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen)) + return; + + if (!(pT1CFF = CFontFileType1C::LoadFromBuffer((char *)m_sFile + m_pTables[nTableIndex].nOffset, m_pTables[nTableIndex].nLen))) + return; + + pT1CFF->ToType0(psName, outputFunc, outputStream); + delete pT1CFF; + } + + void CFontFileTrueType::WriteTTF(FontFileOutputFunc pOutputFunc, void *pOutputStream, char *sName, unsigned short *pCodeToGID) + { + static char arrCMapTab[36] = + { + 0, 0, // table version number + 0, 1, // number of encoding tables + 0, 1, // platform ID + 0, 0, // encoding ID + 0, 0, 0, 12, // offset of subtable + 0, 4, // subtable format + 0, 24, // subtable length + 0, 0, // subtable version + 0, 2, // segment count * 2 + 0, 2, // 2 * 2 ^ floor(log2(segCount)) + 0, 0, // floor(log2(segCount)) + 0, 0, // 2*segCount - 2*2^floor(log2(segCount)) + (char)0xff, (char)0xff, // endCount[0] + 0, 0, // reserved + 0, 0, // startCount[0] + 0, 0, // idDelta[0] + 0, 0 // pad to a mulitple of four bytes + }; + + static char arrNameTab[8] = + { + 0, 0, // format + 0, 0, // number of name records + 0, 6, // offset to start of string storage + 0, 0 // pad to multiple of four bytes + }; + static char arrPostTab[32] = + { + 0, 1, 0, 0, // format + 0, 0, 0, 0, // italic angle + 0, 0, // underline position + 0, 0, // underline thickness + 0, 0, 0, 0, // fixed pitch + 0, 0, 0, 0, // min Type 42 memory + 0, 0, 0, 0, // max Type 42 memory + 0, 0, 0, 0, // min Type 1 memory + 0, 0, 0, 0 // max Type 1 memory + }; + static char arrOS2Tab[86] = + { + 0, 1, // version + 0, 1, // xAvgCharWidth + 0, 0, // usWeightClass + 0, 0, // usWidthClass + 0, 0, // fsType + 0, 0, // ySubscriptXSize + 0, 0, // ySubscriptYSize + 0, 0, // ySubscriptXOffset + 0, 0, // ySubscriptYOffset + 0, 0, // ySuperscriptXSize + 0, 0, // ySuperscriptYSize + 0, 0, // ySuperscriptXOffset + 0, 0, // ySuperscriptYOffset + 0, 0, // yStrikeoutSize + 0, 0, // yStrikeoutPosition + 0, 0, // sFamilyClass + 0, 0, 0, 0, 0, // panose + 0, 0, 0, 0, 0, + 0, 0, 0, 0, // ulUnicodeRange1 + 0, 0, 0, 0, // ulUnicodeRange2 + 0, 0, 0, 0, // ulUnicodeRange3 + 0, 0, 0, 0, // ulUnicodeRange4 + 0, 0, 0, 0, // achVendID + 0, 0, // fsSelection + 0, 0, // usFirstCharIndex + 0, 0, // usLastCharIndex + 0, 0, // sTypoAscender + 0, 0, // sTypoDescender + 0, 0, // sTypoLineGap + 0, 0, // usWinAscent + 0, 0, // usWinDescent + 0, 0, 0, 0, // ulCodePageRange1 + 0, 0, 0, 0 // ulCodePageRange2 + }; + bool badCmapLen, abbrevHMTX; + + int nZeroLengthTables; + int nHMetrics, nAdvWidth, nLeftSideBearing; + TrueTypeTable *pNewTables; + char *arrNewNameTable, *arrNewCmapTable, *arrNewHHEATable, *arrNewHMTXTable; + int nNewTables, nCmapIndex, nCmapLen, nGlyphLen, nNewNameLen, nNewCmapLen, nNext; + int nNewHHEALen, nNewHMTXLen; + unsigned int nLocaChecksum, nGlyphChecksum, nFileChecksum; + char *arrTableDir; + char arrLocaBuf[4], arrChecksumBuf[4]; + unsigned int t; + int nPos = 0, i, j, k, n; + + if (m_bOpenTypeCFF) + return; + + // check for missing tables + // (Note: if the OS/2 table is missing, the Microsoft PCL5 driver + // will embed a PCL TrueType font with the pitch field set to zero, + // which apparently causes divide-by-zero errors. As far as I can + // tell, the only important field in the OS/2 table is + // xAvgCharWidth.) + bool bMissingCmap = (nCmapIndex = SeekTable("cmap")) < 0; + bool bMissingName = SeekTable("name") < 0; + bool bMissingPost = SeekTable("post") < 0; + bool bMissingOS2 = SeekTable("OS/2") < 0; + + TrueTypeLoca *pLocaTable = (TrueTypeLoca *)MemUtilsMallocArray(m_nGlyphs + 1, sizeof(TrueTypeLoca)); + bool bUnsortedLoca = false; + i = SeekTable("loca"); + nPos = m_pTables[i].nOffset; + bool bSuccess = true; + for (i = 0; i <= m_nGlyphs; ++i) + { + if (m_nLocaFormat) + { + pLocaTable[i].nOrigOffset = (int)GetU32BE(nPos + i * 4, &bSuccess); + } + else + { + pLocaTable[i].nOrigOffset = 2 * GetU16BE(nPos + i * 2, &bSuccess); + } + if (i > 0 && pLocaTable[i].nOrigOffset < pLocaTable[i - 1].nOrigOffset) + { + bUnsortedLoca = true; + } + // glyph descriptions must be at least 12 bytes long (nContours, + // xMin, yMin, xMax, yMax, instructionLength - two bytes each); + // invalid glyph descriptions (even if they're never used) make + // Windows choke, so we work around that problem here (ideally, + // this would parse the glyph descriptions in the glyf table and + // remove any that were invalid, but this quick test is a decent + // start) + if (i > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset < 12) + { + pLocaTable[i - 1].nOrigOffset = pLocaTable[i].nOrigOffset; + bUnsortedLoca = true; + } + pLocaTable[i].nIndex = i; + } + + // check for zero-length tables + nZeroLengthTables = 0; + for (i = 0; i < m_nTablesCount; ++i) + { + if (m_pTables[i].nLen == 0) + ++nZeroLengthTables; + } + + // check for an incorrect cmap table length + badCmapLen = false; + nCmapLen = 0; + if (!bMissingCmap) + { + nCmapLen = m_pCMaps[0].nOffset + m_pCMaps[0].nLen; + for (i = 1; i < m_nCMapsCount; ++i) + { + if (m_pCMaps[i].nOffset + m_pCMaps[i].nLen > nCmapLen) + { + nCmapLen = m_pCMaps[i].nOffset + m_pCMaps[i].nLen; + } + } + nCmapLen -= m_pTables[nCmapIndex].nOffset; + if (nCmapLen > m_pTables[nCmapIndex].nLen) + { + badCmapLen = true; + } + } + + // check for an abbreviated hmtx table (this is completely legal, + // but confuses the Microsoft PCL5 printer driver, which generates + // embedded fonts with the pitch field set to zero) + i = SeekTable("hhea"); + nHMetrics = GetU16BE(m_pTables[i].nOffset + 34, &bSuccess); + abbrevHMTX = nHMetrics < m_nGlyphs; + + // if nothing is broken, just write the TTF file as is + if (!bMissingCmap && !bMissingName && !bMissingPost && !bMissingOS2 && !bUnsortedLoca && !badCmapLen && !abbrevHMTX && nZeroLengthTables == 0 && !sName && !pCodeToGID) + { + (*pOutputFunc)(pOutputStream, (char *)m_sFile, m_nLen); + MemUtilsFree(pLocaTable); + return; + } + + // sort the 'loca' table: some (non-compliant) fonts have + // out-of-order loca tables; in order to correctly handle the case + // where (compliant) fonts have empty entries in the middle of the + // table, cmpTrueTypeLocaOffset uses offset as its primary sort key, + // and idx as its secondary key (ensuring that adjacent entries with + // the same pos value remain in the same order) + nGlyphLen = 0; + if (bUnsortedLoca) + { + qsort(pLocaTable, m_nGlyphs + 1, sizeof(TrueTypeLoca), &CompareTrueTypeLocaOffset); + for (i = 0; i < m_nGlyphs; ++i) + { + pLocaTable[i].nLen = pLocaTable[i + 1].nOrigOffset - pLocaTable[i].nOrigOffset; + } + pLocaTable[m_nGlyphs].nLen = 0; + qsort(pLocaTable, m_nGlyphs + 1, sizeof(TrueTypeLoca), &CompareTrueTypeLocaIndex); + nPos = 0; + + for (i = 0; i <= m_nGlyphs; ++i) + { + pLocaTable[i].nNewOffset = nPos; + nPos += pLocaTable[i].nLen; + if (nPos & 3) + { + nPos += 4 - (nPos & 3); + } + } + nGlyphLen = nPos; + } + + // compute checksums for the loca and glyf tables + nLocaChecksum = nGlyphChecksum = 0; + if (bUnsortedLoca) + { + if (m_nLocaFormat) + { + for (j = 0; j <= m_nGlyphs; ++j) + { + nLocaChecksum += pLocaTable[j].nNewOffset; + } + } + else + { + for (j = 0; j <= m_nGlyphs; j += 2) + { + nLocaChecksum += pLocaTable[j].nNewOffset << 16; + if (j + 1 <= m_nGlyphs) + { + nLocaChecksum += pLocaTable[j + 1].nNewOffset; + } + } + } + nPos = m_pTables[SeekTable("glyf")].nOffset; + for (j = 0; j < m_nGlyphs; ++j) + { + n = pLocaTable[j].nLen; + if (n > 0) + { + k = pLocaTable[j].nOrigOffset; + if (CheckRegion(nPos + k, n)) + { + nGlyphChecksum += ComputeTableChecksum(m_sFile + nPos + k, n); + } + } + } + } + + // construct the new name table + if (sName) + { + n = strlen(sName); + nNewNameLen = (6 + 4 * 12 + 2 * (3 * n + 7) + 3) & ~3; + arrNewNameTable = (char *)MemUtilsMalloc(nNewNameLen); + memset(arrNewNameTable, 0, nNewNameLen); + arrNewNameTable[0] = 0; // format selector + arrNewNameTable[1] = 0; + arrNewNameTable[2] = 0; // number of name records + arrNewNameTable[3] = 4; + arrNewNameTable[4] = 0; // offset to start of string storage + arrNewNameTable[5] = 6 + 4 * 12; + nNext = 0; + for (i = 0; i < 4; ++i) + { + arrNewNameTable[6 + i * 12 + 0] = 0; // platform ID = Microsoft + arrNewNameTable[6 + i * 12 + 1] = 3; + arrNewNameTable[6 + i * 12 + 2] = 0; // encoding ID = Unicode + arrNewNameTable[6 + i * 12 + 3] = 1; + arrNewNameTable[6 + i * 12 + 4] = 0x04; // language ID = American English + arrNewNameTable[6 + i * 12 + 5] = 0x09; + arrNewNameTable[6 + i * 12 + 6] = 0; // name ID + arrNewNameTable[6 + i * 12 + 7] = i + 1; + arrNewNameTable[6 + i * 12 + 8] = i + 1 == 2 ? 0 : ((2 * n) >> 8); // string length + arrNewNameTable[6 + i * 12 + 9] = i + 1 == 2 ? 14 : ((2 * n) & 0xff); + arrNewNameTable[6 + i * 12 + 10] = nNext >> 8; // string offset + arrNewNameTable[6 + i * 12 + 11] = nNext & 0xff; + if (i + 1 == 2) + { + memcpy(arrNewNameTable + 6 + 4 * 12 + nNext, "\0R\0e\0g\0u\0l\0a\0r", 14); + nNext += 14; + } + else + { + for (j = 0; j < n; ++j) + { + arrNewNameTable[6 + 4 * 12 + nNext + 2 * j] = 0; + arrNewNameTable[6 + 4 * 12 + nNext + 2 * j + 1] = sName[j]; + } + nNext += 2 * n; + } + } + } + else + { + nNewNameLen = 0; + arrNewNameTable = NULL; + } + + // construct the new cmap table + if (pCodeToGID) + { + nNewCmapLen = 44 + 256 * 2; + arrNewCmapTable = (char *)MemUtilsMalloc(nNewCmapLen); + arrNewCmapTable[0] = 0; // table version number = 0 + arrNewCmapTable[1] = 0; + arrNewCmapTable[2] = 0; // number of encoding tables = 1 + arrNewCmapTable[3] = 1; + arrNewCmapTable[4] = 0; // platform ID = Microsoft + arrNewCmapTable[5] = 3; + arrNewCmapTable[6] = 0; // encoding ID = Unicode + arrNewCmapTable[7] = 1; + arrNewCmapTable[8] = 0; // offset of subtable + arrNewCmapTable[9] = 0; + arrNewCmapTable[10] = 0; + arrNewCmapTable[11] = 12; + arrNewCmapTable[12] = 0; // subtable format = 4 + arrNewCmapTable[13] = 4; + arrNewCmapTable[14] = 0x02; // subtable length + arrNewCmapTable[15] = 0x20; + arrNewCmapTable[16] = 0; // subtable version = 0 + arrNewCmapTable[17] = 0; + arrNewCmapTable[18] = 0; // segment count * 2 + arrNewCmapTable[19] = 4; + arrNewCmapTable[20] = 0; // 2 * 2 ^ floor(log2(segCount)) + arrNewCmapTable[21] = 4; + arrNewCmapTable[22] = 0; // floor(log2(segCount)) + arrNewCmapTable[23] = 1; + arrNewCmapTable[24] = 0; // 2*segCount - 2*2^floor(log2(segCount)) + arrNewCmapTable[25] = 0; + arrNewCmapTable[26] = 0x00; // endCount[0] + arrNewCmapTable[27] = (char)0xff; + arrNewCmapTable[28] = (char)0xff; // endCount[1] + arrNewCmapTable[29] = (char)0xff; + arrNewCmapTable[30] = 0; // reserved + arrNewCmapTable[31] = 0; + arrNewCmapTable[32] = 0x00; // startCount[0] + arrNewCmapTable[33] = 0x00; + arrNewCmapTable[34] = (char)0xff; // startCount[1] + arrNewCmapTable[35] = (char)0xff; + arrNewCmapTable[36] = 0; // idDelta[0] + arrNewCmapTable[37] = 0; + arrNewCmapTable[38] = 0; // idDelta[1] + arrNewCmapTable[39] = 1; + arrNewCmapTable[40] = 0; // idRangeOffset[0] + arrNewCmapTable[41] = 4; + arrNewCmapTable[42] = 0; // idRangeOffset[1] + arrNewCmapTable[43] = 0; + for (i = 0; i < 256; ++i) + { + arrNewCmapTable[44 + 2 * i] = pCodeToGID[i] >> 8; + arrNewCmapTable[44 + 2 * i + 1] = pCodeToGID[i] & 0xff; + } + } + else + { + nNewCmapLen = 0; + arrNewCmapTable = NULL; + } + + // generate the new hmtx table and the updated hhea table + if (abbrevHMTX) + { + i = SeekTable("hhea"); + nPos = m_pTables[i].nOffset; + nNewHHEALen = 36; + arrNewHHEATable = (char *)MemUtilsMalloc(nNewHHEALen); + for (i = 0; i < nNewHHEALen; ++i) + { + arrNewHHEATable[i] = GetU8(nPos++, &bSuccess); + } + arrNewHHEATable[34] = m_nGlyphs >> 8; + arrNewHHEATable[35] = m_nGlyphs & 0xff; + i = SeekTable("hmtx"); + nPos = m_pTables[i].nOffset; + nNewHMTXLen = 4 * m_nGlyphs; + arrNewHMTXTable = (char *)MemUtilsMalloc(nNewHMTXLen); + nAdvWidth = 0; + for (i = 0; i < nHMetrics; ++i) + { + nAdvWidth = GetU16BE(nPos, &bSuccess); + nLeftSideBearing = GetU16BE(nPos + 2, &bSuccess); + nPos += 4; + arrNewHMTXTable[4 * i] = nAdvWidth >> 8; + arrNewHMTXTable[4 * i + 1] = nAdvWidth & 0xff; + arrNewHMTXTable[4 * i + 2] = nLeftSideBearing >> 8; + arrNewHMTXTable[4 * i + 3] = nLeftSideBearing & 0xff; + } + for (; i < m_nGlyphs; ++i) + { + nLeftSideBearing = GetU16BE(nPos, &bSuccess); + nPos += 2; + arrNewHMTXTable[4 * i] = nAdvWidth >> 8; + arrNewHMTXTable[4 * i + 1] = nAdvWidth & 0xff; + arrNewHMTXTable[4 * i + 2] = nLeftSideBearing >> 8; + arrNewHMTXTable[4 * i + 3] = nLeftSideBearing & 0xff; + } + } + else + { + arrNewHHEATable = arrNewHMTXTable = NULL; + nNewHHEALen = nNewHMTXLen = 0; + } + + // construct the new table directory: + // - keep all original tables with non-zero length + // - fix the cmap table's length, if necessary + // - add missing tables + // - sort the table by tag + // - compute new table positions, including 4-byte alignment + // - (re)compute table checksums + nNewTables = m_nTablesCount - nZeroLengthTables + (bMissingCmap ? 1 : 0) + (bMissingName ? 1 : 0) + (bMissingPost ? 1 : 0) + (bMissingOS2 ? 1 : 0); + pNewTables = (TrueTypeTable *)MemUtilsMallocArray(nNewTables, sizeof(TrueTypeTable)); + j = 0; + for (i = 0; i < m_nTablesCount; ++i) + { + if (m_pTables[i].nLen > 0) + { + pNewTables[j] = m_pTables[i]; + pNewTables[j].nOrigOffset = m_pTables[i].nOffset; + if (CheckRegion(m_pTables[i].nOffset, pNewTables[i].nLen)) + { + pNewTables[j].unChecksum = ComputeTableChecksum(m_sFile + m_pTables[i].nOffset, m_pTables[i].nLen); + if (m_pTables[i].unTag == headTag) + { + // don't include the file checksum + pNewTables[j].unChecksum -= GetU32BE(m_pTables[i].nOffset + 8, &bSuccess); + } + } + if (pNewTables[j].unTag == cmapTag && pCodeToGID) + { + pNewTables[j].nLen = nNewCmapLen; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewCmapTable, nNewCmapLen); + } + else if (pNewTables[j].unTag == cmapTag && badCmapLen) + { + pNewTables[j].nLen = nCmapLen; + } + else if (pNewTables[j].unTag == locaTag && bUnsortedLoca) + { + pNewTables[j].nLen = (m_nGlyphs + 1) * (m_nLocaFormat ? 4 : 2); + pNewTables[j].unChecksum = nLocaChecksum; + } + else if (pNewTables[j].unTag == glyfTag && bUnsortedLoca) + { + pNewTables[j].nLen = nGlyphLen; + pNewTables[j].unChecksum = nGlyphChecksum; + } + else if (pNewTables[j].unTag == nameTag && sName) + { + pNewTables[j].nLen = nNewNameLen; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewNameTable, nNewNameLen); + } + else if (pNewTables[j].unTag == hheaTag && abbrevHMTX) + { + pNewTables[j].nLen = nNewHHEALen; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewHHEATable, nNewHHEALen); + } + else if (pNewTables[j].unTag == hmtxTag && abbrevHMTX) + { + pNewTables[j].nLen = nNewHMTXLen; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewHMTXTable, nNewHMTXLen); + } + ++j; + } + } + if (bMissingCmap) + { + pNewTables[j].unTag = cmapTag; + if (pCodeToGID) + { + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewCmapTable, nNewCmapLen); + pNewTables[j].nLen = nNewCmapLen; + } + else + { + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrCMapTab, sizeof(arrCMapTab)); + pNewTables[j].nLen = sizeof(arrCMapTab); + } + ++j; + } + if (bMissingName) + { + pNewTables[j].unTag = nameTag; + if (sName) + { + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNewNameTable, nNewNameLen); + pNewTables[j].nLen = nNewNameLen; + } + else + { + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrNameTab, sizeof(arrNameTab)); + pNewTables[j].nLen = sizeof(arrNameTab); + } + ++j; + } + if (bMissingPost) + { + pNewTables[j].unTag = postTag; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrPostTab, sizeof(arrPostTab)); + pNewTables[j].nLen = sizeof(arrPostTab); + ++j; + } + if (bMissingOS2) + { + pNewTables[j].unTag = os2Tag; + pNewTables[j].unChecksum = ComputeTableChecksum((unsigned char *)arrOS2Tab, sizeof(arrOS2Tab)); + pNewTables[j].nLen = sizeof(arrOS2Tab); + ++j; + } + qsort(pNewTables, nNewTables, sizeof(TrueTypeTable), CompareTrueTypeTableTag); + nPos = 12 + nNewTables * 16; + for (i = 0; i < nNewTables; ++i) + { + pNewTables[i].nOffset = nPos; + nPos += pNewTables[i].nLen; + if (nPos & 3) + { + nPos += 4 - (nPos & 3); + } + } + + // write the table directory + arrTableDir = (char *)MemUtilsMalloc(12 + nNewTables * 16); + arrTableDir[0] = 0x00; // sfnt version + arrTableDir[1] = 0x01; + arrTableDir[2] = 0x00; + arrTableDir[3] = 0x00; + arrTableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables + arrTableDir[5] = (char)(nNewTables & 0xff); + for (i = -1, t = (unsigned int)nNewTables; t; ++i, t >>= 1); + t = 1 << (4 + i); + arrTableDir[6] = (char)((t >> 8) & 0xff); // searchRange + arrTableDir[7] = (char)(t & 0xff); + arrTableDir[8] = (char)((i >> 8) & 0xff); // entrySelector + arrTableDir[9] = (char)(i & 0xff); + t = nNewTables * 16 - t; + arrTableDir[10] = (char)((t >> 8) & 0xff); // rangeShift + arrTableDir[11] = (char)(t & 0xff); + nPos = 12; + for (i = 0; i < nNewTables; ++i) + { + arrTableDir[nPos] = (char)(pNewTables[i].unTag >> 24); + arrTableDir[nPos + 1] = (char)(pNewTables[i].unTag >> 16); + arrTableDir[nPos + 2] = (char)(pNewTables[i].unTag >> 8); + arrTableDir[nPos + 3] = (char)pNewTables[i].unTag; + arrTableDir[nPos + 4] = (char)(pNewTables[i].unChecksum >> 24); + arrTableDir[nPos + 5] = (char)(pNewTables[i].unChecksum >> 16); + arrTableDir[nPos + 6] = (char)(pNewTables[i].unChecksum >> 8); + arrTableDir[nPos + 7] = (char)pNewTables[i].unChecksum; + arrTableDir[nPos + 8] = (char)(pNewTables[i].nOffset >> 24); + arrTableDir[nPos + 9] = (char)(pNewTables[i].nOffset >> 16); + arrTableDir[nPos + 10] = (char)(pNewTables[i].nOffset >> 8); + arrTableDir[nPos + 11] = (char)pNewTables[i].nOffset; + arrTableDir[nPos + 12] = (char)(pNewTables[i].nLen >> 24); + arrTableDir[nPos + 13] = (char)(pNewTables[i].nLen >> 16); + arrTableDir[nPos + 14] = (char)(pNewTables[i].nLen >> 8); + arrTableDir[nPos + 15] = (char)pNewTables[i].nLen; + nPos += 16; + } + (*pOutputFunc)(pOutputStream, arrTableDir, 12 + nNewTables * 16); + + // compute the file checksum + nFileChecksum = ComputeTableChecksum((unsigned char *)arrTableDir, 12 + nNewTables * 16); + for (i = 0; i < nNewTables; ++i) + { + nFileChecksum += pNewTables[i].unChecksum; + } + nFileChecksum = 0xb1b0afba - nFileChecksum; + + // write the tables + for (i = 0; i < nNewTables; ++i) + { + if (pNewTables[i].unTag == headTag) + { + if (CheckRegion(pNewTables[i].nOrigOffset, pNewTables[i].nLen)) + { + (*pOutputFunc)(pOutputStream, (char *)m_sFile + pNewTables[i].nOrigOffset, 8); + arrChecksumBuf[0] = nFileChecksum >> 24; + arrChecksumBuf[1] = nFileChecksum >> 16; + arrChecksumBuf[2] = nFileChecksum >> 8; + arrChecksumBuf[3] = nFileChecksum; + (*pOutputFunc)(pOutputStream, arrChecksumBuf, 4); + (*pOutputFunc)(pOutputStream, (char *)m_sFile + pNewTables[i].nOrigOffset + 12, pNewTables[i].nLen - 12); + } + else + { + for (j = 0; j < pNewTables[i].nLen; ++j) + { + (*pOutputFunc)(pOutputStream, "\0", 1); + } + } + } + else if (pNewTables[i].unTag == cmapTag && pCodeToGID) + (*pOutputFunc)(pOutputStream, arrNewCmapTable, pNewTables[i].nLen); + else if (pNewTables[i].unTag == cmapTag && bMissingCmap) + (*pOutputFunc)(pOutputStream, arrCMapTab, pNewTables[i].nLen); + else if (pNewTables[i].unTag == nameTag && sName) + (*pOutputFunc)(pOutputStream, arrNewNameTable, pNewTables[i].nLen); + else if (pNewTables[i].unTag == nameTag && bMissingName) + (*pOutputFunc)(pOutputStream, arrNameTab, pNewTables[i].nLen); + else if (pNewTables[i].unTag == postTag && bMissingPost) + (*pOutputFunc)(pOutputStream, arrPostTab, pNewTables[i].nLen); + else if (pNewTables[i].unTag == os2Tag && bMissingOS2) + (*pOutputFunc)(pOutputStream, arrOS2Tab, pNewTables[i].nLen); + else if (pNewTables[i].unTag == hheaTag && abbrevHMTX) + (*pOutputFunc)(pOutputStream, arrNewHHEATable, pNewTables[i].nLen); + else if (pNewTables[i].unTag == hmtxTag && abbrevHMTX) + (*pOutputFunc)(pOutputStream, arrNewHMTXTable, pNewTables[i].nLen); + else if (pNewTables[i].unTag == locaTag && bUnsortedLoca) + { + for (j = 0; j <= m_nGlyphs; ++j) + { + if (m_nLocaFormat) + { + arrLocaBuf[0] = (char)(pLocaTable[j].nNewOffset >> 24); + arrLocaBuf[1] = (char)(pLocaTable[j].nNewOffset >> 16); + arrLocaBuf[2] = (char)(pLocaTable[j].nNewOffset >> 8); + arrLocaBuf[3] = (char)pLocaTable[j].nNewOffset; + (*pOutputFunc)(pOutputStream, arrLocaBuf, 4); + } + else + { + arrLocaBuf[0] = (char)(pLocaTable[j].nNewOffset >> 9); + arrLocaBuf[1] = (char)(pLocaTable[j].nNewOffset >> 1); + (*pOutputFunc)(pOutputStream, arrLocaBuf, 2); + } + } + } + else if (pNewTables[i].unTag == glyfTag && bUnsortedLoca) + { + nPos = m_pTables[SeekTable("glyf")].nOffset; + for (j = 0; j < m_nGlyphs; ++j) + { + n = pLocaTable[j].nLen; + if (n > 0) + { + k = pLocaTable[j].nOrigOffset; + if (CheckRegion(nPos + k, n)) + { + (*pOutputFunc)(pOutputStream, (char *)m_sFile + nPos + k, n); + } + else + { + for (k = 0; k < n; ++k) + { + (*pOutputFunc)(pOutputStream, "\0", 1); + } + } + if ((k = pLocaTable[j].nLen & 3)) + { + (*pOutputFunc)(pOutputStream, "\0\0\0\0", 4 - k); + } + } + } + } + else + { + if (CheckRegion(pNewTables[i].nOrigOffset, pNewTables[i].nLen)) + { + (*pOutputFunc)(pOutputStream, (char *)m_sFile + pNewTables[i].nOrigOffset, pNewTables[i].nLen); + } + else + { + for (j = 0; j < pNewTables[i].nLen; ++j) + { + (*pOutputFunc)(pOutputStream, "\0", 1); + } + } + } + if (pNewTables[i].nLen & 3) + { + (*pOutputFunc)(pOutputStream, "\0\0\0", 4 - (pNewTables[i].nLen & 3)); + } + } + + MemUtilsFree(arrNewHMTXTable); + MemUtilsFree(arrNewHHEATable); + MemUtilsFree(arrNewCmapTable); + MemUtilsFree(arrNewNameTable); + MemUtilsFree(arrTableDir); + MemUtilsFree(pNewTables); + MemUtilsFree(pLocaTable); + } + + void CFontFileTrueType::ConvertEncoding(char **ppEncoding, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + // конвертация кодировки в тип Type42 + char *sName; + StringExt *seBuffer; + + (*pOutputFunc)(pOutputStream, "/Encoding 256 array\n", 20); + if (ppEncoding) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (!(sName = ppEncoding[nIndex])) + { + sName = ".notdef"; + } + seBuffer = StringExt::Format("dup {0:d} /", nIndex); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + (*pOutputFunc)(pOutputStream, sName, strlen(sName)); + (*pOutputFunc)(pOutputStream, " put\n", 5); + } + } + else + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + seBuffer = StringExt::Format("dup {0:d} /c{1:02x} put\n", nIndex, nIndex); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + } + (*pOutputFunc)(pOutputStream, "readonly def\n", 13); + } + + void CFontFileTrueType::ConvertCharStrings(char **ppEncoding, unsigned short *pnCodeToGID, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + char *sName; + StringExt *seBuffer; + char sBuf[16]; + + (*pOutputFunc)(pOutputStream, "/CharStrings 256 dict dup begin\n", 32); + (*pOutputFunc)(pOutputStream, "/.notdef 0 def\n", 15); + + if (m_nCMapsCount == 0) + { + (*pOutputFunc)(pOutputStream, "end readonly def\n", 17); + return; + } + + // Ставим в соответствие названию символа glyph индекс: + // 1. Используем ppEncoding для отображения имени символа в его номер + // 2. Используем pnCodeToGID для отображения номера символа в glyph индекс + int nGlyphIndex = 0; + for (int nIndex = 255; nIndex >= 0; --nIndex) + { + if (ppEncoding) + { + sName = ppEncoding[nIndex]; + } + else + { + sprintf(sBuf, "c%02x", nIndex); + sName = sBuf; + } + if (sName && strcmp(sName, ".notdef")) + { + nGlyphIndex = pnCodeToGID[nIndex]; + + if (nGlyphIndex > 0 && nGlyphIndex < m_nGlyphs) + { + (*pOutputFunc)(pOutputStream, "/", 1); + (*pOutputFunc)(pOutputStream, sName, strlen(sName)); + seBuffer = StringExt::Format(" {0:d} def\n", nGlyphIndex); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + } + } + } + + void CFontFileTrueType::ConvertSfnts(FontFileOutputFunc pOutputFunc, void *pOutputStream, StringExt *seName, bool bNeedVerticalMetrics) + { + unsigned char pHeadData[54]; + TrueTypeLoca *pLocaTable; + unsigned char *pLocaData; + TrueTypeTable arrNewTables[nT42Tables]; + unsigned char arrTableDir[12 + nT42Tables * 16]; + unsigned int nChecksum = 0; + int nNewTables; + int nLength = 0, nGlyphfPos = 0, nJ = 0; + + unsigned char arrVheaTable[36] = + { + 0, 1, 0, 0, // table version number + 0, 0, // ascent + 0, 0, // descent + 0, 0, // reserved + 0, 0, // max advance height + 0, 0, // min top side bearing + 0, 0, // min bottom side bearing + 0, 0, // y max extent + 0, 0, // caret slope rise + 0, 1, // caret slope run + 0, 0, // caret offset + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // metric data format + 0, 1 // number of advance heights in vmtx table + }; + + unsigned char *arrVmtxTable; + bool bNeedVhea, bNeedVmtx; + + int nCurTable = SeekTable("head"); + int nPos = m_pTables[nCurTable].nOffset; + if (!CheckRegion(nPos, 54)) + return; + + memcpy(pHeadData, m_sFile + nPos, 54); + pHeadData[8] = pHeadData[9] = pHeadData[10] = pHeadData[11] = (unsigned char)0; + + pLocaTable = (TrueTypeLoca *)MemUtilsMallocArray(m_nGlyphs + 1, sizeof(TrueTypeLoca)); + nCurTable = SeekTable("loca"); + nPos = m_pTables[nCurTable].nOffset; + bool bSuccess = true; + for (int nIndex = 0; nIndex <= m_nGlyphs; ++nIndex) + { + pLocaTable[nIndex].nIndex = nIndex; + if (m_nLocaFormat) + pLocaTable[nIndex].nOrigOffset = (int)GetU32BE(nPos + nIndex * 4, &bSuccess); + else + pLocaTable[nIndex].nOrigOffset = 2 * GetU16BE(nPos + nIndex * 2, &bSuccess); + } + qsort(pLocaTable, m_nGlyphs + 1, sizeof(TrueTypeLoca), &CompareTrueTypeLocaOffset); + + for (int nIndex = 0; nIndex < m_nGlyphs; ++nIndex) + { + pLocaTable[nIndex].nLen = pLocaTable[nIndex + 1].nOrigOffset - pLocaTable[nIndex].nOrigOffset; + } + + pLocaTable[m_nGlyphs].nLen = 0; + qsort(pLocaTable, m_nGlyphs + 1, sizeof(TrueTypeLoca), &CompareTrueTypeLocaIndex); + nPos = 0; + for (int nIndex = 0; nIndex <= m_nGlyphs; ++nIndex) + { + pLocaTable[nIndex].nNewOffset = nPos; + nPos += pLocaTable[nIndex].nLen; + if (nPos & 3) + { + nPos += 4 - (nPos & 3); + } + } + + // Создаем новую таблицу 'loca' + pLocaData = (unsigned char *)MemUtilsMallocArray(m_nGlyphs + 1, (m_nLocaFormat ? 4 : 2)); + for (int nIndex = 0; nIndex <= m_nGlyphs; ++nIndex) + { + nPos = pLocaTable[nIndex].nNewOffset; + if (m_nLocaFormat) + { + pLocaData[4 * nIndex] = (unsigned char)(nPos >> 24); + pLocaData[4 * nIndex + 1] = (unsigned char)(nPos >> 16); + pLocaData[4 * nIndex + 2] = (unsigned char)(nPos >> 8); + pLocaData[4 * nIndex + 3] = (unsigned char)nPos; + } + else + { + pLocaData[2 * nIndex] = (unsigned char)(nPos >> 9); + pLocaData[2 * nIndex + 1] = (unsigned char)(nPos >> 1); + } + } + + // считаем число таблиц + nNewTables = 0; + for (int nIndex = 0; nIndex < nT42Tables; ++nIndex) + { + if (t42Tables[nIndex].bRequired || SeekTable(t42Tables[nIndex].sTag) >= 0) + { + ++nNewTables; + } + } + arrVmtxTable = NULL; + int nAdvance = 0; + if (bNeedVerticalMetrics) + { + bNeedVhea = SeekTable("vhea") < 0; + bNeedVmtx = SeekTable("vmtx") < 0; + if (bNeedVhea || bNeedVmtx) + { + nCurTable = SeekTable("head"); + nAdvance = GetU16BE(m_pTables[nCurTable].nOffset + 18, &bSuccess); // units per em + if (bNeedVhea) + { + ++nNewTables; + } + if (bNeedVmtx) + { + ++nNewTables; + } + } + } + + nPos = 12 + nNewTables * 16; + int nTableIndex = 0; + for (int nIndex = 0; nIndex < nT42Tables; ++nIndex) + { + nLength = -1; + nChecksum = 0; + if (t42HeadTable == nIndex) + { + nLength = 54; + nChecksum = ComputeTableChecksum(pHeadData, 54); + } + else if (t42LocaTable == nIndex) + { + nLength = (m_nGlyphs + 1) * (m_nLocaFormat ? 4 : 2); + nChecksum = ComputeTableChecksum(pLocaData, nLength); + } + else if (t42GlyfTable == nIndex) + { + nLength = 0; + nChecksum = 0; + nGlyphfPos = m_pTables[SeekTable("glyf")].nOffset; + for (nJ = 0; nJ < m_nGlyphs; ++nJ) + { + nLength += pLocaTable[nJ].nLen; + if (nLength & 3) + { + nLength += 4 - (nLength & 3); + } + if (CheckRegion(nGlyphfPos + pLocaTable[nJ].nOrigOffset, pLocaTable[nJ].nLen)) + { + nChecksum += ComputeTableChecksum(m_sFile + nGlyphfPos + pLocaTable[nJ].nOrigOffset, pLocaTable[nJ].nLen); + } + } + } + else + { + if ((nJ = SeekTable(t42Tables[nIndex].sTag)) >= 0) + { + nLength = m_pTables[nJ].nLen; + if (CheckRegion(m_pTables[nJ].nOffset, nLength)) + { + nChecksum = ComputeTableChecksum(m_sFile + m_pTables[nJ].nOffset, nLength); + } + } + else if (bNeedVerticalMetrics && nIndex == t42VheaTable) + { + arrVheaTable[10] = nAdvance / 256; // max advance height + arrVheaTable[11] = nAdvance % 256; + nLength = sizeof(arrVheaTable); + nChecksum = ComputeTableChecksum(arrVheaTable, nLength); + } + else if (bNeedVerticalMetrics && nIndex == t42VmtxTable) + { + nLength = 4 + (m_nGlyphs - 1) * 4; + arrVmtxTable = (unsigned char *)MemUtilsMalloc(nLength); + arrVmtxTable[0] = nAdvance / 256; + arrVmtxTable[1] = nAdvance % 256; + for (nJ = 2; nJ < nLength; nJ += 2) + { + arrVmtxTable[nJ] = 0; + arrVmtxTable[nJ + 1] = 0; + } + nChecksum = ComputeTableChecksum(arrVmtxTable, nLength); + } + else if (t42Tables[nIndex].bRequired) + { + // TO DO : "Embedded TrueType font is missing a required table t42Tables[i].tag + nLength = 0; + nChecksum = 0; + } + } + if (nLength >= 0) + { + arrNewTables[nTableIndex].unTag = ((t42Tables[nIndex].sTag[0] & 0xff) << 24) | ((t42Tables[nIndex].sTag[1] & 0xff) << 16) | ((t42Tables[nIndex].sTag[2] & 0xff) << 8) | (t42Tables[nIndex].sTag[3] & 0xff); + arrNewTables[nTableIndex].unChecksum = nChecksum; + arrNewTables[nTableIndex].nOffset = nPos; + arrNewTables[nTableIndex].nLen = nLength; + nPos += nLength; + if (nPos & 3) + { + nPos += 4 - (nLength & 3); + } + ++nTableIndex; + } + } + + // construct the table directory + arrTableDir[0] = 0x00; // sfnt version + arrTableDir[1] = 0x01; + arrTableDir[2] = 0x00; + arrTableDir[3] = 0x00; + arrTableDir[4] = 0; // numTables + arrTableDir[5] = nNewTables; + arrTableDir[6] = 0; // searchRange + arrTableDir[7] = (unsigned char)128; + arrTableDir[8] = 0; // entrySelector + arrTableDir[9] = 3; + arrTableDir[10] = 0; // rangeShift + arrTableDir[11] = (unsigned char)(16 * nNewTables - 128); + nPos = 12; + for (int nIndex = 0; nIndex < nNewTables; ++nIndex) + { + arrTableDir[nPos] = (unsigned char)(arrNewTables[nIndex].unTag >> 24); + arrTableDir[nPos + 1] = (unsigned char)(arrNewTables[nIndex].unTag >> 16); + arrTableDir[nPos + 2] = (unsigned char)(arrNewTables[nIndex].unTag >> 8); + arrTableDir[nPos + 3] = (unsigned char)arrNewTables[nIndex].unTag; + arrTableDir[nPos + 4] = (unsigned char)(arrNewTables[nIndex].unChecksum >> 24); + arrTableDir[nPos + 5] = (unsigned char)(arrNewTables[nIndex].unChecksum >> 16); + arrTableDir[nPos + 6] = (unsigned char)(arrNewTables[nIndex].unChecksum >> 8); + arrTableDir[nPos + 7] = (unsigned char)arrNewTables[nIndex].unChecksum; + arrTableDir[nPos + 8] = (unsigned char)(arrNewTables[nIndex].nOffset >> 24); + arrTableDir[nPos + 9] = (unsigned char)(arrNewTables[nIndex].nOffset >> 16); + arrTableDir[nPos + 10] = (unsigned char)(arrNewTables[nIndex].nOffset >> 8); + arrTableDir[nPos + 11] = (unsigned char)arrNewTables[nIndex].nOffset; + arrTableDir[nPos + 12] = (unsigned char)(arrNewTables[nIndex].nLen >> 24); + arrTableDir[nPos + 13] = (unsigned char)(arrNewTables[nIndex].nLen >> 16); + arrTableDir[nPos + 14] = (unsigned char)(arrNewTables[nIndex].nLen >> 8); + arrTableDir[nPos + 15] = (unsigned char)arrNewTables[nIndex].nLen; + nPos += 16; + } + + // вычисляем checksum и сохраняем ее в заголовке таблицы + nChecksum = ComputeTableChecksum(arrTableDir, 12 + nNewTables * 16); + for (int nIndex = 0; nIndex < nNewTables; ++nIndex) + { + nChecksum += arrNewTables[nIndex].unChecksum; + } + nChecksum = 0xb1b0afba - nChecksum; // по спецификации TrueType + pHeadData[8] = (unsigned char)(nChecksum >> 24); + pHeadData[9] = (unsigned char)(nChecksum >> 16); + pHeadData[10] = (unsigned char)(nChecksum >> 8); + pHeadData[11] = (unsigned char)nChecksum; + + // начинаем писать массив sfnts + if (seName) + { + (*pOutputFunc)(pOutputStream, "/", 1); + (*pOutputFunc)(pOutputStream, seName->GetBuffer(), seName->GetLength()); + (*pOutputFunc)(pOutputStream, " [\n", 3); + } + else + { + (*pOutputFunc)(pOutputStream, "/sfnts [\n", 9); + } + + DumpString(arrTableDir, 12 + nNewTables * 16, pOutputFunc, pOutputStream); + + // пишем таблицы + for (int nIndex = 0; nIndex < nNewTables; ++nIndex) + { + if (t42HeadTable == nIndex) + { + DumpString(pHeadData, 54, pOutputFunc, pOutputStream); + } + else if (t42LocaTable == nIndex) + { + nLength = (m_nGlyphs + 1) * (m_nLocaFormat ? 4 : 2); + DumpString(pLocaData, nLength, pOutputFunc, pOutputStream); + } + else if (t42GlyfTable == nIndex) + { + nGlyphfPos = m_pTables[SeekTable("glyf")].nOffset; + for (nJ = 0; nJ < m_nGlyphs; ++nJ) + { + if (pLocaTable[nJ].nLen > 0 && CheckRegion(nGlyphfPos + pLocaTable[nJ].nOrigOffset, pLocaTable[nJ].nLen)) + { + DumpString(m_sFile + nGlyphfPos + pLocaTable[nJ].nOrigOffset, pLocaTable[nJ].nLen, pOutputFunc, pOutputStream); + } + } + } + else + { + // nLength == 0 означает, что таблица не найдена, а ошибка уже была выдана + // во время конструирования таблицы + if ((nLength = arrNewTables[nIndex].nLen) > 0) + { + if ((nJ = SeekTable(t42Tables[nIndex].sTag)) >= 0 && CheckRegion(m_pTables[nJ].nOffset, m_pTables[nJ].nLen)) + { + DumpString(m_sFile + m_pTables[nJ].nOffset, m_pTables[nJ].nLen, pOutputFunc, pOutputStream); + } + else if (bNeedVerticalMetrics && t42VheaTable == nIndex) + { + DumpString(arrVheaTable, nLength, pOutputFunc, pOutputStream); + } + else if (bNeedVerticalMetrics && t42VmtxTable == nIndex) + { + DumpString(arrVmtxTable, nLength, pOutputFunc, pOutputStream); + MemUtilsFree(arrVmtxTable); + } + } + } + } + + // закончили писать массив sfnts + (*pOutputFunc)(pOutputStream, "] def\n", 6); + + MemUtilsFree(pLocaData); + MemUtilsFree(pLocaTable); + } + + void CFontFileTrueType::DumpString(unsigned char *sString, int nLength, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + StringExt *seBuffer; + int nPad = 0; + + (*pOutputFunc)(pOutputStream, "<", 1); + for (int nIndex = 0; nIndex < nLength; nIndex += 32) + { + for (int nJ = 0; nJ < 32 && nIndex + nJ < nLength; ++nJ) + { + seBuffer = StringExt::Format("{0:02x}", sString[nIndex + nJ] & 0xff); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (nIndex % (65536 - 32) == 65536 - 64) + { + (*pOutputFunc)(pOutputStream, ">\n<", 3); + } + else if (nIndex + 32 < nLength) + { + (*pOutputFunc)(pOutputStream, "\n", 1); + } + } + if (nLength & 3) + { + nPad = 4 - (nLength & 3); + for (int nIndex = 0; nIndex < nPad; ++nIndex) + { + (*pOutputFunc)(pOutputStream, "00", 2); + } + } + // Добавляем дополнительный нулевой байт, по спецификации Adobe Type 42 + (*pOutputFunc)(pOutputStream, "00>\n", 4); + } + + unsigned int CFontFileTrueType::ComputeTableChecksum(unsigned char *sData, int nLength) + { + unsigned int nWord = 0; + + unsigned int nChecksum = 0; + for (int nIndex = 0; nIndex + 3 < nLength; nIndex += 4) + { + nWord = ((sData[nIndex] & 0xff) << 24) + ((sData[nIndex + 1] & 0xff) << 16) + ((sData[nIndex + 2] & 0xff) << 8) + (sData[nIndex + 3] & 0xff); + nChecksum += nWord; + } + if (nLength & 3) + { + nWord = 0; + int nTemp = nLength & ~3; + switch (nLength & 3) + { + case 3: + nWord |= (sData[nTemp + 2] & 0xff) << 8; + case 2: + nWord |= (sData[nTemp + 1] & 0xff) << 16; + case 1: + nWord |= (sData[nTemp] & 0xff) << 24; + break; + } + nChecksum += nWord; + } + return nChecksum; + } + + void CFontFileTrueType::Parse() + { + int nPos = 0, nIndex = 0, nJ; + + m_bSuccess = true; + + // Проверяем является ли данный файл (TTC) + unsigned int usTopTag = GetU32BE(0, &m_bSuccess); + if (!m_bSuccess) + return; + + if (usTopTag == ttcfTag) + { + nPos = GetU32BE(12, &m_bSuccess); + if (!m_bSuccess) + return; + } + else + nPos = 0; + + // Проверяем sfnt версию + int nSfntVersion = GetU32BE(nPos, &m_bSuccess); + if (!m_bSuccess) + return; + + // Проверяем на формат данных. CCF или нет? + m_bOpenTypeCFF = (nSfntVersion == 0x4f54544f); // 'OTTO' + + m_nTablesCount = GetU16BE(nPos + 4, &m_bSuccess); + if (!m_bSuccess) + return; + + m_pTables = (TrueTypeTable *)MemUtilsMallocArray(m_nTablesCount, sizeof(TrueTypeTable)); + nPos += 12; + + for (nIndex = 0; nIndex < m_nTablesCount; ++nIndex) + { + m_pTables[nIndex].unTag = GetU32BE(nPos, &m_bSuccess); + m_pTables[nIndex].unChecksum = GetU32BE(nPos + 4, &m_bSuccess); + m_pTables[nIndex].nOffset = (int)GetU32BE(nPos + 8, &m_bSuccess); + m_pTables[nIndex].nLen = (int)GetU32BE(nPos + 12, &m_bSuccess); + if (m_pTables[nIndex].nOffset + m_pTables[nIndex].nLen < m_pTables[nIndex].nOffset || m_pTables[nIndex].nOffset + m_pTables[nIndex].nLen > m_nLen) + { + m_bSuccess = false; + } + nPos += 16; + } + if (!m_bSuccess) + return; + + // ищем таблицы необходимые как и для TrueType так и для Type 42 + if (SeekTable("head") < 0 || SeekTable("hhea") < 0 || SeekTable("maxp") < 0 || SeekTable("hmtx") < 0 || (!m_bOpenTypeCFF && SeekTable("loca") < 0) || (!m_bOpenTypeCFF && SeekTable("glyf") < 0) || (m_bOpenTypeCFF && SeekTable("CFF ") < 0)) + { + m_bSuccess = false; + return; + } + + // читаем таблицы CMaps + if ((nIndex = SeekTable("cmap")) >= 0) + { + nPos = m_pTables[nIndex].nOffset + 2; + m_nCMapsCount = GetU16BE(nPos, &m_bSuccess); + nPos += 2; + if (!m_bSuccess) + return; + + m_pCMaps = (TrueTypeCmap *)MemUtilsMallocArray(m_nCMapsCount, sizeof(TrueTypeCmap)); + + for (nJ = 0; nJ < m_nCMapsCount; ++nJ) + { + m_pCMaps[nJ].nPlatform = GetU16BE(nPos, &m_bSuccess); + m_pCMaps[nJ].nEncoding = GetU16BE(nPos + 2, &m_bSuccess); + unsigned int nTemp = GetU32BE(nPos + 4, &m_bSuccess); + m_pCMaps[nJ].nOffset = m_pTables[nIndex].nOffset + GetU32BE(nPos + 4, &m_bSuccess); + nPos += 8; + m_pCMaps[nJ].nFormat = GetU16BE(m_pCMaps[nJ].nOffset, &m_bSuccess); + m_pCMaps[nJ].nLen = GetU16BE(m_pCMaps[nJ].nOffset + 2, &m_bSuccess); + } + if (!m_bSuccess) + return; + } + else + m_nCMapsCount = 0; + + nIndex = SeekTable("maxp"); + m_nGlyphs = GetU16BE(m_pTables[nIndex].nOffset + 4, &m_bSuccess); + if (!m_bSuccess) + return; + + nIndex = SeekTable("head"); + m_arrBBox[0] = GetS16BE(m_pTables[nIndex].nOffset + 36, &m_bSuccess); + m_arrBBox[1] = GetS16BE(m_pTables[nIndex].nOffset + 38, &m_bSuccess); + m_arrBBox[2] = GetS16BE(m_pTables[nIndex].nOffset + 40, &m_bSuccess); + m_arrBBox[3] = GetS16BE(m_pTables[nIndex].nOffset + 42, &m_bSuccess); + m_nLocaFormat = GetS16BE(m_pTables[nIndex].nOffset + 50, &m_bSuccess); + if (!m_bSuccess) + return; + + // Проверяем корректность таблицы loca + if (!m_bOpenTypeCFF) + { + nIndex = SeekTable("loca"); + if (m_pTables[nIndex].nLen < 0) + { + m_bSuccess = false; + return; + } + if (m_pTables[nIndex].nLen < (m_nGlyphs + 1) * (m_nLocaFormat ? 4 : 2)) + { + m_nGlyphs = m_pTables[nIndex].nLen / (m_nLocaFormat ? 4 : 2) - 1; + } + for (nJ = 0; nJ <= m_nGlyphs; ++nJ) + { + if (m_nLocaFormat) + nPos = (int)GetU32BE(m_pTables[nIndex].nOffset + nJ * 4, &m_bSuccess); + else + nPos = GetU16BE(m_pTables[nIndex].nOffset + nJ * 2, &m_bSuccess); + + if (nPos < 0 || nPos > m_nLen) + m_bSuccess = false; + } + if (!m_bSuccess) + return; + } + + // Читаем таблицу post + ReadPostTable(); + } + + void CFontFileTrueType::ReadPostTable() + { + StringExt *seName; + int nStringIndex, nStringPos; + bool bSuccess = true; + int nTemp, nJ, nCount = 0, nTempLen = 0; + + if ((nTemp = SeekTable("post")) < 0) + return; + + int nTablePos = m_pTables[nTemp].nOffset; + int nPostFormat = GetU32BE(nTablePos, &bSuccess); + + if (!bSuccess) + goto error; + + if (0x00010000 == nPostFormat) + { + m_pNameToGID = new CHash(true); + for (nTemp = 0; nTemp < 258; ++nTemp) + { + m_pNameToGID->Add(new StringExt(c_arrAppleGlyphNames[nTemp]), nTemp); + } + } + else if (0x00020000 == nPostFormat) + { + m_pNameToGID = new CHash(true); + nCount = GetU16BE(nTablePos + 32, &bSuccess); + if (!bSuccess) + goto error; + if (nCount > m_nGlyphs) + { + nCount = m_nGlyphs; + } + nStringIndex = 0; + nStringPos = nTablePos + 34 + 2 * nCount; + for (nTemp = 0; nTemp < nCount; ++nTemp) + { + nJ = GetU16BE(nTablePos + 34 + 2 * nTemp, &bSuccess); + if (nJ < 258) + { + m_pNameToGID->RemoveInt(c_arrAppleGlyphNames[nJ]); + m_pNameToGID->Add(new StringExt(c_arrAppleGlyphNames[nJ]), nTemp); + } + else + { + nJ -= 258; + if (nJ != nStringIndex) + { + for (nStringIndex = 0, nStringPos = nTablePos + 34 + 2 * nCount; nStringIndex < nJ; ++nStringIndex, nStringPos += 1 + GetU8(nStringPos, &bSuccess)); + if (!bSuccess) + goto error; + } + nTempLen = GetU8(nStringPos, &bSuccess); + if (!bSuccess || !CheckRegion(nStringPos + 1, nTempLen)) + goto error; + seName = new StringExt((char *)&m_sFile[nStringPos + 1], nTempLen); + m_pNameToGID->RemoveInt(seName); + m_pNameToGID->Add(seName, nTemp); + ++nStringIndex; + nStringPos += 1 + nTempLen; + } + } + } + else if (0x00028000 == nPostFormat) + { + m_pNameToGID = new CHash(true); + for (nTemp = 0; nTemp < m_nGlyphs; ++nTemp) + { + nJ = GetU8(nTablePos + 32 + nTemp, &bSuccess); + if (!bSuccess) + goto error; + if (nJ < 258) + { + m_pNameToGID->RemoveInt(c_arrAppleGlyphNames[nJ]); + m_pNameToGID->Add(new StringExt(c_arrAppleGlyphNames[nJ]), nTemp); + } + } + } + + return; + + error: + if (m_pNameToGID) + { + delete m_pNameToGID; + m_pNameToGID = NULL; + } + } + + int CFontFileTrueType::SeekTable(char *sTag) + { + unsigned int nTagIndex = ((sTag[0] & 0xff) << 24) | ((sTag[1] & 0xff) << 16) | ((sTag[2] & 0xff) << 8) | (sTag[3] & 0xff); + for (int nIndex = 0; nIndex < m_nTablesCount; ++nIndex) + { + if (m_pTables[nIndex].unTag == nTagIndex) + { + return nIndex; + } + } + return -1; + } +} \ No newline at end of file diff --git a/PdfReader/Src/FontFileTrueType.h b/PdfReader/Src/FontFileTrueType.h new file mode 100644 index 0000000000..4dfc00eba2 --- /dev/null +++ b/PdfReader/Src/FontFileTrueType.h @@ -0,0 +1,143 @@ +#ifndef _PDF_READER_FONT_FILE_TRUETYPE_H +#define _PDF_READER_FONT_FILE_TRUETYPE_H + +#include "FontFileBase.h" + +namespace PdfReader +{ + class StringExt; + class CHash; + struct TrueTypeTable; + struct TrueTypeCmap; + + //------------------------------------------------------------------------ + // CFontFileTrueType + //------------------------------------------------------------------------ + + class CFontFileTrueType : public CFontFileBase + { + public: + + // Создаем объект TTF из буфера. + static CFontFileTrueType *LoadFromBuffer(char *sBuffer, int lenA); + + // Создаем объект TTF из файла. + static CFontFileTrueType *LoadFromFile(wchar_t *wsFileName); + + virtual ~CFontFileTrueType(); + + // true, если данный OpenType фонт содержите данные формата CFF. + // false,если это TrueType фонт ( или OpenType фонт с данными в формате TrueType). + bool IsOpenTypeCFF() + { + return m_bOpenTypeCFF; + } + + int GetCmapsCount(); + + int GetCmapPlatform(int nIndex); + + int GetCmapEncoding(int nIndex); + + int FindCmap(int nPlatform, int nEncoding); + + // Возвращает GID, соответствующий символу в ной CMap. + unsigned short MapCodeToGID(int nCMapIndex, int nChar); + + // Возвращает GID, соответствующий в таблице post. Возвращает 0, + // если символа с таким именем не нашли, или таблицы post нет. + int MapNameToGID(char *sName); + + // Возвращает карту CIDs в GIDs, и возваращет количество элементов + // CIDs в *. Только для CID фонтов( OpenType CFF ) + unsigned short *GetCIDToGIDMap(int *pnCIDs); + + // Лицензионные ограничения на включение фонта( в соответствие со + // спецификацией True Type): + + // * 4: таблицы OS/2 не найдена или некорректна + // * 3: разрешено устанавливать + // * 2: разрешено редактировать + // * 1: разрешено просматривать и печатать + // * 0: ограничено лицензией + int GetEmbeddingRestrictions(); + + // Convert to a Type 42 font, suitable for embedding in a PostScript + // file. will be used as the PostScript font name (so we + // don't need to depend on the 'name' table in the font). The + // array specifies the mapping from char codes to names. + // If is NULL, the encoding is unknown or undefined. The + // array specifies the mapping from char codes to GIDs. + // (Not useful for OpenType CFF fonts.) + void ToType42(char *sPSName, char **ppEncoding, unsigned short *pCodeToGID, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If is + // non-NULL, it will be used as the PostScript font name. (Only + // useful for OpenType CFF fonts.) + void ToType1(char *sPSName, char **ppNewEncoding, bool bASKII, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 2 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name (so we don't need to depend on the 'name' table in the + // font). The array maps CIDs to GIDs; it has + // entries. (Not useful for OpenType CFF fonts.) + void ToCIDType2(char *sPSName, unsigned short *pCIDMap, int nCIDCount, bool bNeedVerticalMetrics, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name. (Only useful for OpenType CFF fonts.) + void ToCIDType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name (so we don't need to depend on the 'name' + // table in the font). The array maps CIDs to GIDs; it has + // entries. (Not useful for OpenType CFF fonts.) + void ToType0(char *sPSName, unsigned short *pCIDMap, int nCIDCount, bool bNeedVerticalMetrics, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name. (Only useful for OpenType CFF fonts.) + void ToType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Write a clean TTF file, filling in missing tables and correcting + // various other errors. If is non-NULL, the font is renamed + // to . If is non-NULL, the font is re-encoded, + // using a Windows Unicode cmap. If is NULL and the font is + // complete and correct, it will be written unmodified. (Not useful + // for OpenType CFF fonts.) + void WriteTTF(FontFileOutputFunc pOutputFunc, void *pOutputStream, char *sName = NULL, unsigned short *pCodeToGID = NULL); + + private: + + CFontFileTrueType(char *sFileName, int nLen, bool bFreeFileData); + + void ConvertEncoding(char **ppEncoding, FontFileOutputFunc pOutputFunc, void *pOutputStream); + void ConvertCharStrings(char **ppEncoding, unsigned short *pnCodeToGID, FontFileOutputFunc pOutputFunc, void *pOutputStream); + void ConvertSfnts(FontFileOutputFunc pOutputFunc, void *pOutputStream, StringExt *seName, bool bNeedVerticalMetrics); + void DumpString(unsigned char *sString, int nLength, FontFileOutputFunc pOutputFunc, void *pOutputStream); + unsigned int ComputeTableChecksum(unsigned char *sData, int nLength); + void Parse(); + void ReadPostTable(); + int SeekTable(char *sTag); + + private: + + TrueTypeTable *m_pTables; + int m_nTablesCount; + TrueTypeCmap *m_pCMaps; + int m_nCMapsCount; + int m_nGlyphs; + int m_nLocaFormat; + int m_arrBBox[4]; + CHash *m_pNameToGID; + bool m_bOpenTypeCFF; + + bool m_bSuccess; + }; +} +#endif // _PDF_READER_FONT_FILE_TRUETYPE_H diff --git a/PdfReader/Src/FontFileType1.cpp b/PdfReader/Src/FontFileType1.cpp new file mode 100644 index 0000000000..91eb0eeb05 --- /dev/null +++ b/PdfReader/Src/FontFileType1.cpp @@ -0,0 +1,255 @@ +#include +#include +#include "MemoryUtils.h" +#include "FontFileEncodings.h" +#include "FontFileType1.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // CFontFileType1 + //------------------------------------------------------------------------ + + CFontFileType1 *CFontFileType1::LoadFromBuffer(char *sBuffer, int nLen) + { + return new CFontFileType1(sBuffer, nLen, false); + } + + CFontFileType1 *CFontFileType1::LoadFromFile(wchar_t *wsFileName) + { + char *sBuffer; + int nLen = 0; + + if (!(sBuffer = CFontFileBase::ReadFile(wsFileName, &nLen))) + return NULL; + + return new CFontFileType1(sBuffer, nLen, true); + } + + CFontFileType1::CFontFileType1(char *sBuffer, int nLen, bool bFreeData) : + CFontFileBase(sBuffer, nLen, bFreeData) + { + m_sName = NULL; + m_arrEncoding = NULL; + m_bParsed = false; + } + + CFontFileType1::~CFontFileType1() + { + if (m_sName) + MemUtilsFree(m_sName); + + if (m_arrEncoding && m_arrEncoding != c_arrsFontFileType1StandardEncoding) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + MemUtilsFree(m_arrEncoding[nIndex]); + } + MemUtilsFree(m_arrEncoding); + } + } + + char *CFontFileType1::GetName() + { + if (!m_bParsed) + Parse(); + + return m_sName; + } + + char **CFontFileType1::GetEncoding() + { + if (!m_bParsed) + Parse(); + + return m_arrEncoding; + } + + void CFontFileType1::WriteEncoded(char **ppNewEncoding, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + char sBuffer[512]; + char *sLine, *sLine2, *sCurChar; + + // копируем все до строчки /Encoding + for (sLine = (char *)m_sFile; sLine && strncmp(sLine, "/Encoding", 9); sLine = GetNextLine(sLine)); + if (!sLine) + { + // не нашли кодировку, тогда копируем целиком фонт файл + (*pOutputFunc)(pOutputStream, (char *)m_sFile, m_nLen); + return; + } + (*pOutputFunc)(pOutputStream, (char *)m_sFile, sLine - (char *)m_sFile); + + // пишем новую кодировку + (*pOutputFunc)(pOutputStream, "/Encoding 256 array\n", 20); + (*pOutputFunc)(pOutputStream, "0 1 255 {1 index exch /.notdef put} for\n", 40); + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (ppNewEncoding[nIndex]) + { + sprintf(sBuffer, "dup %d /%s put\n", nIndex, ppNewEncoding[nIndex]); + (*pOutputFunc)(pOutputStream, sBuffer, strlen(sBuffer)); + } + } + (*pOutputFunc)(pOutputStream, "readonly def\n", 13); + + if (!strncmp(sLine, "/Encoding StandardEncoding def", 30)) + { + sLine = GetNextLine(sLine); + } + else + { + sCurChar = sLine + 10; + sLine = NULL; + for (; sCurChar < (char *)m_sFile + m_nLen; ++sCurChar) + { + if ((*sCurChar == ' ' || *sCurChar == '\t' || *sCurChar == '\x0a' || *sCurChar == '\x0d' || *sCurChar == '\x0c' || *sCurChar == '\0') && sCurChar + 4 <= (char *)m_sFile + m_nLen && !strncmp(sCurChar + 1, "def", 3)) + { + sLine = sCurChar + 4; + break; + } + } + } + + // У некоторых фонтов две записи /Encoding, поэтому проверяем наличие второй записи + if (sLine) + { + int nIndex; + for (sLine2 = sLine, nIndex = 0; nIndex < 20 && sLine2 && strncmp(sLine2, "/Encoding", 9); sLine2 = GetNextLine(sLine2), ++nIndex); + if (nIndex < 20 && sLine2) + { + (*pOutputFunc)(pOutputStream, sLine, sLine2 - sLine); + if (!strncmp(sLine2, "/Encoding StandardEncoding def", 30)) + { + sLine = GetNextLine(sLine2); + } + else + { + sCurChar = sLine2 + 10; + sLine = NULL; + for (; sCurChar < (char *)m_sFile + m_nLen; ++sCurChar) + { + if ((*sCurChar == ' ' || *sCurChar == '\t' || *sCurChar == '\x0a' || *sCurChar == '\x0d' || *sCurChar == '\x0c' || *sCurChar == '\0') && sCurChar + 4 <= (char *)m_sFile + m_nLen && !strncmp(sCurChar + 1, "def", 3)) + { + sLine = sCurChar + 4; + break; + } + } + } + } + + // копируем все после кодировки + if (sLine) + { + (*pOutputFunc)(pOutputStream, sLine, ((char *)m_sFile + m_nLen) - sLine); + } + } + } + + char *CFontFileType1::GetNextLine(char *sLine) + { + while (sLine < (char *)m_sFile + m_nLen && *sLine != '\x0a' && *sLine != '\x0d') + ++sLine; + + if (sLine < (char *)m_sFile + m_nLen && *sLine == '\x0d') + ++sLine; + + if (sLine < (char *)m_sFile + m_nLen && *sLine == '\x0a') + ++sLine; + + if (sLine >= (char *)m_sFile + m_nLen) + return NULL; + + return sLine; + } + + void CFontFileType1::Parse() + { + char *sLine, *sLine1, *pCur, *pTemp; + char sBuffer[256]; + int nCount, nCode; + int nIndex = 0; + + for (nIndex = 1, sLine = (char *)m_sFile; nIndex <= 100 && sLine && (!m_sName || !m_arrEncoding); ++nIndex) + { + if (!m_sName && !strncmp(sLine, "/FontName", 9)) + { + strncpy(sBuffer, sLine, 255); + sBuffer[255] = '\0'; + if ((pCur = strchr(sBuffer + 9, '/')) && (pCur = strtok(pCur + 1, " \t\n\r"))) + { + m_sName = CopyString(pCur); + } + sLine = GetNextLine(sLine); + + } + else if (!m_arrEncoding && !strncmp(sLine, "/Encoding StandardEncoding def", 30)) + { + m_arrEncoding = c_arrsFontFileType1StandardEncoding; + } + else if (!m_arrEncoding && !strncmp(sLine, "/Encoding 256 array", 19)) + { + m_arrEncoding = (char **)MemUtilsMallocArray(256, sizeof(char *)); + int nJ = 0; + for (nJ = 0; nJ < 256; ++nJ) + { + m_arrEncoding[nJ] = NULL; + } + for (nJ = 0, sLine = GetNextLine(sLine); nJ < 300 && sLine && (sLine1 = GetNextLine(sLine)); ++nJ, sLine = sLine1) + { + if ((nCount = sLine1 - sLine) > 255) + { + nCount = 255; + } + strncpy(sBuffer, sLine, nCount); + sBuffer[nCount] = '\0'; + for (pCur = sBuffer; *pCur == ' ' || *pCur == '\t'; ++pCur); + if (!strncmp(pCur, "dup", 3)) + { + for (pCur += 3; *pCur == ' ' || *pCur == '\t'; ++pCur); + for (pTemp = pCur; *pTemp >= '0' && *pTemp <= '9'; ++pTemp); + if (*pTemp) + { + char nChar = *pTemp; + *pTemp = '\0'; + nCode = atoi(pCur); + *pTemp = nChar; + if (nCode == 8 && *pTemp == '#') + { + nCode = 0; + for (++pTemp; *pTemp >= '0' && *pTemp <= '7'; ++pTemp) + { + nCode = nCode * 8 + (*pTemp - '0'); + } + } + if (nCode < 256) + { + for (pCur = pTemp; *pCur == ' ' || *pCur == '\t'; ++pCur); + if (*pCur == '/') + { + ++pCur; + for (pTemp = pCur; *pTemp && *pTemp != ' ' && *pTemp != '\t'; ++pTemp); + *pTemp = '\0'; + m_arrEncoding[nCode] = CopyString(pCur); + } + } + } + } + else + { + if (strtok(sBuffer, " \t") && (pCur = strtok(NULL, " \t\n\r")) && !strcmp(pCur, "def")) + { + break; + } + } + } + } + else + { + sLine = GetNextLine(sLine); + } + } + + m_bParsed = true; + } +} \ No newline at end of file diff --git a/PdfReader/Src/FontFileType1.h b/PdfReader/Src/FontFileType1.h new file mode 100644 index 0000000000..955780ae13 --- /dev/null +++ b/PdfReader/Src/FontFileType1.h @@ -0,0 +1,42 @@ +#ifndef _PDF_READER_FONT_FILE_TYPE1_H +#define _PDF_READER_FONT_FILE_TYPE1_H + +#include "FontFileBase.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // CFontFileType1 + //------------------------------------------------------------------------ + + class CFontFileType1 : public CFontFileBase + { + public: + + static CFontFileType1 *LoadFromBuffer(char *sBuffer, int nLen); + static CFontFileType1 *LoadFromFile(wchar_t *wsFileName); + + virtual ~CFontFileType1(); + + char *GetName(); + + char **GetEncoding(); + + void WriteEncoded(char **ppNewEncoding, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + private: + + CFontFileType1(char *sBuffer, int nLen, bool bFreeData); + + char *GetNextLine(char *sLine); + void Parse(); + + private: + + char *m_sName; + char **m_arrEncoding; + bool m_bParsed; + }; +} + +#endif // _PDF_READER_FONT_FILE_TYPE1_H diff --git a/PdfReader/Src/FontFileType1C.cpp b/PdfReader/Src/FontFileType1C.cpp new file mode 100644 index 0000000000..f577e76c27 --- /dev/null +++ b/PdfReader/Src/FontFileType1C.cpp @@ -0,0 +1,2896 @@ +#include +#include +#include +#include "MemoryUtils.h" +#include "StringExt.h" +#include "FontFileEncodings.h" +#include "FontFileType1C.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + + static char c_sHexChars[17] = "0123456789ABCDEF"; + + //------------------------------------------------------------------------ + // CFontFileType1C + //------------------------------------------------------------------------ + + CFontFileType1C *CFontFileType1C::LoadFromBuffer(char *sBuffer, int nLen) + { + CFontFileType1C *pT1CFF = new CFontFileType1C(sBuffer, nLen, false); + if (!pT1CFF->Parse()) + { + delete pT1CFF; + return NULL; + } + return pT1CFF; + } + + CFontFileType1C *CFontFileType1C::LoadFromFile(wchar_t *wsFileName) + { + char *sBuffer; + int nLen = 0; + + if (!(sBuffer = CFontFileBase::ReadFile(wsFileName, &nLen))) + return NULL; + + CFontFileType1C *pT1CFF = new CFontFileType1C(sBuffer, nLen, true); + + if (!pT1CFF->Parse()) + { + delete pT1CFF; + return NULL; + } + return pT1CFF; + } + + CFontFileType1C::CFontFileType1C(char *sBuffer, int nLen, bool bFreeData) : + CFontFileBase(sBuffer, nLen, bFreeData) + { + m_seName = NULL; + m_arrEncoding = NULL; + m_pPrivateDicts = NULL; + m_pnFDSelect = NULL; + m_pnCharset = NULL; + } + + CFontFileType1C::~CFontFileType1C() + { + if (m_seName) + delete m_seName; + + if (m_arrEncoding && m_arrEncoding != c_arrsFontFileType1StandardEncoding && m_arrEncoding != c_arrsFontFileType1ExpertEncoding) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + MemUtilsFree(m_arrEncoding[nIndex]); + } + MemUtilsFree(m_arrEncoding); + } + + if (m_pPrivateDicts) + { + MemUtilsFree(m_pPrivateDicts); + } + if (m_pnFDSelect) + { + MemUtilsFree(m_pnFDSelect); + } + + if (m_pnCharset && m_pnCharset != c_arrnFontFileType1CISOAdobeCharset && m_pnCharset != c_arrnFontFileType1CExpertCharset && m_pnCharset != c_arrnFontFileType1CExpertSubsetCharset) + { + MemUtilsFree(m_pnCharset); + } + } + + char *CFontFileType1C::GetName() + { + return m_seName ? m_seName->GetBuffer() : (char *)NULL; + } + + char **CFontFileType1C::GetEncoding() + { + return m_arrEncoding; + } + + unsigned short *CFontFileType1C::GetCIDToGIDMap(int *arrCIDs) + { + if (m_oTopDict.nFirstOperator != 0x0c1e) + { + *arrCIDs = 0; + return NULL; + } + + int nCount = 0; + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + if (m_pnCharset[nIndex] > nCount) + { + nCount = m_pnCharset[nIndex]; + } + } + ++nCount; + unsigned short *pMap = (unsigned short *)MemUtilsMallocArray(nCount, sizeof(unsigned short)); + memset(pMap, 0, nCount * sizeof(unsigned short)); + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + pMap[m_pnCharset[nIndex]] = nIndex; + } + *arrCIDs = nCount; + return pMap; + } + + void CFontFileType1C::ToType1(char *sPSName, char **ppNewEncoding, bool bASKII, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + int nPSNameLen; + StringExt *seBuffer; + char sBuf[256]; + + if (sPSName) + { + nPSNameLen = strlen(sPSName); + } + else + { + sPSName = m_seName->GetBuffer(); + nPSNameLen = m_seName->GetLength(); + } + + bool bSuccess = true; + (*pOutputFunc)(pOutputStream, "%!FontType1-1.0: ", 17); + (*pOutputFunc)(pOutputStream, sPSName, nPSNameLen); + if (m_oTopDict.nVersionSID != 0) + { + GetString(m_oTopDict.nVersionSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + } + (*pOutputFunc)(pOutputStream, "\n", 1); + // Для словаря нужно место для 12 полей: следующие 9 + + // Private и CharStrings (в eexec секции) и FID. + (*pOutputFunc)(pOutputStream, "12 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontInfo 10 dict dup begin\n", 28); + if (m_oTopDict.nVersionSID != 0) + { + (*pOutputFunc)(pOutputStream, "/version (", 10); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nNoticeSID != 0) + { + GetString(m_oTopDict.nNoticeSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, "/Notice (", 9); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nCopyrightSID != 0) + { + GetString(m_oTopDict.nCopyrightSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, "/Copyright (", 12); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nFullNameSID != 0) + { + GetString(m_oTopDict.nFullNameSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, "/FullName (", 11); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nFamilyNameSID != 0) + { + GetString(m_oTopDict.nFamilyNameSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, "/FamilyName (", 13); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nWeightSID != 0) + { + GetString(m_oTopDict.nWeightSID, sBuf, &bSuccess); + (*pOutputFunc)(pOutputStream, "/Weight (", 9); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") readonly def\n", 15); + } + if (m_oTopDict.nIsFixedPitch) + { + (*pOutputFunc)(pOutputStream, "/isFixedPitch true def\n", 23); + } + else + { + (*pOutputFunc)(pOutputStream, "/isFixedPitch false def\n", 24); + } + + seBuffer = StringExt::Format("/ItalicAngle {0:.4g} def\n", m_oTopDict.dItalicAngle); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/UnderlinePosition {0:.4g} def\n", m_oTopDict.dUnderlinePosition); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/UnderlineThickness {0:.4g} def\n", m_oTopDict.dUnderlineThickness); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "end readonly def\n", 17); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, nPSNameLen); + (*pOutputFunc)(pOutputStream, " def\n", 5); + + seBuffer = StringExt::Format("/PaintType {0:d} def\n", m_oTopDict.nPaintType); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/FontType 1 def\n", 16); + seBuffer = StringExt::Format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n", m_oTopDict.arrdFontMatrix[0], m_oTopDict.arrdFontMatrix[1], m_oTopDict.arrdFontMatrix[2], m_oTopDict.arrdFontMatrix[3], m_oTopDict.arrdFontMatrix[4], m_oTopDict.arrdFontMatrix[5]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n", m_oTopDict.arrdFontBBox[0], m_oTopDict.arrdFontBBox[1], m_oTopDict.arrdFontBBox[2], m_oTopDict.arrdFontBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/StrokeWidth {0:.4g} def\n", m_oTopDict.dStrokeWidth); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + if (m_oTopDict.nUniqueID != 0) + { + seBuffer = StringExt::Format("/UniqueID {0:d} def\n", m_oTopDict.nUniqueID); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + + // Запись кодировки + (*pOutputFunc)(pOutputStream, "/Encoding ", 10); + if (!ppNewEncoding && m_arrEncoding == c_arrsFontFileType1ExpertEncoding) + { + (*pOutputFunc)(pOutputStream, "StandardEncoding def\n", 21); + } + else + { + (*pOutputFunc)(pOutputStream, "256 array\n", 10); + (*pOutputFunc)(pOutputStream, "0 1 255 {1 index exch /.notdef put} for\n", 40); + char **ppEnc = ppNewEncoding ? ppNewEncoding : m_arrEncoding; + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (ppEnc[nIndex]) + { + seBuffer = StringExt::Format("dup {0:d} /{1:s} put\n", nIndex, ppEnc[nIndex]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + } + (*pOutputFunc)(pOutputStream, "readonly def\n", 13); + } + (*pOutputFunc)(pOutputStream, "currentdict end\n", 16); + + // Бинарная секция (eexec) + Type1CEexecBuf oEexecBuffer; + (*pOutputFunc)(pOutputStream, "currentfile eexec\n", 18); + oEexecBuffer.pOutputFunc = pOutputFunc; + oEexecBuffer.pOutputStream = pOutputStream; + oEexecBuffer.bASKII = bASKII; + oEexecBuffer.unEncryptionKey = 55665; + oEexecBuffer.nLine = 0; + + // Private Dictionary + EexecWrite(&oEexecBuffer, "\x83\xca\x73\xd5"); + EexecWrite(&oEexecBuffer, "dup /Private 32 dict dup begin\n"); + EexecWrite(&oEexecBuffer, "/RD {string currentfile exch readstring pop} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/ND {noaccess def} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/NP {noaccess put} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/MinFeature {16 16} def\n"); + EexecWrite(&oEexecBuffer, "/password 5839 def\n"); + + if (m_pPrivateDicts[0].nBlueValues) + { + EexecWrite(&oEexecBuffer, "/BlueValues ["); + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nBlueValues; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:d}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrnBlueValues[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[0].nOtherBlues) + { + EexecWrite(&oEexecBuffer, "/OtherBlues ["); + + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nOtherBlues; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:d}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrnOtherBlues[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[0].nFamilyBlues) + { + EexecWrite(&oEexecBuffer, "/FamilyBlues ["); + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nFamilyBlues; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:d}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrnFamilyBlues[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + + if (m_pPrivateDicts[0].nFamilyOtherBlues) + { + EexecWrite(&oEexecBuffer, "/FamilyOtherBlues ["); + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nFamilyOtherBlues; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:d}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrnFamilyOtherBlues[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[0].dBlueScale != 0.039625) + { + seBuffer = StringExt::Format("/BlueScale {0:.4g} def\n", m_pPrivateDicts[0].dBlueScale); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].nBlueShift != 7) + { + seBuffer = StringExt::Format("/BlueShift {0:d} def\n", m_pPrivateDicts[0].nBlueShift); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].nBlueFuzz != 1) + { + seBuffer = StringExt::Format("/BlueFuzz {0:d} def\n", m_pPrivateDicts[0].nBlueFuzz); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].bHasStdHW) + { + seBuffer = StringExt::Format("/StdHW [{0:.4g}] def\n", m_pPrivateDicts[0].dStdHW); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].bHasStdVW) + { + seBuffer = StringExt::Format("/StdVW [{0:.4g}] def\n", m_pPrivateDicts[0].dStdVW); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].nStemSnapH) + { + EexecWrite(&oEexecBuffer, "/StemSnapH ["); + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nStemSnapH; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrdStemSnapH[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[0].nStemSnapV) + { + EexecWrite(&oEexecBuffer, "/StemSnapV ["); + for (int nIndex = 0; nIndex < m_pPrivateDicts[0].nStemSnapV; ++nIndex) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", nIndex > 0 ? " " : "", m_pPrivateDicts[0].arrdStemSnapV[nIndex]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[0].bHasForceBold) + { + seBuffer = StringExt::Format("/ForceBold {0:s} def\n", m_pPrivateDicts[0].bForceBold ? "true" : "false"); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].dForceBoldThreshold != 0) + { + seBuffer = StringExt::Format("/ForceBoldThreshold {0:.4g} def\n", m_pPrivateDicts[0].dForceBoldThreshold); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].nLanguageGroup != 0) + { + seBuffer = StringExt::Format("/LanguageGroup {0:d} def\n", m_pPrivateDicts[0].nLanguageGroup); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[0].dExpansionFactor != 0.06) + { + seBuffer = StringExt::Format("/ExpansionFactor {0:.4g} def\n", m_pPrivateDicts[0].dExpansionFactor); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + + bSuccess = true; + Type1CIndex oSubrIndex; + GetIndex(m_pPrivateDicts[0].nSubrsOffset, &oSubrIndex, &bSuccess); + if (!bSuccess) + { + oSubrIndex.nPos = -1; + } + + // CharStrings + seBuffer = StringExt::Format("2 index /CharStrings {0:d} dict dup begin\n", m_nGlyphsCount); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + Type1CIndexVal oIndexVal; + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + bSuccess = true; + GetIndexVal(&m_oCharStringsIndex, nIndex, &oIndexVal, &bSuccess); + if (bSuccess) + { + GetString(m_pnCharset[nIndex], sBuf, &bSuccess); + if (bSuccess) + { + EexecConvertGlyph(&oEexecBuffer, sBuf, oIndexVal.nPos, oIndexVal.nLen, &oSubrIndex, &m_pPrivateDicts[0]); + } + } + } + EexecWrite(&oEexecBuffer, "end\n"); + EexecWrite(&oEexecBuffer, "end\n"); + EexecWrite(&oEexecBuffer, "readonly put\n"); + EexecWrite(&oEexecBuffer, "noaccess put\n"); + EexecWrite(&oEexecBuffer, "dup /FontName get exch definefont pop\n"); + EexecWrite(&oEexecBuffer, "mark currentfile closefile\n"); + + // Trailer + if (bASKII && oEexecBuffer.nLine > 0) + { + (*pOutputFunc)(pOutputStream, "\n", 1); + } + for (int nIndex = 0; nIndex < 8; ++nIndex) + { + (*pOutputFunc)(pOutputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*pOutputFunc)(pOutputStream, "cleartomark\n", 12); + } + + void CFontFileType1C::ToCIDType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + StringExt *charStrings; + int *charStringOffsets; + StringExt *seBuffer; + char sBuf[256]; + bool bSuccess = true; + int nGID = 0, i, j, k; + + // Вычислим количество CID и построим отображение CID->GID + int nCIDsCount = 0; + for (i = 0; i < m_nGlyphsCount; ++i) + { + if (m_pnCharset[i] >= nCIDsCount) + { + nCIDsCount = m_pnCharset[i] + 1; + } + } + int *arrCIDdMap = (int *)MemUtilsMallocArray(nCIDsCount, sizeof(int)); + for (i = 0; i < nCIDsCount; ++i) + { + arrCIDdMap[i] = -1; + } + for (i = 0; i < m_nGlyphsCount; ++i) + { + arrCIDdMap[m_pnCharset[i]] = i; + } + + // Build Charstrings + charStrings = new StringExt(); + charStringOffsets = (int *)MemUtilsMallocArray(nCIDsCount + 1, sizeof(int)); + for (i = 0; i < nCIDsCount; ++i) + { + charStringOffsets[i] = charStrings->GetLength(); + if ((nGID = arrCIDdMap[i]) >= 0) + { + Type1CIndexVal oIndexVal; + bSuccess = true; + GetIndexVal(&m_oCharStringsIndex, nGID, &oIndexVal, &bSuccess); + if (bSuccess) + { + Type1CIndex oSubrIndex; + GetIndex(m_pPrivateDicts[m_pnFDSelect[nGID]].nSubrsOffset, &oSubrIndex, &bSuccess); + if (!bSuccess) + { + oSubrIndex.nPos = -1; + } + ConvertGlyph(oIndexVal.nPos, oIndexVal.nLen, charStrings, &oSubrIndex, &m_pPrivateDicts[m_pnFDSelect[nGID]], true); + } + } + } + charStringOffsets[nCIDsCount] = charStrings->GetLength(); + + // Вычислим nNeedBytes = количество байт, необходимых для charstring offsets + int nNeedBytes = 0; + i = (nCIDsCount + 1) * 5 + charStrings->GetLength(); + if (i < 0x100) + { + nNeedBytes = 1; + } + else if (i < 0x10000) + { + nNeedBytes = 2; + } + else if (i < 0x1000000) + { + nNeedBytes = 3; + } + else + { + nNeedBytes = 4; + } + + // Начинаем запись Font Dictionary + (*pOutputFunc)(pOutputStream, "/CIDInit /ProcSet findresource begin\n", 37); + (*pOutputFunc)(pOutputStream, "20 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/CIDFontName /", 14); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, " def\n", 5); + (*pOutputFunc)(pOutputStream, "/CIDFontType 0 def\n", 19); + (*pOutputFunc)(pOutputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + + if (m_oTopDict.nRegistrySID > 0 && m_oTopDict.nOrderingSID > 0) + { + bSuccess = true; + GetString(m_oTopDict.nRegistrySID, sBuf, &bSuccess); + if (bSuccess) + { + (*pOutputFunc)(pOutputStream, " /Registry (", 13); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") def\n", 6); + } + bSuccess = true; + GetString(m_oTopDict.nOrderingSID, sBuf, &bSuccess); + if (bSuccess) + { + (*pOutputFunc)(pOutputStream, " /Ordering (", 13); + (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); + (*pOutputFunc)(pOutputStream, ") def\n", 6); + } + } + else + { + (*pOutputFunc)(pOutputStream, " /Registry (Adobe) def\n", 24); + (*pOutputFunc)(pOutputStream, " /Ordering (Identity) def\n", 27); + } + seBuffer = StringExt::Format(" /Supplement {0:d} def\n", m_oTopDict.nSupplement); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "end def\n", 8); + + if (m_oTopDict.bHasFontMatrix) + { + seBuffer = StringExt::Format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", m_oTopDict.arrdFontMatrix[0], m_oTopDict.arrdFontMatrix[1], m_oTopDict.arrdFontMatrix[2], m_oTopDict.arrdFontMatrix[3], m_oTopDict.arrdFontMatrix[4], m_oTopDict.arrdFontMatrix[5]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + else if (m_pPrivateDicts[0].bHasFontMatrix) + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + else + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + seBuffer = StringExt::Format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", m_oTopDict.arrdFontBBox[0], m_oTopDict.arrdFontBBox[1], m_oTopDict.arrdFontBBox[2], m_oTopDict.arrdFontBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/FontInfo 1 dict dup begin\n", 27); + (*pOutputFunc)(pOutputStream, " /FSType 8 def\n", 16); + (*pOutputFunc)(pOutputStream, "end def\n", 8); + + // CIDFont-specific + seBuffer = StringExt::Format("/CIDCount {0:d} def\n", nCIDsCount); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/FDBytes 1 def\n", 15); + seBuffer = StringExt::Format("/GDBytes {0:d} def\n", nNeedBytes); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/CIDMapOffset 0 def\n", 20); + + if (m_oTopDict.nPaintType != 0) + { + seBuffer = StringExt::Format("/PaintType {0:d} def\n", m_oTopDict.nPaintType); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/StrokeWidth {0:.4g} def\n", m_oTopDict.dStrokeWidth); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + + // FDArray + seBuffer = StringExt::Format("/FDArray {0:d} array\n", m_nFDsCount); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + for (i = 0; i < m_nFDsCount; ++i) + { + seBuffer = StringExt::Format("dup {0:d} 10 dict begin\n", i); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/FontType 1 def\n", 16); + + if (m_pPrivateDicts[i].bHasFontMatrix) + { + seBuffer = StringExt::Format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", m_pPrivateDicts[i].arrdFontMatrix[0], m_pPrivateDicts[i].arrdFontMatrix[1], m_pPrivateDicts[i].arrdFontMatrix[2], m_pPrivateDicts[i].arrdFontMatrix[3], m_pPrivateDicts[i].arrdFontMatrix[4], m_pPrivateDicts[i].arrdFontMatrix[5]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + else + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + seBuffer = StringExt::Format("/PaintType {0:d} def\n", m_oTopDict.nPaintType); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/Private 32 dict begin\n", 23); + if (m_pPrivateDicts[i].nBlueValues) + { + (*pOutputFunc)(pOutputStream, "/BlueValues [", 13); + for (j = 0; j < m_pPrivateDicts[i].nBlueValues; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:d}", j > 0 ? " " : "", m_pPrivateDicts[i].arrnBlueValues[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].nOtherBlues) + { + (*pOutputFunc)(pOutputStream, "/OtherBlues [", 13); + for (j = 0; j < m_pPrivateDicts[i].nOtherBlues; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:d}", j > 0 ? " " : "", m_pPrivateDicts[i].arrnOtherBlues[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].nFamilyBlues) + { + (*pOutputFunc)(pOutputStream, "/FamilyBlues [", 14); + for (j = 0; j < m_pPrivateDicts[i].nFamilyBlues; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:d}", j > 0 ? " " : "", m_pPrivateDicts[i].arrnFamilyBlues[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].nFamilyOtherBlues) + { + (*pOutputFunc)(pOutputStream, "/FamilyOtherBlues [", 19); + for (j = 0; j < m_pPrivateDicts[i].nFamilyOtherBlues; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:d}", j > 0 ? " " : "", m_pPrivateDicts[i].arrnFamilyOtherBlues[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].dBlueScale != 0.039625) + { + seBuffer = StringExt::Format("/BlueScale {0:.4g} def\n", m_pPrivateDicts[i].dBlueScale); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].nBlueShift != 7) + { + seBuffer = StringExt::Format("/BlueShift {0:d} def\n", m_pPrivateDicts[i].nBlueShift); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].nBlueFuzz != 1) + { + seBuffer = StringExt::Format("/BlueFuzz {0:d} def\n", m_pPrivateDicts[i].nBlueFuzz); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].bHasStdHW) + { + seBuffer = StringExt::Format("/StdHW [{0:.4g}] def\n", m_pPrivateDicts[i].dStdHW); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].bHasStdVW) + { + seBuffer = StringExt::Format("/StdVW [{0:.4g}] def\n", m_pPrivateDicts[i].dStdVW); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].nStemSnapH) + { + (*pOutputFunc)(pOutputStream, "/StemSnapH [", 12); + for (j = 0; j < m_pPrivateDicts[i].nStemSnapH; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", j > 0 ? " " : "", m_pPrivateDicts[i].arrdStemSnapH[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].nStemSnapV) + { + (*pOutputFunc)(pOutputStream, "/StemSnapV [", 12); + for (j = 0; j < m_pPrivateDicts[i].nStemSnapV; ++j) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", j > 0 ? " " : "", m_pPrivateDicts[i].arrdStemSnapV[j]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "] def\n", 6); + } + if (m_pPrivateDicts[i].bHasForceBold) + { + seBuffer = StringExt::Format("/ForceBold {0:s} def\n", m_pPrivateDicts[i].bForceBold ? "true" : "false"); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].dForceBoldThreshold != 0) + { + seBuffer = StringExt::Format("/ForceBoldThreshold {0:.4g} def\n", m_pPrivateDicts[i].dForceBoldThreshold); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].nLanguageGroup != 0) + { + seBuffer = StringExt::Format("/LanguageGroup {0:d} def\n", m_pPrivateDicts[i].nLanguageGroup); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (m_pPrivateDicts[i].dExpansionFactor != 0.06) + { + seBuffer = StringExt::Format("/ExpansionFactor {0:.4g} def\n", m_pPrivateDicts[i].dExpansionFactor); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "currentdict end def\n", 20); + (*pOutputFunc)(pOutputStream, "currentdict end put\n", 20); + } + (*pOutputFunc)(pOutputStream, "def\n", 4); + + // Binary section + int nOffset = (nCIDsCount + 1) * (1 + nNeedBytes); + seBuffer = StringExt::Format("(Hex) {0:d} StartData\n", nOffset + charStrings->GetLength()); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + int nLen = 0; + + // write the charstring offset (CIDMap) table + for (i = 0; i <= nCIDsCount; i += 6) + { + for (j = 0; j < 6 && i + j <= nCIDsCount; ++j) + { + if (i + j < nCIDsCount && arrCIDdMap[i + j] >= 0) + { + sBuf[0] = (char)m_pnFDSelect[arrCIDdMap[i + j]]; + } + else + { + sBuf[0] = (char)0; + } + nLen = nOffset + charStringOffsets[i + j]; + for (k = nNeedBytes; k >= 1; --k) + { + sBuf[k] = (char)(nLen & 0xff); + nLen >>= 8; + } + for (k = 0; k <= nNeedBytes; ++k) + { + seBuffer = StringExt::Format("{0:02x}", sBuf[k] & 0xff); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + } + (*pOutputFunc)(pOutputStream, "\n", 1); + } + + // Charstring + nLen = charStrings->GetLength(); + for (i = 0; i < nLen; i += 32) + { + for (j = 0; j < 32 && i + j < nLen; ++j) + { + seBuffer = StringExt::Format("{0:02x}", charStrings->GetAt(i + j) & 0xff); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (i + 32 >= nLen) + { + (*pOutputFunc)(pOutputStream, ">", 1); + } + (*pOutputFunc)(pOutputStream, "\n", 1); + } + + MemUtilsFree(charStringOffsets); + delete charStrings; + MemUtilsFree(arrCIDdMap); + } + + void CFontFileType1C::ToType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream) + { + StringExt *seBuffer; + bool bSuccess = true; + int i, j, k; + + int nCurFD = 0; + + // Вычислим количество CID и построим отображение CID->GID + int nCIDsCount = 0; + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + if (m_pnCharset[nIndex] >= nCIDsCount) + { + nCIDsCount = m_pnCharset[nIndex] + 1; + } + } + int *arrCIDMap = (int *)MemUtilsMallocArray(nCIDsCount, sizeof(int)); + for (int nIndex = 0; nIndex < nCIDsCount; ++nIndex) + { + arrCIDMap[nIndex] = -1; + } + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + arrCIDMap[m_pnCharset[nIndex]] = nIndex; + } + + // Запись Type 1 фонта + for (i = 0; i < nCIDsCount; i += 256) + { + // Игнорируем CID = 0, т.е. ".notdef" + nCurFD = 0; + for (j = ((i == 0) ? 1 : 0); j < 256 && i + j < nCIDsCount; ++j) + { + if (arrCIDMap[i + j] >= 0) + { + nCurFD = m_pnFDSelect[arrCIDMap[i + j]]; + break; + } + } + + // Font Dictionary (незашифрованная часть) + (*pOutputFunc)(pOutputStream, "16 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + + seBuffer = StringExt::Format("_{0:02x} def\n", i >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + (*pOutputFunc)(pOutputStream, "/FontType 1 def\n", 16); + if (m_pPrivateDicts[nCurFD].bHasFontMatrix) + { + seBuffer = StringExt::Format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", m_pPrivateDicts[nCurFD].arrdFontMatrix[0], m_pPrivateDicts[nCurFD].arrdFontMatrix[1], m_pPrivateDicts[nCurFD].arrdFontMatrix[2], m_pPrivateDicts[nCurFD].arrdFontMatrix[3], m_pPrivateDicts[nCurFD].arrdFontMatrix[4], m_pPrivateDicts[nCurFD].arrdFontMatrix[5]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + else if (m_oTopDict.bHasFontMatrix) + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + else + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + seBuffer = StringExt::Format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", m_oTopDict.arrdFontBBox[0], m_oTopDict.arrdFontBBox[1], m_oTopDict.arrdFontBBox[2], m_oTopDict.arrdFontBBox[3]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + seBuffer = StringExt::Format("/PaintType {0:d} def\n", m_oTopDict.nPaintType); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + + if (m_oTopDict.nPaintType != 0) + { + seBuffer = StringExt::Format("/StrokeWidth {0:.4g} def\n", m_oTopDict.dStrokeWidth); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "/Encoding 256 array\n", 20); + for (j = 0; j < 256 && i + j < nCIDsCount; ++j) + { + seBuffer = StringExt::Format("dup {0:d} /c{1:02x} put\n", j, j); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + if (j < 256) + { + seBuffer = StringExt::Format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", j); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + (*pOutputFunc)(pOutputStream, "readonly def\n", 13); + (*pOutputFunc)(pOutputStream, "currentdict end\n", 16); + + // start the binary section + Type1CEexecBuf oEexecBuffer; + (*pOutputFunc)(pOutputStream, "currentfile eexec\n", 18); + oEexecBuffer.pOutputFunc = pOutputFunc; + oEexecBuffer.pOutputStream = pOutputStream; + oEexecBuffer.bASKII = true; + oEexecBuffer.unEncryptionKey = 55665; + oEexecBuffer.nLine = 0; + + // start the private dictionary + EexecWrite(&oEexecBuffer, "\x83\xca\x73\xd5"); + EexecWrite(&oEexecBuffer, "dup /Private 32 dict dup begin\n"); + EexecWrite(&oEexecBuffer, "/RD {string currentfile exch readstring pop} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/ND {noaccess def} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/NP {noaccess put} executeonly def\n"); + EexecWrite(&oEexecBuffer, "/MinFeature {16 16} def\n"); + EexecWrite(&oEexecBuffer, "/password 5839 def\n"); + if (m_pPrivateDicts[nCurFD].nBlueValues) + { + EexecWrite(&oEexecBuffer, "/BlueValues ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nBlueValues; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:d}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrnBlueValues[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].nOtherBlues) + { + EexecWrite(&oEexecBuffer, "/OtherBlues ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nOtherBlues; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:d}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrnOtherBlues[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].nFamilyBlues) + { + EexecWrite(&oEexecBuffer, "/FamilyBlues ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nFamilyBlues; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:d}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrnFamilyBlues[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].nFamilyOtherBlues) + { + EexecWrite(&oEexecBuffer, "/FamilyOtherBlues ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nFamilyOtherBlues; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:d}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrnFamilyOtherBlues[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].dBlueScale != 0.039625) + { + seBuffer = StringExt::Format("/BlueScale {0:.4g} def\n", m_pPrivateDicts[nCurFD].dBlueScale); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].nBlueShift != 7) + { + seBuffer = StringExt::Format("/BlueShift {0:d} def\n", m_pPrivateDicts[nCurFD].nBlueShift); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].nBlueFuzz != 1) + { + seBuffer = StringExt::Format("/BlueFuzz {0:d} def\n", m_pPrivateDicts[nCurFD].nBlueFuzz); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].bHasStdHW) + { + seBuffer = StringExt::Format("/StdHW [{0:.4g}] def\n", m_pPrivateDicts[nCurFD].dStdHW); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].bHasStdVW) + { + seBuffer = StringExt::Format("/StdVW [{0:.4g}] def\n", m_pPrivateDicts[nCurFD].dStdVW); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].nStemSnapH) + { + EexecWrite(&oEexecBuffer, "/StemSnapH ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nStemSnapH; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrdStemSnapH[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].nStemSnapV) + { + EexecWrite(&oEexecBuffer, "/StemSnapV ["); + for (k = 0; k < m_pPrivateDicts[nCurFD].nStemSnapV; ++k) + { + seBuffer = StringExt::Format("{0:s}{1:.4g}", k > 0 ? " " : "", m_pPrivateDicts[nCurFD].arrdStemSnapV[k]); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + EexecWrite(&oEexecBuffer, "] def\n"); + } + if (m_pPrivateDicts[nCurFD].bHasForceBold) + { + seBuffer = StringExt::Format("/ForceBold {0:s} def\n", m_pPrivateDicts[nCurFD].bForceBold ? "true" : "false"); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].dForceBoldThreshold != 0) + { + seBuffer = StringExt::Format("/ForceBoldThreshold {0:.4g} def\n", m_pPrivateDicts[nCurFD].dForceBoldThreshold); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].nLanguageGroup != 0) + { + seBuffer = StringExt::Format("/LanguageGroup {0:d} def\n", m_pPrivateDicts[nCurFD].nLanguageGroup); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + if (m_pPrivateDicts[nCurFD].dExpansionFactor != 0.06) + { + seBuffer = StringExt::Format("/ExpansionFactor {0:.4g} def\n", m_pPrivateDicts[nCurFD].dExpansionFactor); + EexecWrite(&oEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + } + + bSuccess = true; + Type1CIndex oSubrIndex; + GetIndex(m_pPrivateDicts[nCurFD].nSubrsOffset, &oSubrIndex, &bSuccess); + if (!bSuccess) + { + oSubrIndex.nPos = -1; + } + + // CharStrings + EexecWrite(&oEexecBuffer, "2 index /CharStrings 256 dict dup begin\n"); + + // .notdef CharString + Type1CIndexVal oIndexVal; + bSuccess = true; + GetIndexVal(&m_oCharStringsIndex, 0, &oIndexVal, &bSuccess); + if (bSuccess) + { + EexecConvertGlyph(&oEexecBuffer, ".notdef", oIndexVal.nPos, oIndexVal.nLen, &oSubrIndex, &m_pPrivateDicts[nCurFD]); + } + + // CharStrings + for (j = 0; j < 256 && i + j < nCIDsCount; ++j) + { + if (arrCIDMap[i + j] >= 0) + { + bSuccess = true; + GetIndexVal(&m_oCharStringsIndex, arrCIDMap[i + j], &oIndexVal, &bSuccess); + if (bSuccess) + { + seBuffer = StringExt::Format("c{0:02x}", j); + EexecConvertGlyph(&oEexecBuffer, seBuffer->GetBuffer(), oIndexVal.nPos, oIndexVal.nLen, &oSubrIndex, &m_pPrivateDicts[nCurFD]); + delete seBuffer; + } + } + } + EexecWrite(&oEexecBuffer, "end\n"); + EexecWrite(&oEexecBuffer, "end\n"); + EexecWrite(&oEexecBuffer, "readonly put\n"); + EexecWrite(&oEexecBuffer, "noaccess put\n"); + EexecWrite(&oEexecBuffer, "dup /FontName get exch definefont pop\n"); + EexecWrite(&oEexecBuffer, "mark currentfile closefile\n"); + + // trailer + if (oEexecBuffer.nLine > 0) + { + (*pOutputFunc)(pOutputStream, "\n", 1); + } + for (j = 0; j < 8; ++j) + { + (*pOutputFunc)(pOutputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*pOutputFunc)(pOutputStream, "cleartomark\n", 12); + } + + // write the Type 0 parent font + (*pOutputFunc)(pOutputStream, "16 dict begin\n", 14); + (*pOutputFunc)(pOutputStream, "/FontName /", 11); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + (*pOutputFunc)(pOutputStream, " def\n", 5); + (*pOutputFunc)(pOutputStream, "/FontType 0 def\n", 16); + if (m_oTopDict.bHasFontMatrix) + { + seBuffer = StringExt::Format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", m_oTopDict.arrdFontMatrix[0], m_oTopDict.arrdFontMatrix[1], m_oTopDict.arrdFontMatrix[2], m_oTopDict.arrdFontMatrix[3], m_oTopDict.arrdFontMatrix[4], m_oTopDict.arrdFontMatrix[5]); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + else + { + (*pOutputFunc)(pOutputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + (*pOutputFunc)(pOutputStream, "/FMapType 2 def\n", 16); + (*pOutputFunc)(pOutputStream, "/Encoding [\n", 12); + + for (i = 0; i < nCIDsCount; i += 256) + { + seBuffer = StringExt::Format("{0:d}\n", i >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + + (*pOutputFunc)(pOutputStream, "] def\n", 6); + (*pOutputFunc)(pOutputStream, "/FDepVector [\n", 14); + + for (i = 0; i < nCIDsCount; i += 256) + { + (*pOutputFunc)(pOutputStream, "/", 1); + (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); + seBuffer = StringExt::Format("_{0:02x} findfont\n", i >> 8); + (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); + delete seBuffer; + } + + (*pOutputFunc)(pOutputStream, "] def\n", 6); + (*pOutputFunc)(pOutputStream, "FontName currentdict end definefont pop\n", 40); + + MemUtilsFree(arrCIDMap); + } + + void CFontFileType1C::EexecConvertGlyph(Type1CEexecBuf *pEexecBuffer, char *sGlyphName, int nOffset, int nBytes, Type1CIndex *pSubrIndex, Type1CPrivateDict *pDict) + { + StringExt *seCharBuffer = new StringExt(); + ConvertGlyph(nOffset, nBytes, seCharBuffer, pSubrIndex, pDict, true); + + StringExt *seBuffer = StringExt::Format("/{0:s} {1:d} RD ", sGlyphName, seCharBuffer->GetLength()); + EexecWrite(pEexecBuffer, seBuffer->GetBuffer()); + delete seBuffer; + EexecWriteCharString(pEexecBuffer, (unsigned char *)seCharBuffer->GetBuffer(), seCharBuffer->GetLength()); + EexecWrite(pEexecBuffer, " ND\n"); + + delete seCharBuffer; + } + + void CFontFileType1C::ConvertGlyph(int nOffset, int nBytes, StringExt *seCharBuffer, Type1CIndex *pSubrIndex, Type1CPrivateDict *pDict, bool bTop) + { + Type1CIndexVal oIndexVal; + double dTemp = 0, dX = 0, dY = 0; + unsigned char unByte = 0; + int nSubrBias = 0, k = 0; + bool bDouble = false; + + int nStart = seCharBuffer->GetLength(); + + if (bTop) + { + seCharBuffer->Append((char)73); + seCharBuffer->Append((char)58); + seCharBuffer->Append((char)147); + seCharBuffer->Append((char)134); + m_nOperatorsCount = 0; + m_nHints = 0; + m_bFirstOperator = true; + m_bOpenPath = false; + } + + int nPos = nOffset; + while (nPos < nOffset + nBytes) + { + bool bSuccess = true; + nPos = GetOperator(nPos, true, &bSuccess); + if (!bSuccess) + break; + + if (!m_arrOperators[m_nOperatorsCount - 1].bIsNumber) + { + --m_nOperatorsCount; + switch (m_arrOperators[m_nOperatorsCount].nOperator) + { + case 0x0001: // hstem + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hstem" + } + dTemp = 0; + bDouble = false; + for (k = 0; k < m_nOperatorsCount; k += 2) + { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (m_arrOperators[k + 1].dNumber < 0) + { + dTemp += m_arrOperators[k].dNumber + m_arrOperators[k + 1].dNumber; + bDouble |= m_arrOperators[k].bIsFloat | m_arrOperators[k + 1].bIsFloat; + ConvertNum(dTemp, bDouble, seCharBuffer); + ConvertNum(-m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + } + else + { + dTemp += m_arrOperators[k].dNumber; + bDouble |= m_arrOperators[k].bIsFloat; + ConvertNum(dTemp, bDouble, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + dTemp += m_arrOperators[k + 1].dNumber; + bDouble |= m_arrOperators[k + 1].bIsFloat; + } + seCharBuffer->Append((char)1); + } + m_nHints += m_nOperatorsCount / 2; + m_nOperatorsCount = 0; + break; + case 0x0003: // vstem + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 vstem" + } + dTemp = 0; + bDouble = false; + for (k = 0; k < m_nOperatorsCount; k += 2) + { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (m_arrOperators[k + 1].dNumber < 0) + { + dTemp += m_arrOperators[k].dNumber + m_arrOperators[k + 1].dNumber; + bDouble |= m_arrOperators[k].bIsFloat | m_arrOperators[k + 1].bIsFloat; + ConvertNum(dTemp, bDouble, seCharBuffer); + ConvertNum(-m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + } + else + { + dTemp += m_arrOperators[k].dNumber; + bDouble |= m_arrOperators[k].bIsFloat; + ConvertNum(dTemp, bDouble, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + dTemp += m_arrOperators[k + 1].dNumber; + bDouble |= m_arrOperators[k + 1].bIsFloat; + } + seCharBuffer->Append((char)3); + } + m_nHints += m_nOperatorsCount / 2; + m_nOperatorsCount = 0; + break; + case 0x0004: // vmoveto + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount == 2, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_bOpenPath) + { + seCharBuffer->Append((char)9); + m_bOpenPath = false; + } + if (m_nOperatorsCount != 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 vmoveto" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)4); + m_nOperatorsCount = 0; + break; + case 0x0005: // rlineto + if (m_nOperatorsCount < 2 || m_nOperatorsCount % 2 != 0) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 rlineto" + } + for (k = 0; k < m_nOperatorsCount; k += 2) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)5); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0006: // hlineto + if (m_nOperatorsCount < 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hlineto" + } + for (k = 0; k < m_nOperatorsCount; ++k) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)((k & 1) ? 7 : 6)); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0007: // vlineto + if (m_nOperatorsCount < 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 vlineto" + } + for (k = 0; k < m_nOperatorsCount; ++k) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)((k & 1) ? 6 : 7)); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0008: // rrcurveto + if (m_nOperatorsCount < 6 || m_nOperatorsCount % 6 != 0) + { + // TO DO: error "Wrong number of args (%d) to Type 2 rrcurveto", m_nOperatorsCount); + } + for (k = 0; k < m_nOperatorsCount; k += 6) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 5].dNumber, m_arrOperators[k + 5].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x000a: // callsubr + if (m_nOperatorsCount >= 1) + { + nSubrBias = (pSubrIndex->nCount < 1240) ? 107 : (pSubrIndex->nCount < 33900) ? 1131 : 32768; + k = nSubrBias + (int)m_arrOperators[m_nOperatorsCount - 1].dNumber; + --m_nOperatorsCount; + bSuccess = true; + GetIndexVal(pSubrIndex, k, &oIndexVal, &bSuccess); + if (bSuccess) + { + ConvertGlyph(oIndexVal.nPos, oIndexVal.nLen, seCharBuffer, pSubrIndex, pDict, false); + } + } + else + { + // TO DO: error "Too few args to Type 2 callsubr" + } + // не очищаем стек + break; + case 0x000b: // return + // не очищаем стек + break; + case 0x000e: // endchar / seac + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount == 1 || m_nOperatorsCount == 5, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_bOpenPath) + { + seCharBuffer->Append((char)9); + m_bOpenPath = false; + } + if (m_nOperatorsCount == 4) + { + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)12)->Append((char)6); + } + else if (m_nOperatorsCount == 0) + { + seCharBuffer->Append((char)14); + + } + else + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 endchar" + } + m_nOperatorsCount = 0; + break; + case 0x000f: // (obsolete) + // Данная операция игнорируется, но нам нужна ширина символа + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount > 0, seCharBuffer, pDict); + m_bFirstOperator = false; + } + m_nOperatorsCount = 0; + break; + case 0x0010: // blend + // TO DO: error "Unimplemented Type 2 charstring op: file[i]" + m_nOperatorsCount = 0; + break; + case 0x0012: // hstemhm + // Данная операция игнорируется + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hstemhm" + } + m_nHints += m_nOperatorsCount / 2; + m_nOperatorsCount = 0; + break; + case 0x0013: // hintmask + // Данная операция игнорируется + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount > 0) + { + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hintmask/vstemhm" + } + m_nHints += m_nOperatorsCount / 2; + } + nPos += (m_nHints + 7) >> 3; + m_nOperatorsCount = 0; + break; + case 0x0014: // cntrmask + // Данная операция игнорируется + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount > 0) + { + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 cntrmask/vstemhm" + } + m_nHints += m_nOperatorsCount / 2; + } + nPos += (m_nHints + 7) >> 3; + m_nOperatorsCount = 0; + break; + case 0x0015: // rmoveto + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount == 3, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_bOpenPath) + { + seCharBuffer->Append((char)9); + m_bOpenPath = false; + } + if (m_nOperatorsCount != 2) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 rmoveto" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)21); + m_nOperatorsCount = 0; + break; + case 0x0016: // hmoveto + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount == 2, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_bOpenPath) + { + seCharBuffer->Append((char)9); + m_bOpenPath = false; + } + if (m_nOperatorsCount != 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hmoveto" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)22); + m_nOperatorsCount = 0; + break; + case 0x0017: // vstemhm + // Данная операция игнорируется + if (m_bFirstOperator) + { + ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); + m_bFirstOperator = false; + } + if (m_nOperatorsCount & 1) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 vstemhm" + } + m_nHints += m_nOperatorsCount / 2; + m_nOperatorsCount = 0; + break; + case 0x0018: // rcurveline + if (m_nOperatorsCount < 8 || (m_nOperatorsCount - 2) % 6 != 0) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 rcurveline" + } + for (k = 0; k < m_nOperatorsCount - 2; k += 6) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 5].dNumber, m_arrOperators[k + 5].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + } + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)5); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0019: // rlinecurve + if (m_nOperatorsCount < 8 || (m_nOperatorsCount - 6) % 2 != 0) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 rlinecurve" + } + for (k = 0; k < m_nOperatorsCount - 6; k += 2) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)5); + } + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 5].dNumber, m_arrOperators[k + 5].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x001a: // vvcurveto + if (m_nOperatorsCount < 4 || !(m_nOperatorsCount % 4 == 0 || (m_nOperatorsCount - 1) % 4 == 0)) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 vvcurveto" + } + if (m_nOperatorsCount % 2 == 1) + { + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + k = 5; + } + else + { + k = 0; + } + for (; k < m_nOperatorsCount; k += 4) + { + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x001b: // hhcurveto + if (m_nOperatorsCount < 4 || !(m_nOperatorsCount % 4 == 0 || (m_nOperatorsCount - 1) % 4 == 0)) + { + // TO DO: error "Wrong number of args (m_nOperatorsCount) to Type 2 hhcurveto" + } + if (m_nOperatorsCount % 2 == 1) + { + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + seCharBuffer->Append((char)8); + k = 5; + } + else + { + k = 0; + } + for (; k < m_nOperatorsCount; k += 4) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + seCharBuffer->Append((char)8); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x001d: // callgsubr + if (m_nOperatorsCount >= 1) + { + k = m_nGsubrBias + (int)m_arrOperators[m_nOperatorsCount - 1].dNumber; + --m_nOperatorsCount; + bSuccess = true; + GetIndexVal(&m_oGsubrIndex, k, &oIndexVal, &bSuccess); + if (bSuccess) + { + ConvertGlyph(oIndexVal.nPos, oIndexVal.nLen, seCharBuffer, pSubrIndex, pDict, false); + } + } + else + { + // TO DO: error "Too few args to Type 2 callgsubr" + } + // не очищаем стек + break; + case 0x001e: // vhcurveto + if (m_nOperatorsCount < 4 || !(m_nOperatorsCount % 4 == 0 || (m_nOperatorsCount - 1) % 4 == 0)) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 vhcurveto" + } + for (k = 0; k < m_nOperatorsCount && k != m_nOperatorsCount - 5; k += 4) + { + if (k % 8 == 0) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)30); + } + else + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)31); + } + } + if (k == m_nOperatorsCount - 5) + { + if (k % 8 == 0) + { + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + } + else + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + } + seCharBuffer->Append((char)8); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x001f: // hvcurveto + if (m_nOperatorsCount < 4 || !(m_nOperatorsCount % 4 == 0 || (m_nOperatorsCount - 1) % 4 == 0)) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 hvcurveto" + } + for (k = 0; k < m_nOperatorsCount && k != m_nOperatorsCount - 5; k += 4) + { + if (k % 8 == 0) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)31); + } + else + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)30); + } + } + if (k == m_nOperatorsCount - 5) + { + if (k % 8 == 0) + { + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + } + else + { + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[k].dNumber, m_arrOperators[k].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 1].dNumber, m_arrOperators[k + 1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 2].dNumber, m_arrOperators[k + 2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 3].dNumber, m_arrOperators[k + 3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[k + 4].dNumber, m_arrOperators[k + 4].bIsFloat, seCharBuffer); + } + seCharBuffer->Append((char)8); + } + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0c00: // dotsection (should be Type 1 only?) + // игнорируем + m_nOperatorsCount = 0; + break; + case 0x0c03: // and + case 0x0c04: // or + case 0x0c05: // not + case 0x0c08: // store + case 0x0c09: // abs + case 0x0c0a: // add + case 0x0c0b: // sub + case 0x0c0c: // div + case 0x0c0d: // load + case 0x0c0e: // neg + case 0x0c0f: // eq + case 0x0c12: // drop + case 0x0c14: // put + case 0x0c15: // get + case 0x0c16: // ifelse + case 0x0c17: // random + case 0x0c18: // mul + case 0x0c1a: // sqrt + case 0x0c1b: // dup + case 0x0c1c: // exch + case 0x0c1d: // index + case 0x0c1e: // roll + // TO DO: "Unimplemented Type 2 charstring op" + m_nOperatorsCount = 0; + break; + case 0x0c22: // hflex + if (m_nOperatorsCount != 7) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 hflex" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + seCharBuffer->Append((char)8); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[5].dNumber, m_arrOperators[5].bIsFloat, seCharBuffer); + ConvertNum(-m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[6].dNumber, m_arrOperators[6].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + seCharBuffer->Append((char)8); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0c23: // flex + if (m_nOperatorsCount != 13) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 flex" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[5].dNumber, m_arrOperators[5].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + ConvertNum(m_arrOperators[6].dNumber, m_arrOperators[6].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[7].dNumber, m_arrOperators[7].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[8].dNumber, m_arrOperators[8].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[9].dNumber, m_arrOperators[9].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[10].dNumber, m_arrOperators[10].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[11].dNumber, m_arrOperators[11].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0c24: // hflex1 + if (m_nOperatorsCount != 9) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 hflex1" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + seCharBuffer->Append((char)8); + ConvertNum(m_arrOperators[5].dNumber, m_arrOperators[5].bIsFloat, seCharBuffer); + ConvertNum(0, false, seCharBuffer); + ConvertNum(m_arrOperators[6].dNumber, m_arrOperators[6].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[7].dNumber, m_arrOperators[7].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[8].dNumber, m_arrOperators[8].bIsFloat, seCharBuffer); + ConvertNum(-(m_arrOperators[1].dNumber + m_arrOperators[3].dNumber + m_arrOperators[7].dNumber), m_arrOperators[1].bIsFloat | m_arrOperators[3].bIsFloat | m_arrOperators[7].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + case 0x0c25: // flex1 + if (m_nOperatorsCount != 11) + { + // TO DO: "Wrong number of args (m_nOperatorsCount) to Type 2 flex1" + } + ConvertNum(m_arrOperators[0].dNumber, m_arrOperators[0].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[1].dNumber, m_arrOperators[1].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[2].dNumber, m_arrOperators[2].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[3].dNumber, m_arrOperators[3].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[4].dNumber, m_arrOperators[4].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[5].dNumber, m_arrOperators[5].bIsFloat, seCharBuffer); + seCharBuffer->Append((char)8); + ConvertNum(m_arrOperators[6].dNumber, m_arrOperators[6].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[7].dNumber, m_arrOperators[7].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[8].dNumber, m_arrOperators[8].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[9].dNumber, m_arrOperators[9].bIsFloat, seCharBuffer); + dX = m_arrOperators[0].dNumber + m_arrOperators[2].dNumber + m_arrOperators[4].dNumber + m_arrOperators[6].dNumber + m_arrOperators[8].dNumber; + dY = m_arrOperators[1].dNumber + m_arrOperators[3].dNumber + m_arrOperators[5].dNumber + m_arrOperators[7].dNumber + m_arrOperators[9].dNumber; + if (fabs(dX) > fabs(dY)) + { + ConvertNum(m_arrOperators[10].dNumber, m_arrOperators[10].bIsFloat, seCharBuffer); + ConvertNum(-dY, m_arrOperators[1].bIsFloat | m_arrOperators[3].bIsFloat | m_arrOperators[5].bIsFloat | m_arrOperators[7].bIsFloat | m_arrOperators[9].bIsFloat, seCharBuffer); + } + else + { + ConvertNum(-dX, m_arrOperators[0].bIsFloat | m_arrOperators[2].bIsFloat | m_arrOperators[4].bIsFloat | m_arrOperators[6].bIsFloat | m_arrOperators[8].bIsFloat, seCharBuffer); + ConvertNum(m_arrOperators[10].dNumber, m_arrOperators[10].bIsFloat, seCharBuffer); + } + seCharBuffer->Append((char)8); + m_nOperatorsCount = 0; + m_bOpenPath = true; + break; + default: + // TO DO: "Illegal Type 2 charstring Operation" + m_nOperatorsCount = 0; + break; + } + } + } + + // CharString Encryption + if (bTop) + { + unsigned short nR2 = 4330; + for (int nIndex = nStart; nIndex < seCharBuffer->GetLength(); ++nIndex) + { + unByte = seCharBuffer->GetAt(nIndex) ^ (nR2 >> 8); + seCharBuffer->SetAt(nIndex, unByte); + nR2 = (unByte + nR2) * 52845 + 22719; + } + } + } + + void CFontFileType1C::ConvertGlyphWidth(bool bUseOperation, StringExt *seCharBuffer, Type1CPrivateDict *pDict) + { + double dWidth = 0; + bool bWidthDouble = false; + + if (bUseOperation) + { + dWidth = pDict->dNominalWidthX + m_arrOperators[0].dNumber; + bWidthDouble = pDict->bNominalWidthXFP | m_arrOperators[0].bIsFloat; + for (int nIndex = 1; nIndex < m_nOperatorsCount; ++nIndex) + { + m_arrOperators[nIndex - 1] = m_arrOperators[nIndex]; + } + --m_nOperatorsCount; + } + else + { + dWidth = pDict->dDefaultWidthX; + bWidthDouble = pDict->bDefaultWidthXFP; + } + ConvertNum(0, false, seCharBuffer); + ConvertNum(dWidth, bWidthDouble, seCharBuffer); + seCharBuffer->Append((char)13); + } + + void CFontFileType1C::ConvertNum(double dValue, bool bIsFloat, StringExt *seCharBuffer) + { + unsigned char sBuffer[12]; + + int nLen = 0; + int nTemp = 0; + if (bIsFloat) + { + + if (dValue >= -32768 && dValue < 32768) + { + nTemp = (int)(dValue * 256.0); + sBuffer[0] = 255; + sBuffer[1] = (unsigned char)(nTemp >> 24); + sBuffer[2] = (unsigned char)(nTemp >> 16); + sBuffer[3] = (unsigned char)(nTemp >> 8); + sBuffer[4] = (unsigned char)nTemp; + sBuffer[5] = 255; + sBuffer[6] = 0; + sBuffer[7] = 0; + sBuffer[8] = 1; + sBuffer[9] = 0; + sBuffer[10] = 12; + sBuffer[11] = 12; + nLen = 12; + } + else + { + // TO DO: "Type 2 fixed point constant out of range" + } + } + else + { + nTemp = (int)dValue; + if (nTemp >= -107 && nTemp <= 107) + { + sBuffer[0] = (unsigned char)(nTemp + 139); + nLen = 1; + } + else if (nTemp > 107 && nTemp <= 1131) + { + nTemp -= 108; + sBuffer[0] = (unsigned char)((nTemp >> 8) + 247); + sBuffer[1] = (unsigned char)(nTemp & 0xff); + nLen = 2; + } + else if (nTemp < -107 && nTemp >= -1131) + { + nTemp = -nTemp - 108; + sBuffer[0] = (unsigned char)((nTemp >> 8) + 251); + sBuffer[1] = (unsigned char)(nTemp & 0xff); + nLen = 2; + } + else + { + sBuffer[0] = 255; + sBuffer[1] = (unsigned char)(nTemp >> 24); + sBuffer[2] = (unsigned char)(nTemp >> 16); + sBuffer[3] = (unsigned char)(nTemp >> 8); + sBuffer[4] = (unsigned char)nTemp; + nLen = 5; + } + } + seCharBuffer->Append((char *)sBuffer, nLen); + } + + void CFontFileType1C::EexecWrite(Type1CEexecBuf *pEexecBuffer, char *sBuffer) + { + unsigned char *pCharPtr; + + for (pCharPtr = (unsigned char *)sBuffer; *pCharPtr; ++pCharPtr) + { + unsigned char nCurChar = *pCharPtr ^ (pEexecBuffer->unEncryptionKey >> 8); + pEexecBuffer->unEncryptionKey = (nCurChar + pEexecBuffer->unEncryptionKey) * 52845 + 22719; + if (pEexecBuffer->bASKII) + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, &c_sHexChars[nCurChar >> 4], 1); + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, &c_sHexChars[nCurChar & 0x0f], 1); + pEexecBuffer->nLine += 2; + if (pEexecBuffer->nLine == 64) + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, "\n", 1); + pEexecBuffer->nLine = 0; + } + } + else + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, (char *)&nCurChar, 1); + } + } + } + + void CFontFileType1C::EexecWriteCharString(Type1CEexecBuf *pEexecBuffer, unsigned char *sBuffer, int nLen) + { + // Eexec шифрование + for (int nIndex = 0; nIndex < nLen; ++nIndex) + { + unsigned nCurChar = sBuffer[nIndex] ^ (pEexecBuffer->unEncryptionKey >> 8); + pEexecBuffer->unEncryptionKey = (nCurChar + pEexecBuffer->unEncryptionKey) * 52845 + 22719; + if (pEexecBuffer->bASKII) + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, &c_sHexChars[nCurChar >> 4], 1); + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, &c_sHexChars[nCurChar & 0x0f], 1); + pEexecBuffer->nLine += 2; + if (pEexecBuffer->nLine == 64) + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, "\n", 1); + pEexecBuffer->nLine = 0; + } + } + else + { + (*pEexecBuffer->pOutputFunc)(pEexecBuffer->pOutputStream, (char *)&nCurChar, 1); + } + } + } + + bool CFontFileType1C::Parse() + { + Type1CIndex oFDIndex; + Type1CIndexVal oIndexVal; + + m_bSuccessParsed = true; + + // некоторые программы включают фонты Type 1C в пробелами в начале + if (m_nLen > 0 && m_sFile[0] != '\x01') + { + ++m_sFile; + --m_nLen; + } + + GetIndex(GetU8(2, &m_bSuccessParsed), &m_oNameIndex, &m_bSuccessParsed); + GetIndex(m_oNameIndex.nEndPos, &m_oTopDictIndex, &m_bSuccessParsed); + GetIndex(m_oTopDictIndex.nEndPos, &m_oStringIndex, &m_bSuccessParsed); + GetIndex(m_oStringIndex.nEndPos, &m_oGsubrIndex, &m_bSuccessParsed); + + if (!m_bSuccessParsed) + return false; + + m_nGsubrBias = (m_oGsubrIndex.nCount < 1240) ? 107 : (m_oGsubrIndex.nCount < 33900) ? 1131 : 32768; + + // считываем первое имя фонта + GetIndexVal(&m_oNameIndex, 0, &oIndexVal, &m_bSuccessParsed); + + if (!m_bSuccessParsed) + return false; + + m_seName = new StringExt((char *)&m_sFile[oIndexVal.nPos], oIndexVal.nLen); + + // Считываем самый верхний словарь для первого фонта + ReadTopDict(); + + if (m_oTopDict.nFirstOperator == 0x0c1e) + { + if (m_oTopDict.nFDArrayOffset == 0) + { + m_nFDsCount = 1; + m_pPrivateDicts = (Type1CPrivateDict *)MemUtilsMalloc(sizeof(Type1CPrivateDict)); + ReadPrivateDict(0, 0, &m_pPrivateDicts[0]); + } + else + { + GetIndex(m_oTopDict.nFDArrayOffset, &oFDIndex, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return false; + m_nFDsCount = oFDIndex.nCount; + m_pPrivateDicts = (Type1CPrivateDict *)MemUtilsMallocArray(m_nFDsCount, sizeof(Type1CPrivateDict)); + for (int nIndex = 0; nIndex < m_nFDsCount; ++nIndex) + { + GetIndexVal(&oFDIndex, nIndex, &oIndexVal, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return false; + ReadFD(oIndexVal.nPos, oIndexVal.nLen, &m_pPrivateDicts[nIndex]); + } + } + } + else + { + m_pPrivateDicts = (Type1CPrivateDict *)MemUtilsMalloc(sizeof(Type1CPrivateDict)); + ReadPrivateDict(m_oTopDict.nPrivateOffset, m_oTopDict.nPrivateSize, &m_pPrivateDicts[0]); + } + + if (!m_bSuccessParsed) + return false; + + // get the charstrings index + if (m_oTopDict.nCharStringsOffset <= 0) + { + m_bSuccessParsed = false; + return false; + } + + GetIndex(m_oTopDict.nCharStringsOffset, &m_oCharStringsIndex, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return false; + + m_nGlyphsCount = m_oCharStringsIndex.nCount; + + if (m_oTopDict.nFirstOperator == 0x0c1e) + { + ReadFDSelect(); + if (!m_bSuccessParsed) + return false; + } + + if (!ReadCharset()) + { + m_bSuccessParsed = false; + return false; + } + + if (m_oTopDict.nFirstOperator != 0x0c14 && m_oTopDict.nFirstOperator != 0x0c1e) + { + BuildEncoding(); + if (!m_bSuccessParsed) + return false; + } + + return m_bSuccessParsed; + } + + void CFontFileType1C::ReadTopDict() + { + Type1CIndexVal oTopDictPointer; + + m_oTopDict.nFirstOperator = -1; + m_oTopDict.nVersionSID = 0; + m_oTopDict.nNoticeSID = 0; + m_oTopDict.nCopyrightSID = 0; + m_oTopDict.nFullNameSID = 0; + m_oTopDict.nFamilyNameSID = 0; + m_oTopDict.nWeightSID = 0; + m_oTopDict.nIsFixedPitch = 0; + m_oTopDict.dItalicAngle = 0; + m_oTopDict.dUnderlinePosition = -100; + m_oTopDict.dUnderlineThickness = 50; + m_oTopDict.nPaintType = 0; + m_oTopDict.nCharStringType = 2; + m_oTopDict.arrdFontMatrix[0] = 0.001; + m_oTopDict.arrdFontMatrix[1] = 0; + m_oTopDict.arrdFontMatrix[2] = 0; + m_oTopDict.arrdFontMatrix[3] = 0.001; + m_oTopDict.arrdFontMatrix[4] = 0; + m_oTopDict.arrdFontMatrix[5] = 0; + m_oTopDict.bHasFontMatrix = false; + m_oTopDict.nUniqueID = 0; + m_oTopDict.arrdFontBBox[0] = 0; + m_oTopDict.arrdFontBBox[1] = 0; + m_oTopDict.arrdFontBBox[2] = 0; + m_oTopDict.arrdFontBBox[3] = 0; + m_oTopDict.dStrokeWidth = 0; + m_oTopDict.nCharsetOffset = 0; + m_oTopDict.nEncodingOffset = 0; + m_oTopDict.nCharStringsOffset = 0; + m_oTopDict.nPrivateSize = 0; + m_oTopDict.nPrivateOffset = 0; + m_oTopDict.nRegistrySID = 0; + m_oTopDict.nOrderingSID = 0; + m_oTopDict.nSupplement = 0; + m_oTopDict.nFDArrayOffset = 0; + m_oTopDict.nFDSelectOffset = 0; + + GetIndexVal(&m_oTopDictIndex, 0, &oTopDictPointer, &m_bSuccessParsed); + int nPos = oTopDictPointer.nPos; + m_nOperatorsCount = 0; + while (nPos < oTopDictPointer.nPos + oTopDictPointer.nLen) + { + nPos = GetOperator(nPos, false, &m_bSuccessParsed); + if (!m_bSuccessParsed) + { + break; + } + if (!m_arrOperators[m_nOperatorsCount - 1].bIsNumber) + { + --m_nOperatorsCount; + if (m_oTopDict.nFirstOperator < 0) + { + m_oTopDict.nFirstOperator = m_arrOperators[m_nOperatorsCount].nOperator; + } + switch (m_arrOperators[m_nOperatorsCount].nOperator) + { + case 0x0000: m_oTopDict.nVersionSID = (int)m_arrOperators[0].dNumber; break; + case 0x0001: m_oTopDict.nNoticeSID = (int)m_arrOperators[0].dNumber; break; + case 0x0c00: m_oTopDict.nCopyrightSID = (int)m_arrOperators[0].dNumber; break; + case 0x0002: m_oTopDict.nFullNameSID = (int)m_arrOperators[0].dNumber; break; + case 0x0003: m_oTopDict.nFamilyNameSID = (int)m_arrOperators[0].dNumber; break; + case 0x0004: m_oTopDict.nWeightSID = (int)m_arrOperators[0].dNumber; break; + case 0x0c01: m_oTopDict.nIsFixedPitch = (int)m_arrOperators[0].dNumber; break; + case 0x0c02: m_oTopDict.dItalicAngle = m_arrOperators[0].dNumber; break; + case 0x0c03: m_oTopDict.dUnderlinePosition = m_arrOperators[0].dNumber; break; + case 0x0c04: m_oTopDict.dUnderlineThickness = m_arrOperators[0].dNumber; break; + case 0x0c05: m_oTopDict.nPaintType = (int)m_arrOperators[0].dNumber; break; + case 0x0c06: m_oTopDict.nCharStringType = (int)m_arrOperators[0].dNumber; break; + case 0x0c07: m_oTopDict.arrdFontMatrix[0] = m_arrOperators[0].dNumber; + m_oTopDict.arrdFontMatrix[1] = m_arrOperators[1].dNumber; + m_oTopDict.arrdFontMatrix[2] = m_arrOperators[2].dNumber; + m_oTopDict.arrdFontMatrix[3] = m_arrOperators[3].dNumber; + m_oTopDict.arrdFontMatrix[4] = m_arrOperators[4].dNumber; + m_oTopDict.arrdFontMatrix[5] = m_arrOperators[5].dNumber; + m_oTopDict.bHasFontMatrix = true; break; + case 0x000d: m_oTopDict.nUniqueID = (int)m_arrOperators[0].dNumber; break; + case 0x0005: m_oTopDict.arrdFontBBox[0] = m_arrOperators[0].dNumber; + m_oTopDict.arrdFontBBox[1] = m_arrOperators[1].dNumber; + m_oTopDict.arrdFontBBox[2] = m_arrOperators[2].dNumber; + m_oTopDict.arrdFontBBox[3] = m_arrOperators[3].dNumber; break; + case 0x0c08: m_oTopDict.dStrokeWidth = m_arrOperators[0].dNumber; break; + case 0x000f: m_oTopDict.nCharsetOffset = (int)m_arrOperators[0].dNumber; break; + case 0x0010: m_oTopDict.nEncodingOffset = (int)m_arrOperators[0].dNumber; break; + case 0x0011: m_oTopDict.nCharStringsOffset = (int)m_arrOperators[0].dNumber; break; + case 0x0012: m_oTopDict.nPrivateSize = (int)m_arrOperators[0].dNumber; + m_oTopDict.nPrivateOffset = (int)m_arrOperators[1].dNumber; break; + case 0x0c1e: m_oTopDict.nRegistrySID = (int)m_arrOperators[0].dNumber; + m_oTopDict.nOrderingSID = (int)m_arrOperators[1].dNumber; + m_oTopDict.nSupplement = (int)m_arrOperators[2].dNumber; break; + case 0x0c24: m_oTopDict.nFDArrayOffset = (int)m_arrOperators[0].dNumber; break; + case 0x0c25: m_oTopDict.nFDSelectOffset = (int)m_arrOperators[0].dNumber; break; + } + m_nOperatorsCount = 0; + } + } + } + + // Читаем словарь шрифта (CID Font Dict (FD)). Отсюда вытаскиваем указатель на private dict, + // и читаем private dict. Также вытаксиваем FontMatrix. + void CFontFileType1C::ReadFD(int nOffset, int nLength, Type1CPrivateDict *pDict) + { + double arrdFontMatrix[6]; + bool bHasFontMatrix = false; + int nPrivateSize = 0, nPrivateOffset = 0; + int nPos = nOffset; + m_nOperatorsCount = 0; + while (nPos < nOffset + nLength) + { + nPos = GetOperator(nPos, false, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + if (!m_arrOperators[m_nOperatorsCount - 1].bIsNumber) + { + if (m_arrOperators[m_nOperatorsCount - 1].nOperator == 0x0012) + { + if (m_nOperatorsCount < 3) + { + m_bSuccessParsed = false; + return; + } + nPrivateSize = (int)m_arrOperators[0].dNumber; + nPrivateOffset = (int)m_arrOperators[1].dNumber; + break; + } + else if (m_arrOperators[m_nOperatorsCount - 1].nOperator == 0x0c07) + { + arrdFontMatrix[0] = m_arrOperators[0].dNumber; + arrdFontMatrix[1] = m_arrOperators[1].dNumber; + arrdFontMatrix[2] = m_arrOperators[2].dNumber; + arrdFontMatrix[3] = m_arrOperators[3].dNumber; + arrdFontMatrix[4] = m_arrOperators[4].dNumber; + arrdFontMatrix[5] = m_arrOperators[5].dNumber; + bHasFontMatrix = true; + } + m_nOperatorsCount = 0; + } + } + ReadPrivateDict(nPrivateOffset, nPrivateSize, pDict); + if (bHasFontMatrix) + { + pDict->arrdFontMatrix[0] = arrdFontMatrix[0]; + pDict->arrdFontMatrix[1] = arrdFontMatrix[1]; + pDict->arrdFontMatrix[2] = arrdFontMatrix[2]; + pDict->arrdFontMatrix[3] = arrdFontMatrix[3]; + pDict->arrdFontMatrix[4] = arrdFontMatrix[4]; + pDict->arrdFontMatrix[5] = arrdFontMatrix[5]; + pDict->bHasFontMatrix = true; + } + } + + void CFontFileType1C::ReadPrivateDict(int nOffset, int nLength, Type1CPrivateDict *pDict) + { + pDict->bHasFontMatrix = false; + pDict->nBlueValues = 0; + pDict->nOtherBlues = 0; + pDict->nFamilyBlues = 0; + pDict->nFamilyOtherBlues = 0; + pDict->dBlueScale = 0.039625; + pDict->nBlueShift = 7; + pDict->nBlueFuzz = 1; + pDict->bHasStdHW = false; + pDict->bHasStdVW = false; + pDict->nStemSnapH = 0; + pDict->nStemSnapV = 0; + pDict->bHasForceBold = false; + pDict->dForceBoldThreshold = 0; + pDict->nLanguageGroup = 0; + pDict->dExpansionFactor = 0.06; + pDict->nInitialRandomSeed = 0; + pDict->nSubrsOffset = 0; + pDict->dDefaultWidthX = 0; + pDict->bDefaultWidthXFP = false; + pDict->dNominalWidthX = 0; + pDict->bNominalWidthXFP = false; + + if (nOffset == 0 || nLength == 0) + return; + + int nPos = nOffset; + m_nOperatorsCount = 0; + + while (nPos < nOffset + nLength) + { + nPos = GetOperator(nPos, false, &m_bSuccessParsed); + if (!m_bSuccessParsed) + break; + + if (!m_arrOperators[m_nOperatorsCount - 1].bIsNumber) + { + --m_nOperatorsCount; + + switch (m_arrOperators[m_nOperatorsCount].nOperator) + { + case 0x0006: + pDict->nBlueValues = GetDeltaIntArray(pDict->arrnBlueValues, type1CMaxBlueValues); + break; + case 0x0007: + pDict->nOtherBlues = GetDeltaIntArray(pDict->arrnOtherBlues, type1CMaxOtherBlues); + break; + case 0x0008: + pDict->nFamilyBlues = GetDeltaIntArray(pDict->arrnFamilyBlues, type1CMaxBlueValues); + break; + case 0x0009: + pDict->nFamilyOtherBlues = GetDeltaIntArray(pDict->arrnFamilyOtherBlues, type1CMaxOtherBlues); + break; + case 0x0c09: + pDict->dBlueScale = m_arrOperators[0].dNumber; + break; + case 0x0c0a: + pDict->nBlueShift = (int)m_arrOperators[0].dNumber; + break; + case 0x0c0b: + pDict->nBlueFuzz = (int)m_arrOperators[0].dNumber; + break; + case 0x000a: + pDict->dStdHW = m_arrOperators[0].dNumber; + pDict->bHasStdHW = true; + break; + case 0x000b: + pDict->dStdVW = m_arrOperators[0].dNumber; + pDict->bHasStdVW = true; + break; + case 0x0c0c: + pDict->nStemSnapH = GetDeltaDoubleArray(pDict->arrdStemSnapH, type1CMaxStemSnap); + break; + case 0x0c0d: + pDict->nStemSnapV = GetDeltaDoubleArray(pDict->arrdStemSnapV, type1CMaxStemSnap); + break; + case 0x0c0e: + pDict->bForceBold = m_arrOperators[0].dNumber != 0; + pDict->bHasForceBold = true; + break; + case 0x0c0f: + pDict->dForceBoldThreshold = m_arrOperators[0].dNumber; + break; + case 0x0c11: + pDict->nLanguageGroup = (int)m_arrOperators[0].dNumber; + break; + case 0x0c12: + pDict->dExpansionFactor = m_arrOperators[0].dNumber; + break; + case 0x0c13: + pDict->nInitialRandomSeed = (int)m_arrOperators[0].dNumber; + break; + case 0x0013: + pDict->nSubrsOffset = nOffset + (int)m_arrOperators[0].dNumber; + break; + case 0x0014: + pDict->dDefaultWidthX = m_arrOperators[0].dNumber; + pDict->bDefaultWidthXFP = m_arrOperators[0].bIsFloat; + break; + case 0x0015: + pDict->dNominalWidthX = m_arrOperators[0].dNumber; + pDict->bNominalWidthXFP = m_arrOperators[0].bIsFloat; + break; + } + m_nOperatorsCount = 0; + } + } + } + + void CFontFileType1C::ReadFDSelect() + { + int nRanges = 0; + + m_pnFDSelect = (unsigned char *)MemUtilsMalloc(m_nGlyphsCount); + + if (m_oTopDict.nFDSelectOffset == 0) + { + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + m_pnFDSelect[nIndex] = 0; + } + } + else + { + int nPos = m_oTopDict.nFDSelectOffset; + int nFDSelectFormat = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + { + return; + } + if (nFDSelectFormat == 0) + { + if (!CheckRegion(nPos, m_nGlyphsCount)) + { + m_bSuccessParsed = false; + return; + } + memcpy(m_pnFDSelect, m_sFile + nPos, m_nGlyphsCount); + } + else if (nFDSelectFormat == 3) + { + nRanges = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + int nGID0 = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + for (int nIndex = 1; nIndex <= nRanges; ++nIndex) + { + int nCurFD = GetU8(nPos++, &m_bSuccessParsed); + int nGID1 = GetU16BE(nPos, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + nPos += 2; + if (nGID0 > nGID1 || nGID1 > m_nGlyphsCount) + { + // TO DO: error "Bad FDSelect table in CID font" + m_bSuccessParsed = false; + return; + } + for (int nJ = nGID0; nJ < nGID1; ++nJ) + { + m_pnFDSelect[nJ] = nCurFD; + } + nGID0 = nGID1; + } + } + else + { + // TO DO: error "Unknown FDSelect table format in CID font" + for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + m_pnFDSelect[nIndex] = 0; + } + } + } + } + + void CFontFileType1C::BuildEncoding() + { + char sBuffer[256]; + int nCodes, nRanges; + int nChar = 0, nLeft, nSups; + + if (m_oTopDict.nEncodingOffset == 0) + { + m_arrEncoding = c_arrsFontFileType1StandardEncoding; + } + else if (m_oTopDict.nEncodingOffset == 1) + { + m_arrEncoding = c_arrsFontFileType1ExpertEncoding; + } + else + { + m_arrEncoding = (char **)MemUtilsMallocArray(256, sizeof(char *)); + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + m_arrEncoding[nIndex] = NULL; + } + int nPos = m_oTopDict.nEncodingOffset; + int nEncodingFormat = GetU8(nPos++, &m_bSuccessParsed); + + if (!m_bSuccessParsed) + return; + + if ((nEncodingFormat & 0x7f) == 0) + { + nCodes = 1 + GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + if (nCodes > m_nGlyphsCount) + { + nCodes = m_nGlyphsCount; + } + for (int nIndex = 1; nIndex < nCodes; ++nIndex) + { + nChar = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + if (m_arrEncoding[nChar]) + { + MemUtilsFree(m_arrEncoding[nChar]); + } + m_arrEncoding[nChar] = CopyString(GetString(m_pnCharset[nIndex], sBuffer, &m_bSuccessParsed)); + } + } + else if ((nEncodingFormat & 0x7f) == 1) + { + nRanges = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + nCodes = 1; + for (int nIndex = 0; nIndex < nRanges; ++nIndex) + { + nChar = GetU8(nPos++, &m_bSuccessParsed); + nLeft = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + for (int nJ = 0; nJ <= nLeft && nCodes < m_nGlyphsCount; ++nJ) + { + if (nChar < 256) + { + if (m_arrEncoding[nChar]) + { + MemUtilsFree(m_arrEncoding[nChar]); + } + m_arrEncoding[nChar] = CopyString(GetString(m_pnCharset[nCodes], sBuffer, &m_bSuccessParsed)); + } + ++nCodes; + ++nChar; + } + } + } + if (nEncodingFormat & 0x80) + { + nSups = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + for (int nIndex = 0; nIndex < nSups; ++nIndex) + { + nChar = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + return; + + int nSID = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + + if (!m_bSuccessParsed) + return; + + if (m_arrEncoding[nChar]) + { + MemUtilsFree(m_arrEncoding[nChar]); + } + m_arrEncoding[nChar] = CopyString(GetString(nSID, sBuffer, &m_bSuccessParsed)); + } + } + } + } + + bool CFontFileType1C::ReadCharset() + { + int nChar = 0; + int nLeft, nIndex = 0; + + if (m_oTopDict.nCharsetOffset == 0) + { + m_pnCharset = c_arrnFontFileType1CISOAdobeCharset; + } + else if (m_oTopDict.nCharsetOffset == 1) + { + m_pnCharset = c_arrnFontFileType1CExpertCharset; + } + else if (m_oTopDict.nCharsetOffset == 2) + { + m_pnCharset = c_arrnFontFileType1CExpertSubsetCharset; + } + else + { + m_pnCharset = (unsigned short *)MemUtilsMallocArray(m_nGlyphsCount, sizeof(unsigned short)); + for (nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) + { + m_pnCharset[nIndex] = 0; + } + int nPos = m_oTopDict.nCharsetOffset; + int nCharsetFormat = GetU8(nPos++, &m_bSuccessParsed); + + if (nCharsetFormat == 0) + { + for (nIndex = 1; nIndex < m_nGlyphsCount; ++nIndex) + { + m_pnCharset[nIndex] = (unsigned short)GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + if (!m_bSuccessParsed) + break; + } + } + else if (nCharsetFormat == 1) + { + nIndex = 1; + while (nIndex < m_nGlyphsCount) + { + nChar = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + nLeft = GetU8(nPos++, &m_bSuccessParsed); + if (!m_bSuccessParsed) + break; + for (int nJ = 0; nJ <= nLeft && nIndex < m_nGlyphsCount; ++nJ) + { + m_pnCharset[nIndex++] = (unsigned short)nChar++; + } + } + } + else if (nCharsetFormat == 2) + { + nIndex = 1; + while (nIndex < m_nGlyphsCount) + { + nChar = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + nLeft = GetU16BE(nPos, &m_bSuccessParsed); + nPos += 2; + if (!m_bSuccessParsed) + break; + + for (int nJ = 0; nJ <= nLeft && nIndex < m_nGlyphsCount; ++nJ) + { + m_pnCharset[nIndex++] = (unsigned short)nChar++; + } + } + } + if (!m_bSuccessParsed) + { + MemUtilsFree(m_pnCharset); + m_pnCharset = NULL; + return false; + } + } + return true; + } + + int CFontFileType1C::GetOperator(int nPos, bool bCharString, bool *pbSuccess) + { + static char c_sNumChars[16] = "0123456789.ee -"; + Type1COperator oOperator; + char sBuffer[65]; + int nFirstChar, nSecondChar, nFC, nSC, nTempValue = 0; + + nFirstChar = GetU8(nPos++, pbSuccess); + oOperator.bIsNumber = true; + oOperator.bIsFloat = false; + + if (nFirstChar == 28) + { + nTempValue = GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + if (nTempValue & 0x8000) + { + nTempValue |= ~0xffff; + } + oOperator.dNumber = nTempValue; + + } + else if (!bCharString && nFirstChar == 29) + { + nTempValue = GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + if (nTempValue & 0x80000000) + { + nTempValue |= ~0xffffffff; + } + oOperator.dNumber = nTempValue; + + } + else if (!bCharString && nFirstChar == 30) + { + int nIndex = 0; + do + { + nSecondChar = GetU8(nPos++, pbSuccess); + nFC = nSecondChar >> 4; + nSC = nSecondChar & 0x0f; + if (nFC == 0xf) + { + break; + } + sBuffer[nIndex++] = c_sNumChars[nFC]; + if (nIndex == 64) + { + break; + } + if (nFC == 0xc) + { + sBuffer[nIndex++] = '-'; + } + if (nIndex == 64) + { + break; + } + if (nSC == 0xf) + { + break; + } + sBuffer[nIndex++] = c_sNumChars[nSC]; + if (nIndex == 64) + { + break; + } + if (nSC == 0xc) + { + sBuffer[nIndex++] = '-'; + } + } while (nIndex < 64); + sBuffer[nIndex] = '\0'; + oOperator.dNumber = atof(sBuffer); + oOperator.bIsFloat = true; + + } + else if (nFirstChar >= 32 && nFirstChar <= 246) + { + oOperator.dNumber = nFirstChar - 139; + } + else if (nFirstChar >= 247 && nFirstChar <= 250) + { + oOperator.dNumber = ((nFirstChar - 247) << 8) + GetU8(nPos++, pbSuccess) + 108; + } + else if (nFirstChar >= 251 && nFirstChar <= 254) + { + oOperator.dNumber = -((nFirstChar - 251) << 8) - GetU8(nPos++, pbSuccess) - 108; + } + else if (bCharString && nFirstChar == 255) + { + nTempValue = GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + nTempValue = (nTempValue << 8) | GetU8(nPos++, pbSuccess); + if (nTempValue & 0x80000000) + { + nTempValue |= ~0xffffffff; + } + oOperator.dNumber = (double)nTempValue / 65536.0; + oOperator.bIsFloat = true; + + } + else if (nFirstChar == 12) + { + oOperator.bIsNumber = false; + oOperator.nOperator = 0x0c00 + GetU8(nPos++, pbSuccess); + } + else + { + oOperator.bIsNumber = false; + oOperator.nOperator = nFirstChar; + } + + if (m_nOperatorsCount < 49) + { + m_arrOperators[m_nOperatorsCount++] = oOperator; + } + + return nPos; + } + + // Конвертируем delta-encoded массив операторов в массив ints + int CFontFileType1C::GetDeltaIntArray(int *pArray, int nMaxLen) + { + int nCount = 0; + + if ((nCount = m_nOperatorsCount) > nMaxLen) + { + nCount = nMaxLen; + } + int nTemp = 0; + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + nTemp += (int)m_arrOperators[nIndex].dNumber; + pArray[nIndex] = nTemp; + } + return nCount; + } + + // Конвертируем delta-encoded массив операторов в массив doubles + int CFontFileType1C::GetDeltaDoubleArray(double *pArray, int nMaxLen) + { + int nCount = 0; + + if ((nCount = m_nOperatorsCount) > nMaxLen) + { + nCount = nMaxLen; + } + double dTemp = 0; + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + dTemp += m_arrOperators[nIndex].dNumber; + pArray[nIndex] = dTemp; + } + return nCount; + } + + void CFontFileType1C::GetIndex(int nPos, Type1CIndex *pIndex, bool *bSuccess) + { + pIndex->nPos = nPos; + pIndex->nCount = GetU16BE(nPos, bSuccess); + if (0 == pIndex->nCount) + { + // возможны пустые индексы, они содержат только поле length + pIndex->nOffsetSize = 0; + pIndex->nStartPos = pIndex->nEndPos = nPos + 2; + } + else + { + pIndex->nOffsetSize = GetU8(nPos + 2, bSuccess); + if (pIndex->nOffsetSize < 1 || pIndex->nOffsetSize > 4) + { + *bSuccess = false; + } + pIndex->nStartPos = nPos + 3 + (pIndex->nCount + 1) * pIndex->nOffsetSize - 1; + if (pIndex->nStartPos < 0 || pIndex->nStartPos >= m_nLen) + { + *bSuccess = false; + } + pIndex->nEndPos = pIndex->nStartPos + GetUVarBE(nPos + 3 + pIndex->nCount * pIndex->nOffsetSize, pIndex->nOffsetSize, bSuccess); + if (pIndex->nEndPos < pIndex->nStartPos || pIndex->nEndPos > m_nLen) + { + *bSuccess = false; + } + } + } + + void CFontFileType1C::GetIndexVal(Type1CIndex *pIndex, int nIndex, Type1CIndexVal *pIndexVal, bool *bSuccess) + { + if (nIndex < 0 || nIndex >= pIndex->nCount) + { + *bSuccess = false; + return; + } + int nPos0 = pIndex->nStartPos + GetUVarBE(pIndex->nPos + 3 + nIndex * pIndex->nOffsetSize, pIndex->nOffsetSize, bSuccess); + int nPos1 = pIndex->nStartPos + GetUVarBE(pIndex->nPos + 3 + (nIndex + 1) * pIndex->nOffsetSize, pIndex->nOffsetSize, bSuccess); + + if (nPos0 < pIndex->nStartPos || nPos0 > pIndex->nEndPos || nPos1 <= pIndex->nStartPos || nPos1 > pIndex->nEndPos || nPos1 < nPos0) + { + *bSuccess = false; + } + pIndexVal->nPos = nPos0; + pIndexVal->nLen = nPos1 - nPos0; + } + + char *CFontFileType1C::GetString(int nSID, char *sBuffer, bool *pbSuccess) + { + Type1CIndexVal oIndexVal; + int nCount = 0; + + if (nSID < 391) + { + strcpy(sBuffer, c_arrsFontFileType1CStandardStrings[nSID]); + } + else + { + nSID -= 391; + GetIndexVal(&m_oStringIndex, nSID, &oIndexVal, pbSuccess); + if (*pbSuccess) + { + if ((nCount = oIndexVal.nLen) > 255) + { + nCount = 255; + } + strncpy(sBuffer, (char *)&m_sFile[oIndexVal.nPos], nCount); + sBuffer[nCount] = '\0'; + } + else + { + sBuffer[0] = '\0'; + } + } + return sBuffer; + } +} \ No newline at end of file diff --git a/PdfReader/Src/FontFileType1C.h b/PdfReader/Src/FontFileType1C.h new file mode 100644 index 0000000000..0f76a13c28 --- /dev/null +++ b/PdfReader/Src/FontFileType1C.h @@ -0,0 +1,220 @@ +#ifndef _PDF_READER_FONT_FILE_TYPE1C_H +#define _PDF_READER_FONT_FILE_TYPE1C_H + +#include "FontFileBase.h" + +namespace PdfReader +{ + class StringExt; + + //------------------------------------------------------------------------ + + struct Type1CIndex + { + int nPos; // Позиция в файле от начала файла + int nCount; // Количество вхождений + int nOffsetSize; // Offset size + int nStartPos; // Начальная позиция index data - 1 + int nEndPos; // Позиция следующего байта после Type1CIndex + }; + + struct Type1CIndexVal + { + int nPos; // Позиция в файле от начала файла + int nLen; // Длина в байтах + }; + + struct Type1CTopDict + { + int nFirstOperator; + + int nVersionSID; + int nNoticeSID; + int nCopyrightSID; + int nFullNameSID; + int nFamilyNameSID; + int nWeightSID; + + int nIsFixedPitch; + double dItalicAngle; + double dUnderlinePosition; + double dUnderlineThickness; + + int nPaintType; + int nCharStringType; + double arrdFontMatrix[6]; + bool bHasFontMatrix; // В CID фонтах возможно матрица фонта лежит в FD, а не в верхнем словаре + int nUniqueID; + double arrdFontBBox[4]; + double dStrokeWidth; + int nCharsetOffset; + int nEncodingOffset; + int nCharStringsOffset; + int nPrivateSize; + int nPrivateOffset; + + // CIDFont entries + int nRegistrySID; + int nOrderingSID; + int nSupplement; + int nFDArrayOffset; + int nFDSelectOffset; + }; + + + +#define type1CMaxBlueValues 14 +#define type1CMaxOtherBlues 10 +#define type1CMaxStemSnap 12 + + struct Type1CPrivateDict + { + double arrdFontMatrix[6]; + bool bHasFontMatrix; + int arrnBlueValues[type1CMaxBlueValues]; + int nBlueValues; + int arrnOtherBlues[type1CMaxOtherBlues]; + int nOtherBlues; + int arrnFamilyBlues[type1CMaxBlueValues]; + int nFamilyBlues; + int arrnFamilyOtherBlues[type1CMaxOtherBlues]; + int nFamilyOtherBlues; + double dBlueScale; + int nBlueShift; + int nBlueFuzz; + double dStdHW; + bool bHasStdHW; + double dStdVW; + bool bHasStdVW; + double arrdStemSnapH[type1CMaxStemSnap]; + int nStemSnapH; + double arrdStemSnapV[type1CMaxStemSnap]; + int nStemSnapV; + bool bForceBold; + bool bHasForceBold; + double dForceBoldThreshold; + int nLanguageGroup; + double dExpansionFactor; + int nInitialRandomSeed; + int nSubrsOffset; + double dDefaultWidthX; + bool bDefaultWidthXFP; + double dNominalWidthX; + bool bNominalWidthXFP; + }; + + struct Type1COperator + { + bool bIsNumber; // true -> number, false -> operator + bool bIsFloat; // true -> floating point number, false -> int + union + { + double dNumber; + int nOperator; + }; + }; + + struct Type1CEexecBuf + { + FontFileOutputFunc pOutputFunc; + void *pOutputStream; + bool bASKII; // ASCII кодировка? + unsigned short unEncryptionKey; // eexec encryption key + int nLine; // количество eexec-символов, оставшихся на текущей строке + }; + + //------------------------------------------------------------------------ + // CFontFileType1C + //------------------------------------------------------------------------ + + class CFontFileType1C : public CFontFileBase + { + + public: + + static CFontFileType1C *LoadFromBuffer(char *sBuffer, int nLen); + + static CFontFileType1C *LoadFromFile(wchar_t *wsFileName); + + virtual ~CFontFileType1C(); + + char *GetName(); + + // Возвращаем кодировку, как массив 256 имен (некоторые могут быть + // NULL). Используется только для 8-битных фонтов. + char **GetEncoding(); + + unsigned short *GetCIDToGIDMap(int *arrCIDs); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If is non-NULL, + // it will be used as the PostScript font name. + void ToType1(char *sPSName, char **ppNewEncoding, bool bASKII, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name. + void ToCIDType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name. + void ToType0(char *sPSName, FontFileOutputFunc pOutputFunc, void *pOutputStream); + + private: + + CFontFileType1C(char *sBuffer, int nLen, bool bFreeData); + void EexecConvertGlyph(Type1CEexecBuf *pEexecBuf, char *sGlyphName, int nOffset, int nBytes, Type1CIndex *pSubrIndex, Type1CPrivateDict *pDict); + void ConvertGlyph(int nOffset, int nBytes, StringExt *seCharBuffer, Type1CIndex *pSubrIndex, Type1CPrivateDict *pDict, bool bTop); + void ConvertGlyphWidth(bool bUseOperation, StringExt *seCharBuffer, Type1CPrivateDict *pDict); + void ConvertNum(double dValue, bool bIsFloat, StringExt *seCharBuffer); + void EexecWrite(Type1CEexecBuf *pEexecBuf, char *sBuffer); + void EexecWriteCharString(Type1CEexecBuf *pEexecBuf, unsigned char *sBuffer, int nLen); + bool Parse(); + void ReadTopDict(); + void ReadFD(int nOffset, int nLength, Type1CPrivateDict *pDict); + void ReadPrivateDict(int nOffset, int nLength, Type1CPrivateDict *pDict); + void ReadFDSelect(); + void BuildEncoding(); + bool ReadCharset(); + int GetOperator(int nPos, bool bCharString, bool *pbSuccess); + int GetDeltaIntArray(int *pArray, int nMaxLen); + int GetDeltaDoubleArray(double *pArray, int nMaxLen); + void GetIndex(int nPos, Type1CIndex *pIndex, bool *pbSuccess); + void GetIndexVal(Type1CIndex *pIndex, int nIndex, Type1CIndexVal *pIndexVal, bool *bSuccess); + char *GetString(int nSID, char *sBuffer, bool *pbSuccess); + + private: + + StringExt *m_seName; + char **m_arrEncoding; + + Type1CIndex m_oNameIndex; + Type1CIndex m_oTopDictIndex; + Type1CIndex m_oStringIndex; + Type1CIndex m_oGsubrIndex; + Type1CIndex m_oCharStringsIndex; + + Type1CTopDict m_oTopDict; + Type1CPrivateDict *m_pPrivateDicts; + + int m_nGlyphsCount; + int m_nFDsCount; + unsigned char *m_pnFDSelect; + unsigned short *m_pnCharset; + int m_nGsubrBias; + + bool m_bSuccessParsed; + + Type1COperator m_arrOperators[49]; + int m_nOperatorsCount; + int m_nHints; // для текущего символа + bool m_bFirstOperator; + bool m_bOpenPath; // true, если есть незакрытый пат + }; +} + +#endif // _PDF_READER_FONT_FILE_TYPE1C_H diff --git a/PdfReader/Src/Function.cpp b/PdfReader/Src/Function.cpp new file mode 100644 index 0000000000..b5b8428fda --- /dev/null +++ b/PdfReader/Src/Function.cpp @@ -0,0 +1,1867 @@ +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "Dict.h" +#include "Stream.h" +#include "Function.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Function + //------------------------------------------------------------------------ + + Function::Function() + { + } + + Function::~Function() + { + } + + Function *Function::Parse(Object *pFuncObject) + { + Dict *pDict; + + // Функция задается либо как словарь, либо поток, либо как тождественная функция + if (pFuncObject->IsStream()) + { + pDict = pFuncObject->StreamGetDict(); + } + else if (pFuncObject->IsDict()) + { + pDict = pFuncObject->GetDict(); + } + else if (pFuncObject->IsName("Identity")) + { + return new IdentityFunction(); + } + else + { + // TO DO: Error "Expected function dictionary or stream" + return NULL; + } + + Object oTemp; + if (!pDict->Search("FunctionType", &oTemp)->IsInt()) + { + // TO DO: Error "Function type is missing or wrong type" + oTemp.Free(); + return NULL; + } + int nFuncType = oTemp.GetInt(); + oTemp.Free(); + + Function *pFunc = NULL; + if (0 == nFuncType) // Sampled function + { + pFunc = new SampledFunction(pFuncObject, pDict); + } + else if (2 == nFuncType) // Exponential interpolation function + { + pFunc = new ExponentialFunction(pFuncObject, pDict); + } + else if (3 == nFuncType) // Stitching function + { + pFunc = new StitchingFunction(pFuncObject, pDict); + } + else if (4 == nFuncType) // PostScript calculator function + { + pFunc = new PostScriptFunction(pFuncObject, pDict); + } + else + { + // TO DO: Error "Unimplemented function type" + return NULL; + } + if (!pFunc->IsValid()) + { + delete pFunc; + return NULL; + } + + return pFunc; + } + + bool Function::Initialize(Dict *pDict) + { + Object oArray; + // Domain (Всегда должен присутствовать) + if (!pDict->Search("Domain", &oArray)->IsArray()) + { + // TO DO: Error "Function is missing domain" + oArray.Free(); + return false; + } + m_nInputDim = oArray.ArrayGetLength() / 2; + + if (m_nInputDim > funcMaxInputs) + { + // TO DO: Error "Functions with more than funcMaxInputs inputs are unsupported" + oArray.Free(); + return false; + } + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(2 * nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function domain array" + oTemp.Free(); + oArray.Free(); + return false; + } + m_arrDomain[nIndex][0] = oTemp.GetNum(); + oTemp.Free(); + oArray.ArrayGet(2 * nIndex + 1, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function domain array" + oTemp.Free(); + oArray.Free(); + return false; + } + m_arrDomain[nIndex][1] = oTemp.GetNum(); + oTemp.Free(); + } + oArray.Free(); + + // Range (Этого поля может и не быть) + m_bHasRange = false; + m_nOutputDim = 0; + if (pDict->Search("Range", &oArray)->IsArray()) + { + m_bHasRange = true; + m_nOutputDim = oArray.ArrayGetLength() / 2; + if (m_nOutputDim > funcMaxOutputs) + { + // TO DO: Error "Functions with more than funcMaxOutputs outputs are unsupported" + oArray.Free(); + return false; + } + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(2 * nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function range array" + oTemp.Free(); + oArray.Free(); + return false; + } + m_arrRange[nIndex][0] = oTemp.GetNum(); + oTemp.Free(); + oArray.ArrayGet(2 * nIndex + 1, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function range array" + oTemp.Free(); + oArray.Free(); + return false; + } + m_arrRange[nIndex][1] = oTemp.GetNum(); + oTemp.Free(); + } + } + oArray.Free(); + + return true; + } + + //------------------------------------------------------------------------ + // IdentityFunction + //------------------------------------------------------------------------ + + IdentityFunction::IdentityFunction() + { + // Заполняем произвольными значениями + m_nInputDim = funcMaxInputs; + m_nOutputDim = funcMaxOutputs; + + for (int nIndex = 0; nIndex < funcMaxInputs; ++nIndex) + { + m_arrDomain[nIndex][0] = 0; + m_arrDomain[nIndex][1] = 1; + } + m_bHasRange = false; + } + + IdentityFunction::~IdentityFunction() + { + } + + void IdentityFunction::Transform(double *pInput, double *pOutput) + { + for (int nIndex = 0; nIndex < funcMaxOutputs; ++nIndex) + { + pOutput[nIndex] = pInput[nIndex]; // тождественная же функция :) + } + } + + //------------------------------------------------------------------------ + // SampledFunction + //------------------------------------------------------------------------ + + SampledFunction::SampledFunction(Object *pFuncObject, Dict *pDict) + { + m_pSamples = NULL; + m_pBuffer = NULL; + m_bValid = false; + + if (!Initialize(pDict)) + { + return; + } + if (!m_bHasRange) + { + // TO DO: Error "Type 0 function is missing range" + return; + } + if (m_nInputDim > sampledFuncMaxInputs) + { + // TO DO: Error "Sampled functions with more than sampledFuncMaxInputs inputs are unsupported" + return; + } + + m_pBuffer = (double *)MemUtilsMallocArray(1 << m_nInputDim, sizeof(double)); + + if (!pFuncObject->IsStream()) + { + // TO DO: Error "Type 0 function isn't a stream" + return; + } + Stream *pStream = pFuncObject->GetStream(); + + // Size + Object oArray; + if (!pDict->Search("Size", &oArray)->IsArray() || oArray.ArrayGetLength() != m_nInputDim) + { + // TO DO: Error "Function has missing or invalid size array" + oArray.Free(); + return; + } + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(nIndex, &oTemp); + if (!oTemp.IsInt()) + { + // TO DO: Error "Illegal value in function size array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrSize[nIndex] = oTemp.GetInt(); + oTemp.Free(); + } + oArray.Free(); + + m_arrIndexMult[0] = m_nOutputDim; + for (int nIndex = 1; nIndex < m_nInputDim; ++nIndex) + { + m_arrIndexMult[nIndex] = m_arrIndexMult[nIndex - 1] * m_arrSize[nIndex - 1]; + } + + // BitsPerSample + if (!pDict->Search("BitsPerSample", &oArray)->IsInt()) + { + // TO DO: Error "Function has missing or invalid BitsPerSample" + oArray.Free(); + return; + } + int nSampleBits = oArray.GetInt(); + double dSampleMult = 1.0 / (pow(2.0, (double)nSampleBits) - 1); + oArray.Free(); + + // TO DO: Сделать чтение поля Order, и реализовать функцию Transform + + // Encode + if (pDict->Search("Encode", &oArray)->IsArray() && oArray.ArrayGetLength() == 2 * m_nInputDim) + { + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(2 * nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function encode array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrEncoder[nIndex][0] = oTemp.GetNum(); + oTemp.Free(); + + oArray.ArrayGet(2 * nIndex + 1, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function encode array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrEncoder[nIndex][1] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + m_arrEncoder[nIndex][0] = 0; + m_arrEncoder[nIndex][1] = m_arrSize[nIndex] - 1; + } + } + oArray.Free(); + + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + m_arrInputMult[nIndex] = (m_arrEncoder[nIndex][1] - m_arrEncoder[nIndex][0]) / (m_arrDomain[nIndex][1] - m_arrDomain[nIndex][0]); + } + + // Decode + if (pDict->Search("Decode", &oArray)->IsArray() && oArray.ArrayGetLength() == 2 * m_nOutputDim) + { + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(2 * nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function decode array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrDecoder[nIndex][0] = oTemp.GetNum(); + oTemp.Free(); + + oArray.ArrayGet(2 * nIndex + 1, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function decode array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrDecoder[nIndex][1] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + m_arrDecoder[nIndex][0] = m_arrRange[nIndex][0]; + m_arrDecoder[nIndex][1] = m_arrRange[nIndex][1]; + } + } + oArray.Free(); + + // Samples + m_nSamplesCount = m_nOutputDim; + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + m_nSamplesCount *= m_arrSize[nIndex]; + m_pSamples = (double *)MemUtilsMallocArray(m_nSamplesCount, sizeof(double)); + + unsigned int unBuf = 0; + int nBitsCount = 0; + unsigned int unBitMask = (1 << nSampleBits) - 1; + pStream->Reset(); + for (int nIndex = 0; nIndex < m_nSamplesCount; ++nIndex) + { + unsigned int unValue = 0; + if (nSampleBits == 8) + { + unValue = pStream->GetChar(); + } + else if (nSampleBits == 16) + { + unValue = pStream->GetChar(); + unValue = (unValue << 8) + pStream->GetChar(); + } + else if (nSampleBits == 32) + { + unValue = pStream->GetChar(); + unValue = (unValue << 8) + pStream->GetChar(); + unValue = (unValue << 8) + pStream->GetChar(); + unValue = (unValue << 8) + pStream->GetChar(); + } + else + { + while (nBitsCount < nSampleBits) + { + unBuf = (unBuf << 8) | (pStream->GetChar() & 0xff); + nBitsCount += 8; + } + unValue = (unBuf >> (nBitsCount - nSampleBits)) & unBitMask; + nBitsCount -= nSampleBits; + } + m_pSamples[nIndex] = (double)unValue * dSampleMult; + } + pStream->Close(); + + m_bValid = true; + return; + } + + SampledFunction::~SampledFunction() + { + MemUtilsFree(m_pSamples); + MemUtilsFree(m_pBuffer); + } + + SampledFunction::SampledFunction(SampledFunction *pFunc) + { + memcpy(this, pFunc, sizeof(SampledFunction)); + m_pSamples = (double *)MemUtilsMallocArray(m_nSamplesCount, sizeof(double)); + memcpy(m_pSamples, pFunc->m_pSamples, m_nSamplesCount * sizeof(double)); + m_pBuffer = (double *)MemUtilsMallocArray(1 << m_nInputDim, sizeof(double)); + } + + void SampledFunction::Transform(double *pInput, double *pOutput) + { + int arrE[funcMaxInputs][2]; + double arrEFrac0[funcMaxInputs]; + double arrEFrac1[funcMaxInputs]; + + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + double dValue = (pInput[nIndex] - m_arrDomain[nIndex][0]) * m_arrInputMult[nIndex] + m_arrEncoder[nIndex][0]; + if (dValue < 0) + { + dValue = 0; + } + else if (dValue > m_arrSize[nIndex] - 1) + { + dValue = m_arrSize[nIndex] - 1; + } + arrE[nIndex][0] = (int)dValue; + if ((arrE[nIndex][1] = arrE[nIndex][0] + 1) >= m_arrSize[nIndex]) + { + arrE[nIndex][1] = arrE[nIndex][0]; + } + arrEFrac1[nIndex] = dValue - arrE[nIndex][0]; + arrEFrac0[nIndex] = 1 - arrEFrac1[nIndex]; + } + + for (int nI = 0; nI < m_nOutputDim; ++nI) + { + for (int nJ = 0; nJ < (1 << m_nInputDim); ++nJ) + { + int nIdx = nI; + for (int nK = 0, t = nJ; nK < m_nInputDim; ++nK, t >>= 1) + { + nIdx += m_arrIndexMult[nK] * (arrE[nK][t & 1]); + } + m_pBuffer[nJ] = m_pSamples[nIdx]; + } + + int nT = 0; + for (int nJ = 0, nT = (1 << m_nInputDim); nJ < m_nInputDim; ++nJ, nT >>= 1) + { + for (int nK = 0; nK < nT; nK += 2) + { + m_pBuffer[nK >> 1] = arrEFrac0[nJ] * m_pBuffer[nK] + arrEFrac1[nJ] * m_pBuffer[nK + 1]; + } + } + + pOutput[nI] = m_pBuffer[0] * (m_arrDecoder[nI][1] - m_arrDecoder[nI][0]) + m_arrDecoder[nI][0]; + if (pOutput[nI] < m_arrRange[nI][0]) + { + pOutput[nI] = m_arrRange[nI][0]; + } + else if (pOutput[nI] > m_arrRange[nI][1]) + { + pOutput[nI] = m_arrRange[nI][1]; + } + } + } + + //------------------------------------------------------------------------ + // ExponentialFunction + //------------------------------------------------------------------------ + + ExponentialFunction::ExponentialFunction(Object *pFuncObject, Dict *pDict) + { + m_bValid = false; + + if (!Initialize(pDict)) + { + return; + } + if (m_nInputDim != 1) + { + // TO DO: Error "Exponential function with more than one input" + return; + } + + // C0 + Object oArray; + if (pDict->Search("C0", &oArray)->IsArray()) + { + if (m_bHasRange && oArray.ArrayGetLength() != m_nOutputDim) + { + // TO DO: Error "Function's C0 array is wrong length" + oArray.Free(); + return; + } + m_nOutputDim = oArray.ArrayGetLength(); + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function C0 array" + oArray.Free(); + oTemp.Free(); + return; + } + m_arrC0[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + if (m_bHasRange && m_nOutputDim != 1) + { + // TO DO: Error "Function's C0 array is wrong length" + oArray.Free(); + return; + } + m_nOutputDim = 1; + m_arrC0[0] = 0; + } + oArray.Free(); + + // C1 + if (pDict->Search("C1", &oArray)->IsArray()) + { + if (oArray.ArrayGetLength() != m_nOutputDim) + { + // TO DO: Error "Function's C1 array is wrong length" + oArray.Free(); + return; + } + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + Object oTemp; + oArray.ArrayGet(nIndex, &oTemp); + if (!oTemp.IsNum()) + { + // TO DO: Error "Illegal value in function C1 array" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrC1[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + if (m_nOutputDim != 1) + { + // TO DO: Error "Function's C1 array is wrong length" + oArray.Free(); + return; + } + m_arrC1[0] = 1; + } + oArray.Free(); + + // N (exponent) + if (!pDict->Search("N", &oArray)->IsNum()) + { + // TO DO: Error "Function has missing or invalid N" + oArray.Free(); + return; + } + m_dN = oArray.GetNum(); + oArray.Free(); + + m_bValid = true; + return; + } + + ExponentialFunction::~ExponentialFunction() + { + } + + ExponentialFunction::ExponentialFunction(ExponentialFunction *pFunc) + { + memcpy(this, pFunc, sizeof(ExponentialFunction)); + } + + void ExponentialFunction::Transform(double *pInput, double *pOutput) + { + double dX = 0; + + if (pInput[0] < m_arrDomain[0][0]) + { + dX = m_arrDomain[0][0]; + } + else if (pInput[0] > m_arrDomain[0][1]) + { + dX = m_arrDomain[0][1]; + } + else + { + dX = pInput[0]; + } + for (int nIndex = 0; nIndex < m_nOutputDim; ++nIndex) + { + pOutput[nIndex] = m_arrC0[nIndex] + pow(dX, m_dN) * (m_arrC1[nIndex] - m_arrC0[nIndex]); + if (m_bHasRange) + { + if (pOutput[nIndex] < m_arrRange[nIndex][0]) + { + pOutput[nIndex] = m_arrRange[nIndex][0]; + } + else if (pOutput[nIndex] > m_arrRange[nIndex][1]) + { + pOutput[nIndex] = m_arrRange[nIndex][1]; + } + } + } + return; + } + + //------------------------------------------------------------------------ + // StitchingFunction + //------------------------------------------------------------------------ + + StitchingFunction::StitchingFunction(Object *pFuncObject, Dict *pDict) + { + m_bValid = false; + m_ppFuncs = NULL; + m_arrBounds = NULL; + m_arrEncode = NULL; + m_arrScale = NULL; + + if (!Initialize(pDict)) + { + return; + } + + if (m_nInputDim != 1) + { + // TO DO: Error "Stitching function with more than one input" + return; + } + + // Functions + Object oArray; + if (!pDict->Search("Functions", &oArray)->IsArray()) + { + // TO DO: Error "Missing 'Functions' entry in stitching function" + oArray.Free(); + return; + } + + m_nCount = oArray.ArrayGetLength(); + m_ppFuncs = (Function**)MemUtilsMallocArray(m_nCount, sizeof(Function *)); + m_arrBounds = (double *)MemUtilsMallocArray(m_nCount + 1, sizeof(double)); + m_arrEncode = (double *)MemUtilsMallocArray(2 * m_nCount, sizeof(double)); + m_arrScale = (double *)MemUtilsMallocArray(m_nCount, sizeof(double)); + + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + { + m_ppFuncs[nIndex] = NULL; + } + + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + { + Object oTemp; + if (!(m_ppFuncs[nIndex] = Function::Parse(oArray.ArrayGet(nIndex, &oTemp)))) + { + oTemp.Free(); + oArray.Free(); + return; + } + + if (nIndex > 0 && (m_ppFuncs[nIndex]->GetInputSize() != 1 || m_ppFuncs[nIndex]->GetOutputSize() != m_ppFuncs[0]->GetOutputSize())) + { + // TO DO: Error "Incompatible subfunctions in stitching function" + oTemp.Free(); + oArray.Free(); + return; + } + oTemp.Free(); + } + oArray.Free(); + + // Bounds + if (!pDict->Search("Bounds", &oArray)->IsArray() || oArray.ArrayGetLength() != m_nCount - 1) + { + // TO DO: Error "Missing or invalid 'Bounds' entry in stitching function" + oArray.Free(); + return; + } + m_arrBounds[0] = m_arrDomain[0][0]; + for (int nIndex = 1; nIndex < m_nCount; ++nIndex) + { + Object oTemp; + if (!oArray.ArrayGet(nIndex - 1, &oTemp)->IsNum()) + { + // TO DO: Error "Invalid type in 'Bounds' array in stitching function" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrBounds[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + m_arrBounds[m_nCount] = m_arrDomain[0][1]; + oArray.Free(); + + // Encode + if (!pDict->Search("Encode", &oArray)->IsArray() || oArray.ArrayGetLength() != 2 * m_nCount) + { + // TO DO: Error "Missing or invalid 'Encode' entry in stitching function" + oArray.Free(); + return; + } + + for (int nIndex = 0; nIndex < 2 * m_nCount; ++nIndex) + { + Object oTemp; + if (!oArray.ArrayGet(nIndex, &oTemp)->IsNum()) + { + // TO DO: Error "Invalid type in 'Encode' array in stitching function" + oTemp.Free(); + oArray.Free(); + return; + } + m_arrEncode[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + oArray.Free(); + + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + { + if (m_arrBounds[nIndex] == m_arrBounds[nIndex + 1]) + { + // Чтобы избежать деление на 0, в данном случае функция с номером nIndex не будет использоваться + m_arrScale[nIndex] = 0; + } + else + { + m_arrScale[nIndex] = (m_arrEncode[2 * nIndex + 1] - m_arrEncode[2 * nIndex]) / (m_arrBounds[nIndex + 1] - m_arrBounds[nIndex]); + } + } + + m_bValid = true; + return; + } + + StitchingFunction::StitchingFunction(StitchingFunction *pFunc) + { + m_nCount = pFunc->m_nCount; + m_ppFuncs = (Function **)MemUtilsMallocArray(m_nCount, sizeof(Function *)); + + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + { + m_ppFuncs[nIndex] = pFunc->m_ppFuncs[nIndex]->Copy(); + } + + m_arrBounds = (double *)MemUtilsMallocArray(m_nCount + 1, sizeof(double)); + memcpy(m_arrBounds, pFunc->m_arrBounds, (m_nCount + 1) * sizeof(double)); + + m_arrEncode = (double *)MemUtilsMallocArray(2 * m_nCount, sizeof(double)); + memcpy(m_arrEncode, pFunc->m_arrEncode, 2 * m_nCount * sizeof(double)); + + m_arrScale = (double *)MemUtilsMallocArray(m_nCount, sizeof(double)); + memcpy(m_arrScale, pFunc->m_arrScale, m_nCount * sizeof(double)); + + m_bValid = true; + } + + StitchingFunction::~StitchingFunction() + { + if (m_ppFuncs) + { + for (int nIndex = 0; nIndex < m_nCount; ++nIndex) + { + delete m_ppFuncs[nIndex]; + } + } + MemUtilsFree(m_ppFuncs); + MemUtilsFree(m_arrBounds); + MemUtilsFree(m_arrEncode); + MemUtilsFree(m_arrScale); + } + + void StitchingFunction::Transform(double *pInput, double *pOutput) + { + double dX; + + if (pInput[0] < m_arrDomain[0][0]) + { + dX = m_arrDomain[0][0]; + } + else if (pInput[0] > m_arrDomain[0][1]) + { + dX = m_arrDomain[0][1]; + } + else + { + dX = pInput[0]; + } + + int nIndex = 0; + for (nIndex = 0; nIndex < m_nCount - 1; ++nIndex) + { + if (dX < m_arrBounds[nIndex + 1]) + { + break; + } + } + dX = m_arrEncode[2 * nIndex] + (dX - m_arrBounds[nIndex]) * m_arrScale[nIndex]; + m_ppFuncs[nIndex]->Transform(&dX, pOutput); + } + + //------------------------------------------------------------------------ + // PostScriptFunction + //------------------------------------------------------------------------ + + enum PSOperations + { + psOperationAbs, + psOperationAdd, + psOperationAnd, + psOperationAtan, + psOperationBitshift, + psOperationCeiling, + psOperationCopy, + psOperationCos, + psOperationCvi, + psOperationCvr, + psOperationDiv, + psOperationDup, + psOperationEq, + psOperationExch, + psOperationExp, + psOperationFalse, + psOperationFloor, + psOperationGe, + psOperationGt, + psOperationIdiv, + psOperationIndex, + psOperationLe, + psOperationLn, + psOperationLog, + psOperationLt, + psOperationMod, + psOperationMul, + psOperationNe, + psOperationNeg, + psOperationNot, + psOperationOr, + psOperationPop, + psOperationRoll, + psOperationRound, + psOperationSin, + psOperationSqrt, + psOperationSub, + psOperationTrue, + psOperationTruncate, + psOperationXor, + psOperationIf, + psOperationIfelse, + psOperationReturn + }; + + // Список идет в алфавитном порядке. Номер элемента здесь, соответствует + // операции в перечисляемом типе PSOperations + char *c_sPSOperationNames[] = + { + "abs", + "add", + "and", + "atan", + "bitshift", + "ceiling", + "copy", + "cos", + "cvi", + "cvr", + "div", + "dup", + "eq", + "exch", + "exp", + "false", + "floor", + "ge", + "gt", + "idiv", + "index", + "le", + "ln", + "log", + "lt", + "mod", + "mul", + "ne", + "neg", + "not", + "or", + "pop", + "roll", + "round", + "sin", + "sqrt", + "sub", + "true", + "truncate", + "xor" + }; + +#define PSOperationsCount (sizeof(c_sPSOperationNames) / sizeof(char *)) + + enum PSObjectType + { + psBool, + psInt, + psReal, + psOperator, + psBlock + }; + + // В потоке, операторы 'if'/'ifelse' занимают три слота. + // + // +---------------------------------+ + // | psOperator: If / Ifelse | + // +---------------------------------+ + // | psBlock: указатель = | + // +---------------------------------+ + // | psBlock: указатель = | + // +---------------------------------+ + // | if | + // | ... | + // | psOperator: Return | + // +---------------------------------+ + // | else | + // | ... | + // | psOperator: Return | + // +---------------------------------+ + // | ... | + // + // Если оператор = 'if', указатель все задан, но не используется + + struct PSObject + { + PSObjectType eType; + union + { + bool uBool; // boolean (stack only) + int uInt; // integer (stack and code) + double uReal; // real (stack and code) + PSOperations uOperation; // operator (code only) + int uBlock; // if/ifelse block pointer (code only) + }; + }; + +#define psStackSize 100 + + class PSStack + { + public: + + PSStack() + { + m_nStackSize = psStackSize; + } + void PushBool(bool bBool) + { + if (CheckOverflow()) + { + m_arrStack[--m_nStackSize].eType = psBool; + m_arrStack[m_nStackSize].uBool = bBool; + } + } + + void PushInt(int nInteger) + { + if (CheckOverflow()) + { + m_arrStack[--m_nStackSize].eType = psInt; + m_arrStack[m_nStackSize].uInt = nInteger; + } + } + + void PushReal(double dReal) + { + if (CheckOverflow()) + { + m_arrStack[--m_nStackSize].eType = psReal; + m_arrStack[m_nStackSize].uReal = dReal; + } + } + + bool PopBool() + { + if (CheckUnderflow() && CheckType(psBool, psBool)) + { + return m_arrStack[m_nStackSize++].uBool; + } + return false; + } + + int PopInt() + { + if (CheckUnderflow() && CheckType(psInt, psInt)) + { + return m_arrStack[m_nStackSize++].uInt; + } + return 0; + } + + double PopNum() + { + if (CheckUnderflow() && CheckType(psInt, psReal)) + { + double dReturn = (m_arrStack[m_nStackSize].eType == psInt) ? (double)m_arrStack[m_nStackSize].uInt : m_arrStack[m_nStackSize].uReal; + ++m_nStackSize; + return dReturn; + } + return 0; + } + + bool Empty() + { + return m_nStackSize == psStackSize; + } + bool TopIsInt() + { + return m_nStackSize < psStackSize && m_arrStack[m_nStackSize].eType == psInt; + } + bool TopTwoAreInts() + { + return m_nStackSize < psStackSize - 1 && m_arrStack[m_nStackSize].eType == psInt && m_arrStack[m_nStackSize + 1].eType == psInt; + } + bool TopIsReal() + { + return m_nStackSize < psStackSize && m_arrStack[m_nStackSize].eType == psReal; + } + bool TopTwoAreNums() + { + return m_nStackSize < psStackSize - 1 && (m_arrStack[m_nStackSize].eType == psInt || m_arrStack[m_nStackSize].eType == psReal) && (m_arrStack[m_nStackSize + 1].eType == psInt || m_arrStack[m_nStackSize + 1].eType == psReal); + } + + void Copy(int nCount) + { + if (m_nStackSize + nCount > psStackSize) + { + // TO DO: Error "Stack underflow in PostScript function" + return; + } + if (!CheckOverflow(nCount)) + { + return; + } + for (int nIndex = m_nStackSize + nCount - 1; nIndex >= m_nStackSize; --nIndex) + { + m_arrStack[nIndex - nCount] = m_arrStack[nIndex]; + } + m_nStackSize -= nCount; + } + + void Roll(int n, int j) + { + int i, k; + + if (j >= 0) + { + j %= n; + } + else + { + j = -j % n; + if (j != 0) + { + j = n - j; + } + } + if (n <= 0 || j == 0) + { + return; + } + for (i = 0; i < j; ++i) + { + PSObject oPSObject = m_arrStack[m_nStackSize]; + for (k = m_nStackSize; k < m_nStackSize + n - 1; ++k) + { + m_arrStack[k] = m_arrStack[k + 1]; + } + m_arrStack[m_nStackSize + n - 1] = oPSObject; + } + } + + void Index(int nIndex) + { + if (!CheckOverflow()) + { + return; + } + --m_nStackSize; + m_arrStack[m_nStackSize] = m_arrStack[m_nStackSize + 1 + nIndex]; + } + + void Pop() + { + if (!CheckUnderflow()) + { + return; + } + ++m_nStackSize; + } + + + private: + + bool CheckOverflow(int nCount = 1) + { + if (m_nStackSize - nCount < 0) + { + // TO DO: Error "Stack overflow in PostScript function" + return false; + } + return true; + } + + bool CheckUnderflow() + { + if (m_nStackSize == psStackSize) + { + // TO DO: Error "Stack underflow in PostScript function" + return false; + } + return true; + } + + bool CheckType(PSObjectType eType1, PSObjectType eType2) + { + if (m_arrStack[m_nStackSize].eType != eType1 && m_arrStack[m_nStackSize].eType != eType2) + { + // TO DO: Error "Type mismatch in PostScript function" + return false; + } + return true; + } + + private: + + PSObject m_arrStack[psStackSize]; + int m_nStackSize; + }; + + PostScriptFunction::PostScriptFunction(Object *pFuncObject, Dict *pDict) + { + m_pCode = NULL; + m_nCodeSize = 0; + m_bValid = false; + + if (!Initialize(pDict)) + { + return; + } + if (!m_bHasRange) + { + // TO DO: Error "Type 4 function is missing range" + return; + } + + if (!pFuncObject->IsStream()) + { + // TO DO: Error "Type 4 function isn't a stream" + return; + } + Stream *pStream = pFuncObject->GetStream(); + + //----- parse the function + m_seCodeString = new StringExt(); + pStream->Reset(); + + StringExt *seToken; + if (!(seToken = GetToken(pStream)) || seToken->Compare("{")) + { + // TO DO: Error "Expected '{' at start of PostScript function" + MemUtilsFree(seToken); + pStream->Close(); + return; + } + if (seToken) + delete seToken; + int nCodePos = 0; + if (!ParseCode(pStream, &nCodePos)) + { + pStream->Close(); + return; + } + pStream->Close(); + + m_bValid = true; + } + + PostScriptFunction::PostScriptFunction(PostScriptFunction *pFunc) + { + memcpy(this, pFunc, sizeof(PostScriptFunction)); + m_pCode = (PSObject *)MemUtilsMallocArray(m_nCodeSize, sizeof(PSObject)); + memcpy(m_pCode, pFunc->m_pCode, m_nCodeSize * sizeof(PSObject)); + m_seCodeString = pFunc->m_seCodeString->Copy(); + } + + PostScriptFunction::~PostScriptFunction() + { + MemUtilsFree(m_pCode); + if (m_seCodeString) + delete m_seCodeString; + } + + void PostScriptFunction::Transform(double *pInput, double *pOutput) + { + PSStack *pStack = new PSStack(); + if (!pStack) + return; + + for (int nIndex = 0; nIndex < m_nInputDim; ++nIndex) + { + pStack->PushReal(pInput[nIndex]); + } + Exec(pStack, 0); + + for (int nIndex = m_nOutputDim - 1; nIndex >= 0; --nIndex) + { + pOutput[nIndex] = pStack->PopNum(); + if (pOutput[nIndex] < m_arrRange[nIndex][0]) + { + pOutput[nIndex] = m_arrRange[nIndex][0]; + } + else if (pOutput[nIndex] > m_arrRange[nIndex][1]) + { + pOutput[nIndex] = m_arrRange[nIndex][1]; + } + } + delete pStack; + } + + bool PostScriptFunction::ParseCode(Stream *pStream, int *pnCodePos) + { + StringExt *seToken; + + while (1) + { + if (!(seToken = GetToken(pStream))) + { + // TO DO: Error "Unexpected end of PostScript function stream" + return false; + } + if (!seToken) + return false; + + char *pCurChar = seToken->GetBuffer(); + + if (isdigit(*pCurChar) || *pCurChar == '.' || *pCurChar == '-') + { + bool bReal = false; + for (++pCurChar; *pCurChar; ++pCurChar) + { + if (*pCurChar == '.') + { + bReal = true; + break; + } + } + ResizeCode(*pnCodePos); + if (bReal) + { + m_pCode[*pnCodePos].eType = psReal; + m_pCode[*pnCodePos].uReal = atof(seToken->GetBuffer()); + } + else + { + m_pCode[*pnCodePos].eType = psInt; + m_pCode[*pnCodePos].uInt = atoi(seToken->GetBuffer()); + } + ++*pnCodePos; + delete seToken; + } + else if (!seToken->Compare("{")) + { + delete seToken; + int nOperatorPos = *pnCodePos; + int nElsePos = 0; + *pnCodePos += 3; + ResizeCode(nOperatorPos + 2); + if (!ParseCode(pStream, pnCodePos)) + { + return false; + } + if (!(seToken = GetToken(pStream))) + { + // TO DO: Error "Unexpected end of PostScript function stream" + return false; + } + if (!seToken->Compare("{")) + { + nElsePos = *pnCodePos; + if (!ParseCode(pStream, pnCodePos)) + { + return false; + } + delete seToken; + if (!(seToken = GetToken(pStream))) + { + // TO DO: Error "Unexpected end of PostScript function stream" + return false; + } + } + else + { + nElsePos = -1; + } + if (!seToken->Compare("if")) + { + if (nElsePos >= 0) + { + // TO DO: Error "Got 'if' operator with two blocks in PostScript function" + return false; + } + m_pCode[nOperatorPos].eType = psOperator; + m_pCode[nOperatorPos].uOperation = psOperationIf; + m_pCode[nOperatorPos + 2].eType = psBlock; + m_pCode[nOperatorPos + 2].uBlock = *pnCodePos; + } + else if (!seToken->Compare("ifelse")) + { + if (nElsePos < 0) + { + // TO DO: Error "Got 'ifelse' operator with one blocks in PostScript function" + return false; + } + m_pCode[nOperatorPos].eType = psOperator; + m_pCode[nOperatorPos].uOperation = psOperationIfelse; + m_pCode[nOperatorPos + 1].eType = psBlock; + m_pCode[nOperatorPos + 1].uBlock = nElsePos; + m_pCode[nOperatorPos + 2].eType = psBlock; + m_pCode[nOperatorPos + 2].uBlock = *pnCodePos; + } + else + { + // TO DO: Error "Expected if/ifelse operator in PostScript function" + delete seToken; + return false; + } + delete seToken; + } + else if (!seToken->Compare("}")) + { + delete seToken; + ResizeCode(*pnCodePos); + m_pCode[*pnCodePos].eType = psOperator; + m_pCode[*pnCodePos].uOperation = psOperationReturn; + ++*pnCodePos; + break; + } + else + { + int nFirst = -1; + int nSecond = PSOperationsCount; + // invariant: psOpNames[a] < tok < psOpNames[b] + int nCompareRes = 0; + while (nSecond - nFirst > 1) + { + int nMiddle = (nFirst + nSecond) / 2; + nCompareRes = seToken->Compare(c_sPSOperationNames[nMiddle]); + if (nCompareRes > 0) + { + nFirst = nMiddle; + } + else if (nCompareRes < 0) + { + nSecond = nMiddle; + } + else + { + nFirst = nSecond = nMiddle; + } + } + if (nCompareRes != 0) + { + // TO DO: Error "Unknown operator in PostScript function" + delete seToken; + return false; + } + delete seToken; + ResizeCode(*pnCodePos); + m_pCode[*pnCodePos].eType = psOperator; + m_pCode[*pnCodePos].uOperation = (PSOperations)nFirst; + ++*pnCodePos; + } + } + return true; + } + + StringExt *PostScriptFunction::GetToken(Stream *pStream) + { + int nChar = 0; + + StringExt *seResult = new StringExt(); + bool bComment = false; + + while (1) + { + if ((nChar = pStream->GetChar()) == EOF) + { + break; + } + m_seCodeString->Append(nChar); + if (bComment) + { + if (nChar == '\x0a' || nChar == '\x0d') + { + bComment = false; + } + } + else if (nChar == '%') + { + bComment = true; + } + else if (!isspace(nChar)) + { + break; + } + } + if (nChar == '{' || nChar == '}') + { + seResult->Append((char)nChar); + } + else if (isdigit(nChar) || nChar == '.' || nChar == '-') + { + while (1) + { + seResult->Append((char)nChar); + nChar = pStream->LookChar(); + if (nChar == EOF || !(isdigit(nChar) || nChar == '.' || nChar == '-')) + { + break; + } + pStream->GetChar(); + m_seCodeString->Append(nChar); + } + } + else + { + while (1) + { + seResult->Append((char)nChar); + nChar = pStream->LookChar(); + if (nChar == EOF || !isalnum(nChar)) + { + break; + } + pStream->GetChar(); + m_seCodeString->Append(nChar); + } + } + return seResult; + } + + void PostScriptFunction::ResizeCode(int nNewSize) + { + if (nNewSize >= m_nCodeSize) + { + m_nCodeSize += 64; + m_pCode = (PSObject *)MemUtilsReallocArray(m_pCode, m_nCodeSize, sizeof(PSObject)); + } + } + + void PostScriptFunction::Exec(PSStack *pStack, int codePtr) + { + int nInteger1 = 0, nInteger2 = 0; + double dReal1 = 0, dReal2 = 0; + bool bBool1 = false, bBool2 = false; + + while (1) + { + switch (m_pCode[codePtr].eType) + { + case psInt: + pStack->PushInt(m_pCode[codePtr++].uInt); + break; + case psReal: + pStack->PushReal(m_pCode[codePtr++].uReal); + break; + case psOperator: + switch (m_pCode[codePtr++].uOperation) + { + case psOperationAbs: + if (pStack->TopIsInt()) + { + pStack->PushInt(abs(pStack->PopInt())); + } + else + { + pStack->PushReal(fabs(pStack->PopNum())); + } + break; + case psOperationAdd: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 + nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(dReal1 + dReal2); + } + break; + case psOperationAnd: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 & nInteger2); + } + else + { + bBool2 = pStack->PopBool(); + bBool1 = pStack->PopBool(); + pStack->PushBool(bBool1 && bBool2); + } + break; + case psOperationAtan: + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(atan2(dReal1, dReal2)); + break; + case psOperationBitshift: + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + if (nInteger2 > 0) + { + pStack->PushInt(nInteger1 << nInteger2); + } + else if (nInteger2 < 0) + { + pStack->PushInt((int)((unsigned int)nInteger1 >> nInteger2)); + } + else + { + pStack->PushInt(nInteger1); + } + break; + case psOperationCeiling: + if (!pStack->TopIsInt()) + { + pStack->PushReal(ceil(pStack->PopNum())); + } + break; + case psOperationCopy: + pStack->Copy(pStack->PopInt()); + break; + case psOperationCos: + pStack->PushReal(cos(pStack->PopNum())); + break; + case psOperationCvi: + if (!pStack->TopIsInt()) + { + pStack->PushInt((int)pStack->PopNum()); + } + break; + case psOperationCvr: + if (!pStack->TopIsReal()) + { + pStack->PushReal(pStack->PopNum()); + } + break; + case psOperationDiv: + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(dReal1 / dReal2); + break; + case psOperationDup: + pStack->Copy(1); + break; + case psOperationEq: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 == nInteger2); + } + else if (pStack->TopTwoAreNums()) + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 == dReal2); + } + else + { + bBool2 = pStack->PopBool(); + bBool1 = pStack->PopBool(); + pStack->PushBool(bBool1 == bBool2); + } + break; + case psOperationExch: + pStack->Roll(2, 1); + break; + case psOperationExp: + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(pow(dReal1, dReal2)); + break; + case psOperationFalse: + pStack->PushBool(false); + break; + case psOperationFloor: + if (!pStack->TopIsInt()) + { + pStack->PushReal(floor(pStack->PopNum())); + } + break; + case psOperationGe: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 >= nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 >= dReal2); + } + break; + case psOperationGt: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 > nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 > dReal2); + } + break; + case psOperationIdiv: + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 / nInteger2); + break; + case psOperationIndex: + pStack->Index(pStack->PopInt()); + break; + case psOperationLe: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 <= nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 <= dReal2); + } + break; + case psOperationLn: + pStack->PushReal(log(pStack->PopNum())); + break; + case psOperationLog: + pStack->PushReal(log10(pStack->PopNum())); + break; + case psOperationLt: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 < nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 < dReal2); + } + break; + case psOperationMod: + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 % nInteger2); + break; + case psOperationMul: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + //~ should check for out-of-range, and push a real instead + pStack->PushInt(nInteger1 * nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(dReal1 * dReal2); + } + break; + case psOperationNe: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushBool(nInteger1 != nInteger2); + } + else if (pStack->TopTwoAreNums()) + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushBool(dReal1 != dReal2); + } + else + { + bBool2 = pStack->PopBool(); + bBool1 = pStack->PopBool(); + pStack->PushBool(bBool1 != bBool2); + } + break; + case psOperationNeg: + if (pStack->TopIsInt()) + { + pStack->PushInt(-pStack->PopInt()); + } + else + { + pStack->PushReal(-pStack->PopNum()); + } + break; + case psOperationNot: + if (pStack->TopIsInt()) + { + pStack->PushInt(~pStack->PopInt()); + } + else + { + pStack->PushBool(!pStack->PopBool()); + } + break; + case psOperationOr: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 | nInteger2); + } + else + { + bBool2 = pStack->PopBool(); + bBool1 = pStack->PopBool(); + pStack->PushBool(bBool1 || bBool2); + } + break; + case psOperationPop: + pStack->Pop(); + break; + case psOperationRoll: + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->Roll(nInteger1, nInteger2); + break; + case psOperationRound: + if (!pStack->TopIsInt()) + { + dReal1 = pStack->PopNum(); + pStack->PushReal((dReal1 >= 0) ? floor(dReal1 + 0.5) : ceil(dReal1 - 0.5)); + } + break; + case psOperationSin: + pStack->PushReal(sin(pStack->PopNum())); + break; + case psOperationSqrt: + pStack->PushReal(sqrt(pStack->PopNum())); + break; + case psOperationSub: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 - nInteger2); + } + else + { + dReal2 = pStack->PopNum(); + dReal1 = pStack->PopNum(); + pStack->PushReal(dReal1 - dReal2); + } + break; + case psOperationTrue: + pStack->PushBool(true); + break; + case psOperationTruncate: + if (!pStack->TopIsInt()) + { + dReal1 = pStack->PopNum(); + pStack->PushReal((dReal1 >= 0) ? floor(dReal1) : ceil(dReal1)); + } + break; + case psOperationXor: + if (pStack->TopTwoAreInts()) + { + nInteger2 = pStack->PopInt(); + nInteger1 = pStack->PopInt(); + pStack->PushInt(nInteger1 ^ nInteger2); + } + else + { + bBool2 = pStack->PopBool(); + bBool1 = pStack->PopBool(); + pStack->PushBool(bBool1 ^ bBool2); + } + break; + case psOperationIf: + bBool1 = pStack->PopBool(); + if (bBool1) + { + Exec(pStack, codePtr + 2); + } + codePtr = m_pCode[codePtr + 1].uBlock; + break; + case psOperationIfelse: + bBool1 = pStack->PopBool(); + if (bBool1) + { + Exec(pStack, codePtr + 2); + } + else + { + Exec(pStack, m_pCode[codePtr].uBlock); + } + codePtr = m_pCode[codePtr + 1].uBlock; + break; + case psOperationReturn: + return; + } + break; + default: + // TO DO: Error "Internal: bad object in PostScript function code" + break; + } + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/Function.h b/PdfReader/Src/Function.h new file mode 100644 index 0000000000..b477517fef --- /dev/null +++ b/PdfReader/Src/Function.h @@ -0,0 +1,352 @@ +#ifndef _PDF_READER_FUNCTION_H +#define _PDF_READER_FUNCTION_H + +#include "Object.h" + +namespace PdfReader +{ + class Dict; + class Stream; + struct PSObject; + class PSStack; + + //------------------------------------------------------------------------ + // Function + //------------------------------------------------------------------------ + +#define funcMaxInputs 32 +#define funcMaxOutputs 32 +#define sampledFuncMaxInputs 16 + + class Function + { + public: + + Function(); + + virtual ~Function(); + + static Function *Parse(Object *pFuncObject); + + // Заполняем Domain и Range + bool Initialize(Dict *pDict); + + virtual Function *Copy() = 0; + + // Типы функций + // -1 : identity + // 0 : sampled + // 2 : exponential + // 3 : stitching + // 4 : PostScript + virtual int GetType() = 0; + + int GetInputSize() + { + return m_nInputDim; + } + int GetOutputSize() + { + return m_nOutputDim; + } + + double GetDomainMin(int nIndex) + { + return m_arrDomain[nIndex][0]; + } + double GetDomainMax(int nIndex) + { + return m_arrDomain[nIndex][1]; + } + double GetRangeMin(int nIndex) + { + return m_arrRange[nIndex][0]; + } + double GetRangeMax(int nIndex) + { + return m_arrRange[nIndex][1]; + } + bool HasRange() + { + return m_bHasRange; + } + + // Собственно, работа самой функции. pInput - набор входящих параметров, pOutput - выходящие значения. + virtual void Transform(double *pInput, double *pOutput) = 0; + + virtual bool IsValid() = 0; + + protected: + + + int m_nInputDim; // Function: R^(InputDim) -> R^(OutputDim) + int m_nOutputDim; // + double m_arrDomain[funcMaxInputs][2]; // Минимум и максимум для каждой входящей переменной + double m_arrRange[funcMaxOutputs][2]; // Минимум и максимум для каждого выходящего параметра + bool m_bHasRange; // Domain должен быть задан всегда, а Range может отсутствовать + }; + + //------------------------------------------------------------------------ + // IdentityFunction + //------------------------------------------------------------------------ + + class IdentityFunction : public Function + { + public: + + IdentityFunction(); + virtual ~IdentityFunction(); + virtual Function *Copy() + { + return new IdentityFunction(); + } + virtual int GetType() + { + return -1; + } + virtual void Transform(double *pInput, double *pOutput); + virtual bool IsValid() + { + return true; + } + + private: + }; + + //------------------------------------------------------------------------ + // SampledFunction (Type0 Function) + //------------------------------------------------------------------------ + + // На самом деле это аппроксимационная функция. Здесь должны быть заданы + // точки и значения функции в данных точках, и тогда данная функция + // воспринимается как аппромаксионная функция по заданным значениям, причем + // аппрокимация зависит от поля Order, 1 - линейная интерполяция, + // 3 - интерполяция. + + // Пока реализована только линейная интерполяция. + class SampledFunction : public Function + { + public: + + SampledFunction(Object *pFuncObject, Dict *pDict); + virtual ~SampledFunction(); + virtual Function *Copy() + { + return new SampledFunction(this); + } + virtual int GetType() + { + return 0; + } + virtual void Transform(double *pInput, double *pOutput); + virtual bool IsValid() + { + return m_bValid; + } + + + int GetSampleSize(int nIndex) + { + return m_arrSize[nIndex]; + } + double GetEncodeMin(int nIndex) + { + return m_arrEncoder[nIndex][0]; + } + double GetEncodeMax(int nIndex) + { + return m_arrEncoder[nIndex][1]; + } + double GetDecodeMin(int nIndex) + { + return m_arrDecoder[nIndex][0]; + } + double GetDecodeMax(int nIndex) + { + return m_arrDecoder[nIndex][1]; + } + double *GetSamples() + { + return m_pSamples; + } + + private: + + SampledFunction(SampledFunction *pFunc); + + private: + + int m_arrSize[funcMaxInputs]; // Количество различных значений, которые может принимать данный параметр + double m_arrEncoder[funcMaxInputs][2]; // Минимум и максимум для Domain encoder + double m_arrDecoder[funcMaxOutputs][2]; // Минимум и максимум для Range decoder + double m_arrInputMult[funcMaxInputs]; // + int m_arrIndexMult[funcMaxInputs]; // + double *m_pSamples; // Собственно сами значения + int m_nSamplesCount; // Количество заданных значений + double *m_pBuffer; // Буфер для функции преобразования + + bool m_bValid; + }; + + //------------------------------------------------------------------------ + // ExponentialFunction + //------------------------------------------------------------------------ + + class ExponentialFunction : public Function + { + public: + + ExponentialFunction(Object *pFuncObject, Dict *pDict); + virtual ~ExponentialFunction(); + virtual Function *Copy() + { + return new ExponentialFunction(this); + } + virtual int GetType() + { + return 2; + } + virtual void Transform(double *pInput, double *pOutput); + virtual bool IsValid() + { + return m_bValid; + } + + double *GetC0() + { + return m_arrC0; + } + double *GetC1() + { + return m_arrC1; + } + double GetN() + { + return m_dN; + } + + private: + + ExponentialFunction(ExponentialFunction *pFunc); + + private: + + double m_arrC0[funcMaxOutputs]; + double m_arrC1[funcMaxOutputs]; + double m_dN; + + bool m_bValid; + }; + + //------------------------------------------------------------------------ + // StitchingFunction + //------------------------------------------------------------------------ + + // Кусочная функция. В массиве m_arrBounds задаются точки деления исходного + // отрезка. Domain0 < Bounds0 < Bounds1 < ... < Bounds(K - 2) < Domain1. + // i-ая функция задана на полуинтервале [ Bounds(i - 1), Bounds(i) ), + // где Bounds(-1) = Domain0, Bound(k-1) = Domain1 (услованая запись, в массиве + // m_arrBounds эти значения не входят). + class StitchingFunction : public Function + { + public: + + StitchingFunction(Object *pFuncObject, Dict *pDict); + virtual ~StitchingFunction(); + virtual Function *Copy() + { + return new StitchingFunction(this); + } + virtual int GetType() + { + return 3; + } + virtual void Transform(double *pInput, double *pOutput); + virtual bool IsValid() + { + return m_bValid; + } + + int GetFunctionsCount() + { + return m_nCount; + } + Function *GetFunction(int nIndex) + { + return m_ppFuncs[nIndex]; + } + double *GetBounds() + { + return m_arrBounds; + } + double *GetEncode() + { + return m_arrEncode; + } + double *GetScale() + { + return m_arrScale; + } + + private: + + StitchingFunction(StitchingFunction *pFunc); + + private: + + int m_nCount; // количество функций + Function **m_ppFuncs; // сами функции + double *m_arrBounds; // Границы областей определения функций + double *m_arrEncode; // Границы множств значений функций + double *m_arrScale; + + bool m_bValid; + }; + + //------------------------------------------------------------------------ + // PostScriptFunction + //------------------------------------------------------------------------ + + class PostScriptFunction : public Function + { + public: + + PostScriptFunction(Object *pFuncObject, Dict *pDict); + virtual ~PostScriptFunction(); + virtual Function *Copy() + { + return new PostScriptFunction(this); + } + virtual int GetType() + { + return 4; + } + virtual void Transform(double *pInput, double *pOutput); + virtual bool IsValid() + { + return m_bValid; + } + StringExt *GetCodeString() + { + return m_seCodeString; + } + + private: + + PostScriptFunction(PostScriptFunction *pFunc); + bool ParseCode(Stream *pStream, int *pnCodePos); + StringExt *GetToken(Stream *pStream); + void ResizeCode(int nNewSize); + void Exec(PSStack *pStack, int nCodePos); + + private: + + StringExt *m_seCodeString; + PSObject *m_pCode; + int m_nCodeSize; + + bool m_bValid; + }; +} + +#endif // _PDF_READER_FUNCTION_H diff --git a/PdfReader/Src/GFont.cpp b/PdfReader/Src/GFont.cpp new file mode 100644 index 0000000000..8db35b12b2 --- /dev/null +++ b/PdfReader/Src/GFont.cpp @@ -0,0 +1,1960 @@ +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "Dict.h" +#include "GlobalParams.h" +#include "CMap.h" +#include "CharCodeToUnicode.h" +#include "EncodingTables.h" +#include "BuiltinFontTables.h" +#include "FontFileType1.h" +#include "FontFileType1C.h" +#include "FontFileTrueType.h" +#include "GFont.h" +#include "File.h" +#include "Stream.h" + +namespace PdfReader +{ + struct StandardFontMapEntry + { + char *sAlternativeName; + char *sProperName; + }; + + // PDF поддерживает 14 стандартных фонтов(Type1) без указаниях ширин и FontDescriptor, + // поэтому мы состовляем карту отображающую стандартные фонты в 14 основных фонтов PDF. + // Эта таблица составлена на основе "implementation note 44 in the PDF 1.4 spec", с + // небольшими добавками. + static StandardFontMapEntry c_sStandardFontMap[] = + { + { "Arial", "Helvetica" }, + { "Arial,Bold", "Helvetica-Bold" }, + { "Arial,BoldItalic", "Helvetica-BoldOblique" }, + { "Arial,Italic", "Helvetica-Oblique" }, + { "Arial-Bold", "Helvetica-Bold" }, + { "Arial-BoldItalic", "Helvetica-BoldOblique" }, + { "Arial-BoldItalicMT", "Helvetica-BoldOblique" }, + { "Arial-BoldMT", "Helvetica-Bold" }, + { "Arial-Italic", "Helvetica-Oblique" }, + { "Arial-ItalicMT", "Helvetica-Oblique" }, + { "ArialMT", "Helvetica" }, + { "Courier,Bold", "Courier-Bold" }, + { "Courier,BoldItalic", "Courier-BoldOblique" }, + { "Courier,Italic", "Courier-Oblique" }, + { "CourierNew", "Courier" }, + { "CourierNew,Bold", "Courier-Bold" }, + { "CourierNew,BoldItalic", "Courier-BoldOblique" }, + { "CourierNew,Italic", "Courier-Oblique" }, + { "CourierNew-Bold", "Courier-Bold" }, + { "CourierNew-BoldItalic", "Courier-BoldOblique" }, + { "CourierNew-Italic", "Courier-Oblique" }, + { "CourierNewPS-BoldItalicMT", "Courier-BoldOblique" }, + { "CourierNewPS-BoldMT", "Courier-Bold" }, + { "CourierNewPS-ItalicMT", "Courier-Oblique" }, + { "CourierNewPSMT", "Courier" }, + { "Helvetica,Bold", "Helvetica-Bold" }, + { "Helvetica,BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica,Italic", "Helvetica-Oblique" }, + { "Helvetica-BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica-Italic", "Helvetica-Oblique" }, + { "Symbol,Bold", "Symbol" }, + { "Symbol,BoldItalic", "Symbol" }, + { "Symbol,Italic", "Symbol" }, + { "TimesNewRoman", "Times-Roman" }, + { "TimesNewRoman,Bold", "Times-Bold" }, + { "TimesNewRoman,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman,Italic", "Times-Italic" }, + { "TimesNewRoman-Bold", "Times-Bold" }, + { "TimesNewRoman-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman-Italic", "Times-Italic" }, + { "TimesNewRomanPS", "Times-Roman" }, + { "TimesNewRomanPS-Bold", "Times-Bold" }, + { "TimesNewRomanPS-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldMT", "Times-Bold" }, + { "TimesNewRomanPS-Italic", "Times-Italic" }, + { "TimesNewRomanPS-ItalicMT", "Times-Italic" }, + { "TimesNewRomanPSMT", "Times-Roman" }, + { "TimesNewRomanPSMT,Bold", "Times-Bold" }, + { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPSMT,Italic", "Times-Italic" } + }; + + //------------------------------------------------------------------------ + // GrFont + //------------------------------------------------------------------------ + + GrFont *GrFont::MakeFont(XRef *pXref, char *sTag, Ref oID, Dict *pFontDict, GlobalParams *pGlobalParams) + { + // Считываем название шрифта + StringExt *seName = NULL; + + Object oTemp; + pFontDict->Search("BaseFont", &oTemp); + if (oTemp.IsName()) + { + seName = new StringExt(oTemp.GetName()); + } + oTemp.Free(); + + // Тип шрифта + GrFont *pFont = NULL; + pFontDict->Search("Subtype", &oTemp); + if (oTemp.IsName("Type1") || oTemp.IsName("MMType1")) + { + pFont = new Gr8BitFont(pXref, sTag, oID, seName, fontType1, pFontDict, pGlobalParams); + } + else if (oTemp.IsName("Type1C")) + { + pFont = new Gr8BitFont(pXref, sTag, oID, seName, fontType1C, pFontDict, pGlobalParams); + } + else if (oTemp.IsName("Type3")) + { + pFont = new Gr8BitFont(pXref, sTag, oID, seName, fontType3, pFontDict, pGlobalParams); + } + else if (oTemp.IsName("TrueType")) + { + pFont = new Gr8BitFont(pXref, sTag, oID, seName, fontTrueType, pFontDict, pGlobalParams); + } + else if (oTemp.IsName("Type0")) + { + pFont = new GrCIDFont(pXref, sTag, oID, seName, pFontDict, pGlobalParams); + } + else + { + // TO DO: Error "Unknown font type" + pFont = new Gr8BitFont(pXref, sTag, oID, seName, fontUnknownType, pFontDict, pGlobalParams); + } + oTemp.Free(); + + return pFont; + } + + GrFont::GrFont(char *sTag, Ref oID, StringExt *seName, GlobalParams *pGlobalParams) + { + m_pGlobalParams = pGlobalParams; + + m_bValid = false; + m_seTag = new StringExt(sTag); + m_oID = oID; + m_seName = seName; + m_seOriginalName = seName; + m_seEmbeddedFontName = NULL; + m_wsExternalFontFilePath = L""; + } + + GrFont::~GrFont() + { + if (m_seTag) + { + delete m_seTag; + } + if (m_seOriginalName && m_seOriginalName != m_seName) + { + delete m_seOriginalName; + } + if (m_seName) + { + delete m_seName; + } + if (m_seEmbeddedFontName) + { + delete m_seEmbeddedFontName; + } + } + + void GrFont::ReadFontDescriptor(XRef *pXref, Dict *pFontDict) + { + m_nFlags = fontSerif; + + m_oEmbFontFileRef.nNum = -1; + m_oEmbFontFileRef.nGen = -1; + m_dMissingWidth = 0; + + Object oFontDescriptor; + if (pFontDict->Search("FontDescriptor", &oFontDescriptor)->IsDict()) + { + // Flags + Object oDictItem; + if (oFontDescriptor.DictLookup("Flags", &oDictItem)->IsInt()) + { + m_nFlags = oDictItem.GetInt(); + } + oDictItem.Free(); + + // FontName + oFontDescriptor.DictLookup("FontName", &oDictItem); + if (oDictItem.IsName()) + { + m_seEmbeddedFontName = new StringExt(oDictItem.GetName()); + } + oDictItem.Free(); + + // Ищем внедренный FontFile + if (oFontDescriptor.DictLookupAndCopy("FontFile", &oDictItem)->IsRef()) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontType1) + { + // TO DO: Error "Mismatch between font type and embedded font file" + m_eType = fontType1; + } + } + oDictItem.Free(); + + if (m_oEmbFontFileRef.nNum == -1 && oFontDescriptor.DictLookupAndCopy("FontFile2", &oDictItem)->IsRef()) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontTrueType && m_eType != fontCIDType2) + { + // TO DO: Error "Mismatch between font type and embedded font file" + m_eType = (m_eType == fontCIDType0 ? fontCIDType2 : fontTrueType); + } + } + oDictItem.Free(); + + if (m_oEmbFontFileRef.nNum == -1 && oFontDescriptor.DictLookupAndCopy("FontFile3", &oDictItem)->IsRef()) + { + Object oStream; + if (oDictItem.Fetch(pXref, &oStream)->IsStream()) + { + Object oTemp; + oStream.StreamGetDict()->Search("Subtype", &oTemp); + if (oTemp.IsName("Type1")) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontType1) + { + // TO DO: Error "Mismatch between font type and embedded font file" + m_eType = fontType1; + } + } + else if (oTemp.IsName("Type1C")) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontType1 && m_eType != fontType1C) + { + // TO DO: Error "Mismatch between font type and embedded font file" + } + m_eType = fontType1C; + } + else if (oTemp.IsName("TrueType")) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontTrueType) + { + // TO DO: Error "Mismatch between font type and embedded font file" + m_eType = fontTrueType; + } + } + else if (oTemp.IsName("CIDFontType0C")) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType != fontCIDType0) + { + // TO DO: Error "Mismatch between font type and embedded font file" + } + m_eType = fontCIDType0C; + } + else if (oTemp.IsName("OpenType")) + { + m_oEmbFontFileRef = oDictItem.GetRef(); + if (m_eType == fontTrueType) + { + m_eType = fontTrueTypeOT; + } + else if (m_eType == fontType1) + { + m_eType = fontType1COT; + } + else if (m_eType == fontCIDType0) + { + m_eType = fontCIDType0COT; + } + else if (m_eType == fontCIDType2) + { + m_eType = fontCIDType2OT; + } + else + { + // TO DO: Error "Mismatch between font type and embedded font file" + } + } + else + { + // TO DO: Error "Unknown embedded font type" + } + oTemp.Free(); + } + oStream.Free(); + } + oDictItem.Free(); + + // MissingWidth + oFontDescriptor.DictLookup("MissingWidth", &oDictItem); + if (oDictItem.IsNum()) + { + m_dMissingWidth = oDictItem.GetNum(); + } + oDictItem.Free(); + + double dTemp = 0; + // Ascent + oFontDescriptor.DictLookup("Ascent", &oDictItem); + if (oDictItem.IsNum()) + { + dTemp = 0.001 * oDictItem.GetNum(); + // Некоторые неправильнае шрифты устанавливают Ascent и Descent равными 0 + if (dTemp != 0) + { + m_dAscent = dTemp; + } + } + oDictItem.Free(); + + // Descent + oFontDescriptor.DictLookup("Descent", &oDictItem); + if (oDictItem.IsNum()) + { + dTemp = 0.001 * oDictItem.GetNum(); + // Некоторые неправильнае шрифты устанавливают Ascent и Descent равными 0 + if (dTemp != 0) + { + m_dDescent = dTemp; + } + // Descent должно быть отрицательным значением + if (m_dDescent > 0) + { + m_dDescent = -m_dDescent; + } + } + oDictItem.Free(); + + // FontBBox + if (oFontDescriptor.DictLookup("FontBBox", &oDictItem)->IsArray()) + { + for (int nIndex = 0; nIndex < 4 && nIndex < oDictItem.ArrayGetLength(); ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + m_arrFontBBox[nIndex] = 0.001 * oTemp.GetNum(); + } + oTemp.Free(); + } + } + oDictItem.Free(); + + } + oFontDescriptor.Free(); + } + + CharCodeToUnicode *GrFont::ReadToUnicodeCMap(Dict *pFontDict, int nBitsCount, CharCodeToUnicode *pCharToUnicode) + { + Object oTemp; + if (!pFontDict->Search("ToUnicode", &oTemp)->IsStream()) + { + oTemp.Free(); + return NULL; + } + StringExt *seBuffer = new StringExt(); + oTemp.StreamReset(); + int nChar = 0; + while ((nChar = oTemp.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oTemp.StreamClose(); + oTemp.Free(); + if (pCharToUnicode) + { + pCharToUnicode->MergeCMap(seBuffer, nBitsCount, m_pGlobalParams); + } + else + { + pCharToUnicode = CharCodeToUnicode::ParseCMap(seBuffer, nBitsCount, m_pGlobalParams); + } + delete seBuffer; + return pCharToUnicode; + } + + void GrFont::FindExternalFontFile() + { + static wchar_t *c_wsType1Ext[] ={ L".pfa", L".pfb", L".ps", L"", NULL }; + static wchar_t *c_wsTTFExts[] ={ L".ttf", NULL }; + + if (m_pGlobalParams && m_seName) + { + if (m_eType == fontType1) + { + m_wsExternalFontFilePath = m_pGlobalParams->FindFontFile(m_seName, c_wsType1Ext); + } + else if (m_eType == fontTrueType) + { + m_wsExternalFontFilePath = m_pGlobalParams->FindFontFile(m_seName, c_wsTTFExts); + } + } + } + + char *GrFont::ReadExternalFontFile(int *pnLen) + { + NSFile::CFileBinary oFile; + if (!oFile.OpenFile(m_wsExternalFontFilePath)) + { + // TO DO: Error "External font file vanished" + return NULL; + } + FILE* pFile = oFile.GetFileNative(); + + fseek(pFile, 0, SEEK_END); + *pnLen = (int)ftell(pFile); + fseek(pFile, 0, SEEK_SET); + + char *sBuffer = (char *)MemUtilsMalloc(*pnLen); + if ((int)fread(sBuffer, 1, *pnLen, pFile) != *pnLen) + { + // TO DO: Error "Error reading external font file" + } + fclose(pFile); + return sBuffer; + } + + char *GrFont::ReadEmbeddedFontFile(XRef *pXref, int *pnLen) + { + Object oFontFile; + oFontFile.InitRef(m_oEmbFontFileRef.nNum, m_oEmbFontFileRef.nGen); + Object oStream; + oFontFile.Fetch(pXref, &oStream); + if (!oStream.IsStream()) + { + // TO DO: Error "Embedded font file is not a stream" + oStream.Free(); + oFontFile.Free(); + m_oEmbFontFileRef.nNum = -1; + return NULL; + } + Stream *pStream = oStream.GetStream(); + char *sBuffer = NULL; + int nSize = 0; + int nIndex = 0; + pStream->Reset(); + int nChar = 0; + while ((nChar = pStream->GetChar()) != EOF) + { + if (nIndex == nSize) + { + nSize += 4096; + sBuffer = (char *)MemUtilsRealloc(sBuffer, nSize); + } + sBuffer[nIndex++] = nChar; + } + *pnLen = nIndex; + pStream->Close(); + + oStream.Free(); + oFontFile.Free(); + + return sBuffer; + } + + //------------------------------------------------------------------------ + // Gr8BitFont + //------------------------------------------------------------------------ + + Gr8BitFont::Gr8BitFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, GrFontType eType, Dict *pFontDict, GlobalParams *pGlobalParams) : + GrFont(sTag, oID, seName, pGlobalParams) + { + m_eType = eType; + m_pCharToUnicode = NULL; + + if (m_seName) + { + StringExt *seName2 = m_seName->Copy(); + int nIndex = 0; + while (nIndex < seName2->GetLength()) + { + if (seName2->GetAt(nIndex) == ' ') + { + seName2->Delete(nIndex); + } + else + { + ++nIndex; + } + } + int nFirst = 0; + int nLast = sizeof(c_sStandardFontMap) / sizeof(StandardFontMapEntry); + + // Поиск методом деления отрезка пополам + while (nLast - nFirst > 1) + { + int nMiddle = (nFirst + nLast) / 2; + if (seName2->Compare(c_sStandardFontMap[nMiddle].sAlternativeName) >= 0) + { + nFirst = nMiddle; + } + else + { + nLast = nMiddle; + } + } + if (!seName2->Compare(c_sStandardFontMap[nFirst].sAlternativeName)) + { + m_seName = new StringExt(c_sStandardFontMap[nFirst].sProperName); + } + delete seName2; + } + + // Смотрим является ли наш фонт одним из 14 стандартных + BuiltinFont *pBuiltinFont = NULL; + if (m_seName) + { + for (int nIndex = 0; nIndex < BuiltinFontsCount; ++nIndex) + { + if (!m_seName->Compare(c_arrBuiltinFonts[nIndex].sName)) + { + pBuiltinFont = &c_arrBuiltinFonts[nIndex]; + break; + } + } + } + + // Выставляем стандартные значения для Ascent/Descent/BBox + if (pBuiltinFont) + { + m_dAscent = 0.001 * pBuiltinFont->nAscent; + m_dDescent = 0.001 * pBuiltinFont->nDescent; + m_arrFontBBox[0] = 0.001 * pBuiltinFont->arrBBox[0]; + m_arrFontBBox[1] = 0.001 * pBuiltinFont->arrBBox[1]; + m_arrFontBBox[2] = 0.001 * pBuiltinFont->arrBBox[2]; + m_arrFontBBox[3] = 0.001 * pBuiltinFont->arrBBox[3]; + } + else + { + m_dAscent = 0.95; + m_dDescent = -0.35; + m_arrFontBBox[0] = m_arrFontBBox[1] = m_arrFontBBox[2] = m_arrFontBBox[3] = 0; + } + + // Считываем данные из FontDescriptor + ReadFontDescriptor(pXref, pFontDict); + + // Для стандартных фонтов выставляем стандартные значения Ascent/Descent/BBox + if (pBuiltinFont && m_oEmbFontFileRef.nNum < 0) + { + m_dAscent = 0.001 * pBuiltinFont->nAscent; + m_dDescent = 0.001 * pBuiltinFont->nDescent; + m_arrFontBBox[0] = 0.001 * pBuiltinFont->arrBBox[0]; + m_arrFontBBox[1] = 0.001 * pBuiltinFont->arrBBox[1]; + m_arrFontBBox[2] = 0.001 * pBuiltinFont->arrBBox[2]; + m_arrFontBBox[3] = 0.001 * pBuiltinFont->arrBBox[3]; + } + + // Ищем внешний FontFile + FindExternalFontFile(); + + // FontMatrix + m_arrFontMatrix[0] = m_arrFontMatrix[3] = 1; + m_arrFontMatrix[1] = m_arrFontMatrix[2] = m_arrFontMatrix[4] = m_arrFontMatrix[5] = 0; + + Object oDictItem; + if (pFontDict->Search("FontMatrix", &oDictItem)->IsArray()) + { + for (int nIndex = 0; nIndex < 6 && nIndex < oDictItem.ArrayGetLength(); ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + m_arrFontMatrix[nIndex] = oTemp.GetNum(); + } + oTemp.Free(); + } + } + oDictItem.Free(); + + // Считываем данные, характерные для шрифта Type 3 + if (m_eType == fontType3) + { + if (pFontDict->Search("FontBBox", &oDictItem)->IsArray()) + { + for (int nIndex = 0; nIndex < 4 && nIndex < oDictItem.ArrayGetLength(); ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + m_arrFontBBox[nIndex] = oTemp.GetNum(); + } + oTemp.Free(); + } + } + oDictItem.Free(); + + if (!pFontDict->Search("CharProcs", &m_oCharProcs)->IsDict()) + { + // TO DO: Error "Missing or invalid CharProcs dictionary in Type 3 font" + m_oCharProcs.Free(); + } + + if (!pFontDict->Search("Resources", &m_oResources)->IsDict()) + { + m_oResources.Free(); + } + } + + //----- Строим Encoding ----- + + // Encodings начинается с BaseEncoding, которую мы можем найти в + // (в порядке приоритета): + // 1. pFontDict.Encoding or pFontDict.Encoding.BaseEncoding + // - MacRoman / MacExpert / WinAnsi / Standard + // 2. Во внедренном или внешнем FontFile + // 3. Стандартные значения(если до этого не нашли): + // - Builtin --> Builtin encoding + // - TrueType --> WinAnsiEncoding + // - Остальные --> StandardEncoding + + // Ищем BaseEncoding в pFontDict + m_bHasEncoding = false; + m_bUsesMacRomanEncoding = false; + char **ppBaseEncoding = NULL; + bool bBaseEncodingFromFontFile = false; + + pFontDict->Search("Encoding", &oDictItem); + if (oDictItem.IsDict()) + { + Object oTemp; + oDictItem.DictLookup("BaseEncoding", &oTemp); + if (oTemp.IsName("MacRomanEncoding")) + { + m_bHasEncoding = true; + m_bUsesMacRomanEncoding = true; + ppBaseEncoding = c_arrMacRomanEncoding; + } + else if (oTemp.IsName("MacExpertEncoding")) + { + m_bHasEncoding = true; + ppBaseEncoding = c_arrMacExpertEncoding; + } + else if (oTemp.IsName("WinAnsiEncoding")) + { + m_bHasEncoding = true; + ppBaseEncoding = c_arrWinAnsiEncoding; + } + oTemp.Free(); + } + else if (oDictItem.IsName("MacRomanEncoding")) + { + m_bHasEncoding = true; + m_bUsesMacRomanEncoding = true; + ppBaseEncoding = c_arrMacRomanEncoding; + } + else if (oDictItem.IsName("MacExpertEncoding")) + { + m_bHasEncoding = true; + ppBaseEncoding = c_arrMacExpertEncoding; + } + else if (oDictItem.IsName("WinAnsiEncoding")) + { + m_bHasEncoding = true; + ppBaseEncoding = c_arrWinAnsiEncoding; + } + + // Ищем BaseEncoding в FontFile(только для Type1) + CFontFileType1 *pFFT1 = NULL; + CFontFileType1C *pFFT1C = NULL; + char *sBuffer = NULL; + int nLen = 0; + + if (m_eType == fontType1 && (L"" != m_wsExternalFontFilePath || m_oEmbFontFileRef.nNum >= 0)) + { + if (L"" != m_wsExternalFontFilePath) + { + pFFT1 = CFontFileType1::LoadFromFile((wchar_t*)m_wsExternalFontFilePath.c_str()); + } + else + { + sBuffer = ReadEmbeddedFontFile(pXref, &nLen); + pFFT1 = CFontFileType1::LoadFromBuffer(sBuffer, nLen); + } + if (pFFT1) + { + if (pFFT1->GetName()) + { + if (m_seEmbeddedFontName) + { + delete m_seEmbeddedFontName; + } + m_seEmbeddedFontName = new StringExt(pFFT1->GetName()); + } + if (!ppBaseEncoding) + { + ppBaseEncoding = pFFT1->GetEncoding(); + bBaseEncodingFromFontFile = true; + } + } + } + else if (m_eType == fontType1C && (L"" != m_wsExternalFontFilePath || m_oEmbFontFileRef.nNum >= 0)) + { + if (L"" != m_wsExternalFontFilePath) + { + pFFT1C = CFontFileType1C::LoadFromFile((wchar_t*)m_wsExternalFontFilePath.c_str()); + } + else + { + sBuffer = ReadEmbeddedFontFile(pXref, &nLen); + pFFT1C = CFontFileType1C::LoadFromBuffer(sBuffer, nLen); + } + if (pFFT1C) + { + if (pFFT1C->GetName()) + { + if (m_seEmbeddedFontName) + { + delete m_seEmbeddedFontName; + } + m_seEmbeddedFontName = new StringExt(pFFT1C->GetName()); + } + if (!ppBaseEncoding) + { + ppBaseEncoding = pFFT1C->GetEncoding(); + bBaseEncodingFromFontFile = true; + } + } + } + if (sBuffer) + { + MemUtilsFree(sBuffer); + } + + // Стандартные значения BaseEncoding + if (!ppBaseEncoding) + { + if (pBuiltinFont && m_oEmbFontFileRef.nNum < 0) + { + ppBaseEncoding = pBuiltinFont->ppDefaultBaseEncoding; + m_bHasEncoding = true; + } + else if (m_eType == fontTrueType) + { + ppBaseEncoding = c_arrWinAnsiEncoding; + } + else + { + ppBaseEncoding = c_arrStandardEncoding; + } + } + + // copy the base encoding + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + m_ppEncoding[nIndex] = ppBaseEncoding[nIndex]; + if ((m_arrEncFree[nIndex] = bBaseEncodingFromFontFile) && m_ppEncoding[nIndex]) + { + m_ppEncoding[nIndex] = CopyString(ppBaseEncoding[nIndex]); + } + } + + // Некоторые Type 1C Font Files имею пустые кодировки, что может навредить конвертации T1C->T1, + // поэтому мы заполняем все пустые места из StandardEncoding + if (m_eType == fontType1C && (L"" != m_wsExternalFontFilePath || m_oEmbFontFileRef.nNum >= 0) && bBaseEncodingFromFontFile) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (!m_ppEncoding[nIndex] && c_arrStandardEncoding[nIndex]) + { + m_ppEncoding[nIndex] = c_arrStandardEncoding[nIndex]; + m_arrEncFree[nIndex] = false; + } + } + } + + // Differences + if (oDictItem.IsDict()) + { + Object oDifferences; + oDictItem.DictLookup("Differences", &oDifferences); + if (oDifferences.IsArray()) + { + m_bHasEncoding = true; + int nCode = 0; + for (int nIndex = 0; nIndex < oDifferences.ArrayGetLength(); ++nIndex) + { + Object oTemp; + oDifferences.ArrayGet(nIndex, &oTemp); + if (oTemp.IsInt()) + { + nCode = oTemp.GetInt(); + } + else if (oTemp.IsName()) + { + if (nCode >= 0 && nCode < 256) + { + if (m_arrEncFree[nCode]) + { + MemUtilsFree(m_ppEncoding[nCode]); + } + m_ppEncoding[nCode] = CopyString(oTemp.GetName()); + m_arrEncFree[nCode] = true; + } + ++nCode; + } + else + { + // TO DO: Error "Wrong type in font encoding resource differences" + } + oTemp.Free(); + } + } + oDifferences.Free(); + } + oDictItem.Free(); + + if (pFFT1) + { + delete pFFT1; + } + if (pFFT1C) + { + delete pFFT1C; + } + + //----- build the mapping to Unicode ----- + + // Шаг 1: Используем соответствие Name-to-Unicode + bool bMissing = false, bHex = false; + char *sCharName; + Unicode arrToUnicode[256]; + for (int nCode = 0; nCode < 256; ++nCode) + { + if ((sCharName = m_ppEncoding[nCode])) + { + if (m_pGlobalParams && !(arrToUnicode[nCode] = m_pGlobalParams->MapNameToUnicode(sCharName)) && strcmp(sCharName, ".notdef")) + { + // Если данного символа не было в таблице Name-to-Unicode table, проверяем + // как выглядит Name. ( либо 'Axx', либо 'xx', где 'A' - произвольная буква + // и 'xx' - два шестнадцатиричных числа + if ((strlen(sCharName) == 3 && isalpha(sCharName[0]) && + isxdigit(sCharName[1]) && isxdigit(sCharName[2]) && + ((sCharName[1] >= 'a' && sCharName[1] <= 'f') || + (sCharName[1] >= 'A' && sCharName[1] <= 'F') || + (sCharName[2] >= 'a' && sCharName[2] <= 'f') || + (sCharName[2] >= 'A' && sCharName[2] <= 'F')) + ) || + (strlen(sCharName) == 2 && + isxdigit(sCharName[0]) && isxdigit(sCharName[1]) && + ((sCharName[0] >= 'a' && sCharName[0] <= 'f') || + (sCharName[0] >= 'A' && sCharName[0] <= 'F') || + (sCharName[1] >= 'a' && sCharName[1] <= 'f') || + (sCharName[1] >= 'A' && sCharName[1] <= 'F')) + )) + { + bHex = true; + } + bMissing = true; + } + } + else + { + arrToUnicode[nCode] = 0; + } + } + + // Шаг 2: Заполняем пропущенные символы, ищем имена одного из видов + // 'Axx', 'xx', 'Ann', 'ABnn' или 'nn', где 'A' и 'B' - любые буквы, + // 'xx' - два шестнадцатиричных числа, и 'nn' - 2-4 десятичных числа + if (bMissing && m_pGlobalParams && m_pGlobalParams->GetMapNumericCharNames()) + { + for (int nCode = 0; nCode < 256; ++nCode) + { + if ((sCharName = m_ppEncoding[nCode]) && !arrToUnicode[nCode] && strcmp(sCharName, ".notdef")) + { + int nCount = strlen(sCharName); + int nCode2 = -1; + if (bHex && nCount == 3 && isalpha(sCharName[0]) && isxdigit(sCharName[1]) && isxdigit(sCharName[2])) + { + sscanf(sCharName + 1, "%x", &nCode2); + } + else if (bHex && nCount == 2 && isxdigit(sCharName[0]) && isxdigit(sCharName[1])) + { + sscanf(sCharName, "%x", &nCode2); + } + else if (!bHex && nCount >= 2 && nCount <= 4 && isdigit(sCharName[0]) && isdigit(sCharName[1])) + { + nCode2 = atoi(sCharName); + } + else if (nCount >= 3 && nCount <= 5 && isdigit(sCharName[1]) && isdigit(sCharName[2])) + { + nCode2 = atoi(sCharName + 1); + } + else if (nCount >= 4 && nCount <= 6 && isdigit(sCharName[2]) && isdigit(sCharName[3])) + { + nCode2 = atoi(sCharName + 2); + } + if (nCode2 >= 0 && nCode2 <= 0xff) + { + arrToUnicode[nCode] = (Unicode)nCode2; + } + } + } + } + else if (bMissing && m_pGlobalParams && m_pGlobalParams->GetMapUnknownCharNames()) // Если установлен флаг 'mapUnknownCharNames' + { + for (int nCode = 0; nCode < 256; ++nCode) + { + if (!arrToUnicode[nCode]) + { + arrToUnicode[nCode] = nCode; + } + } + } + + m_pCharToUnicode = CharCodeToUnicode::Make8BitToUnicode(arrToUnicode); + + // ToUnicode CMap + ReadToUnicodeCMap(pFontDict, 8, m_pCharToUnicode); + + // Ищем Unicode-to-Unicode + CharCodeToUnicode *pUnicodeToUnicode, *pCharToUnicode; + if (m_seName && m_pGlobalParams && (pUnicodeToUnicode = m_pGlobalParams->GetUnicodeToUnicode(m_seName))) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + arrToUnicode[nIndex] = 0; + } + pCharToUnicode = CharCodeToUnicode::Make8BitToUnicode(arrToUnicode); + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + Unicode arrUnicodeBuf[8]; + int nCount = m_pCharToUnicode->MapToUnicode((CharCode)nIndex, arrUnicodeBuf, 8); + if (nCount >= 1) + { + nCount = pUnicodeToUnicode->MapToUnicode((CharCode)arrUnicodeBuf[0], arrUnicodeBuf, 8); + if (nCount >= 1) + { + pCharToUnicode->SetMapping((CharCode)nIndex, arrUnicodeBuf, nCount); + } + } + } + pUnicodeToUnicode->Release(); + if (m_pCharToUnicode) + delete m_pCharToUnicode; + m_pCharToUnicode = pCharToUnicode; + } + + // Widths + + for (int nCode = 0; nCode < 256; ++nCode) + { + m_arrWidths[nCode] = m_dMissingWidth * 0.001; + } + + // Используем шириные из pFontDict, если они там заданы + pFontDict->Search("FirstChar", &oDictItem); + int nFirstChar = oDictItem.IsInt() ? oDictItem.GetInt() : 0; + oDictItem.Free(); + + if (nFirstChar < 0 || nFirstChar > 255) + { + nFirstChar = 0; + } + pFontDict->Search("LastChar", &oDictItem); + int nLastChar = oDictItem.IsInt() ? oDictItem.GetInt() : 255; + oDictItem.Free(); + + if (nLastChar < 0 || nLastChar > 255) + { + nLastChar = 255; + } + double dMult = (m_eType == fontType3) ? m_arrFontMatrix[0] : 0.001; + + pFontDict->Search("Widths", &oDictItem); + if (oDictItem.IsArray()) + { + m_nFlags |= fontFixedWidth; + if (oDictItem.ArrayGetLength() < nLastChar - nFirstChar + 1) + { + nLastChar = nFirstChar + oDictItem.ArrayGetLength() - 1; + } + for (int nCode = nFirstChar; nCode <= nLastChar; ++nCode) + { + Object oTemp; + oDictItem.ArrayGet(nCode - nFirstChar, &oTemp); + if (oTemp.IsNum()) + { + m_arrWidths[nCode] = oTemp.GetNum() * dMult; + if (m_arrWidths[nCode] != m_arrWidths[nFirstChar]) + { + m_nFlags &= ~fontFixedWidth; + } + } + oTemp.Free(); + } + } + else if (pBuiltinFont) // Используем ширины из Built-in шрифта + { + // Некорректные PDF-файлы кодируют символ с номером 32 как .notdef(хотя это пробел) + unsigned short unWidth = 0; + if (BuiltinFontGetWidth(pBuiltinFont, "space", &unWidth)) + { + m_arrWidths[32] = 0.001 * unWidth; + } + for (int nCode = 0; nCode < 256; ++nCode) + { + if (m_ppEncoding[nCode] && BuiltinFontGetWidth(pBuiltinFont, m_ppEncoding[nCode], &unWidth)) + { + m_arrWidths[nCode] = 0.001 * unWidth; + } + } + } + else // Ширины не заданы - заполняем стандартными значениями + { + int nIndex = 0; + if (IsFixedWidth()) + { + nIndex = 0; + } + else if (IsSerif()) + { + nIndex = 8; + } + else + { + nIndex = 4; + } + if (IsBold()) + { + nIndex += 2; + } + if (IsItalic()) + { + nIndex += 1; + } + pBuiltinFont = c_arrBuiltinFontSubset[nIndex]; + + // Некорректные PDF-файлы кодируют символ с номером 32 как .notdef(хотя это пробел) + unsigned short unWidth = 0; + if (BuiltinFontGetWidth(pBuiltinFont, "space", &unWidth)) + { + m_arrWidths[32] = 0.001 * unWidth; + } + for (int nCode = 0; nCode < 256; ++nCode) + { + if (m_ppEncoding[nCode] && BuiltinFontGetWidth(pBuiltinFont, m_ppEncoding[nCode], &unWidth)) + { + m_arrWidths[nCode] = 0.001 * unWidth; + } + } + } + oDictItem.Free(); + + m_bValid = true; + } + + Gr8BitFont::~Gr8BitFont() + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (m_arrEncFree[nIndex] && m_ppEncoding[nIndex]) + { + MemUtilsFree(m_ppEncoding[nIndex]); + } + } + m_pCharToUnicode->Release(); + if (m_oCharProcs.IsDict()) + { + m_oCharProcs.Free(); + } + if (m_oResources.IsDict()) + { + m_oResources.Free(); + } + } + + int Gr8BitFont::GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy) + { + CharCode nCharCode; + + *punCode = nCharCode = (CharCode)(*sText & 0xff); + *uLen = m_pCharToUnicode->MapToUnicode(nCharCode, punUnicode, uSize); + *pdDx = m_arrWidths[nCharCode]; + *pdDy = *pdVx = *pdVy = 0; + return 1; + } + + CharCodeToUnicode *Gr8BitFont::GetToUnicode() + { + m_pCharToUnicode->AddRef(); + return m_pCharToUnicode; + } + + unsigned short *Gr8BitFont::GetCodeToGIDMap(CFontFileTrueType *pTTF) + { + unsigned short *pMap = (unsigned short *)MemUtilsMallocArray(256, sizeof(unsigned short)); + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + pMap[nIndex] = 0; + } + + // 1. Если в PDF задана кодировка: + // 1a. Если в PDF шрифте определна кодировка MacRomanEncoding и + // TrueType-шрифт имеет Macintosh Roman CMap, используем его, + // и получем обатно по именам коды символов. + // 1b. Если TrueType-шрифт имеет Microsoft Unicode CMap или + // non-Microsoft Unicode CMap, используем его, и используем + // юникодные номера, а не коды символов. + // 1c. Если PDF-шрифт - Symbolic и TrueType-шрифт имеет + // Microsoft Symbol CMap, используем его, и используем сами + // коды символов (возможно со сдвигом 0xf000). + // 1d. Если TrueType-шрифт имеет Macintosh Roman CMap, используем + // его как и в случае 1a. + // 2. Если PDF-шрифт не имеет кодировки или PDF-шрифт - Symbolic: + // 2a. Если TrueType-шрифт имеет Macintosh Roman CMap, используем + // его, и используем сами коды символов (возможно со сдвигом + // 0xf000). + // 2b. Если TrueType-шрифт имеет Microsoft Symbol CMap, используем + // его, и используем сами коды символов (возможно со сдвигом + // 0xf000). + // 3. Если не один из этих случаев не применим, тогда используем первый + // CMap. (но такого не должно происходить) + + + // TO DO: Возможна ситуация, когда одинаковых кодировок несколько, и в они содерржат + // разные символы. В таких случаях надо бы делать общую кодировку, а не считывать + // одну конкретную. + + int nUnicodeCmap = -1, nMacRomanCmap = -1, nMSSymbolCmap = -1; + int nCmapPlatform = 0, nCmapEncoding = 0; + for (int nIndex = 0; nIndex < pTTF->GetCmapsCount(); ++nIndex) + { + nCmapPlatform = pTTF->GetCmapPlatform(nIndex); + nCmapEncoding = pTTF->GetCmapEncoding(nIndex); + + if ((nCmapPlatform == 3 && nCmapEncoding == 1) || nCmapPlatform == 0) + { + nUnicodeCmap = nIndex; + } + else if (nCmapPlatform == 1 && nCmapEncoding == 0) + { + nMacRomanCmap = nIndex; + } + else if (nCmapPlatform == 3 && nCmapEncoding == 0) + { + nMSSymbolCmap = nIndex; + } + } + int nCmap = 0; + bool bUseMacRoman = false; + bool bUseUnicode = false; + if (m_bHasEncoding) + { + if (m_bUsesMacRomanEncoding && nMacRomanCmap >= 0) + { + nCmap = nMacRomanCmap; + bUseMacRoman = true; + } + else if (nUnicodeCmap >= 0) + { + nCmap = nUnicodeCmap; + bUseUnicode = true; + } + else if ((m_nFlags & fontSymbolic) && nMSSymbolCmap >= 0) + { + nCmap = nMSSymbolCmap; + } + else if ((m_nFlags & fontSymbolic) && nMacRomanCmap >= 0) + { + nCmap = nMacRomanCmap; + } + else if (nMacRomanCmap >= 0) + { + nCmap = nMacRomanCmap; + bUseMacRoman = true; + } + } + else + { + if (nMSSymbolCmap >= 0) + { + nCmap = nMSSymbolCmap; + } + else if (nMacRomanCmap >= 0) + { + nCmap = nMacRomanCmap; + } + } + + char *sCharName; + int nCode = 0; + + if (bUseMacRoman) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if ((sCharName = m_ppEncoding[nIndex])) + { + if (m_pGlobalParams && (nCode = m_pGlobalParams->GetMacRomanCharCode(sCharName))) + { + pMap[nIndex] = pTTF->MapCodeToGID(nCmap, nCode); + } + } + } + } + else if (bUseUnicode) + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + int nLen = 0; + Unicode nUnicode = 0; + if (((sCharName = m_ppEncoding[nIndex]) && (m_pGlobalParams) && (nUnicode = m_pGlobalParams->MapNameToUnicode(sCharName))) || (nLen = m_pCharToUnicode->MapToUnicode((CharCode)nIndex, &nUnicode, 1))) + { + pMap[nIndex] = pTTF->MapCodeToGID(nCmap, nUnicode); + } + } + } + else + { + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (!(pMap[nIndex] = pTTF->MapCodeToGID(nCmap, nIndex))) + { + pMap[nIndex] = pTTF->MapCodeToGID(nCmap, 0xf000 + nIndex); + } + } + } + + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + if (!pMap[nIndex] && (sCharName = m_ppEncoding[nIndex])) + { + pMap[nIndex] = (unsigned short)(int)pTTF->MapNameToGID(sCharName); + } + } + + return pMap; + } + + Dict *Gr8BitFont::GetCharProcs() + { + return m_oCharProcs.IsDict() ? m_oCharProcs.GetDict() : (Dict *)NULL; + } + + Object *Gr8BitFont::GetCharProc(int nCode, Object *pProc) + { + if (m_ppEncoding[nCode] && m_oCharProcs.IsDict()) + { + m_oCharProcs.DictLookup(m_ppEncoding[nCode], pProc); + } + else + { + pProc->InitNull(); + } + return pProc; + } + + Dict *Gr8BitFont::GetResources() + { + return m_oResources.IsDict() ? m_oResources.GetDict() : (Dict *)NULL; + } + + //------------------------------------------------------------------------ + // GrCIDFont + //------------------------------------------------------------------------ + + static int CompareWidthExceptions(const void *pWidth1, const void *pWidth2) + { + return ((GrFontCIDWidthException *)pWidth1)->nFirst - ((GrFontCIDWidthException *)pWidth2)->nFirst; + } + + static int CompareWidthExceptionsV(const void *pWidth1, const void *pWidth2) + { + return ((GrFontCIDWidthExceptionV *)pWidth1)->nFirst - ((GrFontCIDWidthExceptionV *)pWidth2)->nFirst; + } + + GrCIDFont::GrCIDFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, Dict *pFontDict, GlobalParams *pGlobalParams) : + GrFont(sTag, oID, seName, pGlobalParams) + { + m_dAscent = 0.95; + m_dDescent = -0.35; + m_arrFontBBox[0] = m_arrFontBBox[1] = m_arrFontBBox[2] = m_arrFontBBox[3] = 0; + m_pCMap = NULL; + m_pCharToUnicode = NULL; + m_oWidths.dDefaultWidth = 1.0; + m_oWidths.dDefaultHeight = -1.0; + m_oWidths.dDefaultV = 0.880; + m_oWidths.pExceptions = NULL; + m_oWidths.nExceptionsCount = 0; + m_oWidths.pExceptionsV = NULL; + m_oWidths.nExceptionsVCount = 0; + m_pCidToGID = NULL; + m_nCidToGIDLen = 0; + + // Descendant font + Object oDictItem; + if (!pFontDict->Search("DescendantFonts", &oDictItem)->IsArray()) + { + // TO DO: Error "Missing DescendantFonts entry in Type 0 font" + oDictItem.Free(); + return; + } + Object oDescendantObject; + if (!oDictItem.ArrayGet(0, &oDescendantObject)->IsDict()) + { + // TO DO: Error "Bad descendant font in Type 0 font" + oDescendantObject.Free(); + oDictItem.Free(); + return; + } + oDictItem.Free(); + + Dict *pDescendantDict = oDescendantObject.GetDict(); + + // Subtype + + if (!pDescendantDict->Search("Subtype", &oDictItem)) + { + // TO DO: Error "Missing Subtype entry in Type 0 descendant font" + oDescendantObject.Free(); + oDictItem.Free(); + return; + } + if (oDictItem.IsName("CIDFontType0")) + { + m_eType = fontCIDType0; + } + else if (oDictItem.IsName("CIDFontType2")) + { + m_eType = fontCIDType2; + } + else + { + // TO DO: Error "Unknown Type 0 descendant font type" + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + oDictItem.Free(); + + ReadFontDescriptor(pXref, pDescendantDict); + + // Ищем внешний FontFile + FindExternalFontFile(); + + // Кодировка + + // Char collection + if (!pDescendantDict->Search("CIDSystemInfo", &oDictItem)->IsDict()) + { + // TO DO: Error "Missing CIDSystemInfo dictionary in Type 0 descendant font" + oDescendantObject.Free(); + oDictItem.Free(); + return; + } + Object oRegistry; + oDictItem.DictLookup("Registry", &oRegistry); + Object oOrdering; + oDictItem.DictLookup("Ordering", &oOrdering); + + if (!oRegistry.IsString() || !oOrdering.IsString()) + { + // TO DO: Error "Invalid CIDSystemInfo dictionary in Type 0 descendant font" + oRegistry.Free(); + oOrdering.Free(); + oDescendantObject.Free(); + oDictItem.Free(); + return; + } + + StringExt *seCollection = oRegistry.GetString()->Copy()->Append('-')->Append(oOrdering.GetString()); + oOrdering.Free(); + oRegistry.Free(); + oDictItem.Free(); + + // ToUnicode CMap + if (!(m_pCharToUnicode = ReadToUnicodeCMap(pFontDict, 16, NULL))) + { + + // "Adobe-Identity" и "Adobe-UCS" collections не имеют файлов СidToUnicode + if (seCollection->Compare("Adobe-Identity") && seCollection->Compare("Adobe-UCS")) + { + // Ищем файлы cidToUnicode, данные извне + if (m_pGlobalParams && !(m_pCharToUnicode = m_pGlobalParams->GetCIDToUnicode(seCollection))) + { + // TO DO: Error "Unknown character collection" + } + } + } + + // Ищем Unicode-to-Unicode + CharCodeToUnicode *pUnicodeToUnicode = NULL; + if (m_seName && m_pGlobalParams && (pUnicodeToUnicode = m_pGlobalParams->GetUnicodeToUnicode(m_seName))) + { + if (m_pCharToUnicode) + { + for (CharCode nCharCode = 0; nCharCode < m_pCharToUnicode->GetLength(); ++nCharCode) + { + Unicode arrUnicodeBuffer[8]; + int nCount = m_pCharToUnicode->MapToUnicode(nCharCode, arrUnicodeBuffer, 8); + if (nCount >= 1) + { + nCount = pUnicodeToUnicode->MapToUnicode((CharCode)arrUnicodeBuffer[0], arrUnicodeBuffer, 8); + if (nCount >= 1) + { + m_pCharToUnicode->SetMapping(nCharCode, arrUnicodeBuffer, nCount); + } + } + } + pUnicodeToUnicode->Release(); + } + else + { + m_pCharToUnicode = pUnicodeToUnicode; + } + } + + // Кодировка (т.е. CMap) + pFontDict->Search("Encoding", &oDictItem); + + if (oDictItem.IsName()) + { + StringExt *seCMapName = new StringExt(oDictItem.GetName()); + + if (m_pGlobalParams && !(m_pCMap = m_pGlobalParams->GetCMap(seCollection, seCMapName))) + { + // TO DO: Error "Unknown CMap for character collection" + if (seCollection) + delete seCollection; + if (seCMapName) + delete seCMapName; + + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + if (seCMapName) + delete seCMapName; + } + else if (oDictItem.IsStream()) + { + Stream *pStream = oDictItem.GetStream(); + Dict *pEncDict = pStream->GetDict(); + + Object oEncItem; + + pEncDict->Search("CMapName", &oEncItem); + if (!oEncItem.IsName()) + { + if (seCollection) + delete seCollection; + oEncItem.Free(); + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + + StringExt *seCMapName = new StringExt(oEncItem.GetName()); + oEncItem.Free(); + + std::wstring wsTempFile; + FILE *pFile = NULL; + if (!OpenTempFile(&wsTempFile, &pFile, L"wb", L".cmap", (wchar_t*)m_pGlobalParams->GetTempFolder().c_str())) + { + if (seCollection) + delete seCollection; + + if (seCMapName) + delete seCMapName; + + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + pStream->Reset(); + int nChar = 0; + while (EOF != (nChar = pStream->GetChar())) + { + ::fputc(nChar, pFile); + } + + fclose(pFile); + + if (!(m_pCMap = pGlobalParams->GetCMap(seCollection, seCMapName, (wchar_t*)wsTempFile.c_str()))) + { + NSFile::CFileBinary::Remove(wsTempFile.c_str()); + + if (seCollection) + delete seCollection; + + if (seCMapName) + delete seCMapName; + + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + + NSFile::CFileBinary::Remove(wsTempFile.c_str()); + + if (seCMapName) + delete seCMapName; + + } + else + { + // TO DO: Error "Missing or invalid Encoding entry in Type 0 font" + if (seCollection) + delete seCollection; + oDictItem.Free(); + oDescendantObject.Free(); + return; + } + oDictItem.Free(); + + if (seCollection) + delete seCollection; + + // CIDToGIDMap (для внедренных шрифтов-TrueType) + if (m_eType == fontCIDType2) + { + pDescendantDict->Search("CIDToGIDMap", &oDictItem); + if (oDictItem.IsStream()) + { + int nChar1 = 0, nChar2 = 0; + m_nCidToGIDLen = 0; + int nLen = 64; + m_pCidToGID = (unsigned short *)MemUtilsMallocArray(nLen, sizeof(unsigned short)); + oDictItem.StreamReset(); + while ((nChar1 = oDictItem.StreamGetChar()) != EOF && (nChar2 = oDictItem.StreamGetChar()) != EOF) + { + if (m_nCidToGIDLen == nLen) + { + nLen *= 2; + m_pCidToGID = (unsigned short *)MemUtilsReallocArray(m_pCidToGID, nLen, sizeof(unsigned short)); + } + m_pCidToGID[m_nCidToGIDLen++] = (unsigned short)((nChar1 << 8) + nChar2); + } + } + else if (!oDictItem.IsName("Identity") && !oDictItem.IsNull()) + { + // TO DO: Error "Invalid CIDToGIDMap entry in CID font" + } + oDictItem.Free(); + } + + // Метрики + + // Стандартное значение ширин + if (pDescendantDict->Search("DW", &oDictItem)->IsInt()) + { + m_oWidths.dDefaultWidth = oDictItem.GetInt() * 0.001; + } + oDictItem.Free(); + + // Исключения + if (pDescendantDict->Search("W", &oDictItem)->IsArray()) + { + int nExceptionsSize = 0; + int nCounter = 0; + while (nCounter + 1 < oDictItem.ArrayGetLength()) + { + Object oFirst, oSecond; + oDictItem.ArrayGet(nCounter, &oFirst); + oDictItem.ArrayGet(nCounter + 1, &oSecond); + if (oFirst.IsInt() && oSecond.IsInt() && nCounter + 2 < oDictItem.ArrayGetLength()) + { + // формат: C_first C_last W + Object oWidth; + if (oDictItem.ArrayGet(nCounter + 2, &oWidth)->IsNum()) + { + if (m_oWidths.nExceptionsCount == nExceptionsSize) + { + nExceptionsSize += 16; + m_oWidths.pExceptions = (GrFontCIDWidthException *)MemUtilsReallocArray(m_oWidths.pExceptions, nExceptionsSize, sizeof(GrFontCIDWidthException)); + } + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].nFirst = oFirst.GetInt(); + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].nLast = oSecond.GetInt(); + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].dWidth = oWidth.GetNum() * 0.001; + ++m_oWidths.nExceptionsCount; + } + else + { + // TO DO: Error "Bad widths array in Type 0 font" + } + oWidth.Free(); + nCounter += 3; + } + else if (oFirst.IsInt() && oSecond.IsArray()) + { + // Формат: c [ w1 w2 … wn ] + if (m_oWidths.nExceptionsCount + oSecond.ArrayGetLength() > nExceptionsSize) + { + nExceptionsSize = (m_oWidths.nExceptionsCount + oSecond.ArrayGetLength() + 15) & ~15; + m_oWidths.pExceptions = (GrFontCIDWidthException *)MemUtilsReallocArray(m_oWidths.pExceptions, nExceptionsSize, sizeof(GrFontCIDWidthException)); + } + int nCurFirst = oFirst.GetInt(); + for (int nArrayIndex = 0; nArrayIndex < oSecond.ArrayGetLength(); ++nArrayIndex) + { + Object oTemp; + if (oSecond.ArrayGet(nArrayIndex, &oTemp)->IsNum()) + { + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].nFirst = nCurFirst; + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].nLast = nCurFirst; + m_oWidths.pExceptions[m_oWidths.nExceptionsCount].dWidth = oTemp.GetNum() * 0.001; + ++nCurFirst; + ++m_oWidths.nExceptionsCount; + } + else + { + // TO DO: Error "Bad widths array in Type 0 font" + } + oTemp.Free(); + } + nCounter += 2; + } + else + { + // TO DO: Error "Bad widths array in Type 0 font"); + ++nCounter; + } + oSecond.Free(); + oFirst.Free(); + } + qsort(m_oWidths.pExceptions, m_oWidths.nExceptionsCount, sizeof(GrFontCIDWidthException), &CompareWidthExceptions); + } + oDictItem.Free(); + + // Стандартные метрики по вертикали + if (pDescendantDict->Search("DW2", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) + { + Object oTemp; + if (oDictItem.ArrayGet(0, &oTemp)->IsNum()) + { + m_oWidths.dDefaultV = oTemp.GetNum() * 0.001; + } + oTemp.Free(); + + if (oDictItem.ArrayGet(1, &oTemp)->IsNum()) + { + m_oWidths.dDefaultHeight = oTemp.GetNum() * 0.001; + } + oTemp.Free(); + } + oDictItem.Free(); + + // Исключения + if (pDescendantDict->Search("W2", &oDictItem)->IsArray()) + { + int nExceptionsSize = 0; + int nCounter = 0; + while (nCounter + 1 < oDictItem.ArrayGetLength()) + { + Object oFirst, oSecond; + oDictItem.ArrayGet(nCounter, &oFirst); + oDictItem.ArrayGet(nCounter + 1, &oSecond); + if (oFirst.IsInt() && oSecond.IsInt() && nCounter + 4 < oDictItem.ArrayGetLength()) + { + // Формат: С_first С_last W11y V1x V1y + Object oHeight, oVx, oVy; + if (oDictItem.ArrayGet(nCounter + 2, &oHeight)->IsNum() && oDictItem.ArrayGet(nCounter + 3, &oVx)->IsNum() && oDictItem.ArrayGet(nCounter + 4, &oVy)->IsNum()) + { + if (m_oWidths.nExceptionsVCount == nExceptionsSize) + { + nExceptionsSize += 16; + m_oWidths.pExceptionsV = (GrFontCIDWidthExceptionV *)MemUtilsReallocArray(m_oWidths.pExceptionsV, nExceptionsSize, sizeof(GrFontCIDWidthExceptionV)); + } + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nFirst = oFirst.GetInt(); + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nLast = oSecond.GetInt(); + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dHeight = oHeight.GetNum() * 0.001; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dVx = oVx.GetNum() * 0.001; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dVy = oVy.GetNum() * 0.001; + ++m_oWidths.nExceptionsVCount; + } + else + { + // TO DO: Error "Bad widths (W2) array in Type 0 font" + } + oVy.Free(); + oVx.Free(); + oHeight.Free(); + nCounter += 5; + } + else if (oFirst.IsInt() && oSecond.IsArray()) + { + if (m_oWidths.nExceptionsVCount + oSecond.ArrayGetLength() / 3 > nExceptionsSize) + { + nExceptionsSize = (m_oWidths.nExceptionsVCount + oSecond.ArrayGetLength() / 3 + 15) & ~15; + m_oWidths.pExceptionsV = (GrFontCIDWidthExceptionV *)MemUtilsReallocArray(m_oWidths.pExceptionsV, nExceptionsSize, sizeof(GrFontCIDWidthExceptionV)); + } + int nCurFirst = oFirst.GetInt(); + for (int nArrayIndex = 0; nArrayIndex < oSecond.ArrayGetLength(); nArrayIndex += 3) + { + Object oHeight, oVx, oVy; + if (oSecond.ArrayGet(nArrayIndex, &oHeight)->IsNum() && oSecond.ArrayGet(nArrayIndex + 1, &oVx)->IsNum() && oSecond.ArrayGet(nArrayIndex + 2, &oVy)->IsNum()) + { + // TO DO: Здесь было исправлено!!! неправильные индексы передавались -> вместо nExceptionsVCount передавались nExceptionsCount + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nFirst = nCurFirst; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nLast = nCurFirst; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dHeight = oHeight.GetNum() * 0.001; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dVx = oVx.GetNum() * 0.001; + m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dVy = oVy.GetNum() * 0.001; + ++nCurFirst; + ++m_oWidths.nExceptionsVCount; + } + else + { + // TO DO: Error "Bad widths (W2) array in Type 0 font" + } + oVy.Free(); + oVx.Free(); + oHeight.Free(); + } + nCounter += 2; + } + else + { + // TO DO: Error "Bad widths (W2) array in Type 0 font" + ++nCounter; + } + oSecond.Free(); + oFirst.Free(); + } + qsort(m_oWidths.pExceptionsV, m_oWidths.nExceptionsVCount, sizeof(GrFontCIDWidthExceptionV), &CompareWidthExceptionsV); + } + oDictItem.Free(); + + oDescendantObject.Free(); + m_bValid = true; + return; + } + + GrCIDFont::~GrCIDFont() + { + if (m_pCMap) + { + m_pCMap->Release(); + } + if (m_pCharToUnicode) + { + m_pCharToUnicode->Release(); + } + + MemUtilsFree(m_oWidths.pExceptions); + MemUtilsFree(m_oWidths.pExceptionsV); + + if (m_pCidToGID) + { + MemUtilsFree(m_pCidToGID); + } + } + + int GrCIDFont::GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy) + { + CID nCID = 0; + int nCount = 0; + + if (!m_pCMap) + { + *punCode = 0; + *uLen = 0; + *pdDx = *pdDy = 0; + return 1; + } + + *punCode = (CharCode)(nCID = m_pCMap->GetCID(sText, nLen, &nCount)); + // Временно + + *uLen = nCount; + if (1 == nCount) + *punUnicode = sText[0]; + else if (2 == nCount) + { + *punUnicode = 0; + *punUnicode |= sText[0] & 0xFF; + *punUnicode <<= 8; + *punUnicode |= sText[1] & 0xFF; + } + else + { + *uLen = 0; + *punUnicode = 0; + } + + //if ( m_pCharToUnicode ) + //{ + // *uLen = m_pCharToUnicode->MapToUnicode( nCID, punUnicode, uSize); + //} + //else + //{ + // *uLen = 0; + //} + + double dWidth = 0, dHeight = 0, dVx = 0, dVy = 0; + // Horizontal + if (m_pCMap->GetWMode() == 0) + { + dWidth = m_oWidths.dDefaultWidth; + dHeight = dVx = dVy = 0; + if (m_oWidths.nExceptionsCount > 0 && nCID >= m_oWidths.pExceptions[0].nFirst) + { + int nFirst = 0; + int nLast = m_oWidths.nExceptionsCount; + + while (nLast - nFirst > 1) + { + int nMiddle = (nFirst + nLast) / 2; + if (m_oWidths.pExceptions[nMiddle].nFirst <= nCID) + { + nFirst = nMiddle; + } + else + { + nLast = nMiddle; + } + } + if (nCID <= m_oWidths.pExceptions[nFirst].nLast) + { + dWidth = m_oWidths.pExceptions[nFirst].dWidth; + } + } + } + else // Vertical + { + dWidth = 0; + dHeight = m_oWidths.dDefaultHeight; + dVx = m_oWidths.dDefaultWidth / 2; + dVy = m_oWidths.dDefaultV; + if (m_oWidths.nExceptionsVCount > 0 && nCID >= m_oWidths.pExceptionsV[0].nFirst) + { + int nFirst = 0; + int nLast = m_oWidths.nExceptionsVCount; + + while (nLast - nFirst > 1) + { + int nMiddle = (nFirst + nLast) / 2; + if (m_oWidths.pExceptionsV[nMiddle].nLast <= nCID) + { + nFirst = nMiddle; + } + else + { + nLast = nMiddle; + } + } + if (nCID <= m_oWidths.pExceptionsV[nFirst].nLast) + { + dHeight = m_oWidths.pExceptionsV[nFirst].dHeight; + dVx = m_oWidths.pExceptionsV[nFirst].dVx; + dVy = m_oWidths.pExceptionsV[nFirst].dVy; + } + } + } + + *pdDx = dWidth; + *pdDy = dHeight; + *pdVx = dVx; + *pdVy = dVy; + + return nCount; + } + + int GrCIDFont::GetWMode() + { + return m_pCMap ? m_pCMap->GetWMode() : 0; + } + + CharCodeToUnicode *GrCIDFont::GetToUnicode() + { + if (m_pCharToUnicode) + { + m_pCharToUnicode->AddRef(); + } + return m_pCharToUnicode; + } + + StringExt *GrCIDFont::GetCollection() + { + return m_pCMap ? m_pCMap->GetCollection() : (StringExt *)NULL; + } + + //------------------------------------------------------------------------ + // GrFontDict + //------------------------------------------------------------------------ + + GrFontDict::GrFontDict(XRef *pXref, Ref *pFontDictRef, Dict *pFontDict, GlobalParams *pGlobalParams) + { + m_pGlobalParams = pGlobalParams; + + Ref oRef; + + m_nFontsCount = pFontDict->GetEntryCount(); + m_ppFonts = (GrFont **)MemUtilsMallocArray(m_nFontsCount, sizeof(GrFont *)); + for (int nIndex = 0; nIndex < m_nFontsCount; ++nIndex) + { + Object oFontRef, oFont; + pFontDict->GetValueCopy(nIndex, &oFontRef); + oFontRef.Fetch(pXref, &oFont); + if (oFont.IsDict()) + { + if (oFontRef.IsRef()) + { + oRef = oFontRef.GetRef(); + } + else + { + // Нет ссылки на данный шрифт, но ссылка нам нужна как идентефикатор, поэтому выбираем некотый уникальный номер + // (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением) + oRef.nNum = nIndex; + if (pFontDictRef) + { + oRef.nGen = 100000 + pFontDictRef->nNum; + } + else + { + oRef.nGen = 999999; + } + } + m_ppFonts[nIndex] = GrFont::MakeFont(pXref, pFontDict->GetKey(nIndex), oRef, oFont.GetDict(), pGlobalParams); + if (m_ppFonts[nIndex] && !m_ppFonts[nIndex]->CheckValidate()) + { + if (m_ppFonts[nIndex]) + delete m_ppFonts[nIndex]; + m_ppFonts[nIndex] = NULL; + } + } + else + { + // TO DO: Error "font resource is not a dictionary" + m_ppFonts[nIndex] = NULL; + } + oFontRef.Free(); + oFont.Free(); + } + } + + GrFontDict::~GrFontDict() + { + for (int nIndex = 0; nIndex < m_nFontsCount; ++nIndex) + { + if (m_ppFonts[nIndex]) + { + delete m_ppFonts[nIndex]; + } + } + MemUtilsFree(m_ppFonts); + } + + GrFont *GrFontDict::Search(char *sTag) + { + for (int nIndex = 0; nIndex < m_nFontsCount; ++nIndex) + { + if (m_ppFonts[nIndex] && m_ppFonts[nIndex]->CheckTag(sTag)) + { + return m_ppFonts[nIndex]; + } + } + return NULL; + } +} \ No newline at end of file diff --git a/PdfReader/Src/GFont.h b/PdfReader/Src/GFont.h new file mode 100644 index 0000000000..d15d50fd82 --- /dev/null +++ b/PdfReader/Src/GFont.h @@ -0,0 +1,377 @@ +#ifndef _PDFREADER_GFONT_H +#define _PDFREADER_GFONT_H + +#include "StringExt.h" +#include "Object.h" +#include "CharTypes.h" +#include "GlobalParams.h" + +namespace PdfReader +{ + class Dict; + class CMap; + class CharCodeToUnicode; + class CFontFileTrueType; + struct GrFontCIDWidths; + + //------------------------------------------------------------------------ + // GrFontType + //------------------------------------------------------------------------ + + enum GrFontType + { + //----- Gr8BitFont + fontUnknownType, + fontType1, + fontType1C, + fontType1COT, + fontType3, + fontTrueType, + fontTrueTypeOT, + //----- GrCIDFont + fontCIDType0, + fontCIDType0C, + fontCIDType0COT, + fontCIDType2, + fontCIDType2OT + }; + + //------------------------------------------------------------------------ + // GrFontCIDWidths + //------------------------------------------------------------------------ + + struct GrFontCIDWidthException + { + CID nFirst; // Данная запись применяется к + CID nLast; // CID: ... + double dWidth; // Новая ширина символов + }; + + struct GrFontCIDWidthExceptionV + { + CID nFirst; // Данная запись применяется к + CID nLast; // CID: ... + double dHeight; // Новая высота символов + double dVx; // Координаты вектора V: origin0->origin1 + double dVy; // См. фигуру 40 в спецификации PDF 1.7 + }; + + struct GrFontCIDWidths + { + double dDefaultWidth; // Стандартное значение ширины символа + double dDefaultHeight; // Стандартное значение высоты символа + double dDefaultV; // Стандартное значение вектора V + GrFontCIDWidthException *pExceptions; // Исключения для горизонтальных метрик + int nExceptionsCount; // Число исключений + GrFontCIDWidthExceptionV*pExceptionsV; // Исключения для вертикальных метрик + int nExceptionsVCount; // Число исключений + }; + + //------------------------------------------------------------------------ + // GrFont + //------------------------------------------------------------------------ + +#define fontFixedWidth (1 << 0) +#define fontSerif (1 << 1) +#define fontSymbolic (1 << 2) +#define fontItalic (1 << 6) +#define fontBold (1 << 18) + + class GrFont + { + public: + + static GrFont *MakeFont(XRef *pXref, char *sTag, Ref oID, Dict *pFontDict, GlobalParams *pGlobalParams); + + GrFont(char *sTag, Ref oID, StringExt *seName, GlobalParams *pGlobalParams); + + virtual ~GrFont(); + + bool CheckValidate() + { + return m_bValid; + } + + StringExt *GetTag() + { + return m_seTag; + } + + Ref *GetID() + { + return &m_oID; + } + + bool CheckTag(char *sTag) + { + return !m_seTag->Compare(sTag); + } + + StringExt *GetBaseName() + { + return m_seName; + } + + StringExt *GetOriginalName() + { + return m_seOriginalName; + } + + GrFontType GetType() + { + return m_eType; + } + virtual bool IsCIDFont() + { + return false; + } + + // Внедренные фонты. + bool GetEmbeddedFontFileRef(Ref *pEmbRef) + { + *pEmbRef = m_oEmbFontFileRef; + return m_oEmbFontFileRef.nNum >= 0; + } + + StringExt *GetEmbeddedFontName() + { + return m_seEmbeddedFontName; + } + + std::wstring GetExternalFontFilePath() + { + return m_wsExternalFontFilePath; + } + + // + int GetFlags() + { + return m_nFlags; + } + bool IsFixedWidth() + { + return (m_nFlags & fontFixedWidth ? true : false); + } + bool IsSerif() + { + return (m_nFlags & fontSerif ? true : false); + } + bool IsSymbolic() + { + return (m_nFlags & fontSymbolic ? true : false); + } + bool IsItalic() + { + return (m_nFlags & fontItalic ? true : false); + } + bool IsBold() + { + return (m_nFlags & fontBold ? true : false); + } + + double *GetFontMatrix() + { + return m_arrFontMatrix; + } + + double *GetFontBBox() + { + return m_arrFontBBox; + } + + double GetAscent() + { + return m_dAscent; + } + double GetDescent() + { + return m_dDescent; + } + + // 0 = пишем по горизонтали, 1 = по вертикали + virtual int GetWMode() + { + return 0; + } + + // Считываем внешний или включенный FontFile в буфер. + char *ReadExternalFontFile(int *pnLength); + char *ReadEmbeddedFontFile(XRef *pXref, int *pnLegth); + + // Считываем следующий символ из строки длины байт, возвращем + // код символа , его юникодное значение , вектор замещения + // (w0 или w1, см. спецификацию PDF 1.7 фигура 40) (, ), и вектор V + // (см. фигуру 40) (, ). Возвращаем количество байт необходимых для punCode. + virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy) = 0; + + protected: + + void ReadFontDescriptor(XRef *pXref, Dict *pFontDict); + CharCodeToUnicode *ReadToUnicodeCMap(Dict *pFontDict, int nBitsCount, CharCodeToUnicode *pCharToUnicode); + void FindExternalFontFile(); + + protected: + + StringExt* m_seTag; // Тэг pdf-шрифта + Ref m_oID; // Ссылка на объект-шрифт (используем в качестве уникального идентефикатора) + StringExt* m_seName; // Название шрифта + StringExt* m_seOriginalName; // Первоначальное название шрифта + GrFontType m_eType; // Тип шрифта + int m_nFlags; // Флаги в FontDescriptor + StringExt* m_seEmbeddedFontName; // Название включенного в PDF шрифта(т.е. шрифт идет вместе с FontFile) + Ref m_oEmbFontFileRef; // Ссылка(pdf-ссылка) на FontFile для включенного шрифта + std::wstring m_wsExternalFontFilePath; // Путь в FontFile(т.е. font file не в самом PDF) + + double m_arrFontMatrix[6]; // Матрица преобразования координат символа в координаты текста (только для Type 3) + double m_arrFontBBox[4]; // Наименьший прямоугольник задающий границы всех символов (только для Type 3) + double m_dMissingWidth; // Стандартное значение ширины для пропущенных символов + double m_dAscent; // Ascent + double m_dDescent; // Descent + + bool m_bValid; + + GlobalParams* m_pGlobalParams; + }; + + //------------------------------------------------------------------------ + // Gr8BitFont + //------------------------------------------------------------------------ + + class Gr8BitFont : public GrFont + { + public: + + Gr8BitFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, GrFontType eType, Dict *pFontDict, GlobalParams *pGlobalParams); + + virtual ~Gr8BitFont(); + + virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy); + + char **GetEncoding() + { + return m_ppEncoding; + } + + CharCodeToUnicode *GetToUnicode(); + + char *GetCharName(int nCode) + { + return m_ppEncoding[nCode]; + } + + bool GetHasEncoding() + { + return m_bHasEncoding; + } + + bool GetUsesMacRomanEncoding() + { + return m_bUsesMacRomanEncoding; + } + + double GetWidth(unsigned char unChar) + { + return m_arrWidths[unChar]; + } + // Только для TrueType + unsigned short *GetCodeToGIDMap(CFontFileTrueType *pTTF); + + // Следующие три функции используются только для Type 3 + Dict *GetCharProcs(); + Object *GetCharProc(int nCode, Object *pProc); + Dict *GetResources(); + + private: + + char *m_ppEncoding[256]; // Кодировка( Сhar code --> Сhar name) + bool m_arrEncFree[256]; // Булевские значения для имени каждого символа: true, если под строку выделяли память + CharCodeToUnicode *m_pCharToUnicode; // Сhar code --> Unicode + bool m_bHasEncoding; // Имеется ли кодировка вообще? + bool m_bUsesMacRomanEncoding; // Кодировка MacRomanEncoding? + double m_arrWidths[256]; // Ширины символов + Object m_oCharProcs; // Специфично только для Type 3, словарь CharProcs + Object m_oResources; // Специфично только для Type 3, словарь Resources + }; + + //------------------------------------------------------------------------ + // GrCIDFont + //------------------------------------------------------------------------ + + class GrCIDFont : public GrFont + { + public: + + GrCIDFont(XRef *pXref, char *sTag, Ref oID, StringExt *seName, Dict *pFontDict, GlobalParams *pGlobalParams); + + virtual ~GrCIDFont(); + + virtual bool IsCIDFont() + { + return true; + } + + virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy); + + virtual int GetWMode(); + + CharCodeToUnicode *GetToUnicode(); + + // Сollection name (-). + StringExt *GetCollection(); + + // CID-to-GID. Используется только если тип = fontCIDType2. + unsigned short *GetCIDToGID() + { + return m_pCidToGID; + } + int GetCIDToGIDLen() + { + return m_nCidToGIDLen; + } + + CMap *GetCMap() + { + return m_pCMap; + } + + private: + + CMap *m_pCMap; // char code --> CID + CharCodeToUnicode *m_pCharToUnicode; // CID --> Unicode + GrFontCIDWidths m_oWidths; // character widths + unsigned short *m_pCidToGID; // CID --> GID mapping (for embedded TrueType fonts) + int m_nCidToGIDLen; + }; + + //------------------------------------------------------------------------ + // GrFontDict + //------------------------------------------------------------------------ + + class GrFontDict + { + public: + + GrFontDict(XRef *pXref, Ref *pFontDictRef, Dict *pFontDict, GlobalParams *pGlobalParams); + + ~GrFontDict(); + + GrFont *Search(char *sTag); + + int GetFontsCount() + { + return m_nFontsCount; + } + GrFont *GetFont(int nIndex) + { + return m_ppFonts[nIndex]; + } + + private: + + GrFont **m_ppFonts; // Список шрифтов + int m_nFontsCount; // Количество шрифтов + GlobalParams *m_pGlobalParams; + }; +} + +#endif // _PDFREADER_GFONT_H diff --git a/PdfReader/Src/GState.cpp b/PdfReader/Src/GState.cpp new file mode 100644 index 0000000000..c75462b718 --- /dev/null +++ b/PdfReader/Src/GState.cpp @@ -0,0 +1,4840 @@ +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "Array.h" +#include "Page.h" +#include "GState.h" +#include "Dict.h" +#include "Stream.h" + +namespace PdfReader +{ + static inline GrColorComp ClipToBounds(GrColorComp nColor) + { + return (nColor < 0) ? 0 : (nColor > GrColorComp1) ? GrColorComp1 : nColor; + } + + static inline double ClipToBounds(double dValue) + { + return (dValue < 0) ? 0 : (dValue > 1) ? 1 : dValue; + } + + //------------------------------------------------------------------------------------------------------------------------------- + + struct GrBlendModeInfo + { + char *sName; + GraphicsBlendMode eMode; + }; + + static GrBlendModeInfo c_arrsGrBlendModeNames[] = + { + { "Normal", grBlendNormal }, + { "Compatible", grBlendNormal }, + { "Multiply", grBlendMultiply }, + { "Screen", grBlendScreen }, + { "Overlay", grBlendOverlay }, + { "Darken", grBlendDarken }, + { "Lighten", grBlendLighten }, + { "ColorDodge", grBlendColorDodge }, + { "ColorBurn", grBlendColorBurn }, + { "HardLight", grBlendHardLight }, + { "SoftLight", grBlendSoftLight }, + { "Difference", grBlendDifference }, + { "Exclusion", grBlendExclusion }, + { "Hue", grBlendHue }, + { "Saturation", grBlendSaturation }, + { "Color", grBlendColor }, + { "Luminosity", grBlendLuminosity } + }; + +#define GrBlendModeNamesCount ((int)((sizeof(c_arrsGrBlendModeNames) / sizeof(GrBlendModeInfo)))) + + //------------------------------------------------------------------------------------------------------------------------------- + + static char *c_arrsGrColorSpaceModeNames[] = + { + "DeviceGray", + "CalGray", + "DeviceRGB", + "CalRGB", + "DeviceCMYK", + "Lab", + "ICCBased", + "Indexed", + "Separation", + "DeviceN", + "Pattern" + }; + +#define GrColorSpaceModesCount ((sizeof(c_arrsGrColorSpaceModeNames) / sizeof(char *))) + + //------------------------------------------------------------------------------------------------------------------------------- + // GrColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrColorSpace::GrColorSpace() + { + } + + GrColorSpace::~GrColorSpace() + { + } + + GrColorSpace *GrColorSpace::Parse(Object *pColorSpaceObject) + { + GrColorSpace *pColorSpace = NULL; + + if (pColorSpaceObject->IsName()) + { + if (pColorSpaceObject->IsName("DeviceGray") || pColorSpaceObject->IsName("G")) + { + pColorSpace = new GrDeviceGrayColorSpace(); + } + else if (pColorSpaceObject->IsName("DeviceRGB") || pColorSpaceObject->IsName("RGB")) + { + pColorSpace = new GrDeviceRGBColorSpace(); + } + else if (pColorSpaceObject->IsName("DeviceCMYK") || pColorSpaceObject->IsName("CMYK")) + { + pColorSpace = new GrDeviceCMYKColorSpace(); + } + else if (pColorSpaceObject->IsName("Pattern")) + { + pColorSpace = new GrPatternColorSpace(NULL); + } + else + { + // TO DO: Error "Bad color space" + } + } + else if (pColorSpaceObject->IsArray()) + { + Object oTemp; + pColorSpaceObject->ArrayGet(0, &oTemp); + if (oTemp.IsName("DeviceGray") || oTemp.IsName("G")) + { + pColorSpace = new GrDeviceGrayColorSpace(); + } + else if (oTemp.IsName("DeviceRGB") || oTemp.IsName("RGB")) + { + pColorSpace = new GrDeviceRGBColorSpace(); + } + else if (oTemp.IsName("DeviceCMYK") || oTemp.IsName("CMYK")) + { + pColorSpace = new GrDeviceCMYKColorSpace(); + } + else if (oTemp.IsName("CalGray")) + { + pColorSpace = GrCalGrayColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("CalRGB")) + { + pColorSpace = GrCalRGBColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("Lab")) + { + pColorSpace = GrLabColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("ICCBased")) + { + pColorSpace = GrICCBasedColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("Indexed") || oTemp.IsName("I")) + { + pColorSpace = GrIndexedColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("Separation")) + { + pColorSpace = GrSeparationColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("DeviceN")) + { + pColorSpace = GrDeviceNColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else if (oTemp.IsName("Pattern")) + { + pColorSpace = GrPatternColorSpace::Parse(pColorSpaceObject->GetArray()); + } + else + { + // TO DO: Error "Bad color space" + } + oTemp.Free(); + } + else + { + // TO DO: Error "Bad color space - expected name or array" + } + return pColorSpace; + } + + void GrColorSpace::GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue) + { + for (int nIndex = 0; nIndex < GetComponentsCount(); ++nIndex) + { + pDecodeLow[nIndex] = 0; + pDecodeRange[nIndex] = 1; + } + } + + int GrColorSpace::GetColorSpaceModesCount() + { + return GrColorSpaceModesCount; + } + + char *GrColorSpace::GetColorSpaceModeName(int nIndex) + { + return c_arrsGrColorSpaceModeNames[nIndex]; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceGrayColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrDeviceGrayColorSpace::GrDeviceGrayColorSpace() + { + } + + GrDeviceGrayColorSpace::~GrDeviceGrayColorSpace() + { + } + + GrColorSpace *GrDeviceGrayColorSpace::Copy() + { + return new GrDeviceGrayColorSpace(); + } + + void GrDeviceGrayColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = ClipToBounds(pColor->arrComp[0]); + } + + void GrDeviceGrayColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + pRGB->r = pRGB->g = pRGB->b = ClipToBounds(pColor->arrComp[0]); + } + + void GrDeviceGrayColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + pCMYK->c = pCMYK->m = pCMYK->y = 0; + pCMYK->k = ClipToBounds(GrColorComp1 - pColor->arrComp[0]); + } + + void GrDeviceGrayColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrCalGrayColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrCalGrayColorSpace::GrCalGrayColorSpace() + { + m_dWhiteX = m_dWhiteY = m_dWhiteZ = 1; + m_dBlackX = m_dBlackY = m_dBlackZ = 0; + m_dGamma = 1; + } + + GrCalGrayColorSpace::~GrCalGrayColorSpace() + { + } + + GrColorSpace *GrCalGrayColorSpace::Copy() + { + GrCalGrayColorSpace *pColorSpace = new GrCalGrayColorSpace(); + pColorSpace->m_dWhiteX = m_dWhiteX; + pColorSpace->m_dWhiteY = m_dWhiteY; + pColorSpace->m_dWhiteZ = m_dWhiteZ; + pColorSpace->m_dBlackX = m_dBlackX; + pColorSpace->m_dBlackY = m_dBlackY; + pColorSpace->m_dBlackZ = m_dBlackZ; + pColorSpace->m_dGamma = m_dGamma; + return pColorSpace; + } + + GrColorSpace *GrCalGrayColorSpace::Parse(Array *pArray) + { + Object oDict; + pArray->Get(1, &oDict); + + if (!oDict.IsDict()) + { + // TO DO: Error "Bad CalGray color space" + oDict.Free(); + return NULL; + } + + GrCalGrayColorSpace *pColorSpace = new GrCalGrayColorSpace(); + Object oDictValue; + if (oDict.DictLookup("WhitePoint", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 3) + { + Object oTemp; + oDictValue.ArrayGet(0, &oTemp); + pColorSpace->m_dWhiteX = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(1, &oTemp); + pColorSpace->m_dWhiteY = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(2, &oTemp); + pColorSpace->m_dWhiteZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictValue.Free(); + + if (oDict.DictLookup("BlackPoint", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 3) + { + Object oTemp; + oDictValue.ArrayGet(0, &oTemp); + pColorSpace->m_dBlackX = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(1, &oTemp); + pColorSpace->m_dBlackY = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(2, &oTemp); + pColorSpace->m_dBlackZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictValue.Free(); + + if (oDict.DictLookup("Gamma", &oDictValue)->IsNum()) + { + pColorSpace->m_dGamma = oDictValue.GetNum(); + } + oDictValue.Free(); + + oDict.Free(); + return pColorSpace; + } + + void GrCalGrayColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = ClipToBounds(pColor->arrComp[0]); + } + + void GrCalGrayColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + pRGB->r = pRGB->g = pRGB->b = ClipToBounds(pColor->arrComp[0]); + } + + void GrCalGrayColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + pCMYK->c = pCMYK->m = pCMYK->y = 0; + pCMYK->k = ClipToBounds(GrColorComp1 - pColor->arrComp[0]); + } + + void GrCalGrayColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceRGBColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrDeviceRGBColorSpace::GrDeviceRGBColorSpace() + { + } + + GrDeviceRGBColorSpace::~GrDeviceRGBColorSpace() + { + } + + GrColorSpace *GrDeviceRGBColorSpace::Copy() + { + return new GrDeviceRGBColorSpace(); + } + + void GrDeviceRGBColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = ClipToBounds((GrColorComp)(0.3 * pColor->arrComp[0] + 0.59 * pColor->arrComp[1] + 0.11 * pColor->arrComp[2] + 0.5)); + } + + void GrDeviceRGBColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + pRGB->r = ClipToBounds(pColor->arrComp[0]); + pRGB->g = ClipToBounds(pColor->arrComp[1]); + pRGB->b = ClipToBounds(pColor->arrComp[2]); + } + + void GrDeviceRGBColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + GrColorComp nC = ClipToBounds(GrColorComp1 - pColor->arrComp[0]); + GrColorComp nM = ClipToBounds(GrColorComp1 - pColor->arrComp[1]); + GrColorComp nY = ClipToBounds(GrColorComp1 - pColor->arrComp[2]); + GrColorComp nK = nC; + + if (nM < nK) + { + nK = nM; + } + if (nY < nK) + { + nK = nY; + } + pCMYK->c = nC - nK; + pCMYK->m = nM - nK; + pCMYK->y = nY - nK; + pCMYK->k = nK; + } + + void GrDeviceRGBColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + pColor->arrComp[1] = 0; + pColor->arrComp[2] = 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrCalRGBColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrCalRGBColorSpace::GrCalRGBColorSpace() + { + m_dWhiteX = m_dWhiteY = m_dWhiteZ = 1; + m_dBlackX = m_dBlackY = m_dBlackZ = 0; + m_dGammaR = m_dGammaG = m_dGammaB = 1; + m_arrdMatrix[0] = 1; m_arrdMatrix[1] = 0; m_arrdMatrix[2] = 0; + m_arrdMatrix[3] = 0; m_arrdMatrix[4] = 1; m_arrdMatrix[5] = 0; + m_arrdMatrix[6] = 0; m_arrdMatrix[7] = 0; m_arrdMatrix[8] = 1; + } + + GrCalRGBColorSpace::~GrCalRGBColorSpace() + { + } + + GrColorSpace *GrCalRGBColorSpace::Copy() + { + GrCalRGBColorSpace *pColorSpace = new GrCalRGBColorSpace(); + pColorSpace->m_dWhiteX = m_dWhiteX; + pColorSpace->m_dWhiteY = m_dWhiteY; + pColorSpace->m_dWhiteZ = m_dWhiteZ; + pColorSpace->m_dBlackX = m_dBlackX; + pColorSpace->m_dBlackY = m_dBlackY; + pColorSpace->m_dBlackZ = m_dBlackZ; + pColorSpace->m_dGammaR = m_dGammaR; + pColorSpace->m_dGammaG = m_dGammaG; + pColorSpace->m_dGammaB = m_dGammaB; + for (int nIndex = 0; nIndex < 9; ++nIndex) + { + pColorSpace->m_arrdMatrix[nIndex] = m_arrdMatrix[nIndex]; + } + return pColorSpace; + } + + GrColorSpace *GrCalRGBColorSpace::Parse(Array *pArray) + { + Object oDict; + pArray->Get(1, &oDict); + if (!oDict.IsDict()) + { + // TO DO: Error "Bad CalRGB color space" + oDict.Free(); + return NULL; + } + + GrCalRGBColorSpace *pColorSpace = new GrCalRGBColorSpace(); + Object oDictValue; + if (oDict.DictLookup("WhitePoint", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 3) + { + Object oTemp; + oDictValue.ArrayGet(0, &oTemp); + pColorSpace->m_dWhiteX = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(1, &oTemp); + pColorSpace->m_dWhiteY = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(2, &oTemp); + pColorSpace->m_dWhiteZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictValue.Free(); + + if (oDict.DictLookup("BlackPoint", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 3) + { + Object oTemp; + oDictValue.ArrayGet(0, &oTemp); + pColorSpace->m_dBlackX = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(1, &oTemp); + pColorSpace->m_dBlackY = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(2, &oTemp); + pColorSpace->m_dBlackZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictValue.Free(); + + if (oDict.DictLookup("Gamma", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 3) + { + Object oTemp; + oDictValue.ArrayGet(0, &oTemp); + pColorSpace->m_dGammaR = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(1, &oTemp); + pColorSpace->m_dGammaG = oTemp.GetNum(); + oTemp.Free(); + + oDictValue.ArrayGet(2, &oTemp); + pColorSpace->m_dGammaB = oTemp.GetNum(); + oTemp.Free(); + } + oDictValue.Free(); + + if (oDict.DictLookup("Matrix", &oDictValue)->IsArray() && oDictValue.ArrayGetLength() == 9) + { + for (int nIndex = 0; nIndex < 9; ++nIndex) + { + Object oTemp; + oDictValue.ArrayGet(nIndex, &oTemp); + pColorSpace->m_arrdMatrix[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + oDictValue.Free(); + oDict.Free(); + return pColorSpace; + } + + void GrCalRGBColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = ClipToBounds((GrColorComp)(0.299 * pColor->arrComp[0] + 0.587 * pColor->arrComp[1] + 0.114 * pColor->arrComp[2] + 0.5)); + } + + void GrCalRGBColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + pRGB->r = ClipToBounds(pColor->arrComp[0]); + pRGB->g = ClipToBounds(pColor->arrComp[1]); + pRGB->b = ClipToBounds(pColor->arrComp[2]); + } + + void GrCalRGBColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + GrColorComp nC = ClipToBounds(GrColorComp1 - pColor->arrComp[0]); + GrColorComp nM = ClipToBounds(GrColorComp1 - pColor->arrComp[1]); + GrColorComp nY = ClipToBounds(GrColorComp1 - pColor->arrComp[2]); + GrColorComp nK = nC; + + if (nM < nK) + { + nK = nM; + } + if (nY < nK) + { + nK = nY; + } + pCMYK->c = nC - nK; + pCMYK->m = nM - nK; + pCMYK->y = nY - nK; + pCMYK->k = nK; + } + + void GrCalRGBColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + pColor->arrComp[1] = 0; + pColor->arrComp[2] = 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceCMYKColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrDeviceCMYKColorSpace::GrDeviceCMYKColorSpace() + { + } + + GrDeviceCMYKColorSpace::~GrDeviceCMYKColorSpace() + { + } + + GrColorSpace *GrDeviceCMYKColorSpace::Copy() + { + return new GrDeviceCMYKColorSpace(); + } + + void GrDeviceCMYKColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = ClipToBounds((GrColorComp)(GrColorComp1 - pColor->arrComp[3] - 0.3 * pColor->arrComp[0] - 0.59 * pColor->arrComp[1] - 0.11 * pColor->arrComp[2] + 0.5)); + } + + void GrDeviceCMYKColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + double dR = 0, dG = 0, dB = 0, dX = 0; + + double dC = ColorToDouble(pColor->arrComp[0]); + double dM = ColorToDouble(pColor->arrComp[1]); + double dY = ColorToDouble(pColor->arrComp[2]); + double dK = ColorToDouble(pColor->arrComp[3]); + + double dRevC = 1 - dC; + double dRevM = 1 - dM; + double dRevY = 1 - dY; + double dRevK = 1 - dK; + + // C M Y K + dX = dRevC * dRevM * dRevY * dRevK; // 0 0 0 0 + dR = dG = dB = dX; + + dX = dRevC * dRevM * dRevY * dK; // 0 0 0 1 + dR += 0.1373 * dX; + dG += 0.1216 * dX; + dB += 0.1255 * dX; + + dX = dRevC * dRevM * dY * dRevK; // 0 0 1 0 + dR += dX; + dG += 0.9490 * dX; + + dX = dRevC * dRevM * dY * dK; // 0 0 1 1 + dR += 0.1098 * dX; + dG += 0.1020 * dX; + + dX = dRevC * dM * dRevY * dRevK; // 0 1 0 0 + dR += 0.9255 * dX; + dB += 0.5490 * dX; + + dX = dRevC * dM * dRevY * dK; // 0 1 0 1 + dR += 0.1412 * dX; + + dX = dRevC * dM * dY * dRevK; // 0 1 1 0 + dR += 0.9294 * dX; + dG += 0.1098 * dX; + dB += 0.1412 * dX; + + dX = dRevC * dM * dY * dK; // 0 1 1 1 + dR += 0.1333 * dX; + + dX = dC * dRevM * dRevY * dRevK; // 1 0 0 0 + dG += 0.6784 * dX; + dB += 0.9373 * dX; + + dX = dC * dRevM * dRevY * dK; // 1 0 0 1 + dG += 0.0588 * dX; + dB += 0.1412 * dX; + + dX = dC * dRevM * dY * dRevK; // 1 0 1 0 + dG += 0.6510 * dX; + dB += 0.3137 * dX; + + dX = dC * dRevM * dY * dK; // 1 0 1 1 + dG += 0.0745 * dX; + + dX = dC * dM * dRevY * dRevK; // 1 1 0 0 + dR += 0.1804 * dX; + dG += 0.1922 * dX; + dB += 0.5725 * dX; + + dX = dC * dM * dRevY * dK; // 1 1 0 1 + dB += 0.0078 * dX; + + dX = dC * dM * dY * dRevK; // 1 1 1 0 + dR += 0.2118 * dX; + dG += 0.2119 * dX; + dB += 0.2235 * dX; + + pRGB->r = ClipToBounds(DoubleToColor(dR)); + pRGB->g = ClipToBounds(DoubleToColor(dG)); + pRGB->b = ClipToBounds(DoubleToColor(dB)); + } + + void GrDeviceCMYKColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + pCMYK->c = ClipToBounds(pColor->arrComp[0]); + pCMYK->m = ClipToBounds(pColor->arrComp[1]); + pCMYK->y = ClipToBounds(pColor->arrComp[2]); + pCMYK->k = ClipToBounds(pColor->arrComp[3]); + } + + void GrDeviceCMYKColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + pColor->arrComp[1] = 0; + pColor->arrComp[2] = 0; + pColor->arrComp[3] = GrColorComp1; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrLabColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + // Это обратная матрица к матрице LMN, данной в примере 4.10 в спецификации + // PostScript Language Reference, Third Edition. + static double c_arrLMNReverse[3][3] = + { + { 3.240449, -1.537136, -0.498531 }, + { -0.969265, 1.876011, 0.041556 }, + { 0.055643, -0.204026, 1.057229 } + }; + + GrLabColorSpace::GrLabColorSpace() + { + m_dWhiteX = m_dWhiteY = m_dWhiteZ = 1; + m_dBlackX = m_dBlackY = m_dBlackZ = 0; + m_dMinA = m_dMinB = -100; + m_dMaxA = m_dMaxB = 100; + } + + GrLabColorSpace::~GrLabColorSpace() + { + } + + GrColorSpace *GrLabColorSpace::Copy() + { + GrLabColorSpace *pColorSpace = new GrLabColorSpace(); + pColorSpace->m_dWhiteX = m_dWhiteX; + pColorSpace->m_dWhiteY = m_dWhiteY; + pColorSpace->m_dWhiteZ = m_dWhiteZ; + pColorSpace->m_dBlackX = m_dBlackX; + pColorSpace->m_dBlackY = m_dBlackY; + pColorSpace->m_dBlackZ = m_dBlackZ; + pColorSpace->m_dMinA = m_dMinA; + pColorSpace->m_dMaxA = m_dMaxA; + pColorSpace->m_dMinB = m_dMinB; + pColorSpace->m_dMaxB = m_dMaxB; + pColorSpace->m_dMultR = m_dMultR; + pColorSpace->m_dMultG = m_dMultG; + pColorSpace->m_dMultB = m_dMultB; + return pColorSpace; + } + + GrColorSpace *GrLabColorSpace::Parse(Array *pArray) + { + Object obj1, obj2, obj3; + + Object oDict; + pArray->Get(1, &oDict); + if (!oDict.IsDict()) + { + // TO DO: Error "Bad Lab color space" + oDict.Free(); + return NULL; + } + GrLabColorSpace *pColorSpace = new GrLabColorSpace(); + + Object oDictItem; + if (oDict.DictLookup("WhitePoint", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 3) + { + Object oTemp; + oDictItem.ArrayGet(0, &oTemp); + pColorSpace->m_dWhiteX = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(1, &oTemp); + pColorSpace->m_dWhiteY = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(2, &oTemp); + pColorSpace->m_dWhiteZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + if (oDict.DictLookup("BlackPoint", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 3) + { + Object oTemp; + oDictItem.ArrayGet(0, &oTemp); + pColorSpace->m_dBlackX = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(1, &oTemp); + pColorSpace->m_dBlackY = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(2, &oTemp); + pColorSpace->m_dBlackZ = oTemp.GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + if (oDict.DictLookup("Range", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 4) + { + Object oTemp; + oDictItem.ArrayGet(0, &oTemp); + pColorSpace->m_dMinA = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(1, &oTemp); + pColorSpace->m_dMaxA = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(2, &oTemp); + pColorSpace->m_dMinB = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(3, &oTemp); + pColorSpace->m_dMaxB = oTemp.GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + oDict.Free(); + + + pColorSpace->m_dMultR = 1 / (c_arrLMNReverse[0][0] * pColorSpace->m_dWhiteX + c_arrLMNReverse[0][1] * pColorSpace->m_dWhiteY + c_arrLMNReverse[0][2] * pColorSpace->m_dWhiteZ); + pColorSpace->m_dMultG = 1 / (c_arrLMNReverse[1][0] * pColorSpace->m_dWhiteX + c_arrLMNReverse[1][1] * pColorSpace->m_dWhiteY + c_arrLMNReverse[1][2] * pColorSpace->m_dWhiteZ); + pColorSpace->m_dMultB = 1 / (c_arrLMNReverse[2][0] * pColorSpace->m_dWhiteX + c_arrLMNReverse[2][1] * pColorSpace->m_dWhiteY + c_arrLMNReverse[2][2] * pColorSpace->m_dWhiteZ); + + return pColorSpace; + } + + void GrLabColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + GrRGB oRGB; + + GetRGB(pColor, &oRGB); + *pGray = ClipToBounds((GrColorComp)(0.299 * oRGB.r + 0.587 * oRGB.g + 0.114 * oRGB.b + 0.5)); + } + + void GrLabColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + double dX, dY, dZ; + + // L*a*b* -> CIE 1931 XYZ + double dTemp1 = (ColorToDouble(pColor->arrComp[0]) + 16) / 116; + double dTemp2 = dTemp1 + ColorToDouble(pColor->arrComp[1]) / 500; + if (dTemp2 >= (6.0 / 29.0)) + { + dX = dTemp2 * dTemp2 * dTemp2; + } + else + { + dX = (108.0 / 841.0) * (dTemp2 - (4.0 / 29.0)); + } + dX *= m_dWhiteX; + if (dTemp1 >= (6.0 / 29.0)) + { + dY = dTemp1 * dTemp1 * dTemp1; + } + else + { + dY = (108.0 / 841.0) * (dTemp1 - (4.0 / 29.0)); + } + dY *= m_dWhiteY; + dTemp2 = dTemp1 - ColorToDouble(pColor->arrComp[2]) / 200; + if (dTemp2 >= (6.0 / 29.0)) + { + dZ = dTemp2 * dTemp2 * dTemp2; + } + else + { + dZ = (108.0 / 841.0) * (dTemp2 - (4.0 / 29.0)); + } + dZ *= m_dWhiteZ; + + // XYZ -> RGB ( учитывая гамма коррекцию ) + double dR = c_arrLMNReverse[0][0] * dX + c_arrLMNReverse[0][1] * dY + c_arrLMNReverse[0][2] * dZ; + double dG = c_arrLMNReverse[1][0] * dX + c_arrLMNReverse[1][1] * dY + c_arrLMNReverse[1][2] * dZ; + double dB = c_arrLMNReverse[2][0] * dX + c_arrLMNReverse[2][1] * dY + c_arrLMNReverse[2][2] * dZ; + pRGB->r = DoubleToColor(pow(ClipToBounds(dR * m_dMultR), 0.5)); + pRGB->g = DoubleToColor(pow(ClipToBounds(dG * m_dMultG), 0.5)); + pRGB->b = DoubleToColor(pow(ClipToBounds(dB * m_dMultB), 0.5)); + } + + void GrLabColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + GrRGB oRGB; + + GetRGB(pColor, &oRGB); + GrColorComp nC = ClipToBounds(GrColorComp1 - oRGB.r); + GrColorComp nM = ClipToBounds(GrColorComp1 - oRGB.g); + GrColorComp nY = ClipToBounds(GrColorComp1 - oRGB.b); + GrColorComp nK = nC; + + if (nM < nK) + { + nK = nM; + } + if (nY < nK) + { + nK = nY; + } + pCMYK->c = nC - nK; + pCMYK->m = nM - nK; + pCMYK->y = nY - nK; + pCMYK->k = nK; + } + + void GrLabColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + if (m_dMinA > 0) + { + pColor->arrComp[1] = DoubleToColor(m_dMinA); + } + else if (m_dMaxA < 0) + { + pColor->arrComp[1] = DoubleToColor(m_dMaxA); + } + else + { + pColor->arrComp[1] = 0; + } + if (m_dMinB > 0) + { + pColor->arrComp[2] = DoubleToColor(m_dMinB); + } + else if (m_dMaxB < 0) + { + pColor->arrComp[2] = DoubleToColor(m_dMaxB); + } + else + { + pColor->arrComp[2] = 0; + } + } + + void GrLabColorSpace::GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue) + { + pDecodeLow[0] = 0; + pDecodeRange[0] = 100; + pDecodeLow[1] = m_dMinA; + pDecodeRange[1] = m_dMaxA - m_dMinA; + pDecodeLow[2] = m_dMinB; + pDecodeRange[2] = m_dMaxB - m_dMinB; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrICCBasedColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrICCBasedColorSpace::GrICCBasedColorSpace(int nComponentsCount, GrColorSpace *pAlternate, Ref *pICCProfileStream) + { + m_nComponentsCount = nComponentsCount; + m_pAlternate = pAlternate; + m_oICCProfileStream = *pICCProfileStream; + m_arrdRangeMin[0] = m_arrdRangeMin[1] = m_arrdRangeMin[2] = m_arrdRangeMin[3] = 0; + m_arrdRangeMax[0] = m_arrdRangeMax[1] = m_arrdRangeMax[2] = m_arrdRangeMax[3] = 1; + } + + GrICCBasedColorSpace::~GrICCBasedColorSpace() + { + if (m_pAlternate) + delete m_pAlternate; + } + + GrColorSpace *GrICCBasedColorSpace::Copy() + { + GrICCBasedColorSpace *pColorSpaces = new GrICCBasedColorSpace(m_nComponentsCount, m_pAlternate->Copy(), &m_oICCProfileStream); + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + pColorSpaces->m_arrdRangeMin[nIndex] = m_arrdRangeMin[nIndex]; + pColorSpaces->m_arrdRangeMax[nIndex] = m_arrdRangeMax[nIndex]; + } + return pColorSpaces; + } + + GrColorSpace *GrICCBasedColorSpace::Parse(Array *pArray) + { + Ref oICCProfileStream; + Object oStream; + pArray->GetCopy(1, &oStream); + if (oStream.IsRef()) + { + oICCProfileStream = oStream.GetRef(); + } + else + { + oICCProfileStream.nNum = 0; + oICCProfileStream.nGen = 0; + } + oStream.Free(); + pArray->Get(1, &oStream); + if (!oStream.IsStream()) + { + // TO DO: Error "Bad ICCBased color space (stream)" + oStream.Free(); + return NULL; + } + Dict *pDict = oStream.StreamGetDict(); + + Object oDictItem; + if (!pDict->Search("N", &oDictItem)->IsInt()) + { + // TO DO: Error "Bad ICCBased color space (N)" + oDictItem.Free(); + oStream.Free(); + return NULL; + } + int nCompCount = oDictItem.GetInt(); + oDictItem.Free(); + + if (nCompCount > GrColorMaxComps) + { + // TO DO: Error "ICCBased color space with too many (%d > %d) components" + nCompCount = GrColorMaxComps; + } + + GrColorSpace *pAlternativeCS; + if (pDict->Search("Alternate", &oDictItem)->IsNull() || !(pAlternativeCS = GrColorSpace::Parse(&oDictItem))) + { + switch (nCompCount) + { + case 1: + pAlternativeCS = new GrDeviceGrayColorSpace(); + break; + case 3: + pAlternativeCS = new GrDeviceRGBColorSpace(); + break; + case 4: + pAlternativeCS = new GrDeviceCMYKColorSpace(); + break; + default: + // TO DO: Error "Bad ICCBased color space - invalid N" + oDictItem.Free(); + oStream.Free(); + return NULL; + } + } + oDictItem.Free(); + GrICCBasedColorSpace *pColorSpace = new GrICCBasedColorSpace(nCompCount, pAlternativeCS, &oICCProfileStream); + + if (pDict->Search("Range", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2 * nCompCount) + { + for (int nIndex = 0; nIndex < nCompCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(2 * nIndex, &oTemp); + pColorSpace->m_arrdRangeMin[nIndex] = oTemp.GetNum(); + oTemp.Free(); + + oDictItem.ArrayGet(2 * nIndex + 1, &oTemp); + pColorSpace->m_arrdRangeMax[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + oDictItem.Free(); + oStream.Free(); + return pColorSpace; + } + + void GrICCBasedColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + m_pAlternate->GetGray(pColor, pGray); + } + + void GrICCBasedColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + m_pAlternate->GetRGB(pColor, pRGB); + } + + void GrICCBasedColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + m_pAlternate->GetCMYK(pColor, pCMYK); + } + + void GrICCBasedColorSpace::GetDefaultColor(GrColor *pColor) + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + if (m_arrdRangeMin[nIndex] > 0) + { + pColor->arrComp[nIndex] = DoubleToColor(m_arrdRangeMin[nIndex]); + } + else if (m_arrdRangeMax[nIndex] < 0) + { + pColor->arrComp[nIndex] = DoubleToColor(m_arrdRangeMax[nIndex]); + } + else + { + pColor->arrComp[nIndex] = 0; + } + } + } + + void GrICCBasedColorSpace::GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue) + { + m_pAlternate->GetDefaultRanges(pDecodeLow, pDecodeRange, nMaxImagePixelValue); + +#if 0 + // Так должно работать, но некоторые PDF фалй не содержат корректных данных в полях Range + // в словаре ICCBased. + + for ( int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex ) + { + pDecodeLow[nIndex] = m_arrdRangeMin[nIndex]; + pDecodeRange[nIndex] = m_arrdRangeMax[nIndex] - m_arrdRangeMin[nIndex]; + } +#endif + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrIndexedColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrIndexedColorSpace::GrIndexedColorSpace(GrColorSpace *pBase, int nHival) + { + m_pBase = pBase; + m_nHival = nHival; + m_pLookup = (unsigned char *)MemUtilsMallocArray((m_nHival + 1) * m_pBase->GetComponentsCount(), sizeof(unsigned char)); + } + + GrIndexedColorSpace::~GrIndexedColorSpace() + { + if (m_pBase) + delete m_pBase; + + MemUtilsFree(m_pLookup); + } + + GrColorSpace *GrIndexedColorSpace::Copy() + { + GrIndexedColorSpace *pColorSpace = new GrIndexedColorSpace(m_pBase->Copy(), m_nHival); + memcpy(pColorSpace->m_pLookup, m_pLookup, (m_nHival + 1) * m_pBase->GetComponentsCount() * sizeof(unsigned char)); + return pColorSpace; + } + + GrColorSpace *GrIndexedColorSpace::Parse(Array *pArray) + { + // [ /Indexed base hival lookup ] - массив из 4 элементов должен быть + if (pArray->GetCount() != 4) + { + // TO DO: Error "Bad Indexed color space" + return NULL; + } + + Object oArrayItem; + pArray->Get(1, &oArrayItem); + GrColorSpace *pBase = NULL; + if (!(pBase = GrColorSpace::Parse(&oArrayItem))) + { + // TO DO: Error "Bad Indexed color space (base color space)" + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + + if (!pArray->Get(2, &oArrayItem)->IsInt()) + { + // TO DO: Error "Bad Indexed color space (hival)" + if (pBase) + delete pBase; + oArrayItem.Free(); + return NULL; + } + int nHival = oArrayItem.GetInt(); + + if (nHival < 0 || nHival > 255) // По спецификации PDF значение hival должно лежать в отрезке [0,255] + { + // TO DO: Error "Bad Indexed color space (invalid hival value)" + if (pBase) + delete pBase; + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + GrIndexedColorSpace *pColorSpace = new GrIndexedColorSpace(pBase, nHival); + + pArray->Get(3, &oArrayItem); + int nCompCount = pBase->GetComponentsCount(); + + if (oArrayItem.IsStream()) + { + oArrayItem.StreamReset(); + for (int nIndex = 0; nIndex <= nHival; ++nIndex) + { + for (int nComp = 0; nComp < nCompCount; ++nComp) + { + int nChar = 0; + if ((nChar = oArrayItem.StreamGetChar()) == EOF) + { + // TO DO: Error "Bad Indexed color space (lookup table stream too short)" + if (pColorSpace) + delete pColorSpace; + oArrayItem.Free(); + return NULL; + } + pColorSpace->m_pLookup[nIndex * nCompCount + nComp] = (unsigned char)nChar; + } + } + oArrayItem.StreamClose(); + } + else if (oArrayItem.IsString()) + { + if (oArrayItem.GetString()->GetLength() < (nHival + 1) * nCompCount) + { + // TO DO: Error "Bad Indexed color space (lookup table string too short)" + if (pColorSpace) + delete pColorSpace; + oArrayItem.Free(); + return NULL; + } + char *sString = oArrayItem.GetString()->GetBuffer(); + for (int nIndex = 0; nIndex <= nHival; ++nIndex) + { + for (int nComp = 0; nComp < nCompCount; ++nComp) + { + pColorSpace->m_pLookup[nIndex * nCompCount + nComp] = (unsigned char)*sString++; + } + } + } + else + { + // TO DO: Error "Bad Indexed color space (lookup table)" + if (pColorSpace) + delete pColorSpace; + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + return pColorSpace; + } + + GrColor *GrIndexedColorSpace::MapColorToBase(GrColor *pColor, GrColor *pBaseColor) + { + double arrLow[GrColorMaxComps], arrRange[GrColorMaxComps]; + + int nCompsCount = m_pBase->GetComponentsCount(); + m_pBase->GetDefaultRanges(arrLow, arrRange, m_nHival); + unsigned char *pLookup = &m_pLookup[(int)(ColorToDouble(pColor->arrComp[0]) + 0.5) * nCompsCount]; + for (int nIndex = 0; nIndex < nCompsCount; ++nIndex) + { + pBaseColor->arrComp[nIndex] = DoubleToColor(arrLow[nIndex] + (pLookup[nIndex] / 255.0) * arrRange[nIndex]); + } + return pBaseColor; + } + + void GrIndexedColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + GrColor oTempColor; + + m_pBase->GetGray(MapColorToBase(pColor, &oTempColor), pGray); + } + + void GrIndexedColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + GrColor oTempColor; + + m_pBase->GetRGB(MapColorToBase(pColor, &oTempColor), pRGB); + } + + void GrIndexedColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + GrColor oTempColor; + + m_pBase->GetCMYK(MapColorToBase(pColor, &oTempColor), pCMYK); + } + + void GrIndexedColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = 0; + } + + void GrIndexedColorSpace::GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue) + { + pDecodeLow[0] = 0; + pDecodeRange[0] = nMaxImagePixelValue; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrSeparationColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrSeparationColorSpace::GrSeparationColorSpace(StringExt *seName, GrColorSpace *pAlternate, Function *pFunction) + { + m_seName = seName; + m_pAlternateSpace = pAlternate; + m_pFunction = pFunction; + m_bNonMarking = !m_seName->Compare("None"); + } + + GrSeparationColorSpace::~GrSeparationColorSpace() + { + if (m_seName) + delete m_seName; + if (m_pAlternateSpace) + delete m_pAlternateSpace; + if (m_pFunction) + delete m_pFunction; + } + + GrColorSpace *GrSeparationColorSpace::Copy() + { + return new GrSeparationColorSpace(m_seName->Copy(), m_pAlternateSpace->Copy(), m_pFunction->Copy()); + } + + GrColorSpace *GrSeparationColorSpace::Parse(Array *pArray) + { + // [ /Separation name alternateSpace tintTransform ] - должен быть массив из 4 элементов + if (pArray->GetCount() != 4) + { + // TO DO: Error "Bad Separation color space" + return NULL; + } + + Object oArrayItem; + if (!pArray->Get(1, &oArrayItem)->IsName()) + { + // TO DO: Error "Bad Separation color space (name)" + oArrayItem.Free(); + return NULL; + } + + StringExt *seName = new StringExt(oArrayItem.GetName()); + oArrayItem.Free(); + + pArray->Get(2, &oArrayItem); + GrColorSpace *pAlternate = NULL; + if (!(pAlternate = GrColorSpace::Parse(&oArrayItem))) + { + // TO DO: Error "Bad Separation color space (alternate color space)" + if (seName) + delete seName; + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + + pArray->Get(3, &oArrayItem); + Function *pFunction = NULL; + if (!(pFunction = Function::Parse(&oArrayItem))) + { + if (pAlternate) + delete pAlternate; + if (seName) + delete seName; + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + + GrSeparationColorSpace *pColorSpace = new GrSeparationColorSpace(seName, pAlternate, pFunction); + return pColorSpace; + } + + void GrSeparationColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + double arrDestColor[GrColorMaxComps]; + GrColor oAltColor; + + double dSrcColor = ColorToDouble(pColor->arrComp[0]); + m_pFunction->Transform(&dSrcColor, arrDestColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDestColor[nIndex]); + } + m_pAlternateSpace->GetGray(&oAltColor, pGray); + } + + void GrSeparationColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + double arrDestColor[GrColorMaxComps]; + GrColor oAltColor; + + double dSrcColor = ColorToDouble(pColor->arrComp[0]); + m_pFunction->Transform(&dSrcColor, arrDestColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDestColor[nIndex]); + } + m_pAlternateSpace->GetRGB(&oAltColor, pRGB); + } + + void GrSeparationColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + double arrDestColor[GrColorMaxComps]; + GrColor oAltColor; + + double dSrcColor = ColorToDouble(pColor->arrComp[0]); + m_pFunction->Transform(&dSrcColor, arrDestColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDestColor[nIndex]); + } + m_pAlternateSpace->GetCMYK(&oAltColor, pCMYK); + } + + void GrSeparationColorSpace::GetDefaultColor(GrColor *pColor) + { + pColor->arrComp[0] = GrColorComp1; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceNColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrDeviceNColorSpace::GrDeviceNColorSpace(int nComponentsCount, GrColorSpace *pAlternate, Function *pFunction) + { + m_nComponentsCount = nComponentsCount; + m_pAlternateSpace = pAlternate; + m_pFunction = pFunction; + m_bNonMarking = false; + } + + GrDeviceNColorSpace::~GrDeviceNColorSpace() + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + if (m_arrseNames[nIndex]) + delete m_arrseNames[nIndex]; + } + if (m_pAlternateSpace) + delete m_pAlternateSpace; + if (m_pFunction) + delete m_pFunction; + } + + GrColorSpace *GrDeviceNColorSpace::Copy() + { + GrDeviceNColorSpace *pColorSpace = new GrDeviceNColorSpace(m_nComponentsCount, m_pAlternateSpace->Copy(), m_pFunction->Copy()); + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + pColorSpace->m_arrseNames[nIndex] = m_arrseNames[nIndex]->Copy(); + } + pColorSpace->m_bNonMarking = m_bNonMarking; + return pColorSpace; + } + + GrColorSpace *GrDeviceNColorSpace::Parse(Array *pArray) + { + StringExt *arrseNames[GrColorMaxComps]; + + // Запись о данном цветом пространстве должны быть одной из следующих двух: + // [ /DeviceN names alternateSpace tintTransform ] + // [ /DeviceN names alternateSpace tintTransform attributes ] + + if (pArray->GetCount() != 4 && pArray->GetCount() != 5) + { + // TO DO: Error "Bad DeviceN color space" + return NULL; + } + + Object oArrayItem; + if (!pArray->Get(1, &oArrayItem)->IsArray()) + { + // TO DO: Error "Bad DeviceN color space (names)" + oArrayItem.Free(); + return NULL; + } + + int nCompsCount = oArrayItem.ArrayGetLength(); + if (nCompsCount > GrColorMaxComps) + { + // TO DO: Error "DeviceN color space with too many components" + nCompsCount = GrColorMaxComps; + } + for (int nIndex = 0; nIndex < nCompsCount; ++nIndex) + { + Object oName; + if (!oArrayItem.ArrayGet(nIndex, &oName)->IsName()) + { + // TO DO: Error "Bad DeviceN color space (names)" + oName.Free(); + oArrayItem.Free(); + return NULL; + } + arrseNames[nIndex] = new StringExt(oName.GetName()); + oName.Free(); + } + oArrayItem.Free(); + + pArray->Get(2, &oArrayItem); + GrColorSpace *pAlternate = NULL; + if (!(pAlternate = GrColorSpace::Parse(&oArrayItem))) + { + // TO DO: Error "Bad DeviceN color space (alternate color space)" + for (int nIndex = 0; nIndex < nCompsCount; ++nIndex) + { + if (arrseNames[nIndex]) + delete arrseNames[nIndex]; + } + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + + pArray->Get(3, &oArrayItem); + Function *pFunction = NULL; + if (!(pFunction = Function::Parse(&oArrayItem))) + { + if (pAlternate) + delete pAlternate; + for (int nIndex = 0; nIndex < nCompsCount; ++nIndex) + { + if (arrseNames[nIndex]) + delete arrseNames[nIndex]; + } + oArrayItem.Free(); + return NULL; + } + oArrayItem.Free(); + + GrDeviceNColorSpace *pColorSpace = new GrDeviceNColorSpace(nCompsCount, pAlternate, pFunction); + pColorSpace->m_bNonMarking = true; + + for (int nIndex = 0; nIndex < nCompsCount; ++nIndex) + { + pColorSpace->m_arrseNames[nIndex] = arrseNames[nIndex]; + if (arrseNames[nIndex]->Compare("None")) + { + pColorSpace->m_bNonMarking = false; + } + } + return pColorSpace; + } + + void GrDeviceNColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + double arrSrcColor[GrColorMaxComps], arrDstColor[GrColorMaxComps]; + GrColor oAltColor; + + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + arrSrcColor[nIndex] = ColorToDouble(pColor->arrComp[nIndex]); + } + m_pFunction->Transform(arrSrcColor, arrDstColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDstColor[nIndex]); + } + m_pAlternateSpace->GetGray(&oAltColor, pGray); + } + + void GrDeviceNColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + double arrSrcColor[GrColorMaxComps], arrDstColor[GrColorMaxComps]; + GrColor oAltColor; + + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + arrSrcColor[nIndex] = ColorToDouble(pColor->arrComp[nIndex]); + } + m_pFunction->Transform(arrSrcColor, arrDstColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDstColor[nIndex]); + } + m_pAlternateSpace->GetRGB(&oAltColor, pRGB); + } + + void GrDeviceNColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + double arrSrcColor[GrColorMaxComps], arrDstColor[GrColorMaxComps]; + GrColor oAltColor; + + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + arrSrcColor[nIndex] = ColorToDouble(pColor->arrComp[nIndex]); + } + m_pFunction->Transform(arrSrcColor, arrDstColor); + for (int nIndex = 0; nIndex < m_pAlternateSpace->GetComponentsCount(); ++nIndex) + { + oAltColor.arrComp[nIndex] = DoubleToColor(arrDstColor[nIndex]); + } + m_pAlternateSpace->GetCMYK(&oAltColor, pCMYK); + } + + void GrDeviceNColorSpace::GetDefaultColor(GrColor *pColor) + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + pColor->arrComp[nIndex] = GrColorComp1; + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPatternColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + GrPatternColorSpace::GrPatternColorSpace(GrColorSpace *pUnder) + { + m_pUnder = pUnder; + } + + GrPatternColorSpace::~GrPatternColorSpace() + { + if (m_pUnder) + { + delete m_pUnder; + } + } + + GrColorSpace *GrPatternColorSpace::Copy() + { + return new GrPatternColorSpace(m_pUnder ? m_pUnder->Copy() : (GrColorSpace *)NULL); + } + + GrColorSpace *GrPatternColorSpace::Parse(Array *pArray) + { + if (pArray->GetCount() != 1 && pArray->GetCount() != 2) + { + // TO DO: Error "Bad Pattern color space" + return NULL; + } + GrColorSpace *pUnder = NULL; + if (pArray->GetCount() == 2) + { + Object oTemp; + pArray->Get(1, &oTemp); + if (!(pUnder = GrColorSpace::Parse(&oTemp))) + { + // TO DO: Error "Bad Pattern color space (underlying color space)" + oTemp.Free(); + return NULL; + } + oTemp.Free(); + } + GrPatternColorSpace *pColorSpace = new GrPatternColorSpace(pUnder); + return pColorSpace; + } + + void GrPatternColorSpace::GetGray(GrColor *pColor, GrGray *pGray) + { + *pGray = 0; + } + + void GrPatternColorSpace::GetRGB(GrColor *pColor, GrRGB *pRGB) + { + pRGB->r = pRGB->g = pRGB->b = 0; + } + + void GrPatternColorSpace::GetCMYK(GrColor *pColor, GrCMYK *pCMYK) + { + pCMYK->c = pCMYK->m = pCMYK->y = 0; + pCMYK->k = 1; + } + + void GrPatternColorSpace::GetDefaultColor(GrColor *pColor) + { + // не используется + } + + //============================================================================================================================== + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPattern + //------------------------------------------------------------------------------------------------------------------------------- + + GrPattern::GrPattern(int nType) + { + m_nType = nType; + } + + GrPattern::~GrPattern() + { + } + + GrPattern *GrPattern::Parse(Object *pObject) + { + Object oTemp; + + if (pObject->IsDict()) + { + pObject->DictLookup("PatternType", &oTemp); + } + else if (pObject->IsStream()) + { + pObject->StreamGetDict()->Search("PatternType", &oTemp); + } + else + { + return NULL; + } + GrPattern *pPattern = NULL; + + if (oTemp.IsInt() && oTemp.GetInt() == 1) + { + pPattern = GrTilingPattern::Parse(pObject); + } + else if (oTemp.IsInt() && oTemp.GetInt() == 2) + { + pPattern = GrShadingPattern::Parse(pObject); + } + oTemp.Free(); + return pPattern; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrTilingPattern + //------------------------------------------------------------------------------------------------------------------------------- + + GrTilingPattern *GrTilingPattern::Parse(Object *pPatternObject) + { + int nPaintType = 0, nTilingType = 0; + double dXStep = 0, dYStep = 0; + Object oResources; + + if (!pPatternObject->IsStream()) + { + return NULL; + } + Dict *pDict = pPatternObject->StreamGetDict(); + + Object oDictItem; + if (pDict->Search("PaintType", &oDictItem)->IsInt()) + { + nPaintType = oDictItem.GetInt(); + } + else + { + nPaintType = 1; + // TO DO: Error "Invalid or missing PaintType in pattern" + } + oDictItem.Free(); + + if (pDict->Search("TilingType", &oDictItem)->IsInt()) + { + nTilingType = oDictItem.GetInt(); + } + else + { + nTilingType = 1; + // TO DO: Error "Invalid or missing TilingType in pattern" + } + oDictItem.Free(); + + double arrBBox[4] ={ 0, 0, 1, 1 }; + + if (pDict->Search("BBox", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 4) + { + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + arrBBox[nIndex] = oTemp.GetNum(); + } + oTemp.Free(); + } + } + else + { + // TO DO: Error "Invalid or missing BBox in pattern" + } + oDictItem.Free(); + + if (pDict->Search("XStep", &oDictItem)->IsNum()) + { + dXStep = oDictItem.GetNum(); + } + else + { + dXStep = 1; + // TO DO: Error "Invalid or missing XStep in pattern" + } + oDictItem.Free(); + + if (pDict->Search("YStep", &oDictItem)->IsNum()) + { + dYStep = oDictItem.GetNum(); + } + else + { + dYStep = 1; + // TO DO: Error "Invalid or missing YStep in pattern" + } + oDictItem.Free(); + + if (!pDict->Search("Resources", &oResources)->IsDict()) + { + oResources.Free(); + oResources.InitNull(); + // TO DO: Error "Invalid or missing Resources in pattern" + } + + double arrMatrix[6] ={ 1, 0, 0, 1, 0, 0 }; + + if (pDict->Search("Matrix", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 6) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + arrMatrix[nIndex] = oTemp.GetNum(); + } + oTemp.Free(); + } + } + oDictItem.Free(); + + GrTilingPattern *pPattern = new GrTilingPattern(nPaintType, nTilingType, arrBBox, dXStep, dYStep, &oResources, arrMatrix, pPatternObject); + oResources.Free(); + return pPattern; + } + + GrTilingPattern::GrTilingPattern(int nPaintType, int nTilingType, double *pBBox, double dXStep, double dYStep, Object *pResources, double *pMatrix, Object *pContentStream) : + GrPattern(1) + { + m_nPaintType = nPaintType; + m_nTilingType = nTilingType; + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + m_arrBBox[nIndex] = pBBox[nIndex]; + } + m_dXStep = dXStep; + m_dYStep = dYStep; + pResources->Copy(&m_oResources); + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrMatrix[nIndex] = pMatrix[nIndex]; + } + pContentStream->Copy(&m_oContentStream); + } + + GrTilingPattern::~GrTilingPattern() + { + m_oResources.Free(); + m_oContentStream.Free(); + } + + GrPattern *GrTilingPattern::Copy() + { + return new GrTilingPattern(m_nPaintType, m_nTilingType, m_arrBBox, m_dXStep, m_dYStep, &m_oResources, m_arrMatrix, &m_oContentStream); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrShadingPattern + //------------------------------------------------------------------------------------------------------------------------------- + + GrShadingPattern *GrShadingPattern::Parse(Object *pPatternObject) + { + if (!pPatternObject->IsDict()) + { + return NULL; + } + Dict *pDict = pPatternObject->GetDict(); + + Object oDictItem; + pDict->Search("Shading", &oDictItem); + GrShading *pShading = GrShading::Parse(&oDictItem); + oDictItem.Free(); + + if (!pShading) + { + return NULL; + } + + double arrMatrix[6] ={ 1, 0, 0, 1, 0, 0 }; + if (pDict->Search("Matrix", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 6) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + Object oTemp; + if (oDictItem.ArrayGet(nIndex, &oTemp)->IsNum()) + { + arrMatrix[nIndex] = oTemp.GetNum(); + } + oTemp.Free(); + } + } + oDictItem.Free(); + + // TO DO: Надо сделать чтение поля ExtGState + + return new GrShadingPattern(pShading, arrMatrix); + } + + GrShadingPattern::GrShadingPattern(GrShading *pShading, double *pMatrix) : + GrPattern(2) + { + m_pShading = pShading; + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrMatrix[nIndex] = pMatrix[nIndex]; + } + } + + GrShadingPattern::~GrShadingPattern() + { + delete m_pShading; + } + + GrPattern *GrShadingPattern::Copy() + { + return new GrShadingPattern(m_pShading->Copy(), m_arrMatrix); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrShading::GrShading(int nType) + { + m_nType = nType; + m_pColorSpace = NULL; + } + + GrShading::GrShading(GrShading *pShading) + { + m_nType = pShading->m_nType; + m_pColorSpace = pShading->m_pColorSpace->Copy(); + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + m_oBackground.arrComp[nIndex] = pShading->m_oBackground.arrComp[nIndex]; + } + m_bHasBackground = pShading->m_bHasBackground; + m_dXMin = pShading->m_dXMin; + m_dYMin = pShading->m_dYMin; + m_dXMax = pShading->m_dXMax; + m_dYMax = pShading->m_dYMax; + m_bHasBBox = pShading->m_bHasBBox; + } + + GrShading::~GrShading() + { + if (m_pColorSpace) + { + delete m_pColorSpace; + } + } + + GrShading *GrShading::Parse(Object *pObject) + { + GrShading *pShading = NULL; + + Dict *pDict = NULL; + if (pObject->IsDict()) + { + pDict = pObject->GetDict(); + } + else if (pObject->IsStream()) + { + pDict = pObject->StreamGetDict(); + } + else + { + return NULL; + } + + Object oDictItem; + if (!pDict->Search("ShadingType", &oDictItem)->IsInt()) + { + // TO DO: Error "Invalid ShadingType in shading dictionary" + oDictItem.Free(); + return NULL; + } + int nType = oDictItem.GetInt(); + oDictItem.Free(); + + switch (nType) + { + case 1: + pShading = GrFunctionShading::Parse(pDict); + break; + case 2: + pShading = GrAxialShading::Parse(pDict); + break; + case 3: + pShading = GrRadialShading::Parse(pDict); + break; + case 4: + if (pObject->IsStream()) + { + pShading = GrGouraudTriangleShading::Parse(4, pDict, pObject->GetStream()); + } + else + { + // TO DO: Error "Invalid Type 4 shading object" + return NULL; + } + break; + case 5: + if (pObject->IsStream()) + { + pShading = GrGouraudTriangleShading::Parse(5, pDict, pObject->GetStream()); + } + else + { + // TO DO: Error "Invalid Type 5 shading object" + return NULL; + } + break; + case 6: + if (pObject->IsStream()) + { + pShading = GrPatchMeshShading::Parse(6, pDict, pObject->GetStream()); + } + else + { + // TO DO: Error "Invalid Type 6 shading object" + return NULL; + } + break; + case 7: + if (pObject->IsStream()) + { + pShading = GrPatchMeshShading::Parse(7, pDict, pObject->GetStream()); + } + else + { + // TO DO: Error "Invalid Type 7 shading object" + return NULL; + } + break; + default: + // TO DO: Error "Unimplemented shading type" + return NULL; + } + + // TO DO: Добавить чтение поля AntiAlias + + return pShading; + } + + bool GrShading::Initialize(Dict *pDict) + { + Object oDictItem; + pDict->Search("ColorSpace", &oDictItem); + if (!(m_pColorSpace = GrColorSpace::Parse(&oDictItem))) + { + // TO DO: Error "Bad color space in shading dictionary" + oDictItem.Free(); + return false; + } + oDictItem.Free(); + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + m_oBackground.arrComp[nIndex] = 0; + } + m_bHasBackground = false; + + if (pDict->Search("Background", &oDictItem)->IsArray()) + { + if (oDictItem.ArrayGetLength() == m_pColorSpace->GetComponentsCount()) + { + m_bHasBackground = true; + for (int nIndex = 0; nIndex < m_pColorSpace->GetComponentsCount(); ++nIndex) + { + Object oTemp; + m_oBackground.arrComp[nIndex] = DoubleToColor(oDictItem.ArrayGet(nIndex, &oTemp)->GetNum()); + oTemp.Free(); + } + } + else + { + // TO DO: Error "Bad Background in shading dictionary" + } + } + oDictItem.Free(); + + m_dXMin = m_dYMin = m_dXMax = m_dYMax = 0; + m_bHasBBox = false; + if (pDict->Search("BBox", &oDictItem)->IsArray()) + { + if (oDictItem.ArrayGetLength() == 4) + { + Object oTemp; + m_bHasBBox = true; + m_dXMin = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + + m_dYMin = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + + m_dXMax = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + + m_dYMax = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + } + else + { + // TO DO: Error "Bad BBox in shading dictionary" + } + } + oDictItem.Free(); + + // TO DO: Добавить чтение поля AntiAlias + + return true; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrFunctionShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrFunctionShading::GrFunctionShading(double dMinX, double dMinY, double dMaxX, double dMaxY, double *pMatrix, Function **ppFunctions, int nFuncsCount) : + GrShading(1) + { + m_dDomainMinX = dMinX; + m_dDomainMinY = dMinY; + m_dDomainMaxX = dMaxX; + m_dDomainMaxY = dMaxY; + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrMatrix[nIndex] = pMatrix[nIndex]; + } + m_nFunctionsCount = nFuncsCount; + + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = ppFunctions[nIndex]; + } + } + + GrFunctionShading::GrFunctionShading(GrFunctionShading *pShading) : + GrShading(pShading) + { + m_dDomainMinX = pShading->m_dDomainMinX; + m_dDomainMinY = pShading->m_dDomainMinY; + m_dDomainMaxX = pShading->m_dDomainMaxX; + m_dDomainMaxY = pShading->m_dDomainMaxY; + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrMatrix[nIndex] = pShading->m_arrMatrix[nIndex]; + } + m_nFunctionsCount = pShading->m_nFunctionsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = pShading->m_arrFunctions[nIndex]->Copy(); + } + } + + GrFunctionShading::~GrFunctionShading() + { + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + if (m_arrFunctions[nIndex]) + delete m_arrFunctions[nIndex]; + } + } + + GrFunctionShading *GrFunctionShading::Parse(Dict *pDict) + { + Function *arrFunctions[GrColorMaxComps]; + + double dMinX = 0, dMinY = 0; + double dMaxX = 1, dMaxY = 1; + Object oDictItem; + if (pDict->Search("Domain", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 4) + { + Object oTemp; + dMinX = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + // TO DO: Проверить здесь чтение(было не по спецификации) + dMaxX = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + dMinY = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + dMaxY = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + double arrMatrix[6] ={ 1, 0, 0, 1, 0, 0 }; + if (pDict->Search("Matrix", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 6) + { + Object oTemp; + arrMatrix[0] = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + arrMatrix[1] = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + arrMatrix[2] = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + arrMatrix[3] = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + arrMatrix[4] = oDictItem.ArrayGet(4, &oTemp)->GetNum(); + oTemp.Free(); + arrMatrix[5] = oDictItem.ArrayGet(5, &oTemp)->GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + pDict->Search("Function", &oDictItem); + int nFuncsCount = 0; + if (oDictItem.IsArray()) + { + nFuncsCount = oDictItem.ArrayGetLength(); + if (nFuncsCount > GrColorMaxComps) + { + // TO DO: Error "Invalid Function array in shading dictionary" + oDictItem.Free(); + return NULL; + } + for (int nIndex = 0; nIndex < nFuncsCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + if (!(arrFunctions[nIndex] = Function::Parse(&oTemp))) + { + oTemp.Free(); + oDictItem.Free(); + return NULL; + } + oTemp.Free(); + } + } + else + { + nFuncsCount = 1; + if (!(arrFunctions[0] = Function::Parse(&oDictItem))) + { + oDictItem.Free(); + return NULL; + } + } + oDictItem.Free(); + + GrFunctionShading *pShading = new GrFunctionShading(dMinX, dMinY, dMaxX, dMaxY, arrMatrix, arrFunctions, nFuncsCount); + if (!pShading->Initialize(pDict)) + { + delete pShading; + return NULL; + } + return pShading; + } + + GrShading *GrFunctionShading::Copy() + { + return new GrFunctionShading(this); + } + + void GrFunctionShading::GetColor(double dX, double dY, GrColor *pColor) + { + double arrInput[2], arrOutput[GrColorMaxComps]; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + arrOutput[nIndex] = 0; + } + arrInput[0] = dX; + arrInput[1] = dY; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex]->Transform(arrInput, &arrOutput[nIndex]); + } + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + pColor->arrComp[nIndex] = DoubleToColor(arrOutput[nIndex]); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrAxialShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrAxialShading::GrAxialShading(double dX0, double dY0, double dX1, double dY1, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, bool bExtendStart, bool bExtendEnd) : + GrShading(2) + { + m_dAxisX0 = dX0; + m_dAxisY0 = dY0; + m_dAxisX1 = dX1; + m_dAxisY1 = dY1; + m_dT0 = dT0; + m_dT1 = dT1; + m_nFunctionsCount = nFuncsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = ppFunctions[nIndex]; + } + m_bExtendStart = bExtendStart; + m_bExtendEnd = bExtendEnd; + } + + GrAxialShading::GrAxialShading(GrAxialShading *pShading) : + GrShading(pShading) + { + m_dAxisX0 = pShading->m_dAxisX0; + m_dAxisY0 = pShading->m_dAxisY0; + m_dAxisX1 = pShading->m_dAxisX1; + m_dAxisY1 = pShading->m_dAxisY1; + m_dT0 = pShading->m_dT0; + m_dT1 = pShading->m_dT1; + m_nFunctionsCount = pShading->m_nFunctionsCount; + + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = pShading->m_arrFunctions[nIndex]->Copy(); + } + m_bExtendStart = pShading->m_bExtendStart; + m_bExtendEnd = pShading->m_bExtendEnd; + } + + GrAxialShading::~GrAxialShading() + { + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + delete m_arrFunctions[nIndex]; + } + } + + GrAxialShading *GrAxialShading::Parse(Dict *pDict) + { + Function *arrFunctions[GrColorMaxComps]; + + double dX0 = 0, dY0 = 0, dX1 = 0, dY1 = 0; + Object oDictItem; + if (pDict->Search("Coords", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 4) + { + Object oTemp; + dX0 = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dY0 = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + dX1 = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + dY1 = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + } + else + { + // TO DO: Error "Missing or invalid Coords in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + double dT0 = 0, dT1 = 1; + if (pDict->Search("Domain", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) + { + Object oTemp; + dT0 = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dT1 = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + pDict->Search("Function", &oDictItem); + int nFuncsCount = 0; + if (oDictItem.IsArray()) + { + nFuncsCount = oDictItem.ArrayGetLength(); + if (nFuncsCount > GrColorMaxComps) + { + // TO DO: Error "Invalid Function array in shading dictionary" + oDictItem.Free(); + return NULL; + } + for (int nIndex = 0; nIndex < nFuncsCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + if (!(arrFunctions[nIndex] = Function::Parse(&oTemp))) + { + oDictItem.Free(); + oTemp.Free(); + return NULL; + } + oTemp.Free(); + } + } + else + { + nFuncsCount = 1; + if (!(arrFunctions[0] = Function::Parse(&oDictItem))) + { + oDictItem.Free(); + return NULL; + } + } + oDictItem.Free(); + + bool bExtendStart = false, bExtendEnd = false; + if (pDict->Search("Extend", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) + { + Object oTemp; + bExtendStart = oDictItem.ArrayGet(0, &oTemp)->GetBool(); + oTemp.Free(); + bExtendEnd = oDictItem.ArrayGet(1, &oTemp)->GetBool(); + oTemp.Free(); + } + oDictItem.Free(); + + GrAxialShading *pShading = new GrAxialShading(dX0, dY0, dX1, dY1, dT0, dT1, arrFunctions, nFuncsCount, bExtendStart, bExtendEnd); + if (!pShading->Initialize(pDict)) + { + delete pShading; + return NULL; + } + return pShading; + } + + GrShading *GrAxialShading::Copy() + { + return new GrAxialShading(this); + } + + void GrAxialShading::GetColor(double dT, GrColor *pColor) + { + double arrOutput[GrColorMaxComps]; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + arrOutput[nIndex] = 0; + } + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex]->Transform(&dT, &arrOutput[nIndex]); + } + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + pColor->arrComp[nIndex] = DoubleToColor(arrOutput[nIndex]); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrRadialShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrRadialShading::GrRadialShading(double dFirstX, double dFirstY, double dFirstRad, double dSecondX, double dSecondY, double dSecondRad, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, bool bExtendFirst, bool bExtendSecond) : + GrShading(3) + { + m_dFirstX = dFirstX; + m_dFirstY = dFirstY; + m_dFirstRad = dFirstRad; + m_dSecondX = dSecondX; + m_dSecondY = dSecondY; + m_dSecondRad = dSecondRad; + m_dT0 = dT0; + m_dT1 = dT1; + m_nFunctionsCount = nFuncsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = ppFunctions[nIndex]; + } + m_bExtendFirst = bExtendFirst; + m_bExtendSecond = bExtendSecond; + } + + GrRadialShading::GrRadialShading(GrRadialShading *pShading) : + GrShading(pShading) + { + m_dFirstX = pShading->m_dFirstX; + m_dFirstY = pShading->m_dFirstY; + m_dFirstRad = pShading->m_dFirstRad; + m_dSecondX = pShading->m_dSecondX; + m_dSecondY = pShading->m_dSecondY; + m_dSecondRad = pShading->m_dSecondRad; + m_dT0 = pShading->m_dT0; + m_dT1 = pShading->m_dT1; + m_nFunctionsCount = pShading->m_nFunctionsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex] = pShading->m_arrFunctions[nIndex]->Copy(); + } + m_bExtendFirst = pShading->m_bExtendFirst; + m_bExtendSecond = pShading->m_bExtendSecond; + } + + GrRadialShading::~GrRadialShading() + { + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + if (m_arrFunctions[nIndex]) + delete m_arrFunctions[nIndex]; + } + } + + GrRadialShading *GrRadialShading::Parse(Dict *pDict) + { + Function *arrFunctions[GrColorMaxComps]; + + Object oDictItem; + double dFirstX = 0, dFirstY = 0, dFirstRad = 0, dSecondX = 0, dSecondY = 0, dSecondRad = 0; + if (pDict->Search("Coords", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 6) + { + Object oTemp; + dFirstX = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dFirstY = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + dFirstRad = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + dSecondX = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + dSecondY = oDictItem.ArrayGet(4, &oTemp)->GetNum(); + oTemp.Free(); + dSecondRad = oDictItem.ArrayGet(5, &oTemp)->GetNum(); + oTemp.Free(); + } + else + { + // TO DO: Error "Missing or invalid Coords in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + double dT0 = 0, dT1 = 1; + if (pDict->Search("Domain", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) + { + Object oTemp; + dT0 = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dT1 = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + pDict->Search("Function", &oDictItem); + int nFuncsCount = 0; + if (oDictItem.IsArray()) + { + nFuncsCount = oDictItem.ArrayGetLength(); + if (nFuncsCount > GrColorMaxComps) + { + // TO DO: Error "Invalid Function array in shading dictionary" + oDictItem.Free(); + return NULL; + } + for (int nIndex = 0; nIndex < nFuncsCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + if (!(arrFunctions[nIndex] = Function::Parse(&oTemp))) + { + oDictItem.Free(); + oTemp.Free(); + return NULL; + } + oTemp.Free(); + } + } + else + { + nFuncsCount = 1; + if (!(arrFunctions[0] = Function::Parse(&oDictItem))) + { + oDictItem.Free(); + return NULL; + } + } + oDictItem.Free(); + + bool bExtendFirst = false, bExtendSecond = false; + if (pDict->Search("Extend", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) + { + Object oTemp; + bExtendFirst = oDictItem.ArrayGet(0, &oTemp)->GetBool(); + oTemp.Free(); + bExtendSecond = oDictItem.ArrayGet(1, &oTemp)->GetBool(); + oTemp.Free(); + } + oDictItem.Free(); + + GrRadialShading *pShading = new GrRadialShading(dFirstX, dFirstY, dFirstRad, dSecondX, dSecondY, dSecondRad, dT0, dT1, arrFunctions, nFuncsCount, bExtendFirst, bExtendSecond); + if (!pShading->Initialize(pDict)) + { + delete pShading; + return NULL; + } + return pShading; + } + + GrShading *GrRadialShading::Copy() + { + return new GrRadialShading(this); + } + + void GrRadialShading::GetColor(double dT, GrColor *pColor) + { + double arrOutput[GrColorMaxComps]; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + arrOutput[nIndex] = 0; + } + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_arrFunctions[nIndex]->Transform(&dT, &arrOutput[nIndex]); + } + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + pColor->arrComp[nIndex] = DoubleToColor(arrOutput[nIndex]); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrShadingBitBuffer + //------------------------------------------------------------------------------------------------------------------------------- + + class GrShadingBitBuffer + { + public: + + GrShadingBitBuffer(Stream *pStream) + { + m_pStream = pStream; + m_pStream->Reset(); + m_nBitBuffer = 0; + m_nBitsCount = 0; + } + ~GrShadingBitBuffer() + { + m_pStream->Close(); + } + bool GetBits(int nCount, unsigned int *pValue) + { + int nResult = 0; + + if (m_nBitsCount >= nCount) + { + nResult = (m_nBitBuffer >> (m_nBitsCount - nCount)) & ((1 << nCount) - 1); + m_nBitsCount -= nCount; + } + else + { + nResult = 0; + if (m_nBitsCount > 0) + { + nResult = m_nBitBuffer & ((1 << m_nBitsCount) - 1); + nCount -= m_nBitsCount; + m_nBitsCount = 0; + } + while (nCount > 0) + { + if ((m_nBitBuffer = m_pStream->GetChar()) == EOF) + { + m_nBitsCount = 0; + return false; + } + if (nCount >= 8) + { + nResult = (nResult << 8) | m_nBitBuffer; + nCount -= 8; + } + else + { + nResult = (nResult << nCount) | (m_nBitBuffer >> (8 - nCount)); + m_nBitsCount = 8 - nCount; + nCount = 0; + } + } + } + *pValue = nResult; + return true; + } + + void FlushBits() + { + m_nBitBuffer = 0; + m_nBitsCount = 0; + } + + private: + + Stream *m_pStream; + int m_nBitBuffer; + int m_nBitsCount; + }; + //------------------------------------------------------------------------------------------------------------------------------- + // GrGouraudTriangleShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrGouraudTriangleShading::GrGouraudTriangleShading(int nType, GrGouraudVertex *pVertexes, int nVertexesCount, int(*pTriangles)[3], int nTrianglesCount, Function **ppFunctions, int nFunctionsCount) : + GrShading(nType) + { + m_arrVertexs = pVertexes; + m_nVertexsCount = nVertexesCount; + m_arrTriangles = pTriangles; + m_nTrianglesCount = nTrianglesCount; + m_nFunctionsCount = nFunctionsCount; + + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_ppFunctions[nIndex] = ppFunctions[nIndex]; + } + } + + GrGouraudTriangleShading::GrGouraudTriangleShading(GrGouraudTriangleShading *pShading) : + GrShading(pShading) + { + m_nVertexsCount = pShading->m_nVertexsCount; + m_arrVertexs = (GrGouraudVertex *)MemUtilsMallocArray(m_nVertexsCount, sizeof(GrGouraudVertex)); + memcpy(m_arrVertexs, pShading->m_arrVertexs, m_nVertexsCount * sizeof(GrGouraudVertex)); + + m_nTrianglesCount = pShading->m_nTrianglesCount; + m_arrTriangles = (int(*)[3])MemUtilsMallocArray(m_nTrianglesCount * 3, sizeof(int)); + memcpy(m_arrTriangles, pShading->m_arrTriangles, m_nTrianglesCount * 3 * sizeof(int)); + + m_nFunctionsCount = pShading->m_nFunctionsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_ppFunctions[nIndex] = pShading->m_ppFunctions[nIndex]->Copy(); + } + } + + GrGouraudTriangleShading::~GrGouraudTriangleShading() + { + MemUtilsFree(m_arrVertexs); + MemUtilsFree(m_arrTriangles); + + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + if (m_ppFunctions[nIndex]) + delete m_ppFunctions[nIndex]; + } + } + + GrGouraudTriangleShading *GrGouraudTriangleShading::Parse(int nType, Dict *pDict, Stream *pStream) + { + int nBitsPerCoordinate = 0, nBitsPerComponent = 0; + + int nIndex = 0; + + Object oDictItem; + if (pDict->Search("BitsPerCoordinate", &oDictItem)->IsInt()) + { + nBitsPerCoordinate = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerCoordinate in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + if (pDict->Search("BitsPerComponent", &oDictItem)->IsInt()) + { + nBitsPerComponent = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerComponent in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + int nBitsPerFlag = 0, nVerticesPerRow = 0; + if (nType == 4) + { + if (pDict->Search("BitsPerFlag", &oDictItem)->IsInt()) + { + nBitsPerFlag = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerFlag in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + } + else + { + if (pDict->Search("VerticesPerRow", &oDictItem)->IsInt()) + { + nVerticesPerRow = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid VerticesPerRow in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + } + + // [ Xmin Xmax Ymin Ymax C1,min C1,max ... Cn,min Cn,max ], поэтому как минимум массив должен быть из 6 элементов + double dXMin, dXMax, dYMin, dYMax; + double arrCMin[GrColorMaxComps], arrCMax[GrColorMaxComps]; + double dXMul, dYMul; + double arrCMul[GrColorMaxComps]; + int nComponentsCount = 0; + if (pDict->Search("Decode", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() >= 6) + { + Object oTemp; + dXMin = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dXMax = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + dXMul = (dXMax - dXMin) / (pow(2.0, nBitsPerCoordinate) - 1); + dYMin = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + dYMax = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + dYMul = (dYMax - dYMin) / (pow(2.0, nBitsPerCoordinate) - 1); + + for (nIndex = 0; 5 + 2 * nIndex < oDictItem.ArrayGetLength() && nIndex < GrColorMaxComps; ++nIndex) + { + arrCMin[nIndex] = oDictItem.ArrayGet(4 + 2 * nIndex, &oTemp)->GetNum(); + oTemp.Free(); + arrCMax[nIndex] = oDictItem.ArrayGet(5 + 2 * nIndex, &oTemp)->GetNum(); + oTemp.Free(); + arrCMul[nIndex] = (arrCMax[nIndex] - arrCMin[nIndex]) / (double)((1 << nBitsPerComponent) - 1); + } + nComponentsCount = nIndex; + } + else + { + // TO DO: Error "Missing or invalid Decode array in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + int nFunctionsCount = 0; + Function *ppFunctions[GrColorMaxComps]; + if (!pDict->Search("Function", &oDictItem)->IsNull()) + { + if (oDictItem.IsArray()) + { + nFunctionsCount = oDictItem.ArrayGetLength(); + if (nFunctionsCount > GrColorMaxComps) + { + // TO DO: Error "Invalid Function array in shading dictionary" + oDictItem.Free(); + return NULL; + } + for (int nIndex = 0; nIndex < nFunctionsCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + if (!(ppFunctions[nIndex] = Function::Parse(&oTemp))) + { + oDictItem.Free(); + oTemp.Free(); + return NULL; + } + oTemp.Free(); + } + } + else + { + nFunctionsCount = 1; + if (!(ppFunctions[0] = Function::Parse(&oDictItem))) + { + oDictItem.Free(); + return NULL; + } + } + } + else + { + nFunctionsCount = 0; + } + oDictItem.Free(); + + // Дальше читаем данные из потока(набор вершин) + int nVerticesCount = 0, nTrianglesCount = 0; + GrGouraudVertex *pVertices = NULL; + int(*pTriangles)[3] = NULL; + int nVertSize = 0, nTriSize = 0; + int nState = 0; + unsigned int unFlag = 0, unX = 0, unY = 0; + unsigned int arrunC[GrColorMaxComps]; + GrShadingBitBuffer *pBitBuffer = new GrShadingBitBuffer(pStream); + if (NULL == pBitBuffer) + return NULL; + + while (1) + { + if (nType == 4) // В типе 5 нет флага вначале + { + if (!pBitBuffer->GetBits(nBitsPerFlag, &unFlag)) + { + break; + } + } + if (!pBitBuffer->GetBits(nBitsPerCoordinate, &unX) || !pBitBuffer->GetBits(nBitsPerCoordinate, &unY)) + { + break; + } + for (nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + if (!pBitBuffer->GetBits(nBitsPerComponent, &arrunC[nIndex])) + { + break; + } + } + if (nIndex < nComponentsCount) + { + break; + } + if (nVerticesCount == nVertSize) + { + nVertSize = (nVertSize == 0) ? 16 : 2 * nVertSize; + pVertices = (GrGouraudVertex *)MemUtilsReallocArray(pVertices, nVertSize, sizeof(GrGouraudVertex)); + } + pVertices[nVerticesCount].dX = dXMin + dXMul * (double)unX; + pVertices[nVerticesCount].dY = dYMin + dYMul * (double)unY; + + for (int nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + pVertices[nVerticesCount].oColor.arrComp[nIndex] = DoubleToColor(arrCMin[nIndex] + arrCMul[nIndex] * (double)arrunC[nIndex]); + } + ++nVerticesCount; + + pBitBuffer->FlushBits(); + if (nType == 4) + { + if (nState == 0 || nState == 1) + { + ++nState; + } + else if (nState == 2 || unFlag > 0) + { + if (nTrianglesCount == nTriSize) + { + nTriSize = (nTriSize == 0) ? 16 : 2 * nTriSize; + pTriangles = (int(*)[3]) MemUtilsReallocArray(pTriangles, nTriSize * 3, sizeof(int)); + } + if (nState == 2) + { + pTriangles[nTrianglesCount][0] = nVerticesCount - 3; + pTriangles[nTrianglesCount][1] = nVerticesCount - 2; + pTriangles[nTrianglesCount][2] = nVerticesCount - 1; + ++nState; + } + else if (unFlag == 1) + { + pTriangles[nTrianglesCount][0] = pTriangles[nTrianglesCount - 1][1]; + pTriangles[nTrianglesCount][1] = pTriangles[nTrianglesCount - 1][2]; + pTriangles[nTrianglesCount][2] = nVerticesCount - 1; + } + else // unFlag == 2 + { + pTriangles[nTrianglesCount][0] = pTriangles[nTrianglesCount - 1][0]; + pTriangles[nTrianglesCount][1] = pTriangles[nTrianglesCount - 1][2]; + pTriangles[nTrianglesCount][2] = nVerticesCount - 1; + } + ++nTrianglesCount; + } + else // nState == 3 && unFlag == 0 + { + nState = 1; + } + } + } + delete pBitBuffer; + if (nType == 5) + { + int nRowsCount = nVerticesCount / nVerticesPerRow; + nTrianglesCount = (nRowsCount - 1) * 2 * (nVerticesPerRow - 1); + pTriangles = (int(*)[3])MemUtilsMallocArray(nTrianglesCount * 3, sizeof(int)); + int nTriangleIndex = 0; + for (int nRowIndex = 0; nRowIndex < nRowsCount - 1; ++nRowIndex) + { + for (int nVertIndex = 0; nVertIndex < nVerticesPerRow - 1; ++nVertIndex) + { + pTriangles[nTriangleIndex][0] = nRowIndex * nVerticesPerRow + nVertIndex; + pTriangles[nTriangleIndex][1] = nRowIndex * nVerticesPerRow + nVertIndex + 1; + pTriangles[nTriangleIndex][2] = (nRowIndex + 1) * nVerticesPerRow + nVertIndex; + ++nTriangleIndex; + pTriangles[nTriangleIndex][0] = nRowIndex * nVerticesPerRow + nVertIndex + 1; + pTriangles[nTriangleIndex][1] = (nRowIndex + 1) * nVerticesPerRow + nVertIndex; + pTriangles[nTriangleIndex][2] = (nRowIndex + 1) * nVerticesPerRow + nVertIndex + 1; + ++nTriangleIndex; + } + } + } + + GrGouraudTriangleShading *pShading = new GrGouraudTriangleShading(nType, pVertices, nVerticesCount, pTriangles, nTrianglesCount, ppFunctions, nFunctionsCount); + if (!pShading) + return NULL; + if (!pShading->Initialize(pDict)) + { + delete pShading; + return NULL; + } + return pShading; + } + + GrShading *GrGouraudTriangleShading::Copy() + { + return new GrGouraudTriangleShading(this); + } + + void GrGouraudTriangleShading::GetTriangle(int nIndex, double *pdX0, double *pdY0, GrColor *pColor0, double *pdX1, double *pdY1, GrColor *pColor1, double *pdX2, double *pdY2, GrColor *pColor2) + { + double dIn = 0; + double arrOut[GrColorMaxComps]; + int nVertexIndex; + + nVertexIndex = m_arrTriangles[nIndex][0]; + *pdX0 = m_arrVertexs[nVertexIndex].dX; + *pdY0 = m_arrVertexs[nVertexIndex].dY; + if (m_nFunctionsCount > 0) + { + dIn = ColorToDouble(m_arrVertexs[nVertexIndex].oColor.arrComp[0]); + for (int nJ = 0; nJ < m_nFunctionsCount; ++nJ) + { + m_ppFunctions[nJ]->Transform(&dIn, &arrOut[nJ]); + } + for (int nJ = 0; nJ < GrColorMaxComps; ++nJ) + { + pColor0->arrComp[nJ] = DoubleToColor(arrOut[nJ]); + } + } + else + { + *pColor0 = m_arrVertexs[nVertexIndex].oColor; + } + + nVertexIndex = m_arrTriangles[nIndex][1]; + *pdX1 = m_arrVertexs[nVertexIndex].dX; + *pdY1 = m_arrVertexs[nVertexIndex].dY; + if (m_nFunctionsCount > 0) + { + dIn = ColorToDouble(m_arrVertexs[nVertexIndex].oColor.arrComp[0]); + for (int nJ = 0; nJ < m_nFunctionsCount; ++nJ) + { + m_ppFunctions[nJ]->Transform(&dIn, &arrOut[nJ]); + } + for (int nJ = 0; nJ < GrColorMaxComps; ++nJ) + { + pColor1->arrComp[nJ] = DoubleToColor(arrOut[nJ]); + } + } + else + { + *pColor1 = m_arrVertexs[nVertexIndex].oColor; + } + + nVertexIndex = m_arrTriangles[nIndex][2]; + *pdX2 = m_arrVertexs[nVertexIndex].dX; + *pdY2 = m_arrVertexs[nVertexIndex].dY; + if (m_nFunctionsCount > 0) + { + dIn = ColorToDouble(m_arrVertexs[nVertexIndex].oColor.arrComp[0]); + for (int nJ = 0; nJ < m_nFunctionsCount; ++nJ) + { + m_ppFunctions[nJ]->Transform(&dIn, &arrOut[nJ]); + } + for (int nJ = 0; nJ < GrColorMaxComps; ++nJ) + { + pColor2->arrComp[nJ] = DoubleToColor(arrOut[nJ]); + } + } + else + { + *pColor2 = m_arrVertexs[nVertexIndex].oColor; + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPatchMeshShading + //------------------------------------------------------------------------------------------------------------------------------- + + GrPatchMeshShading::GrPatchMeshShading(int nType, GrPatch *pPatches, int nPatchesCount, Function **ppFunctions, int nFunctionsCount) : + GrShading(nType) + { + m_pPatches = pPatches; + m_nPatchesCount = nPatchesCount; + m_nFunctionsCount = nFunctionsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_ppFunctions[nIndex] = ppFunctions[nIndex]; + } + } + + GrPatchMeshShading::GrPatchMeshShading(GrPatchMeshShading *pShading) : + GrShading(pShading) + { + m_nPatchesCount = pShading->m_nPatchesCount; + m_pPatches = (GrPatch *)MemUtilsMallocArray(m_nPatchesCount, sizeof(GrPatch)); + memcpy(m_pPatches, pShading->m_pPatches, m_nPatchesCount * sizeof(GrPatch)); + + m_nFunctionsCount = pShading->m_nFunctionsCount; + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + m_ppFunctions[nIndex] = pShading->m_ppFunctions[nIndex]->Copy(); + } + } + + GrPatchMeshShading::~GrPatchMeshShading() + { + MemUtilsFree(m_pPatches); + for (int nIndex = 0; nIndex < m_nFunctionsCount; ++nIndex) + { + if (m_ppFunctions[nIndex]) + delete m_ppFunctions[nIndex]; + } + } + + GrPatchMeshShading *GrPatchMeshShading::Parse(int nType, Dict *pDict, Stream *pStream) + { + int nBitsPerCoordinate = 0, nBitsPerComponent = 0, nBitsPerFlag = 0; + int nIndex = 0; + + Object oDictItem; + if (pDict->Search("BitsPerCoordinate", &oDictItem)->IsInt()) + { + nBitsPerCoordinate = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerCoordinate in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + if (pDict->Search("BitsPerComponent", &oDictItem)->IsInt()) + { + nBitsPerComponent = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerComponent in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + if (pDict->Search("BitsPerFlag", &oDictItem)->IsInt()) + { + nBitsPerFlag = oDictItem.GetInt(); + } + else + { + // TO DO: Error "Missing or invalid BitsPerFlag in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + double dXMin, dXMax, dYMin, dYMax; + double arrCMin[GrColorMaxComps], arrCMax[GrColorMaxComps]; + double dXMul, dYMul; + double arrCMul[GrColorMaxComps]; + int nComponentsCount = 0; + + // [ Xmin Xmax Ymin Ymax C1,min C1,max ... Cn,min Cn,max ], поэтому как минимум массив должен быть из 6 элементов + if (pDict->Search("Decode", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() >= 6) + { + Object oTemp; + dXMin = oDictItem.ArrayGet(0, &oTemp)->GetNum(); + oTemp.Free(); + dXMax = oDictItem.ArrayGet(1, &oTemp)->GetNum(); + oTemp.Free(); + dXMul = (dXMax - dXMin) / (pow(2.0, nBitsPerCoordinate) - 1); + dYMin = oDictItem.ArrayGet(2, &oTemp)->GetNum(); + oTemp.Free(); + dYMax = oDictItem.ArrayGet(3, &oTemp)->GetNum(); + oTemp.Free(); + dYMul = (dYMax - dYMin) / (pow(2.0, nBitsPerCoordinate) - 1); + for (nIndex = 0; 5 + 2 * nIndex < oDictItem.ArrayGetLength() && nIndex < GrColorMaxComps; ++nIndex) + { + arrCMin[nIndex] = oDictItem.ArrayGet(4 + 2 * nIndex, &oTemp)->GetNum(); + oTemp.Free(); + arrCMax[nIndex] = oDictItem.ArrayGet(5 + 2 * nIndex, &oTemp)->GetNum(); + oTemp.Free(); + arrCMul[nIndex] = (arrCMax[nIndex] - arrCMin[nIndex]) / (double)((1 << nBitsPerComponent) - 1); + } + nComponentsCount = nIndex; + } + else + { + // TO DO: Error "Missing or invalid Decode array in shading dictionary" + oDictItem.Free(); + return NULL; + } + oDictItem.Free(); + + int nFunctionsCount = 0; + Function *ppFunctions[GrColorMaxComps]; + if (!pDict->Search("Function", &oDictItem)->IsNull()) + { + if (oDictItem.IsArray()) + { + nFunctionsCount = oDictItem.ArrayGetLength(); + if (nFunctionsCount > GrColorMaxComps) + { + // TO DO: Error "Invalid Function array in shading dictionary" + oDictItem.Free(); + return NULL; + } + for (nIndex = 0; nIndex < nFunctionsCount; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + if (!(ppFunctions[nIndex] = Function::Parse(&oTemp))) + { + oDictItem.Free(); + oTemp.Free(); + return NULL; + } + oDictItem.Free(); + } + } + else + { + nFunctionsCount = 1; + if (!(ppFunctions[0] = Function::Parse(&oDictItem))) + { + oDictItem.Free(); + return NULL; + } + } + } + else + { + nFunctionsCount = 0; + } + oDictItem.Free(); + + int nPatchesCount = 0, nPatchesSize = 0; + GrPatch *pPatches = NULL; + GrShadingBitBuffer *pBitBuffer = new GrShadingBitBuffer(pStream); + + double arrX[16], arrY[16]; + GrColorComp arrC[4][GrColorMaxComps]; + + while (1) + { + unsigned int unFlag = 0; + int nPointsCount = 0, nColorsCount = 0; + if (!pBitBuffer->GetBits(nBitsPerFlag, &unFlag)) + { + break; + } + if (nType == 6) + { + switch (unFlag) + { + case 0: nPointsCount = 12; nColorsCount = 4; break; + case 1: + case 2: + case 3: + default: nPointsCount = 8; nColorsCount = 2; break; + } + } + else + { + switch (unFlag) + { + case 0: nPointsCount = 16; nColorsCount = 4; break; + case 1: + case 2: + case 3: + default: nPointsCount = 12; nColorsCount = 2; break; + } + } + for (nIndex = 0; nIndex < nPointsCount; ++nIndex) + { + unsigned int unX = 0, unY = 0; + if (!pBitBuffer->GetBits(nBitsPerCoordinate, &unX) || !pBitBuffer->GetBits(nBitsPerCoordinate, &unY)) + { + break; + } + arrX[nIndex] = dXMin + dXMul * (double)unX; + arrY[nIndex] = dYMin + dYMul * (double)unY; + } + if (nIndex < nPointsCount) + { + break; + } + for (nIndex = 0; nIndex < nColorsCount; ++nIndex) + { + int nJ = 0; + unsigned int arrunC[4]; + for (nJ = 0; nJ < nComponentsCount; ++nJ) + { + if (!pBitBuffer->GetBits(nBitsPerComponent, &arrunC[nJ])) + { + break; + } + arrC[nIndex][nJ] = DoubleToColor(arrCMin[nJ] + arrCMul[nJ] * (double)arrunC[nJ]); + } + if (nJ < nComponentsCount) + { + break; + } + } + if (nIndex < nColorsCount) + { + break; + } + if (nPatchesCount == nPatchesSize) + { + nPatchesSize = (nPatchesSize == 0) ? 16 : 2 * nPatchesSize; + pPatches = (GrPatch *)MemUtilsReallocArray(pPatches, nPatchesSize, sizeof(GrPatch)); + } + GrPatch *pCurPatch = &pPatches[nPatchesCount]; + if (nType == 6) + { + switch (unFlag) + { + case 0: + pCurPatch->arrX[0][0] = arrX[0]; pCurPatch->arrY[0][0] = arrY[0]; + pCurPatch->arrX[0][1] = arrX[1]; pCurPatch->arrY[0][1] = arrY[1]; + pCurPatch->arrX[0][2] = arrX[2]; pCurPatch->arrY[0][2] = arrY[2]; + pCurPatch->arrX[0][3] = arrX[3]; pCurPatch->arrY[0][3] = arrY[3]; + pCurPatch->arrX[1][3] = arrX[4]; pCurPatch->arrY[1][3] = arrY[4]; + pCurPatch->arrX[2][3] = arrX[5]; pCurPatch->arrY[2][3] = arrY[5]; + pCurPatch->arrX[3][3] = arrX[6]; pCurPatch->arrY[3][3] = arrY[6]; + pCurPatch->arrX[3][2] = arrX[7]; pCurPatch->arrY[3][2] = arrY[7]; + pCurPatch->arrX[3][1] = arrX[8]; pCurPatch->arrY[3][1] = arrY[8]; + pCurPatch->arrX[3][0] = arrX[9]; pCurPatch->arrY[3][0] = arrY[9]; + pCurPatch->arrX[2][0] = arrX[10]; pCurPatch->arrY[2][0] = arrY[10]; + pCurPatch->arrX[1][0] = arrX[11]; pCurPatch->arrY[1][0] = arrY[11]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = arrC[1][nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[2][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[3][nJ]; + } + break; + case 1: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[0][3]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[0][3]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[1][3]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[1][3]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[2][3]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[2][3]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[3][3]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[3][3]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[0][1].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][1].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + case 2: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[3][3]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[3][3]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[3][2]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[3][2]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[3][1]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[3][1]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[3][0]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[3][0]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][1].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][0].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + case 3: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[3][0]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[3][0]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[2][0]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[2][0]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[1][0]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[1][0]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[0][0]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[0][0]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][0].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[0][0].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + } + } + else + { + switch (unFlag) + { + case 0: + pCurPatch->arrX[0][0] = arrX[0]; pCurPatch->arrY[0][0] = arrY[0]; + pCurPatch->arrX[0][1] = arrX[1]; pCurPatch->arrY[0][1] = arrY[1]; + pCurPatch->arrX[0][2] = arrX[2]; pCurPatch->arrY[0][2] = arrY[2]; + pCurPatch->arrX[0][3] = arrX[3]; pCurPatch->arrY[0][3] = arrY[3]; + pCurPatch->arrX[1][3] = arrX[4]; pCurPatch->arrY[1][3] = arrY[4]; + pCurPatch->arrX[2][3] = arrX[5]; pCurPatch->arrY[2][3] = arrY[5]; + pCurPatch->arrX[3][3] = arrX[6]; pCurPatch->arrY[3][3] = arrY[6]; + pCurPatch->arrX[3][2] = arrX[7]; pCurPatch->arrY[3][2] = arrY[7]; + pCurPatch->arrX[3][1] = arrX[8]; pCurPatch->arrY[3][1] = arrY[8]; + pCurPatch->arrX[3][0] = arrX[9]; pCurPatch->arrY[3][0] = arrY[9]; + pCurPatch->arrX[2][0] = arrX[10]; pCurPatch->arrY[2][0] = arrY[10]; + pCurPatch->arrX[1][0] = arrX[11]; pCurPatch->arrY[1][0] = arrY[11]; + pCurPatch->arrX[1][1] = arrX[12]; pCurPatch->arrY[1][1] = arrY[12]; + pCurPatch->arrX[1][2] = arrX[13]; pCurPatch->arrY[1][2] = arrY[13]; + pCurPatch->arrX[2][2] = arrX[14]; pCurPatch->arrY[2][2] = arrY[14]; + pCurPatch->arrX[2][1] = arrX[15]; pCurPatch->arrY[2][1] = arrY[15]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = arrC[1][nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[2][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[3][nJ]; + } + break; + case 1: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[0][3]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[0][3]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[1][3]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[1][3]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[2][3]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[2][3]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[3][3]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[3][3]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + pCurPatch->arrX[1][1] = arrX[8]; pCurPatch->arrY[1][1] = arrY[8]; + pCurPatch->arrX[1][2] = arrX[9]; pCurPatch->arrY[1][2] = arrY[9]; + pCurPatch->arrX[2][2] = arrX[10]; pCurPatch->arrY[2][2] = arrY[10]; + pCurPatch->arrX[2][1] = arrX[11]; pCurPatch->arrY[2][1] = arrY[11]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[0][1].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][1].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + case 2: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[3][3]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[3][3]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[3][2]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[3][2]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[3][1]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[3][1]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[3][0]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[3][0]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + pCurPatch->arrX[1][1] = arrX[8]; pCurPatch->arrY[1][1] = arrY[8]; + pCurPatch->arrX[1][2] = arrX[9]; pCurPatch->arrY[1][2] = arrY[9]; + pCurPatch->arrX[2][2] = arrX[10]; pCurPatch->arrY[2][2] = arrY[10]; + pCurPatch->arrX[2][1] = arrX[11]; pCurPatch->arrY[2][1] = arrY[11]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][1].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][0].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + case 3: + pCurPatch->arrX[0][0] = pPatches[nPatchesCount - 1].arrX[3][0]; pCurPatch->arrY[0][0] = pPatches[nPatchesCount - 1].arrY[3][0]; + pCurPatch->arrX[0][1] = pPatches[nPatchesCount - 1].arrX[2][0]; pCurPatch->arrY[0][1] = pPatches[nPatchesCount - 1].arrY[2][0]; + pCurPatch->arrX[0][2] = pPatches[nPatchesCount - 1].arrX[1][0]; pCurPatch->arrY[0][2] = pPatches[nPatchesCount - 1].arrY[1][0]; + pCurPatch->arrX[0][3] = pPatches[nPatchesCount - 1].arrX[0][0]; pCurPatch->arrY[0][3] = pPatches[nPatchesCount - 1].arrY[0][0]; + pCurPatch->arrX[1][3] = arrX[0]; pCurPatch->arrY[1][3] = arrY[0]; + pCurPatch->arrX[2][3] = arrX[1]; pCurPatch->arrY[2][3] = arrY[1]; + pCurPatch->arrX[3][3] = arrX[2]; pCurPatch->arrY[3][3] = arrY[2]; + pCurPatch->arrX[3][2] = arrX[3]; pCurPatch->arrY[3][2] = arrY[3]; + pCurPatch->arrX[3][1] = arrX[4]; pCurPatch->arrY[3][1] = arrY[4]; + pCurPatch->arrX[3][0] = arrX[5]; pCurPatch->arrY[3][0] = arrY[5]; + pCurPatch->arrX[2][0] = arrX[6]; pCurPatch->arrY[2][0] = arrY[6]; + pCurPatch->arrX[1][0] = arrX[7]; pCurPatch->arrY[1][0] = arrY[7]; + pCurPatch->arrX[1][1] = arrX[8]; pCurPatch->arrY[1][1] = arrY[8]; + pCurPatch->arrX[1][2] = arrX[9]; pCurPatch->arrY[1][2] = arrY[9]; + pCurPatch->arrX[2][2] = arrX[10]; pCurPatch->arrY[2][2] = arrY[10]; + pCurPatch->arrX[2][1] = arrX[11]; pCurPatch->arrY[2][1] = arrY[11]; + for (int nJ = 0; nJ < nComponentsCount; ++nJ) + { + pCurPatch->arrColor[0][0].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[1][0].arrComp[nJ]; + pCurPatch->arrColor[0][1].arrComp[nJ] = pPatches[nPatchesCount - 1].arrColor[0][0].arrComp[nJ]; + pCurPatch->arrColor[1][1].arrComp[nJ] = arrC[0][nJ]; + pCurPatch->arrColor[1][0].arrComp[nJ] = arrC[1][nJ]; + } + break; + } + } + ++nPatchesCount; + pBitBuffer->FlushBits(); + } + delete pBitBuffer; + + if (nType == 6) + { + for (nIndex = 0; nIndex < nPatchesCount; ++nIndex) + { + GrPatch *p = &pPatches[nIndex]; + p->arrX[1][1] = (-4 * p->arrX[0][0] + 6 * (p->arrX[0][1] + p->arrX[1][0]) - 2 * (p->arrX[0][3] + p->arrX[3][0]) + 3 * (p->arrX[3][1] + p->arrX[1][3]) - p->arrX[3][3]) / 9; + p->arrY[1][1] = (-4 * p->arrY[0][0] + 6 * (p->arrY[0][1] + p->arrY[1][0]) - 2 * (p->arrY[0][3] + p->arrY[3][0]) + 3 * (p->arrY[3][1] + p->arrY[1][3]) - p->arrY[3][3]) / 9; + + p->arrX[1][2] = (-4 * p->arrX[0][3] + 6 * (p->arrX[0][2] + p->arrX[1][3]) - 2 * (p->arrX[0][0] + p->arrX[3][3]) + 3 * (p->arrX[3][2] + p->arrX[1][0]) - p->arrX[3][0]) / 9; + p->arrY[1][2] = (-4 * p->arrY[0][3] + 6 * (p->arrY[0][2] + p->arrY[1][3]) - 2 * (p->arrY[0][0] + p->arrY[3][3]) + 3 * (p->arrY[3][2] + p->arrY[1][0]) - p->arrY[3][0]) / 9; + + p->arrX[2][1] = (-4 * p->arrX[3][0] + 6 * (p->arrX[3][1] + p->arrX[2][0]) - 2 * (p->arrX[3][3] + p->arrX[0][0]) + 3 * (p->arrX[0][1] + p->arrX[2][3]) - p->arrX[0][3]) / 9; + p->arrY[2][1] = (-4 * p->arrY[3][0] + 6 * (p->arrY[3][1] + p->arrY[2][0]) - 2 * (p->arrY[3][3] + p->arrY[0][0]) + 3 * (p->arrY[0][1] + p->arrY[2][3]) - p->arrY[0][3]) / 9; + + p->arrX[2][2] = (-4 * p->arrX[3][3] + 6 * (p->arrX[3][2] + p->arrX[2][3]) - 2 * (p->arrX[3][0] + p->arrX[0][3]) + 3 * (p->arrX[0][2] + p->arrX[2][0]) - p->arrX[0][0]) / 9; + p->arrY[2][2] = (-4 * p->arrY[3][3] + 6 * (p->arrY[3][2] + p->arrY[2][3]) - 2 * (p->arrY[3][0] + p->arrY[0][3]) + 3 * (p->arrY[0][2] + p->arrY[2][0]) - p->arrY[0][0]) / 9; + } + } + + GrPatchMeshShading *pShading = new GrPatchMeshShading(nType, pPatches, nPatchesCount, ppFunctions, nFunctionsCount); + if (!pShading) + return NULL; + if (!pShading->Initialize(pDict)) + { + delete pShading; + return NULL; + } + return pShading; + } + + GrShading *GrPatchMeshShading::Copy() + { + return new GrPatchMeshShading(this); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrImageColorMap + //------------------------------------------------------------------------------------------------------------------------------- + + GrImageColorMap::GrImageColorMap(int nBitsPerComponent, Object *pDecode, GrColorSpace *pColorSpace) + { + m_bSuccess = true; + + m_nBitsPerComponent = nBitsPerComponent; + int nMaxPixelIndex = (1 << m_nBitsPerComponent) - 1; + m_pColorSpace = pColorSpace; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + m_ppLookup[nIndex] = NULL; + } + + if (pDecode->IsNull()) + { + m_nComponentsCount = m_pColorSpace->GetComponentsCount(); + m_pColorSpace->GetDefaultRanges(m_arrDecodeLow, m_arrDecodeRange, nMaxPixelIndex); + } + else if (pDecode->IsArray()) + { + m_nComponentsCount = pDecode->ArrayGetLength() / 2; + if (m_nComponentsCount != m_pColorSpace->GetComponentsCount()) + { + m_bSuccess = false; + return; + } + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + Object oTemp; + pDecode->ArrayGet(2 * nIndex, &oTemp); + if (!oTemp.IsNum()) + { + oTemp.Free(); + m_bSuccess = false; + return; + } + m_arrDecodeLow[nIndex] = oTemp.GetNum(); + oTemp.Free(); + + pDecode->ArrayGet(2 * nIndex + 1, &oTemp); + if (!oTemp.IsNum()) + { + oTemp.Free(); + m_bSuccess = false; + return; + } + m_arrDecodeRange[nIndex] = oTemp.GetNum() - m_arrDecodeLow[nIndex]; + oTemp.Free(); + } + } + else + { + m_bSuccess = false; + return; + } + + // Строим таблицу поиска, в которой будут храниться, предварительно вычисленные(декодированные), + // значения какждой компоненты. + // Оптимизация для цветовых пространств Indexed and Separation(имеющих одну компоненту): + // в таблице будет хранится значения цвета, а не значения компонент. + m_pColorSpace2 = NULL; + m_nComponentsCount2 = 0; + double arrX[GrColorMaxComps], arrY[GrColorMaxComps]; + if (m_pColorSpace->GetMode() == csIndexed) + { + // Возможно, что nHival != nMaxPixelIndex + GrIndexedColorSpace *pIndexedCS = (GrIndexedColorSpace *)m_pColorSpace; + m_pColorSpace2 = pIndexedCS->GetBase(); + int nHival = pIndexedCS->GetHival(); + m_nComponentsCount2 = m_pColorSpace2->GetComponentsCount(); + unsigned char *pLookup2 = pIndexedCS->GetLookup(); + m_pColorSpace2->GetDefaultRanges(arrX, arrY, nHival); + + for (int nComp = 0; nComp < m_nComponentsCount2; ++nComp) + { + m_ppLookup[nComp] = (GrColorComp *)MemUtilsMallocArray(nMaxPixelIndex + 1, sizeof(GrColorComp)); + for (int nIndex = 0; nIndex <= nMaxPixelIndex; ++nIndex) + { + int nCurIndex = (int)(m_arrDecodeLow[0] + (nIndex * m_arrDecodeRange[0]) / nMaxPixelIndex + 0.5); + if (nCurIndex < 0) + { + nCurIndex = 0; + } + else if (nCurIndex > nHival) + { + nCurIndex = nHival; + } + m_ppLookup[nComp][nIndex] = DoubleToColor(arrX[nComp] + (pLookup2[nCurIndex * m_nComponentsCount2 + nComp] / 255.0) * arrY[nComp]); + } + } + } + else if (m_pColorSpace->GetMode() == csSeparation) + { + GrSeparationColorSpace *pSeparateCS = (GrSeparationColorSpace *)m_pColorSpace; + m_pColorSpace2 = pSeparateCS->GetAlternateSpace(); + m_nComponentsCount2 = m_pColorSpace2->GetComponentsCount(); + Function *pSepFunc = pSeparateCS->GetTransformFunction(); + + for (int nComp = 0; nComp < m_nComponentsCount2; ++nComp) + { + m_ppLookup[nComp] = (GrColorComp *)MemUtilsMallocArray(nMaxPixelIndex + 1, sizeof(GrColorComp)); + for (int nIndex = 0; nIndex <= nMaxPixelIndex; ++nIndex) + { + arrX[0] = m_arrDecodeLow[0] + (nIndex * m_arrDecodeRange[0]) / nMaxPixelIndex; + pSepFunc->Transform(arrX, arrY); + m_ppLookup[nComp][nIndex] = DoubleToColor(arrY[nComp]); + } + } + } + else + { + for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + m_ppLookup[nComp] = (GrColorComp *)MemUtilsMallocArray(nMaxPixelIndex + 1, sizeof(GrColorComp)); + for (int nIndex = 0; nIndex <= nMaxPixelIndex; ++nIndex) + { + m_ppLookup[nComp][nIndex] = DoubleToColor(m_arrDecodeLow[nComp] + (nIndex * m_arrDecodeRange[nComp]) / nMaxPixelIndex); + } + } + } + + return; + } + + GrImageColorMap::GrImageColorMap(GrImageColorMap *pColorMap) + { + m_pColorSpace = pColorMap->m_pColorSpace->Copy(); + m_nBitsPerComponent = pColorMap->m_nBitsPerComponent; + m_nComponentsCount = pColorMap->m_nComponentsCount; + m_nComponentsCount2 = pColorMap->m_nComponentsCount2; + m_pColorSpace2 = NULL; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + m_ppLookup[nIndex] = NULL; + } + int nBitsCount = 1 << m_nBitsPerComponent; + if (m_pColorSpace->GetMode() == csIndexed) + { + m_pColorSpace2 = ((GrIndexedColorSpace *)m_pColorSpace)->GetBase(); + for (int nIndex = 0; nIndex < m_nComponentsCount2; ++nIndex) + { + m_ppLookup[nIndex] = (GrColorComp *)MemUtilsMallocArray(nBitsCount, sizeof(GrColorComp)); + memcpy(m_ppLookup[nIndex], pColorMap->m_ppLookup[nIndex], nBitsCount * sizeof(GrColorComp)); + } + } + else if (m_pColorSpace->GetMode() == csSeparation) + { + m_pColorSpace2 = ((GrSeparationColorSpace *)m_pColorSpace)->GetAlternateSpace(); + for (int nIndex = 0; nIndex < m_nComponentsCount2; ++nIndex) + { + m_ppLookup[nIndex] = (GrColorComp *)MemUtilsMallocArray(nBitsCount, sizeof(GrColorComp)); + memcpy(m_ppLookup[nIndex], pColorMap->m_ppLookup[nIndex], nBitsCount * sizeof(GrColorComp)); + } + } + else + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + m_ppLookup[nIndex] = (GrColorComp *)MemUtilsMallocArray(nBitsCount, sizeof(GrColorComp)); + memcpy(m_ppLookup[nIndex], pColorMap->m_ppLookup[nIndex], nBitsCount * sizeof(GrColorComp)); + } + } + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + m_arrDecodeLow[nIndex] = pColorMap->m_arrDecodeLow[nIndex]; + m_arrDecodeRange[nIndex] = pColorMap->m_arrDecodeRange[nIndex]; + } + m_bSuccess = true; + } + + GrImageColorMap::~GrImageColorMap() + { + if (m_pColorSpace) + delete m_pColorSpace; + + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + MemUtilsFree(m_ppLookup[nIndex]); + } + } + + void GrImageColorMap::GetGray(unsigned char *pColorValue, GrGray *pGray) + { + GrColor oColor; + + if (m_pColorSpace2) + { + for (int nIndex = 0; nIndex < m_nComponentsCount2; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[0]]; + } + m_pColorSpace2->GetGray(&oColor, pGray); + } + else + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[nIndex]]; + } + m_pColorSpace->GetGray(&oColor, pGray); + } + } + + void GrImageColorMap::GetRGB(unsigned char *pColorValue, GrRGB *pRGB) + { + GrColor oColor; + + if (m_pColorSpace2) + { + for (int nIndex = 0; nIndex < m_nComponentsCount2; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[0]]; + } + m_pColorSpace2->GetRGB(&oColor, pRGB); + } + else + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[nIndex]]; + } + m_pColorSpace->GetRGB(&oColor, pRGB); + } + } + + void GrImageColorMap::GetCMYK(unsigned char *pColorValue, GrCMYK *pCMYK) + { + GrColor oColor; + + if (m_pColorSpace2) + { + for (int nIndex = 0; nIndex < m_nComponentsCount2; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[0]]; + } + m_pColorSpace2->GetCMYK(&oColor, pCMYK); + } + else + { + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + oColor.arrComp[nIndex] = m_ppLookup[nIndex][pColorValue[nIndex]]; + } + m_pColorSpace->GetCMYK(&oColor, pCMYK); + } + } + + void GrImageColorMap::GetColor(unsigned char *pColorValue, GrColor *pColor) + { + int nMaxPixel = (1 << m_nBitsPerComponent) - 1; + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + pColor->arrComp[nIndex] = DoubleToColor(m_arrDecodeLow[nIndex] + (pColorValue[nIndex] * m_arrDecodeRange[nIndex]) / nMaxPixel); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrSubpath and GrPath + //------------------------------------------------------------------------------------------------------------------------------- + + GrSubpath::GrSubpath(double dX, double dY) + { + m_nSize = 16; + m_pX = (double *)MemUtilsMallocArray(m_nSize, sizeof(double)); + m_pY = (double *)MemUtilsMallocArray(m_nSize, sizeof(double)); + m_pbCurve = (bool *)MemUtilsMallocArray(m_nSize, sizeof(bool)); + m_nPointsCount = 1; + m_pX[0] = dX; + m_pY[0] = dY; + m_pbCurve[0] = false; + m_bClosed = false; + } + + GrSubpath::~GrSubpath() + { + MemUtilsFree(m_pX); + MemUtilsFree(m_pY); + MemUtilsFree(m_pbCurve); + } + + GrSubpath::GrSubpath(GrSubpath *pSubpath) + { + m_nSize = pSubpath->m_nSize; + m_nPointsCount = pSubpath->m_nPointsCount; + m_pX = (double *)MemUtilsMallocArray(m_nSize, sizeof(double)); + m_pY = (double *)MemUtilsMallocArray(m_nSize, sizeof(double)); + m_pbCurve = (bool *)MemUtilsMallocArray(m_nSize, sizeof(bool)); + memcpy(m_pX, pSubpath->m_pX, m_nPointsCount * sizeof(double)); + memcpy(m_pY, pSubpath->m_pY, m_nPointsCount * sizeof(double)); + memcpy(m_pbCurve, pSubpath->m_pbCurve, m_nPointsCount * sizeof(bool)); + m_bClosed = pSubpath->m_bClosed; + } + + void GrSubpath::LineTo(double dX, double dY) + { + if (m_nPointsCount >= m_nSize) + { + m_nSize += 16; + m_pX = (double *)MemUtilsReallocArray(m_pX, m_nSize, sizeof(double)); + m_pY = (double *)MemUtilsReallocArray(m_pY, m_nSize, sizeof(double)); + m_pbCurve = (bool *)MemUtilsReallocArray(m_pbCurve, m_nSize, sizeof(bool)); + } + m_pX[m_nPointsCount] = dX; + m_pY[m_nPointsCount] = dY; + m_pbCurve[m_nPointsCount] = false; + ++m_nPointsCount; + } + + void GrSubpath::CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3) + { + if (m_nPointsCount + 3 > m_nSize) + { + m_nSize += 16; + m_pX = (double *)MemUtilsReallocArray(m_pX, m_nSize, sizeof(double)); + m_pY = (double *)MemUtilsReallocArray(m_pY, m_nSize, sizeof(double)); + m_pbCurve = (bool *)MemUtilsReallocArray(m_pbCurve, m_nSize, sizeof(bool)); + } + m_pX[m_nPointsCount + 0] = dX1; + m_pY[m_nPointsCount + 0] = dY1; + m_pX[m_nPointsCount + 1] = dX2; + m_pY[m_nPointsCount + 1] = dY2; + m_pX[m_nPointsCount + 2] = dX3; + m_pY[m_nPointsCount + 2] = dY3; + m_pbCurve[m_nPointsCount + 0] = m_pbCurve[m_nPointsCount + 1] = true; + m_pbCurve[m_nPointsCount + 2] = false; + m_nPointsCount += 3; + } + + void GrSubpath::Close() + { + if (m_pX[m_nPointsCount - 1] != m_pX[0] || m_pY[m_nPointsCount - 1] != m_pY[0]) + { + LineTo(m_pX[0], m_pY[0]); + } + m_bClosed = true; + } + + void GrSubpath::Offset(double dDx, double dDy) + { + for (int nIndex = 0; nIndex < m_nPointsCount; ++nIndex) + { + m_pX[nIndex] += dDx; + m_pY[nIndex] += dDy; + } + } + + void GrSubpath::Transform(double *pMatrix) + { + for (int nIndex = 0; nIndex < m_nPointsCount; nIndex++) + { + double dOldX = m_pX[nIndex]; + double dOldY = m_pY[nIndex]; + + m_pX[nIndex] = dOldX * pMatrix[0] + dOldY * pMatrix[2] + pMatrix[4]; + m_pY[nIndex] = dOldX * pMatrix[1] + dOldY * pMatrix[3] + pMatrix[5]; + } + } + GrPath::GrPath() + { + m_bJustStarted = false; + m_nSize = 16; + m_nSubpathsCount = 0; + m_dFirstX = m_dFirstY = 0; + m_ppSubpaths = (GrSubpath **)MemUtilsMallocArray(m_nSize, sizeof(GrSubpath *)); + } + + GrPath::~GrPath() + { + for (int nIndex = 0; nIndex < m_nSubpathsCount; ++nIndex) + { + if (m_ppSubpaths[nIndex]) + delete m_ppSubpaths[nIndex]; + } + MemUtilsFree(m_ppSubpaths); + } + + GrPath::GrPath(bool bJustStarted, double dFirstX, double dFirstY, GrSubpath **ppSubpaths, int nSubpathCount, int nSize) + { + m_bJustStarted = bJustStarted; + m_dFirstX = dFirstX; + m_dFirstY = dFirstY; + m_nSize = nSize; + m_nSubpathsCount = nSubpathCount; + m_ppSubpaths = (GrSubpath **)MemUtilsMallocArray(m_nSize, sizeof(GrSubpath *)); + for (int nIndex = 0; nIndex < m_nSubpathsCount; ++nIndex) + m_ppSubpaths[nIndex] = ppSubpaths[nIndex]->Copy(); + } + + void GrPath::MoveTo(double dX, double dY) + { + m_bJustStarted = true; + m_dFirstX = dX; + m_dFirstY = dY; + } + + void GrPath::LineTo(double dX, double dY) + { + if (m_bJustStarted) + { + if (m_nSubpathsCount >= m_nSize) + { + m_nSize += 16; + m_ppSubpaths = (GrSubpath **)MemUtilsReallocArray(m_ppSubpaths, m_nSize, sizeof(GrSubpath *)); + } + m_ppSubpaths[m_nSubpathsCount] = new GrSubpath(m_dFirstX, m_dFirstY); + ++m_nSubpathsCount; + m_bJustStarted = false; + } + m_ppSubpaths[m_nSubpathsCount - 1]->LineTo(dX, dY); + } + + void GrPath::CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3) + { + if (m_bJustStarted) + { + if (m_nSubpathsCount >= m_nSize) + { + m_nSize += 16; + m_ppSubpaths = (GrSubpath **)MemUtilsReallocArray(m_ppSubpaths, m_nSize, sizeof(GrSubpath *)); + } + m_ppSubpaths[m_nSubpathsCount] = new GrSubpath(m_dFirstX, m_dFirstY); + ++m_nSubpathsCount; + m_bJustStarted = false; + } + m_ppSubpaths[m_nSubpathsCount - 1]->CurveTo(dX1, dY1, dX2, dY2, dX3, dY3); + } + + void GrPath::Close() + { + if (m_bJustStarted) + { + if (m_nSubpathsCount >= m_nSize) + { + m_nSize += 16; + m_ppSubpaths = (GrSubpath **)MemUtilsReallocArray(m_ppSubpaths, m_nSize, sizeof(GrSubpath *)); + } + m_ppSubpaths[m_nSubpathsCount] = new GrSubpath(m_dFirstX, m_dFirstY); + ++m_nSubpathsCount; + m_bJustStarted = false; + } + m_ppSubpaths[m_nSubpathsCount - 1]->Close(); + } + + void GrPath::Append(GrPath *pPath) + { + if (m_nSubpathsCount + pPath->m_nSubpathsCount > m_nSize) + { + m_nSize = m_nSubpathsCount + pPath->m_nSubpathsCount; + m_ppSubpaths = (GrSubpath **)MemUtilsReallocArray(m_ppSubpaths, m_nSize, sizeof(GrSubpath *)); + } + for (int nIndex = 0; nIndex < pPath->m_nSubpathsCount; ++nIndex) + { + m_ppSubpaths[m_nSubpathsCount++] = pPath->m_ppSubpaths[nIndex]->Copy(); + } + m_bJustStarted = false; + } + + void GrPath::Offset(double dDx, double dDy) + { + for (int nIndex = 0; nIndex < m_nSubpathsCount; ++nIndex) + { + m_ppSubpaths[nIndex]->Offset(dDx, dDy); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrClip + //------------------------------------------------------------------------------------------------------------------------------- + + GrClip::GrClip(double dMinX, double dMinY, double dMaxX, double dMaxY) + { + if (dMinX < dMaxX) + { + m_dMinX = dMinX; + m_dMaxX = dMaxX; + } + else + { + m_dMinX = dMaxX; + m_dMaxX = dMinX; + } + if (dMinY < dMaxY) + { + m_dMinY = dMinY; + m_dMaxY = dMaxY; + } + else + { + m_dMinY = dMaxY; + m_dMaxY = dMinY; + } + + m_nMinX = (int)floor(m_dMinX); + m_nMinY = (int)floor(m_dMinY); + m_nMaxX = (int)floor(m_dMaxX); + m_nMaxY = (int)floor(m_dMaxY); + + m_nPathsCount = m_nSize = 0; + m_ppPaths = NULL; + m_pMatrix = NULL; + m_pFlags = NULL; + + m_pTextClip = new GrTextClip(); + } + + GrClip::GrClip(GrClip *pClip) + { + m_dMinX = pClip->m_dMinX; + m_dMinY = pClip->m_dMinY; + m_dMaxX = pClip->m_dMaxX; + m_dMaxY = pClip->m_dMaxY; + m_nMinX = pClip->m_nMinX; + m_nMinY = pClip->m_nMinY; + m_nMaxX = pClip->m_nMaxX; + m_nMaxY = pClip->m_nMaxY; + + m_nPathsCount = pClip->m_nPathsCount; + m_nSize = pClip->m_nSize; + + m_ppPaths = (GrPath **)MemUtilsMallocArray(m_nSize, sizeof(GrPath *)); + m_pMatrix = (Matrix *)MemUtilsMallocArray(m_nSize, sizeof(Matrix)); + m_pFlags = (unsigned char *)MemUtilsMallocArray(m_nSize, sizeof(unsigned char)); + + for (int nIndex = 0; nIndex < m_nPathsCount; ++nIndex) + { + m_ppPaths[nIndex] = pClip->m_ppPaths[nIndex]->Copy(); + m_pMatrix[nIndex] = pClip->m_pMatrix[nIndex]; + m_pFlags[nIndex] = pClip->m_pFlags[nIndex]; + } + + m_pTextClip = pClip->m_pTextClip->Copy(); + } + + GrClip::~GrClip() + { + for (int nIndex = 0; nIndex < m_nPathsCount; ++nIndex) + { + if (m_ppPaths[nIndex]) + { + delete m_ppPaths[nIndex]; + } + } + + MemUtilsFree(m_ppPaths); + MemUtilsFree(m_pMatrix); + MemUtilsFree(m_pFlags); + + if (m_pTextClip) + delete m_pTextClip; + } + + void GrClip::Resize(int nPathsCount) + { + if (m_nPathsCount + nPathsCount > m_nSize) + { + if (m_nSize == 0) + { + m_nSize = 32; + } + while (m_nSize < m_nPathsCount + nPathsCount) + { + m_nSize *= 2; + } + + m_ppPaths = (GrPath **)MemUtilsReallocArray(m_ppPaths, m_nSize, sizeof(GrPath *)); + m_pMatrix = (Matrix *)MemUtilsReallocArray(m_pMatrix, m_nSize, sizeof(Matrix)); + m_pFlags = (unsigned char *)MemUtilsReallocArray(m_pFlags, m_nSize, sizeof(unsigned char)); + } + } + + void GrClip::ResetToRect(double dX0, double dY0, double dX1, double dY1) + { + for (int nIndex = 0; nIndex < m_nPathsCount; ++nIndex) + { + if (m_ppPaths[nIndex]) + { + delete m_ppPaths[nIndex]; + } + } + + MemUtilsFree(m_ppPaths); + MemUtilsFree(m_pMatrix); + MemUtilsFree(m_pFlags); + + m_ppPaths = NULL; + m_pFlags = NULL; + + m_nPathsCount = m_nSize = 0; + + if (dX0 < dX1) + { + m_dMinX = dX0; + m_dMaxX = dX1; + } + else + { + m_dMinX = dX1; + m_dMaxX = dX0; + } + + if (dY0 < dY1) + { + m_dMinY = dY0; + m_dMaxY = dY1; + } + else + { + m_dMinY = dY1; + m_dMaxY = dY0; + } + + m_nMinX = (int)floor(m_dMinX); + m_nMinY = (int)floor(m_dMinY); + m_nMaxX = (int)floor(m_dMaxX); + m_nMaxY = (int)floor(m_dMaxY); + } + + void GrClip::ClipToRect(double dX0, double dY0, double dX1, double dY1) + { + if (dX0 < dX1) + { + if (dX0 > m_dMinX) + { + m_dMinX = dX0; + m_nMinX = (int)floor(m_dMinX); + } + if (dX1 < m_dMaxX) + { + m_dMaxX = dX1; + m_nMaxX = (int)floor(m_dMaxX); + } + } + else + { + if (dX1 > m_dMinX) + { + m_dMinX = dX1; + m_nMinX = (int)floor(m_dMinX); + } + if (dX0 < m_dMaxX) + { + m_dMaxX = dX0; + m_nMaxX = (int)floor(m_dMaxX); + } + } + + if (dY0 < dY1) + { + if (dY0 > m_dMinY) + { + m_dMinY = dY0; + m_nMinY = (int)floor(m_dMinY); + } + if (dY1 < m_dMaxY) + { + m_dMaxY = dY1; + m_nMaxY = (int)floor(m_dMaxY); + } + } + else + { + if (dY1 > m_dMinY) + { + m_dMinY = dY1; + m_nMinY = (int)floor(m_dMinY); + } + if (dY0 < m_dMaxY) + { + m_dMaxY = dY0; + m_nMaxY = (int)floor(m_dMaxY); + } + } + + return; + } + + void GrClip::ClipToPath(GrPath *pPath, double *pMatrix, bool bEO) + { + Resize(1); + + m_ppPaths[m_nPathsCount] = pPath; + m_pMatrix[m_nPathsCount].FromDoublePointer(pMatrix); + m_pFlags[m_nPathsCount] = (bEO ? GrClipEOFlag : 0); + ++m_nPathsCount; + return; + } + GrPath *GrClip::PathRect(double dX0, double dY0, double dX1, double dY1) + { + GrPath *pPath = new GrPath(); + + pPath->MoveTo(dX0, dY0); + pPath->LineTo(dX1, dY0); + pPath->LineTo(dX1, dY1); + pPath->LineTo(dX0, dY1); + pPath->Close(); + + return pPath; + } + //------------------------------------------------------------------------------------------------------------------------------- + // GrState + //------------------------------------------------------------------------------------------------------------------------------- + + GrState::GrState(double dHorizDPI, double dVertDPI, PDFRectangle *pPageBox, int nRotateAngle, bool bUpsideDown) + { + m_dHorDPI = dHorizDPI; + m_dVerDPI = dVertDPI; + m_nRotate = nRotateAngle; + m_dPageLeft = pPageBox->m_dLeft; + m_dPageBottom = pPageBox->m_dBottom; + m_dPageRight = pPageBox->m_dRight; + m_dPageTop = pPageBox->m_dTop; + + double dKoefX = m_dHorDPI / 72.0; + double dKoefY = m_dVerDPI / 72.0; + if (m_nRotate == 90) + { + m_arrCTM[0] = 0; + m_arrCTM[1] = bUpsideDown ? dKoefY : -dKoefY; + m_arrCTM[2] = dKoefX; + m_arrCTM[3] = 0; + m_arrCTM[4] = -dKoefX * m_dPageBottom; + m_arrCTM[5] = dKoefY * (bUpsideDown ? -m_dPageLeft : m_dPageRight); + m_dPageWidth = dKoefX * (m_dPageTop - m_dPageBottom); + m_dPageHeight = dKoefY * (m_dPageRight - m_dPageLeft); + } + else if (m_nRotate == 180) + { + m_arrCTM[0] = -dKoefX; + m_arrCTM[1] = 0; + m_arrCTM[2] = 0; + m_arrCTM[3] = bUpsideDown ? dKoefY : -dKoefY; + m_arrCTM[4] = dKoefX * m_dPageRight; + m_arrCTM[5] = dKoefY * (bUpsideDown ? -m_dPageBottom : m_dPageTop); + m_dPageWidth = dKoefX * (m_dPageRight - m_dPageLeft); + m_dPageHeight = dKoefY * (m_dPageTop - m_dPageBottom); + } + else if (m_nRotate == 270) + { + m_arrCTM[0] = 0; + m_arrCTM[1] = bUpsideDown ? -dKoefY : dKoefY; + m_arrCTM[2] = -dKoefX; + m_arrCTM[3] = 0; + m_arrCTM[4] = dKoefX * m_dPageTop; + m_arrCTM[5] = dKoefY * (bUpsideDown ? m_dPageRight : -m_dPageLeft); + m_dPageWidth = dKoefX * (m_dPageTop - m_dPageBottom); + m_dPageHeight = dKoefY * (m_dPageRight - m_dPageLeft); + } + else + { + m_arrCTM[0] = dKoefX; + m_arrCTM[1] = 0; + m_arrCTM[2] = 0; + m_arrCTM[3] = bUpsideDown ? -dKoefY : dKoefY; + m_arrCTM[4] = -dKoefX * m_dPageLeft; + m_arrCTM[5] = dKoefY * (bUpsideDown ? m_dPageTop : -m_dPageBottom); + m_dPageWidth = dKoefX * (m_dPageRight - m_dPageLeft); + m_dPageHeight = dKoefY * (m_dPageTop - m_dPageBottom); + } + + m_pFillColorSpace = new GrDeviceGrayColorSpace(); + m_pStrokeColorSpace = new GrDeviceGrayColorSpace(); + m_oFillColor.arrComp[0] = 0; + m_oStrokeColor.arrComp[0] = 0; + m_pFillPattern = NULL; + m_pStrokePattern = NULL; + m_eBlendMode = grBlendNormal; + m_dFillOpacity = 1; + m_dStrokeOpacity = 1; + m_bFillOverprint = false; + m_bStrokeOverprint = false; + m_ppTransfer[0] = m_ppTransfer[1] = m_ppTransfer[2] = m_ppTransfer[3] = NULL; + + m_dLineWidth = 1; + m_pLineDash = NULL; + m_nLineDashSize = 0; + m_dLineDashStart = 0; + m_nFlatness = 1; + m_nLineJoin = 0; + m_nLineCap = 0; + m_dMiterLimit = 10; + m_bStrokeAdjust = false; + + m_pFont = NULL; + m_dFontSize = 0; + m_arrTextMatrix[0] = 1; m_arrTextMatrix[1] = 0; + m_arrTextMatrix[2] = 0; m_arrTextMatrix[3] = 1; + m_arrTextMatrix[4] = 0; m_arrTextMatrix[5] = 0; + m_dCharSpace = 0; + m_dWordSpace = 0; + m_dHorizScaling = 1; + m_dLeading = 0; + m_nRise = 0; + m_nRenderMode = 0; + + m_pPath = new GrPath(); + m_dCurX = m_dCurY = 0; + m_dTextLineX = m_dTextLineY = 0; + + m_pClip = new GrClip(0, 0, m_dPageWidth, m_dPageHeight); + m_dClipXMin = 0; + m_dClipYMin = 0; + m_dClipXMax = m_dPageWidth; + m_dClipYMax = m_dPageHeight; + + m_pNext = NULL; + } + + GrState::~GrState() + { + if (m_pFillColorSpace) + { + delete m_pFillColorSpace; + } + if (m_pStrokeColorSpace) + { + delete m_pStrokeColorSpace; + } + if (m_pFillPattern) + { + delete m_pFillPattern; + } + if (m_pStrokePattern) + { + delete m_pStrokePattern; + } + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + if (m_ppTransfer[nIndex]) + { + delete m_ppTransfer[nIndex]; + } + } + MemUtilsFree(m_pLineDash); + if (m_pPath) + { + delete m_pPath; + } + if (m_pClip) + { + delete m_pClip; + } + if (m_pNext) + { + delete m_pNext; + } + } + + GrState::GrState(GrState *pState) + { + memcpy(this, pState, sizeof(GrState)); + + if (m_pFillColorSpace) + { + m_pFillColorSpace = pState->m_pFillColorSpace->Copy(); + } + if (m_pStrokeColorSpace) + { + m_pStrokeColorSpace = pState->m_pStrokeColorSpace->Copy(); + } + if (m_pFillPattern) + { + m_pFillPattern = pState->m_pFillPattern->Copy(); + } + if (m_pStrokePattern) + { + m_pStrokePattern = pState->m_pStrokePattern->Copy(); + } + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + if (m_ppTransfer[nIndex]) + { + m_ppTransfer[nIndex] = pState->m_ppTransfer[nIndex]->Copy(); + } + } + if (m_nLineDashSize > 0) + { + m_pLineDash = (double *)MemUtilsMallocArray(m_nLineDashSize, sizeof(double)); + memcpy(m_pLineDash, pState->m_pLineDash, m_nLineDashSize * sizeof(double)); + } + if (m_pClip) + { + m_pClip = pState->m_pClip->Copy(); + } + m_pNext = NULL; + } + + void GrState::SetPath(GrPath *pPath) + { + if (m_pPath) + delete m_pPath; + m_pPath = pPath; + } + + void GrState::GetUserClipBBox(double *pdXMin, double *pdYMin, double *pdXMax, double *pdYMax) + { + double arrInvCTM[6]; + double dXMin, dYMin, dXMax, dYMax; + + // Обратная матрица для матрицы CTM + double dDet = 1 / (m_arrCTM[0] * m_arrCTM[3] - m_arrCTM[1] * m_arrCTM[2]); + arrInvCTM[0] = m_arrCTM[3] * dDet; + arrInvCTM[1] = -m_arrCTM[1] * dDet; + arrInvCTM[2] = -m_arrCTM[2] * dDet; + arrInvCTM[3] = m_arrCTM[0] * dDet; + arrInvCTM[4] = (m_arrCTM[2] * m_arrCTM[5] - m_arrCTM[3] * m_arrCTM[4]) * dDet; + arrInvCTM[5] = (m_arrCTM[1] * m_arrCTM[4] - m_arrCTM[0] * m_arrCTM[5]) * dDet; + + dXMin = dXMax = m_dClipXMin * arrInvCTM[0] + m_dClipYMin * arrInvCTM[2] + arrInvCTM[4]; + dYMin = dYMax = m_dClipXMin * arrInvCTM[1] + m_dClipYMin * arrInvCTM[3] + arrInvCTM[5]; + double dTransX = m_dClipXMin * arrInvCTM[0] + m_dClipYMax * arrInvCTM[2] + arrInvCTM[4]; + double dTransY = m_dClipXMin * arrInvCTM[1] + m_dClipYMax * arrInvCTM[3] + arrInvCTM[5]; + if (dTransX < dXMin) + { + dXMin = dTransX; + } + else if (dTransX > dXMax) + { + dXMax = dTransX; + } + if (dTransY < dYMin) + { + dYMin = dTransY; + } + else if (dTransY > dYMax) + { + dYMax = dTransY; + } + dTransX = m_dClipXMax * arrInvCTM[0] + m_dClipYMin * arrInvCTM[2] + arrInvCTM[4]; + dTransY = m_dClipXMax * arrInvCTM[1] + m_dClipYMin * arrInvCTM[3] + arrInvCTM[5]; + if (dTransX < dXMin) + { + dXMin = dTransX; + } + else if (dTransX > dXMax) + { + dXMax = dTransX; + } + if (dTransY < dYMin) + { + dYMin = dTransY; + } + else if (dTransY > dYMax) + { + dYMax = dTransY; + } + dTransX = m_dClipXMax * arrInvCTM[0] + m_dClipYMax * arrInvCTM[2] + arrInvCTM[4]; + dTransY = m_dClipXMax * arrInvCTM[1] + m_dClipYMax * arrInvCTM[3] + arrInvCTM[5]; + if (dTransX < dXMin) + { + dXMin = dTransX; + } + else if (dTransX > dXMax) + { + dXMax = dTransX; + } + if (dTransY < dYMin) + { + dYMin = dTransY; + } + else if (dTransY > dYMax) + { + dYMax = dTransY; + } + + *pdXMin = dXMin; + *pdYMin = dYMin; + *pdXMax = dXMax; + *pdYMax = dYMax; + } + + double GrState::TransformWidth(double dWidth) + { + double dX = m_arrCTM[0] + m_arrCTM[2]; + double dY = m_arrCTM[1] + m_arrCTM[3]; + return dWidth * sqrt(0.5 * (dX * dX + dY * dY)); + } + + double GrState::GetTransformedFontSize() + { + double dX1 = m_arrTextMatrix[2] * m_dFontSize; + double dY1 = m_arrTextMatrix[3] * m_dFontSize; + double dX2 = m_arrCTM[0] * dX1 + m_arrCTM[2] * dY1; + double dY2 = m_arrCTM[1] * dX1 + m_arrCTM[3] * dY1; + return sqrt(dX2 * dX2 + dY2 * dY2); + } + + void GrState::GetFontTransformMatrix(double *pdM11, double *pdM12, double *pdM21, double *pdM22) + { + *pdM11 = (m_arrTextMatrix[0] * m_arrCTM[0] + m_arrTextMatrix[1] * m_arrCTM[2]) * m_dFontSize; + *pdM12 = (m_arrTextMatrix[0] * m_arrCTM[1] + m_arrTextMatrix[1] * m_arrCTM[3]) * m_dFontSize; + *pdM21 = (m_arrTextMatrix[2] * m_arrCTM[0] + m_arrTextMatrix[3] * m_arrCTM[2]) * m_dFontSize; + *pdM22 = (m_arrTextMatrix[2] * m_arrCTM[1] + m_arrTextMatrix[3] * m_arrCTM[3]) * m_dFontSize; + } + + void GrState::SetCTM(double dA, double dB, double dC, double dD, double dE, double dF) + { + m_arrCTM[0] = dA; + m_arrCTM[1] = dB; + m_arrCTM[2] = dC; + m_arrCTM[3] = dD; + m_arrCTM[4] = dE; + m_arrCTM[5] = dF; + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + if (m_arrCTM[nIndex] > 1e10) + { + m_arrCTM[nIndex] = 1e10; + } + else if (m_arrCTM[nIndex] < -1e10) + { + m_arrCTM[nIndex] = -1e10; + } + } + } + + void GrState::ConcatCTM(double dA, double dB, double dC, double dD, double dE, double dF) + { + double dOldA = m_arrCTM[0]; + double dOldB = m_arrCTM[1]; + double dOldC = m_arrCTM[2]; + double dOldD = m_arrCTM[3]; + + m_arrCTM[0] = dA * dOldA + dB * dOldC; + m_arrCTM[1] = dA * dOldB + dB * dOldD; + m_arrCTM[2] = dC * dOldA + dD * dOldC; + m_arrCTM[3] = dC * dOldB + dD * dOldD; + m_arrCTM[4] = dE * dOldA + dF * dOldC + m_arrCTM[4]; + m_arrCTM[5] = dE * dOldB + dF * dOldD + m_arrCTM[5]; + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + if (m_arrCTM[nIndex] > 1e10) + { + m_arrCTM[nIndex] = 1e10; + } + else if (m_arrCTM[nIndex] < -1e10) + { + m_arrCTM[nIndex] = -1e10; + } + } + } + + void GrState::ShiftCTM(double dShiftX, double dShiftY) + { + m_arrCTM[4] += dShiftX; + m_arrCTM[5] += dShiftY; + m_dClipXMin += dShiftX; + m_dClipYMin += dShiftY; + m_dClipXMax += dShiftX; + m_dClipYMax += dShiftY; + } + + void GrState::SetFillColorSpace(GrColorSpace *pColorSpace) + { + if (m_pFillColorSpace) + { + delete m_pFillColorSpace; + } + m_pFillColorSpace = pColorSpace; + } + + void GrState::SetStrokeColorSpace(GrColorSpace *pColorSpace) + { + if (m_pStrokeColorSpace) + { + delete m_pStrokeColorSpace; + } + m_pStrokeColorSpace = pColorSpace; + } + + void GrState::SetFillPattern(GrPattern *pPattern) + { + if (m_pFillPattern) + { + delete m_pFillPattern; + } + m_pFillPattern = pPattern; + } + + void GrState::SetStrokePattern(GrPattern *pPattern) + { + if (m_pStrokePattern) + { + delete m_pStrokePattern; + } + m_pStrokePattern = pPattern; + } + + void GrState::SetTransfer(Function **ppFunctions) + { + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + if (m_ppTransfer[nIndex]) + { + delete m_ppTransfer[nIndex]; + } + m_ppTransfer[nIndex] = ppFunctions[nIndex]; + } + } + + void GrState::SetLineDash(double *pDash, int nSize, double dStart) + { + MemUtilsFree(m_pLineDash); + m_pLineDash = pDash; + m_nLineDashSize = nSize; + m_dLineDashStart = dStart; + } + + void GrState::ClearPath() + { + if (m_pPath) + delete m_pPath; + m_pPath = new GrPath(); + } + + void GrState::Clip() + { + double dXMin = 0, dYMin = 0, dXMax = 0, dYMax = 0, dX = 0, dY = 0; + + for (int nSubPathIndex = 0; nSubPathIndex < m_pPath->GetSubpathsCount(); ++nSubPathIndex) + { + GrSubpath *pSubpath = m_pPath->GetSubpath(nSubPathIndex); + for (int nPointIndex = 0; nPointIndex < pSubpath->GetPointsCount(); ++nPointIndex) + { + Transform(pSubpath->GetX(nPointIndex), pSubpath->GetY(nPointIndex), &dX, &dY); + if (nSubPathIndex == 0 && nPointIndex == 0) + { + dXMin = dXMax = dX; + dYMin = dYMax = dY; + } + else + { + if (dX < dXMin) + { + dXMin = dX; + } + else if (dX > dXMax) + { + dXMax = dX; + } + if (dY < dYMin) + { + dYMin = dY; + } + else if (dY > dYMax) + { + dYMax = dY; + } + } + } + } + if (dXMin > m_dClipXMin) + { + m_dClipXMin = dXMin; + } + if (dYMin > m_dClipYMin) + { + m_dClipYMin = dYMin; + } + if (dXMax < m_dClipXMax) + { + m_dClipXMax = dXMax; + } + if (dYMax < m_dClipYMax) + { + m_dClipYMax = dYMax; + } + } + + void GrState::ClipToStrokePath() + { + double dXMin = 0, dYMin = 0, dXMax = 0, dYMax = 0, dX = 0, dY = 0; + + for (int nSubPathIndex = 0; nSubPathIndex < m_pPath->GetSubpathsCount(); ++nSubPathIndex) + { + GrSubpath *pSubpath = m_pPath->GetSubpath(nSubPathIndex); + for (int nPointIndex = 0; nPointIndex < pSubpath->GetPointsCount(); ++nPointIndex) + { + Transform(pSubpath->GetX(nPointIndex), pSubpath->GetY(nPointIndex), &dX, &dY); + if (nSubPathIndex == 0 && nPointIndex == 0) + { + dXMin = dXMax = dX; + dYMin = dYMax = dY; + } + else + { + if (dX < dXMin) + { + dXMin = dX; + } + else if (dX > dXMax) + { + dXMax = dX; + } + if (dY < dYMin) + { + dYMin = dY; + } + else if (dY > dYMax) + { + dYMax = dY; + } + } + } + } + + // Учитываем толщину линии + double dT0 = fabs(m_arrCTM[0]); + double dT1 = fabs(m_arrCTM[2]); + if (dT0 > dT1) + { + dXMin -= 0.5 * m_dLineWidth * dT0; + dXMax += 0.5 * m_dLineWidth * dT0; + } + else + { + dXMin -= 0.5 * m_dLineWidth * dT1; + dXMax += 0.5 * m_dLineWidth * dT1; + } + // TO DO: Проверит здесь!!!! Сдается, что нужно m_arrCTM[1] поставить + dT0 = fabs(m_arrCTM[0]); + dT1 = fabs(m_arrCTM[3]); + if (dT0 > dT1) + { + dYMin -= 0.5 * m_dLineWidth * dT0; + dYMax += 0.5 * m_dLineWidth * dT0; + } + else + { + dYMin -= 0.5 * m_dLineWidth * dT1; + dYMax += 0.5 * m_dLineWidth * dT1; + } + + if (dXMin > m_dClipXMin) + { + m_dClipXMin = dXMin; + } + if (dYMin > m_dClipYMin) + { + m_dClipYMin = dYMin; + } + if (dXMax < m_dClipXMax) + { + m_dClipXMax = dXMax; + } + if (dYMax < m_dClipYMax) + { + m_dClipYMax = dYMax; + } + } + + void GrState::TextShift(double dShiftX, double dShiftY) + { + double dDx = 0, dDy = 0; + + TextTransformDelta(dShiftX, dShiftY, &dDx, &dDy); + m_dCurX += dDx; + m_dCurY += dDy; + } + + void GrState::Shift(double dShiftX, double dShiftY) + { + m_dCurX += dShiftX; + m_dCurY += dShiftY; + } + + GrState *GrState::Save() + { + GrState *pNewState = Copy(); + pNewState->m_pNext = this; + return pNewState; + } + + GrState *GrState::Restore() + { + GrState *pOldState = NULL; + + if (m_pNext) + { + pOldState = m_pNext; + + // Следующие значения не сохраняются/восстанавливаются с помощью операций q/Q + pOldState->m_pPath = m_pPath; + pOldState->m_dCurX = m_dCurX; + pOldState->m_dCurY = m_dCurY; + pOldState->m_dTextLineX = m_dTextLineX; + pOldState->m_dTextLineY = m_dTextLineY; + + m_pPath = NULL; + m_pNext = NULL; + delete this; + + } + else + { + pOldState = this; + } + + return pOldState; + } + + bool GrState::ParseBlendMode(Object *pObject, GraphicsBlendMode *peMode) + { + if (pObject->IsName()) + { + for (int nIndex = 0; nIndex < GrBlendModeNamesCount; ++nIndex) + { + if (!strcmp(pObject->GetName(), c_arrsGrBlendModeNames[nIndex].sName)) + { + *peMode = c_arrsGrBlendModeNames[nIndex].eMode; + return true; + } + } + return false; + } + else if (pObject->IsArray()) + { + for (int nIndex = 0; nIndex < pObject->ArrayGetLength(); ++nIndex) + { + Object oTemp; + pObject->ArrayGet(nIndex, &oTemp); + if (!oTemp.IsName()) + { + oTemp.Free(); + return false; + } + for (int nJ = 0; nJ < GrBlendModeNamesCount; ++nJ) + { + if (!strcmp(oTemp.GetName(), c_arrsGrBlendModeNames[nJ].sName)) + { + oTemp.Free(); + *peMode = c_arrsGrBlendModeNames[nJ].eMode; + return true; + } + } + oTemp.Free(); + } + *peMode = grBlendNormal; + return true; + } + else + { + return false; + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/GState.h b/PdfReader/Src/GState.h new file mode 100644 index 0000000000..f7004372dd --- /dev/null +++ b/PdfReader/Src/GState.h @@ -0,0 +1,2392 @@ +#ifndef _PDF_READER_GSTATE_H +#define _PDF_READER_GSTATE_H + +#include "../../DesktopEditor/common/Types.h" +#include "Object.h" +#include "Function.h" +#include + +namespace PdfReader +{ + class Array; + class GrFont; + class PDFRectangle; + class GrShading; + + //------------------------------------------------------------------------------------------------------------------------------- + // GraphicsBlendMode + //------------------------------------------------------------------------------------------------------------------------------- + + enum GraphicsBlendMode + { + grBlendNormal, + grBlendMultiply, + grBlendScreen, + grBlendOverlay, + grBlendDarken, + grBlendLighten, + grBlendColorDodge, + grBlendColorBurn, + grBlendHardLight, + grBlendSoftLight, + grBlendDifference, + grBlendExclusion, + grBlendHue, + grBlendSaturation, + grBlendColor, + grBlendLuminosity + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrColorComp + //------------------------------------------------------------------------------------------------------------------------------- + + // 16.16 + typedef int GrColorComp; + +#define GrColorComp1 0x10000 + + static inline GrColorComp DoubleToColor(double dValue) + { + return (GrColorComp)(dValue * GrColorComp1); + } + + static inline double ColorToDouble(GrColorComp nColor) + { + return (double)nColor / (double)GrColorComp1; + } + + static inline GrColorComp ByteToColor(unsigned char nByte) + { + // (nByte / 255) << 16 = (0.0000000100000001... * nByte) << 16 + // = ((nByte << 8) + (nByte) + (nByte >> 8) + ...) << 16 + // = (nByte << 8) + (nByte) + (nByte >> 7) + // [для округления] + return (GrColorComp)((nByte << 8) + nByte + (nByte >> 7)); + } + + static inline unsigned char ColorToByte(GrColorComp nColor) + { + // 255 * nColor + 0.5 = 256 * nColor - nColor + 0x8000 + return (unsigned char)(((nColor << 8) - nColor + 0x8000) >> 16); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // GrColor + //------------------------------------------------------------------------------------------------------------------------------- + +#define GrColorMaxComps funcMaxOutputs + + struct GrColor + { + GrColorComp arrComp[GrColorMaxComps]; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrGray + //------------------------------------------------------------------------------------------------------------------------------- + + typedef GrColorComp GrGray; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrRGB + //------------------------------------------------------------------------------------------------------------------------------- + + struct GrRGB + { + GrColorComp r, g, b; + }; + + //------------------------------------------------------------------------ + // GrCMYK + //------------------------------------------------------------------------ + + struct GrCMYK + { + GrColorComp c, m, y, k; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + // Константы GrColorSpaceModes и массив GrColorSpaceModeNames, определенный + // в GState.cpp должны совпадать. + enum GrColorSpaceMode + { + csDeviceGray, + csCalGray, + csDeviceRGB, + csCalRGB, + csDeviceCMYK, + csLab, + csICCBased, + csIndexed, + csSeparation, + csDeviceN, + csPattern + }; + + class GrColorSpace + { + public: + + GrColorSpace(); + virtual ~GrColorSpace(); + virtual GrColorSpace *Copy() = 0; + virtual GrColorSpaceMode GetMode() = 0; + + static GrColorSpace *Parse(Object *pColorSpaceObject); + + // Конвертируем в -> Gray, RGB, или CMYK. + virtual void GetGray(GrColor *pColor, GrGray *pGray) = 0; + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB) = 0; + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK) = 0; + + // Количество компонент. + virtual int GetComponentsCount() = 0; + + // Получаем стандартное значение цвета в данном цветовом пространстве. + virtual void GetDefaultColor(GrColor *pColor) = 0; + + // Стандартные границчные значения для каждой компоненты пикселя, где nMaxImagePixelValue - максимальное значение пикселя. + virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); + + // True, если в данном цветовом пространстве на странице ничего не нарисовано. + virtual bool IsNonMarking() + { + return false; + } + + // Число различных цветовых пространств. + static int GetColorSpaceModesCount(); + + // Имя соответствующего цветового пространства. + static char *GetColorSpaceModeName(int nIndex); + + DWORD GetDwordColor(GrColor *pColor) + { + GrRGB oRGB; + GetRGB(pColor, &oRGB); + unsigned char nR = ColorToByte(oRGB.r); + unsigned char nG = ColorToByte(oRGB.g); + unsigned char nB = ColorToByte(oRGB.b); + return ((nB << 16) | (nG << 8) | nR); + } + + private: + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceGrayColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrDeviceGrayColorSpace : public GrColorSpace + { + public: + + GrDeviceGrayColorSpace(); + virtual ~GrDeviceGrayColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csDeviceGray; + } + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 1; + } + virtual void GetDefaultColor(GrColor *pColor); + + private: + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrCalGrayColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrCalGrayColorSpace : public GrColorSpace + { + public: + + GrCalGrayColorSpace(); + virtual ~GrCalGrayColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csCalGray; + } + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 1; + } + virtual void GetDefaultColor(GrColor *pColor); + + // Возвращаем значения, специфичные пространству CalGray. + double GetWhiteX() + { + return m_dWhiteX; + } + double GetWhiteY() + { + return m_dWhiteY; + } + double GetWhiteZ() + { + return m_dWhiteZ; + } + double GetBlackX() + { + return m_dBlackX; + } + double GetBlackY() + { + return m_dBlackY; + } + double GetBlackZ() + { + return m_dBlackZ; + } + double GetGamma() + { + return m_dGamma; + } + + private: + + double m_dWhiteX; // + double m_dWhiteY; // White point + double m_dWhiteZ; // + + double m_dBlackX; // + double m_dBlackY; // Black point + double m_dBlackZ; // + + double m_dGamma; // Gamma + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceRGBColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrDeviceRGBColorSpace : public GrColorSpace + { + public: + + GrDeviceRGBColorSpace(); + virtual ~GrDeviceRGBColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csDeviceRGB; + } + + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 3; + } + virtual void GetDefaultColor(GrColor *pColor); + + private: + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrCalRGBColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrCalRGBColorSpace : public GrColorSpace + { + public: + + GrCalRGBColorSpace(); + virtual ~GrCalRGBColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csCalRGB; + } + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 3; + } + virtual void GetDefaultColor(GrColor *pColor); + + // Возвращаем значения, специфичные пространству CalRBG. + double GetWhiteX() + { + return m_dWhiteX; + } + double GetWhiteY() + { + return m_dWhiteY; + } + double GetWhiteZ() + { + return m_dWhiteZ; + } + double GetBlackX() + { + return m_dBlackX; + } + double GetBlackY() + { + return m_dBlackY; + } + double GetBlackZ() + { + return m_dBlackZ; + } + double GetGammaR() + { + return m_dGammaR; + } + double GetGammaG() + { + return m_dGammaG; + } + double GetGammaB() + { + return m_dGammaB; + } + double *GetMatrix() + { + return m_arrdMatrix; + } + + private: + + double m_dWhiteX; // + double m_dWhiteY; // White point + double m_dWhiteZ; // + + double m_dBlackX; // + double m_dBlackY; // Black point + double m_dBlackZ; // + + double m_dGammaR; // + double m_dGammaG; // Gamma + double m_dGammaB; // + + double m_arrdMatrix[9]; // Матрица преобразования: ABC -> XYZ + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceCMYKColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrDeviceCMYKColorSpace : public GrColorSpace + { + public: + + GrDeviceCMYKColorSpace(); + virtual ~GrDeviceCMYKColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csDeviceCMYK; + } + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 4; + } + virtual void GetDefaultColor(GrColor *pColor); + + private: + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrLabColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrLabColorSpace : public GrColorSpace + { + public: + + GrLabColorSpace(); + virtual ~GrLabColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csLab; + } + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 3; + } + virtual void GetDefaultColor(GrColor *pColor); + + virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); + + // Возвращаем значения, специфичные пространству Lab. + double GetWhiteX() + { + return m_dWhiteX; + } + double GetWhiteY() + { + return m_dWhiteY; + } + double GetWhiteZ() + { + return m_dWhiteZ; + } + double GetBlackX() + { + return m_dBlackX; + } + double GetBlackY() + { + return m_dBlackY; + } + double GetBlackZ() + { + return m_dBlackZ; + } + double GetMinA() + { + return m_dMinA; + } + double GetMaxA() + { + return m_dMaxA; + } + double GetMinB() + { + return m_dMinB; + } + double GetMaxB() + { + return m_dMaxB; + } + + private: + + double m_dWhiteX; // + double m_dWhiteY; // White point + double m_dWhiteZ; // + + double m_dBlackX; // + double m_dBlackY; // Black point + double m_dBlackZ; // + + double m_dMinA; // + double m_dMaxA; // Границы для компонент А и В + double m_dMinB; // + double m_dMaxB; // + + double m_dMultR; // + double m_dMultG; // Дополнительные сомножители + double m_dMultB; // + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrICCBasedColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrICCBasedColorSpace : public GrColorSpace + { + public: + + GrICCBasedColorSpace(int nCompontnsCount, GrColorSpace *pAlternate, Ref *pICCProfileStream); + virtual ~GrICCBasedColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csICCBased; + } + + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return m_nComponentsCount; + } + virtual void GetDefaultColor(GrColor *pColor); + + virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); + + // Возвращаем значения, специфичные пространству Lab. + GrColorSpace *GetAlternate() + { + return m_pAlternate; + } + + private: + + int m_nComponentsCount; // Число компонент цвета (1, 3, or 4) + GrColorSpace *m_pAlternate; // Альтернативное цветовое пространство + double m_arrdRangeMin[4]; // Минимальные значения для каждой компоненты + double m_arrdRangeMax[4]; // Максимальные значения для каждой компоненты + Ref m_oICCProfileStream; // ICC + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrIndexedColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrIndexedColorSpace : public GrColorSpace + { + public: + + GrIndexedColorSpace(GrColorSpace *pBase, int nHival); + virtual ~GrIndexedColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csIndexed; + } + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 1; + } + virtual void GetDefaultColor(GrColor *pColor); + + virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); + + // Возвращаем значения, специфичные пространству Indexed. + GrColorSpace *GetBase() + { + return m_pBase; + } + int GetHival() + { + return m_nHival; + } + unsigned char *GetLookup() + { + return m_pLookup; + } + + private: + + GrColor *MapColorToBase(GrColor *pColor, GrColor *pBaseColor); + + private: + + GrColorSpace *m_pBase; // Базовое цветовое пространство + int m_nHival; // Hival = max valid index value + unsigned char *m_pLookup; // Таблица цветов + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrSeparationColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrSeparationColorSpace : public GrColorSpace + { + public: + + GrSeparationColorSpace(StringExt *seName, GrColorSpace *pAlternate, Function *pFunction); + virtual ~GrSeparationColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csSeparation; + } + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 1; + } + virtual void GetDefaultColor(GrColor *pColor); + + virtual bool IsNonMarking() + { + return m_bNonMarking; + } + + // Возвращаем значения, специфичные пространству Separation. + StringExt *GetName() + { + return m_seName; + } + GrColorSpace *GetAlternateSpace() + { + return m_pAlternateSpace; + } + Function *GetTransformFunction() + { + return m_pFunction; + } + + private: + + StringExt *m_seName; // Color space family name + GrColorSpace *m_pAlternateSpace; // Альтернативное цветовое пространство + Function *m_pFunction; // tintTransform ( функция преобразования в альтернативное пространство) + + bool m_bNonMarking; // Будет ли видимой графика, использующая данное цветовое пространство + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrDeviceNColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrDeviceNColorSpace : public GrColorSpace + { + public: + + GrDeviceNColorSpace(int nComponentsCount, GrColorSpace *pAlternate, Function *pFunction); + virtual ~GrDeviceNColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csDeviceN; + } + + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return m_nComponentsCount; + } + virtual void GetDefaultColor(GrColor *pColor); + + virtual bool IsNonMarking() + { + return m_bNonMarking; + } + + // Возвращаем значения, специфичные пространству DeviceN. + StringExt *GetColorantName(int nIndex) + { + return m_arrseNames[nIndex]; + } + GrColorSpace *GetAlternateColor() + { + return m_pAlternateSpace; + } + Function *GetTransformFunction() + { + return m_pFunction; + } + + private: + + int m_nComponentsCount; // Число компонент + StringExt *m_arrseNames[GrColorMaxComps]; // Объекты типа "Name" определяющие каждую цветовую компоненту + GrColorSpace *m_pAlternateSpace; // Альтернативное цветовое пространство + Function *m_pFunction; // tintTransform ( функция преобразования в альтернативное пространство) + + bool m_bNonMarking; // Будет ли видимой графика, использующая данное цветовое пространство + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPatternColorSpace + //------------------------------------------------------------------------------------------------------------------------------- + + class GrPatternColorSpace : public GrColorSpace + { + public: + + GrPatternColorSpace(GrColorSpace *pUnder); + virtual ~GrPatternColorSpace(); + virtual GrColorSpace *Copy(); + virtual GrColorSpaceMode GetMode() + { + return csPattern; + } + + + static GrColorSpace *Parse(Array *pArray); + + virtual void GetGray(GrColor *pColor, GrGray *pGray); + virtual void GetRGB(GrColor *pColor, GrRGB *pRGB); + virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK); + + virtual int GetComponentsCount() + { + return 0; + } + virtual void GetDefaultColor(GrColor *pColor); + + // Возвращаем значения, специфичные пространству Pattern. + GrColorSpace *GetUnder() + { + return m_pUnder; + } + + private: + + GrColorSpace *m_pUnder; // Цветовое пространство подкладки (для не цветовых Patterns) + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPattern + //------------------------------------------------------------------------------------------------------------------------------- + + class GrPattern + { + public: + + GrPattern(int nType); + virtual ~GrPattern(); + + static GrPattern *Parse(Object *pObject); + + virtual GrPattern *Copy() = 0; + + int GetType() + { + return m_nType; + } + + private: + + int m_nType; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrTilingPattern + //------------------------------------------------------------------------------------------------------------------------------- + + class GrTilingPattern : public GrPattern + { + public: + + static GrTilingPattern *Parse(Object *pPatternObject); + virtual ~GrTilingPattern(); + + virtual GrPattern *Copy(); + + int GetPaintType() + { + return m_nPaintType; + } + int GetTilingType() + { + return m_nTilingType; + } + double *GetBBox() + { + return m_arrBBox; + } + double GetXStep() + { + return m_dXStep; + } + double GetYStep() + { + return m_dYStep; + } + Dict *GetResourcesDict() + { + return m_oResources.IsDict() ? m_oResources.GetDict() : (Dict *)NULL; + } + double *GetMatrix() + { + return m_arrMatrix; + } + Object *GetContentStream() + { + return &m_oContentStream; + } + + private: + + GrTilingPattern(int nPaintType, int nTilingType, double *pBBox, double dXStep, double dYStep, Object *pResources, double *pMatrix, Object *pContentStream); + + private: + + int m_nPaintType; + int m_nTilingType; + double m_arrBBox[4]; + double m_dXStep; + double m_dYStep; + Object m_oResources; + double m_arrMatrix[6]; + + Object m_oContentStream; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrShadingPattern + //------------------------------------------------------------------------------------------------------------------------------- + + class GrShadingPattern : public GrPattern + { + public: + + static GrShadingPattern *Parse(Object *pPatternObject); + virtual ~GrShadingPattern(); + + virtual GrPattern *Copy(); + + GrShading *GetShading() + { + return m_pShading; + } + double *GetMatrix() + { + return m_arrMatrix; + } + + private: + + GrShadingPattern(GrShading *pShading, double *pMatrix); + + private: + + GrShading *m_pShading; // Сам объект Shading + double m_arrMatrix[6]; // Pattern matrix + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrShading + //------------------------------------------------------------------------------------------------------------------------------- + + class GrShading + { + public: + + GrShading(int nType); + GrShading(GrShading *pShading); + virtual ~GrShading(); + + static GrShading *Parse(Object *pObject); + + virtual GrShading *Copy() = 0; + + int GetType() + { + return m_nType; + } + GrColorSpace *GetColorSpace() + { + return m_pColorSpace; + } + GrColor *GetBackground() + { + return &m_oBackground; + } + bool GetHasBackground() + { + return m_bHasBackground; + } + void GetBBox(double *pdXMin, double *pdYMin, double *pdXMax, double *pdYMax) + { + *pdXMin = m_dXMin; + *pdYMin = m_dYMin; + *pdXMax = m_dXMax; + *pdYMax = m_dYMax; + } + bool GetHasBBox() + { + return m_bHasBBox; + } + + protected: + + bool Initialize(Dict *pDict); + + protected: + + int m_nType; // Тип + GrColorSpace *m_pColorSpace; // Цветовое пространство, в котором рисуем + GrColor m_oBackground; // Цвет подкладки, если она есть + bool m_bHasBackground; // Есть ли подкладка? + + double m_dXMin; // + double m_dYMin; // BBox + double m_dXMax; // + double m_dYMax; // + bool m_bHasBBox; // Задан ли BBox? + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrFunctionShading + //------------------------------------------------------------------------------------------------------------------------------- + + class GrFunctionShading : public GrShading + { + public: + + GrFunctionShading(double dMinX, double dMinY, double dMaxX, double dMaxY, double *pMatrix, Function **ppFunctions, int nFuncsCount); + GrFunctionShading(GrFunctionShading *pShading); + virtual ~GrFunctionShading(); + + static GrFunctionShading *Parse(Dict *pDict); + + virtual GrShading *Copy(); + + void GetDomain(double *pdMinX, double *pdMinY, double *pdMaxX, double *pdMaxY) + { + *pdMinX = m_dDomainMinX; + *pdMinY = m_dDomainMinY; + *pdMaxX = m_dDomainMaxX; + *pdMaxY = m_dDomainMaxY; + } + double *GetMatrix() + { + return m_arrMatrix; + } + int GetFunctionsCount() + { + return m_nFunctionsCount; + } + Function *GetFunction(int nIndex) + { + return m_arrFunctions[nIndex]; + } + void GetColor(double dX, double dY, GrColor *pColor); + + private: + + double m_dDomainMinX; // + double m_dDomainMinY; // Domain + double m_dDomainMaxX; // + double m_dDomainMaxY; // + + double m_arrMatrix[6]; // Матрица преобразования и пространства, определенного Domain, в текущее пространство Shading + Function *m_arrFunctions[GrColorMaxComps]; + int m_nFunctionsCount; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrAxialShading + //------------------------------------------------------------------------------------------------------------------------------- + + class GrAxialShading : public GrShading + { + public: + + GrAxialShading(double dX0, double dY0, double dX1, double dY1, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, bool bExtendStart, bool bExtendEnd); + GrAxialShading(GrAxialShading *pShading); + virtual ~GrAxialShading(); + + static GrAxialShading *Parse(Dict *pDict); + + virtual GrShading *Copy(); + + void GetCoords(double *pdX0, double *pdY0, double *pdX1, double *pdY1) + { + *pdX0 = m_dAxisX0; + *pdY0 = m_dAxisY0; + *pdX1 = m_dAxisX1; + *pdY1 = m_dAxisY1; + } + double GetDomain0() + { + return m_dT0; + } + double GetDomain1() + { + return m_dT1; + } + bool GetExtendStart() + { + return m_bExtendStart; + } + bool GetExtendEnd() + { + return m_bExtendEnd; + } + int GetFunctionsCount() + { + return m_nFunctionsCount; + } + Function *GetFunctions(int nIndex) + { + return m_arrFunctions[nIndex]; + } + void GetColor(double dT, GrColor *pColor); + + private: + + double m_dAxisX0; // Начальная точка вектора + double m_dAxisY0; // + double m_dAxisX1; // Конечная точка вектора + double m_dAxisY1; // + + double m_dT0; // Пределы параметра t(параметризация оси) + double m_dT1; + + Function *m_arrFunctions[GrColorMaxComps]; + int m_nFunctionsCount; + + bool m_bExtendStart; // Продолжать ли за начальную точку оси + bool m_bExtendEnd; // Продолжать ли за конечную точку оси + }; + //------------------------------------------------------------------------------------------------------------------------------- + // GrRadialShading + //------------------------------------------------------------------------------------------------------------------------------- + + class GrRadialShading : public GrShading + { + public: + + GrRadialShading(double dFirstX, double dFirstY, double dFirstRad, double dSecondX, double dSecondY, double dSecondRad, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, bool bExtendFirst, bool bExtendSecond); + GrRadialShading(GrRadialShading *pShading); + virtual ~GrRadialShading(); + + static GrRadialShading *Parse(Dict *pDict); + + virtual GrShading *Copy(); + + void GetCoords(double *pdFirstX, double *pdFirstY, double *pdFirstRad, double *pdSecondX, double *pdSecondY, double *pdSecondRad) + { + *pdFirstX = m_dFirstX; + *pdFirstY = m_dFirstY; + *pdFirstRad = m_dFirstRad; + *pdSecondX = m_dSecondX; + *pdSecondY = m_dSecondY; + *pdSecondRad = m_dSecondRad; + } + double GetDomain0() + { + return m_dT0; + } + double GetDomain1() + { + return m_dT1; + } + bool GetExtendFirst() + { + return m_bExtendFirst; + } + bool GetExtendSecond() + { + return m_bExtendSecond; + } + int GetFunctionsCount() + { + return m_nFunctionsCount; + } + Function *GetFunctions(int nIndex) + { + return m_arrFunctions[nIndex]; + } + void GetColor(double dT, GrColor *pColor); + + private: + + double m_dFirstX; // Координаты центра первой окружности + double m_dFirstY; // + double m_dFirstRad; // Радиус первой окружности + double m_dSecondX; // Координаты центра второй окружности + double m_dSecondY; // + double m_dSecondRad; // Радиус второй окружности + + double m_dT0; // Границы параметра t + double m_dT1; // + + Function *m_arrFunctions[GrColorMaxComps]; + int m_nFunctionsCount; + bool m_bExtendFirst; // Продолжать ли рисовать за первый круг + bool m_bExtendSecond; // Продолжать ли рисовать за второй круг + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrGouraudTriangleShading + //------------------------------------------------------------------------------------------------------------------------------- + + struct GrGouraudVertex + { + double dX; // Координаты вершины + double dY; // + GrColor oColor; // Цвет + }; + + class GrGouraudTriangleShading : public GrShading + { + public: + + GrGouraudTriangleShading(int nType, GrGouraudVertex *pVertexes, int nVertexsCount, int(*pTriangles)[3], int nTrianglesCount, Function **ppFunctions, int nFunctionsCount); + GrGouraudTriangleShading(GrGouraudTriangleShading *pShading); + virtual ~GrGouraudTriangleShading(); + + static GrGouraudTriangleShading *Parse(int nType, Dict *pDict, Stream *pStream); + + virtual GrShading *Copy(); + + int GetTrianglesCount() + { + return m_nTrianglesCount; + } + void GetTriangle(int nIndex, double *pdX0, double *pdY0, GrColor *pColor0, double *pdX1, double *pdY1, GrColor *pColor1, double *pdX2, double *pdY2, GrColor *pColor2); + + private: + + GrGouraudVertex *m_arrVertexs; // Массив всех вершин + int m_nVertexsCount; // Количество вершин + int(*m_arrTriangles)[3]; // Массив треугольников(треугольник определяется по номерам вершин) + int m_nTrianglesCount; // Количество треугольников + Function *m_ppFunctions[GrColorMaxComps]; // Функции + int m_nFunctionsCount; // Количество функций + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrPatchMeshShading + //------------------------------------------------------------------------------------------------------------------------------- + + struct GrPatch + { + double arrX[4][4]; + double arrY[4][4]; + GrColor arrColor[2][2]; + }; + + class GrPatchMeshShading : public GrShading + { + public: + + GrPatchMeshShading(int nType, GrPatch *pPatches, int nPatchesCount, Function **ppFuntions, int nFunctionsCount); + GrPatchMeshShading(GrPatchMeshShading *pShading); + + virtual ~GrPatchMeshShading(); + + static GrPatchMeshShading *Parse(int nType, Dict *pDict, Stream *pStream); + + virtual GrShading *Copy(); + + int GetPatchesCount() + { + return m_nPatchesCount; + } + GrPatch *GetPatch(int nIndex) + { + return &m_pPatches[nIndex]; + } + + private: + + GrPatch *m_pPatches; // Массив частей + int m_nPatchesCount; // Количество частей + Function *m_ppFunctions[GrColorMaxComps]; // Массив функций + int m_nFunctionsCount; // Количество функций + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrImageColorMap + //------------------------------------------------------------------------------------------------------------------------------- + + class GrImageColorMap + { + public: + + GrImageColorMap(int nBitsPerComponent, Object *pDecode, GrColorSpace *pColorSpace); + + ~GrImageColorMap(); + + GrImageColorMap *Copy() + { + return new GrImageColorMap(this); + } + + bool IsValid() + { + return m_bSuccess; + } + + GrColorSpace *GetColorSpace() + { + return m_pColorSpace; + } + + int GetComponentsCount() + { + return m_nComponentsCount; + } + int GetBitsPerComponent() + { + return m_nBitsPerComponent; + } + + double GetDecodeLow(int nIndex) + { + return m_arrDecodeLow[nIndex]; + } + double GetDecodeHigh(int nIndex) + { + return m_arrDecodeLow[nIndex] + m_arrDecodeRange[nIndex]; + } + + void GetGray(unsigned char *pColorValue, GrGray *pGray); + void GetRGB(unsigned char *pColorValue, GrRGB *pRGB); + void GetCMYK(unsigned char *pColorValue, GrCMYK *pCMYK); + void GetColor(unsigned char *pColorValue, GrColor *pColor); + + private: + + GrImageColorMap(GrImageColorMap *pColorMap); + + private: + + GrColorSpace *m_pColorSpace; // Цветовое пространство изображения + int m_nBitsPerComponent; // bits per component + int m_nComponentsCount; // Число цветовых компонент в пикселе + GrColorSpace *m_pColorSpace2; // Второе цветовое пространство + int m_nComponentsCount2; // Число цветовых компонент в пикселе(во втором пространстве) + GrColorComp *m_ppLookup[GrColorMaxComps]; // lookup table + double m_arrDecodeLow[GrColorMaxComps]; // Минимальные значения для каждой компоненты + double m_arrDecodeRange[GrColorMaxComps]; // Значения (Max - min) для каждой компоненты + + bool m_bSuccess; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrSubpath and GrPath + //------------------------------------------------------------------------------------------------------------------------------- + + class GrSubpath + { + public: + + GrSubpath(double dX, double dY); + + ~GrSubpath(); + + GrSubpath *Copy() + { + return new GrSubpath(this); + } + + int GetPointsCount() + { + return m_nPointsCount; + } + double GetX(int nIndex) + { + return m_pX[nIndex]; + } + double GetY(int nIndex) + { + return m_pY[nIndex]; + } + bool GetCurve(int nIndex) + { + return m_pbCurve[nIndex]; + } + + double GetLastX() + { + return m_pX[m_nPointsCount - 1]; + } + double GetLastY() + { + return m_pY[m_nPointsCount - 1]; + } + + + void LineTo(double dX, double dY); + + void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3); + + void Close(); + + bool IsClosed() + { + return m_bClosed; + } + + + // Добавляем сдвиг (, ) к каждой точке subpath. + void Offset(double dDx, double dDy); + void Transform(double *pMatrix); + + bool IsEqual(GrSubpath *pSubPath) + { + if (m_nPointsCount != pSubPath->m_nPointsCount || m_bClosed != pSubPath->m_bClosed) + return false; + + + for (int nIndex = 0; nIndex < m_nPointsCount; nIndex++) + { + if (fabs(m_pX[nIndex] - pSubPath->m_pX[nIndex]) > 0.001 || fabs(m_pY[nIndex] - pSubPath->m_pY[nIndex]) > 0.001 || m_pbCurve[nIndex] != pSubPath->m_pbCurve[nIndex]) + return false; + } + + return true; + } + + private: + + GrSubpath(GrSubpath *pSubpath); + + private: + + double *m_pX; // Координаты точек в supath + double *m_pY; // + + bool *m_pbCurve; // Если m_bCurve[i] = true => точка i - контрольная точка для кривой Безье + int m_nPointsCount; // Количество точек + int m_nSize; // Размер массивов m_pX/m_pY + bool m_bClosed; // Закрыт ли path? + }; + + class GrPath + { + public: + + GrPath(); + + ~GrPath(); + + GrPath *Copy() + { + return new GrPath(m_bJustStarted, m_dFirstX, m_dFirstY, m_ppSubpaths, m_nSubpathsCount, m_nSize); + } + + // Есть ли текущая точка? + bool IsCurPoint() + { + return m_nSubpathsCount > 0 || m_bJustStarted; + } + + // Пустой ли path, т.е. есть ли в нем хотя бы один subpath? + bool IsPathNonEmpty() + { + return m_nSubpathsCount > 0; + } + + int GetSubpathsCount() + { + return m_nSubpathsCount; + } + GrSubpath *GetSubpath(int nIndex) + { + return m_ppSubpaths[nIndex]; + } + + double GetLastX() + { + return m_ppSubpaths[m_nSubpathsCount - 1]->GetLastX(); + } + double GetLastY() + { + return m_ppSubpaths[m_nSubpathsCount - 1]->GetLastY(); + } + + + void MoveTo(double dX, double dY); + void LineTo(double dX, double dY); + void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3); + void Close(); + void Append(GrPath *pPath); + + // Добавляем сдвиг (, ) к каждой точке path. + void Offset(double dDx, double dDy); + + bool IsEqual(GrPath *pPath) + { + if (m_nSubpathsCount != pPath->m_nSubpathsCount) + return false; + + for (int nIndex = 0; nIndex < m_nSubpathsCount; nIndex++) + { + if (!m_ppSubpaths[nIndex]->IsEqual(pPath->m_ppSubpaths[nIndex])) + return false; + } + + return true; + } + + private: + + GrPath(bool bJustStarted, double dFirstX, double dFirstY, GrSubpath **ppSubpaths, int nSubpathsCount, int nSize); + + private: + bool m_bJustStarted; // True, если новый subpath был только что начат + double m_dFirstX; // Координаты первой точки нового subpath + double m_dFirstY; // + GrSubpath **m_ppSubpaths; // Список subpaths + int m_nSubpathsCount; // Количетсво subpaths + int m_nSize; // Размер массива m_ppSubpaths + }; + + + //------------------------------------------------------------------------------------------------------------------------------- + // GrTextClip + //------------------------------------------------------------------------------------------------------------------------------- + + class GrTextClip + { + public: + + GrTextClip() + { + m_nTextsCount = m_nSize = 0; + m_pTexts = NULL; + m_pMatrix = NULL; + } + + GrTextClip *Copy() + { + return new GrTextClip(this); + } + + ~GrTextClip() + { + for (int nIndex = 0; nIndex < m_nTextsCount; ++nIndex) + { + FreeWString(m_pTexts->wsText); + FreeWString(m_pTexts->wsFontName); + FreeWString(m_pTexts->wsFontPath); + } + MemUtilsFree(m_pTexts); + MemUtilsFree(m_pMatrix); + } + + void Reset() + { + for (int nIndex = 0; nIndex < m_nTextsCount; ++nIndex) + { + FreeWString(m_pTexts->wsText); + } + MemUtilsFree(m_pTexts); + MemUtilsFree(m_pMatrix); + + m_nTextsCount = m_nSize = 0; + m_pTexts = NULL; + m_pMatrix = NULL; + } + void ClipToText(std::wstring& wsFontName, std::wstring& wsFontPath, double dFontSize, int nFontStyle, double *pMatrix, std::wstring& wsText, double dX, double dY, double dWidth = 0, double dHeight = 0, double dBaseLineOffset = 0) + { + Resize(1); + + m_pTexts[m_nTextsCount].wsFontName = AllocWString(wsFontName); + m_pTexts[m_nTextsCount].wsFontPath = AllocWString(wsFontPath); + m_pTexts[m_nTextsCount].dFontSize = dFontSize; + m_pTexts[m_nTextsCount].nFontStyle = nFontStyle; + m_pTexts[m_nTextsCount].wsText = AllocWString(wsText); + m_pTexts[m_nTextsCount].dX = dX; + m_pTexts[m_nTextsCount].dY = dY; + m_pTexts[m_nTextsCount].dWidth = dWidth; + m_pTexts[m_nTextsCount].dHeight = dHeight; + m_pTexts[m_nTextsCount].dBaseLineOffset = dBaseLineOffset; + + m_pMatrix[m_nTextsCount].FromDoublePointer(pMatrix); + + ++m_nTextsCount; + return; + + } + int GetTextsCount() + { + return m_nTextsCount; + } + WString GetText(int nTextIndex, double *pdX, double *pdY, double *pdWidth, double *pdHeight, double *pdBaseLineOffset, WString* pwsFontName, WString* pwsFontPath, double *pdFontSize, int* pnFontStyle) + { + if (nTextIndex < 0 || nTextIndex >= m_nTextsCount) + return NULL; + + *pdX = m_pTexts[nTextIndex].dX; + *pdY = m_pTexts[nTextIndex].dY; + *pdWidth = m_pTexts[nTextIndex].dWidth; + *pdHeight = m_pTexts[nTextIndex].dHeight; + *pdBaseLineOffset = m_pTexts[nTextIndex].dBaseLineOffset; + + *pwsFontName = m_pTexts[nTextIndex].wsFontName; + *pwsFontPath = m_pTexts[nTextIndex].wsFontPath; + *pdFontSize = m_pTexts[nTextIndex].dFontSize; + *pnFontStyle = m_pTexts[nTextIndex].nFontStyle; + + return m_pTexts[nTextIndex].wsText; + } + double* GetMatrix(int nTextIndex) + { + if (nTextIndex < 0 || nTextIndex >= m_nTextsCount) + return NULL; + + return m_pMatrix[nTextIndex].ToDoublePointer(); + } + bool IsEqual(GrTextClip *pClip) + { + if (pClip->m_nTextsCount != m_nTextsCount) + return false; + + for (int nIndex = 0; nIndex < m_nTextsCount; nIndex++) + { + if (!m_pTexts[nIndex].IsEqual(pClip->m_pTexts[nIndex]) || !m_pMatrix[nIndex].IsEqual(pClip->m_pMatrix[nIndex])) + return false; + } + + return true; + } + + private: + + GrTextClip(GrTextClip *pTextClip) + { + m_nTextsCount = pTextClip->m_nTextsCount; + m_nSize = pTextClip->m_nSize; + + m_pTexts = (Text *)MemUtilsMallocArray(m_nSize, sizeof(Text)); + m_pMatrix = (Matrix *)MemUtilsMallocArray(m_nSize, sizeof(Matrix)); + + for (int nIndex = 0; nIndex < m_nTextsCount; ++nIndex) + { + m_pTexts[nIndex].wsText = AllocWString(pTextClip->m_pTexts[nIndex].wsText); + m_pTexts[nIndex].dX = pTextClip->m_pTexts[nIndex].dX; + m_pTexts[nIndex].dY = pTextClip->m_pTexts[nIndex].dY; + m_pTexts[nIndex].dWidth = pTextClip->m_pTexts[nIndex].dWidth; + m_pTexts[nIndex].dHeight = pTextClip->m_pTexts[nIndex].dHeight; + m_pTexts[nIndex].dBaseLineOffset = pTextClip->m_pTexts[nIndex].dBaseLineOffset; + + m_pTexts[nIndex].wsFontName = AllocWString(pTextClip->m_pTexts[nIndex].wsFontName); + m_pTexts[nIndex].wsFontPath = AllocWString(pTextClip->m_pTexts[nIndex].wsFontPath); + m_pTexts[nIndex].dFontSize = pTextClip->m_pTexts[nIndex].dFontSize; + m_pTexts[nIndex].nFontStyle = pTextClip->m_pTexts[nIndex].nFontStyle; + + m_pMatrix[nIndex] = pTextClip->m_pMatrix[nIndex]; + } + + } + void Resize(int nTextsCount) + { + if (m_nTextsCount + nTextsCount > m_nSize) + { + if (m_nSize == 0) + { + m_nSize = 32; + } + while (m_nSize < m_nTextsCount + nTextsCount) + { + m_nSize *= 2; + } + + m_pTexts = (Text *)MemUtilsReallocArray(m_pTexts, m_nSize, sizeof(Text)); + m_pMatrix = (Matrix *)MemUtilsReallocArray(m_pMatrix, m_nSize, sizeof(Matrix)); + } + } + void Transform(double *pMatrix, double dX, double dY, double *pdX, double *pdY) + { + *pdX = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4]; + *pdY = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5]; + } + + private: + +#pragma pack(push, 1) + struct Matrix + { + double dA; + double dB; + double dC; + double dD; + double dE; + double dF; + + double *ToDoublePointer() + { + return &dA; + } + + void FromDoublePointer(double *pMatrix) + { + dA = pMatrix[0]; + dB = pMatrix[1]; + dC = pMatrix[2]; + dD = pMatrix[3]; + dE = pMatrix[4]; + dF = pMatrix[5]; + } + bool IsEqual(Matrix &oMatrix) + { + if (fabs(dA - oMatrix.dA) < 0.001 && fabs(dB - oMatrix.dB) < 0.001 && fabs(dC - oMatrix.dC) < 0.001 && fabs(dD - oMatrix.dD) < 0.001 && fabs(dE - oMatrix.dE) < 0.001 && fabs(dF - oMatrix.dF) < 0.001) + return true; + + return false; + } + }; + + struct Text + { + WString wsFontName; + WString wsFontPath; + double dFontSize; + int nFontStyle; + + WString wsText; + double dX; + double dY; + double dWidth; + double dHeight; + double dBaseLineOffset; + + bool IsEqual(Text &oText) + { + if (fabs(dX - oText.dX) < 0.001 && fabs(dY - oText.dY) < 0.001 && fabs(dWidth - oText.dWidth) < 0.001 && fabs(dHeight - oText.dHeight) < 0.001 && fabs(dBaseLineOffset - oText.dBaseLineOffset) < 0.001 && std::wstring(wsText) == std::wstring(oText.wsText)) + return true; + + return false; + } + }; + +#pragma pack(pop) + + private: + + Text* m_pTexts; + Matrix* m_pMatrix; + int m_nTextsCount; + int m_nSize; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrClip + //------------------------------------------------------------------------------------------------------------------------------- + +#define GrClipEOFlag 0x01 // Используем правило Even-odd + + class GrClip + { + public: + + GrClip(double dMinX, double dMinY, double dMaxX, double dMaxY); + + GrClip *Copy() + { + return new GrClip(this); + } + + ~GrClip(); + + void ResetToRect(double dX0, double dY0, double dX1, double dY1); + + // Пересекаем Clip с заданным прямоугольником. + void ClipToRect(double dX0, double dY0, double dX1, double dY1); + + // Пересекаем Clip с . + void ClipToPath(GrPath *pPath, double *pMatrix, bool bEO); + + // Пересекаем с текстом + void ClipToText(std::wstring wsFontName, std::wstring wsFontPath, double dFontSize, int nFontStyle, double *pMatrix, std::wstring wsText, double dX, double dY, double dWidth, double dHeight, double dBaseLineOffset) + { + if (!m_pTextClip) + m_pTextClip = new GrTextClip(); + + m_pTextClip->ClipToText(wsFontName, wsFontPath, dFontSize, nFontStyle, pMatrix, wsText, dX, dY, dWidth, dHeight, dBaseLineOffset); + } + + // + void AppendTextClip(GrTextClip *pTextClip) + { + for (int nIndex = 0; nIndex < pTextClip->GetTextsCount(); nIndex++) + { + WString wsFontName, wsFontPath; + int nFontStyle; + double dFontSize = 10, dX = 0, dY = 0, dWidth = 0, dHeight = 0, dBaseLineOffset = 0; + + WString wsText = pTextClip->GetText(nIndex, &dX, &dY, &dWidth, &dHeight, &dBaseLineOffset, &wsFontName, &wsFontPath, &dFontSize, &nFontStyle); + double *pMatrix = pTextClip->GetMatrix(nIndex); + + ClipToText(std::wstring(wsFontName), std::wstring(wsFontPath), dFontSize, nFontStyle, pMatrix, std::wstring(wsText), dX, dY, dWidth, dHeight, dBaseLineOffset); + } + } + + int GetMinX() + { + return m_nMinX; + } + int GetMaxX() + { + return m_nMaxX; + } + int GetMinY() + { + return m_nMinY; + } + int GetMaxY() + { + return m_nMaxY; + } + + int GetPathsCount() + { + return m_nPathsCount; + } + + GrPath *GetPath(int nPathIndex) + { + if (nPathIndex < 0 || nPathIndex >= m_nPathsCount) + return NULL; + + return m_ppPaths[nPathIndex]; + } + double *GetMatrix(int nPathIndex) + { + if (nPathIndex < 0 || nPathIndex >= m_nPathsCount) + return NULL; + + return m_pMatrix[nPathIndex].ToDoublePointer(); + } + int GetFlag(int nPathIndex) + { + if (nPathIndex < 0 || nPathIndex >= m_nPathsCount) + return NULL; + + return m_pFlags[nPathIndex]; + } + WString GetText(int nTextIndex, double *pdX, double *pdY, double *pdWidth, double *pdHeight, double *pdBaseLineOffset, WString* pwsFontName, WString* pwsFontPath, double *pdFontSize, int* pnFontStyle) + { + if (m_pTextClip) + { + return m_pTextClip->GetText(nTextIndex, pdX, pdY, pdWidth, pdHeight, pdBaseLineOffset, pwsFontName, pwsFontPath, pdFontSize, pnFontStyle); + } + + return NULL; + } + int GetTextsCount() + { + if (m_pTextClip) + { + return m_pTextClip->GetTextsCount(); + } + return -1; + } + double *GetTextMatrix(int nTextIndex) + { + if (m_pTextClip) + return m_pTextClip->GetMatrix(nTextIndex); + + return NULL; + } + + bool IsEqual(GrClip *pClip, int &nPathIndex) + { + bool bResult = true; + nPathIndex = -1; + + if (!m_pTextClip->IsEqual(pClip->m_pTextClip)) + return false; + + if (m_nPathsCount < pClip->m_nPathsCount) + bResult = false; + else if (m_nPathsCount > pClip->m_nPathsCount) + return false; + + + for (int nIndex = 0; nIndex < m_nPathsCount; nIndex++) + { + if (!m_pMatrix[nIndex].IsEqual(pClip->m_pMatrix[nIndex]) || m_pFlags[nIndex] != pClip->m_pFlags[nIndex] || !m_ppPaths[nIndex]->IsEqual(pClip->m_ppPaths[nIndex])) + return false; + } + + nPathIndex = m_nPathsCount; + + return bResult; + } + + private: + + GrClip(GrClip *pClip); + void Resize(int nPathsCount); + GrPath *PathRect(double dX0, double dY0, double dX1, double dY1); + void Transform(double *pMatrix, double dX, double dY, double *pdX, double *pdY) + { + *pdX = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4]; + *pdY = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5]; + } + + private: + +#pragma pack(push, 1) + struct Matrix + { + double dA; + double dB; + double dC; + double dD; + double dE; + double dF; + + double *ToDoublePointer() + { + return &dA; + } + + void FromDoublePointer(double *pMatrix) + { + dA = pMatrix[0]; + dB = pMatrix[1]; + dC = pMatrix[2]; + dD = pMatrix[3]; + dE = pMatrix[4]; + dF = pMatrix[5]; + } + + bool IsEqual(Matrix &oMatrix) + { + if (fabs(dA - oMatrix.dA) < 0.001 && fabs(dB - oMatrix.dB) < 0.001 && fabs(dC - oMatrix.dC) < 0.001 && fabs(dD - oMatrix.dD) < 0.001 && fabs(dE - oMatrix.dE) < 0.001 && fabs(dF - oMatrix.dF) < 0.001) + return true; + + return false; + } + + }; +#pragma pack(pop) + + private: + + double m_dMinX; + double m_dMinY; + double m_dMaxX; + double m_dMaxY; + + int m_nMinX; + int m_nMinY; + int m_nMaxX; + int m_nMaxY; + + GrPath **m_ppPaths; + Matrix *m_pMatrix; + unsigned char *m_pFlags; + int m_nPathsCount; + int m_nSize; + + GrTextClip *m_pTextClip; + }; + + + //------------------------------------------------------------------------------------------------------------------------------- + // GrState + //------------------------------------------------------------------------------------------------------------------------------- + + class GrState + { + public: + + GrState(double dHorizDPI, double dVertDPI, PDFRectangle *pPageBox, int nRotate, bool bUpsideDown); + + ~GrState(); + + GrState *Copy() + { + return new GrState(this); + } + + + double GetHorDPI() + { + return m_dHorDPI; + } + double GetVerDPI() + { + return m_dVerDPI; + } + double *GetCTM() + { + return m_arrCTM; + } + double GetPageLeft() + { + return m_dPageLeft; + } + double GetPageBottom() + { + return m_dPageBottom; + } + double GetPageRight() + { + return m_dPageRight; + } + double GetPageTop() + { + return m_dPageTop; + } + double GetPageWidth() + { + return m_dPageWidth; + } + double GetPageHeight() + { + return m_dPageHeight; + } + int GetRotate() + { + return m_nRotate; + } + GrColor *GetFillColor() + { + return &m_oFillColor; + } + GrColor *GetStrokeColor() + { + return &m_oStrokeColor; + } + void GetFillGray(GrGray *pGray) + { + m_pFillColorSpace->GetGray(&m_oFillColor, pGray); + } + void GetStrokeGray(GrGray *pGray) + { + m_pStrokeColorSpace->GetGray(&m_oStrokeColor, pGray); + } + void GetFillRGB(GrRGB *pRGB) + { + m_pFillColorSpace->GetRGB(&m_oFillColor, pRGB); + } + void GetStrokeRGB(GrRGB *pRGB) + { + m_pStrokeColorSpace->GetRGB(&m_oStrokeColor, pRGB); + } + void GetFillCMYK(GrCMYK *pCMYK) + { + m_pFillColorSpace->GetCMYK(&m_oFillColor, pCMYK); + } + void GetStrokeCMYK(GrCMYK *pCMYK) + { + m_pStrokeColorSpace->GetCMYK(&m_oStrokeColor, pCMYK); + } + GrColorSpace *GetFillColorSpace() + { + return m_pFillColorSpace; + } + GrColorSpace *GetStrokeColorSpace() + { + return m_pStrokeColorSpace; + } + GrPattern *GetFillPattern() + { + return m_pFillPattern; + } + GrPattern *GetStrokePattern() + { + return m_pStrokePattern; + } + GraphicsBlendMode GetBlendMode() + { + return m_eBlendMode; + } + double GetFillOpacity() + { + return m_dFillOpacity; + } + double GetStrokeOpacity() + { + return m_dStrokeOpacity; + } + bool GetFillOverprint() + { + return m_bFillOverprint; + } + bool GetStrokeOverprint() + { + return m_bStrokeOverprint; + } + Function **GetTransfer() + { + return m_ppTransfer; + } + double GetLineWidth() + { + return m_dLineWidth; + } + void GetLineDash(double **ppDash, int *pSize, double *pStart) + { + *ppDash = m_pLineDash; + *pSize = m_nLineDashSize; + *pStart = m_dLineDashStart; + } + int GetFlatness() + { + return m_nFlatness; + } + int GetLineJoin() + { + return m_nLineJoin; + } + int GetLineCap() + { + return m_nLineCap; + } + double GetMiterLimit() + { + return m_dMiterLimit; + } + bool GetStrokeAdjust() + { + return m_bStrokeAdjust; + } + GrFont *GetFont() + { + return m_pFont; + } + double GetFontSize() + { + return m_dFontSize; + } + double *GetTextMatrix() + { + return m_arrTextMatrix; + } + double GetCharSpace() + { + return m_dCharSpace; + } + double GetWordSpace() + { + return m_dWordSpace; + } + double GetHorizScaling() + { + return m_dHorizScaling; + } + double GetLeading() + { + return m_dLeading; + } + double GetRise() + { + return m_nRise; + } + int GetRenderMode() + { + return m_nRenderMode; + } + GrPath *GetPath() + { + return m_pPath; + } + double GetCurX() + { + return m_dCurX; + } + double GetCurY() + { + return m_dCurY; + } + void GetClipBBox(double *pXMin, double *pYMin, double *pXMax, double *pYMax) + { + *pXMin = m_dClipXMin; + *pYMin = m_dClipYMin; + *pXMax = m_dClipXMax; + *pYMax = m_dClipYMax; + } + void GetUserClipBBox(double *pXMin, double *pYMin, double *pXMax, double *pYMax); + double GetTextLineX() + { + return m_dTextLineX; + } + double GetTextLineY() + { + return m_dTextLineY; + } + + GrClip *GetClip() + { + return m_pClip; + } + // Есть ли текущая точка? + bool IsCurPoint() + { + return m_pPath->IsCurPoint(); + } + // Есть ли непустой path? + bool IsPathNonEmpty() + { + return m_pPath->IsPathNonEmpty(); + } + + // Различные преобразования координат. + void Transform(double dSrcX, double dSrcY, double *pdResX, double *pdResY) + { + *pdResX = m_arrCTM[0] * dSrcX + m_arrCTM[2] * dSrcY + m_arrCTM[4]; + *pdResY = m_arrCTM[1] * dSrcX + m_arrCTM[3] * dSrcY + m_arrCTM[5]; + } + void TransformDelta(double dSrcX, double dSrcY, double *pdResX, double *pdResY) + { + *pdResX = m_arrCTM[0] * dSrcX + m_arrCTM[2] * dSrcY; + *pdResY = m_arrCTM[1] * dSrcX + m_arrCTM[3] * dSrcY; + } + void TextTransform(double dSrcX, double dSrcY, double *pdResX, double *pdResY) + { + *pdResX = m_arrTextMatrix[0] * dSrcX + m_arrTextMatrix[2] * dSrcY + m_arrTextMatrix[4]; + *pdResY = m_arrTextMatrix[1] * dSrcX + m_arrTextMatrix[3] * dSrcY + m_arrTextMatrix[5]; + } + void TextTransformDelta(double dSrcX, double dSrcY, double *pdResX, double *pdResY) + { + *pdResX = m_arrTextMatrix[0] * dSrcX + m_arrTextMatrix[2] * dSrcY; + *pdResY = m_arrTextMatrix[1] * dSrcX + m_arrTextMatrix[3] * dSrcY; + } + double TransformWidth(double dWidth); + double GetTransformedLineWidth() + { + return TransformWidth(m_dLineWidth); + } + double GetTransformedFontSize(); + void GetFontTransformMatrix(double *pdM11, double *pdM12, double *pdM21, double *pdM22); + + void SetCTM(double dA, double dB, double dC, double dD, double dE, double dF); + void ConcatCTM(double dA, double dB, double dC, double dD, double dE, double dF); + void ShiftCTM(double dShiftX, double dShiftY); + void SetFillColorSpace(GrColorSpace *pColorSpace); + void SetStrokeColorSpace(GrColorSpace *pColorSpace); + void SetFillColor(GrColor *pColor) + { + m_oFillColor = *pColor; + } + void SetStrokeColor(GrColor *pColor) + { + m_oStrokeColor = *pColor; + } + void SetFillPattern(GrPattern *pPattern); + void SetStrokePattern(GrPattern *pPattern); + void SetBlendMode(GraphicsBlendMode eMode) + { + m_eBlendMode = eMode; + } + void SetFillOpacity(double dOpacity) + { + m_dFillOpacity = dOpacity; + } + void SetStrokeOpacity(double dOpacity) + { + m_dStrokeOpacity = dOpacity; + } + void SetFillOverprint(bool bOverprint) + { + m_bFillOverprint = bOverprint; + } + void SetStrokeOverprint(bool bOverprint) + { + m_bStrokeOverprint = bOverprint; + } + void SetTransfer(Function **ppFunctions); + void SetLineWidth(double dWidth) + { + m_dLineWidth = dWidth; + } + void SetLineDash(double *pDash, int nLength, double dStart); + void SetFlatness(int nFlatness) + { + m_nFlatness = nFlatness; + } + void SetLineJoin(int nLineJoin) + { + m_nLineJoin = nLineJoin; + } + void SetLineCap(int nLineCap) + { + m_nLineCap = nLineCap; + } + void SetMiterLimit(double dMiterLimit) + { + m_dMiterLimit = dMiterLimit; + } + void SetStrokeAdjust(bool bStrokeAdjust) + { + m_bStrokeAdjust = bStrokeAdjust; + } + void SetFont(GrFont *pFont, double dFontSize) + { + m_pFont = pFont; + m_dFontSize = dFontSize; + } + void SetTextMatrix(double dA, double dB, double dC, double dD, double dE, double dF) + { + m_arrTextMatrix[0] = dA; + m_arrTextMatrix[1] = dB; + m_arrTextMatrix[2] = dC; + m_arrTextMatrix[3] = dD; + m_arrTextMatrix[4] = dE; + m_arrTextMatrix[5] = dF; + } + void SetCharSpace(double dCharSpace) + { + m_dCharSpace = dCharSpace; + } + void SetWordSpace(double dWordSpace) + { + m_dWordSpace = dWordSpace; + } + void SetHorizScaling(double dScale) + { + m_dHorizScaling = 0.01 * dScale; + } + void SetLeading(double dLeading) + { + m_dLeading = dLeading; + } + void SetRise(double dRise) + { + m_nRise = dRise; + } + void SetRenderMode(int nRenderMode) + { + m_nRenderMode = nRenderMode; + } + void SetPath(GrPath *pPath); + void MoveTo(double dX, double dY) + { + m_pPath->MoveTo(m_dCurX = dX, m_dCurY = dY); + } + void LineTo(double dX, double dY) + { + m_pPath->LineTo(m_dCurX = dX, m_dCurY = dY); + } + void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3) + { + m_pPath->CurveTo(dX1, dY1, dX2, dY2, m_dCurX = dX3, m_dCurY = dY3); + } + void ClosePath() + { + m_pPath->Close(); + m_dCurX = m_pPath->GetLastX(); + m_dCurY = m_pPath->GetLastY(); + } + void ClearPath(); + void Clip(); + void ClipToStrokePath(); + + // Текст. + void TextSetPos(double dX, double dY) + { + m_dTextLineX = dX; + m_dTextLineY = dY; + } + void TextMoveTo(double dX, double dY) + { + m_dTextLineX = dX; + m_dTextLineY = dY; + TextTransform(dX, dY, &m_dCurX, &m_dCurY); + } + void TextShift(double dShiftX, double dShiftY); + void Shift(double dShidtX, double dShiftY); + + // Работа со стеком. + GrState *Save(); + GrState *Restore(); + bool HasSaves() + { + return m_pNext != NULL; + } + + // + bool ParseBlendMode(Object *pObject, GraphicsBlendMode *peMode); + + private: + + GrState(GrState *pState); + + private: + + double m_dHorDPI; // Разрешение по горизонтали + double m_dVerDPI; // Разрешение по вертикали + double m_arrCTM[6]; // Матрица преобразования координат + + double m_dPageLeft; // Координаты левого нижнего угла и + double m_dPageBottom; // правого верхнего в пользовательстких координатах + double m_dPageRight; // + double m_dPageTop; // + + double m_dPageWidth; // Ширина страницы в пикселях(т.е. с учетом разрешения m_dHorDPI) + double m_dPageHeight; // Высота страницы в пикселях(т.е. с учетом разрешения m_dVerDPI) + + int m_nRotate; // Угол поворота страницы + + GrColorSpace *m_pFillColorSpace; // Цветовое пространство для заливки + GrColorSpace *m_pStrokeColorSpace;// Цветовое пространство для обводки + GrColor m_oFillColor; // Цвет для заливки + GrColor m_oStrokeColor; // Цвет для обводки + GrPattern *m_pFillPattern; // Указатель на объект, определяющий заливку + GrPattern *m_pStrokePattern; // Указатель на объект, определяющий обводку + + GraphicsBlendMode m_eBlendMode; // Blend mode (для прозрачности) + + double m_dFillOpacity; // Прозрачность заливки + double m_dStrokeOpacity; // Прозрачность обводки + + bool m_bFillOverprint; // Заливаем поверх всего? + bool m_bStrokeOverprint; // Обводим поверх всего? + Function *m_ppTransfer[4]; // Функция переноса. Варианты входных параметров: + // все NULL = тождествнная функция; + // последние три NULL = одномерная функция; + // все 4 не NULL = R,G,B,gray -функция + + double m_dLineWidth; // Толщина линии + double *m_pLineDash; // Параметры, если линия пунктирная + int m_nLineDashSize; // Размер массива m_pLineDash + double m_dLineDashStart;// + int m_nFlatness; // Flatness Tolerance + int m_nLineJoin; // Тип соединения линий + int m_nLineCap; // Тип оконачния линий + double m_dMiterLimit; // Miter limit + bool m_bStrokeAdjust; // True, автоматически обводить + + GrFont *m_pFont; // Шрифт + double m_dFontSize; // Размер шрифта + double m_arrTextMatrix[6]; // Матрица координатных преобразований текста + double m_dCharSpace; // Расстояние между символами + double m_dWordSpace; // Расстояние между словами + double m_dHorizScaling; // Горизонтальное растяжение текста + double m_dLeading; // Расстояние между строками + double m_nRise; // Поднятие/опускание текста относительно baseline + int m_nRenderMode; // Способ рисования букв + + GrPath *m_pPath; // Массив графических Path + double m_dCurX; // Координаты текущей точки + double m_dCurY; // (в пользовательских координатах) + double m_dTextLineX; // Координаты начальной точки, начиная с которой пишется текст + double m_dTextLineY; // (в текстовых координатах) + + GrClip *m_pClip; + double m_dClipXMin; // + double m_dClipYMin; // Границы для clip region + double m_dClipXMax; // + double m_dClipYMax; // + + GrState *m_pNext; // Следующий GrState в стэке + }; +} +#endif // _PDF_READER_GSTATE_H diff --git a/PdfReader/Src/GlobalParams.cpp b/PdfReader/Src/GlobalParams.cpp new file mode 100644 index 0000000000..9134a2d9ce --- /dev/null +++ b/PdfReader/Src/GlobalParams.cpp @@ -0,0 +1,200 @@ +#include +#include +#include +#include + +#include "Resource.h" + +#include "MemoryUtils.h" +#include "StringExt.h" +#include "Constants.h" +#include "List.h" +#include "Hash.h" +#include "File.h" +#include "NameToCharCode.h" +#include "CharCodeToUnicode.h" +#include "UnicodeMap.h" +#include "CMap.h" +#include "BuiltinFontTables.h" +#include "EncodingTables.h" +#include "GlobalParams.h" +#include "NameToUnicodeTable.h" +#include "UnicodeMapTables.h" +#include "UTF8.h" + +#include "../Resources/Fontn022003l.h" +#include "../Resources/Fontn022004l.h" +#include "../Resources/Fontn022024l.h" +#include "../Resources/Fontn022023l.h" +#include "../Resources/Fontn019003l.h" +#include "../Resources/Fontn019004l.h" +#include "../Resources/Fontn019024l.h" +#include "../Resources/Fontn019023l.h" +#include "../Resources/Fonts050000l.h" +#include "../Resources/Fontn021004l.h" +#include "../Resources/Fontn021024l.h" +#include "../Resources/Fontn021023l.h" +#include "../Resources/Fontn021003l.h" +#include "../Resources/Fontd050000l.h" + +#define cidToUnicodeCacheSize 4 +#define unicodeToUnicodeCacheSize 4 + +namespace PdfReader +{ + static struct + { + wchar_t* wsName; + wchar_t* wsT1FileName; + wchar_t* wsTTFileName; + const unsigned char* pT1Buffer; + const unsigned int unSize; + } c_arrBase14FontTable[] = + { + { L"Courier", L"n022003l.pfb", L"cour.ttf", c_arrn022003l, c_nSizen022003l}, + { L"Courier-Bold", L"n022004l.pfb", L"courbd.ttf", c_arrn022004l, c_nSizen022004l}, + { L"Courier-BoldOblique", L"n022024l.pfb", L"courbi.ttf", c_arrn022024l, c_nSizen022024l}, + { L"Courier-Oblique", L"n022023l.pfb", L"couri.ttf", c_arrn022023l, c_nSizen022023l}, + { L"Helvetica", L"n019003l.pfb", L"arial.ttf", c_arrn019003l, c_nSizen019003l}, + { L"Helvetica-Bold", L"n019004l.pfb", L"arialbd.ttf", c_arrn019004l, c_nSizen019004l}, + { L"Helvetica-BoldOblique", L"n019024l.pfb", L"arialbi.ttf", c_arrn019024l, c_nSizen019024l}, + { L"Helvetica-Oblique", L"n019023l.pfb", L"ariali.ttf", c_arrn019023l, c_nSizen019023l}, + { L"Symbol", L"s050000l.pfb", NULL, c_arrs050000l, c_nSizes050000l}, + { L"Times-Bold", L"n021004l.pfb", L"timesbd.ttf", c_arrn021004l, c_nSizen021004l}, + { L"Times-BoldItalic", L"n021024l.pfb", L"timesbi.ttf", c_arrn021024l, c_nSizen021024l}, + { L"Times-Italic", L"n021023l.pfb", L"timesi.ttf", c_arrn021023l, c_nSizen021023l}, + { L"Times-Roman", L"n021003l.pfb", L"times.ttf", c_arrn021003l, c_nSizen021003l}, + { L"ZapfDingbats", L"d050000l.pfb", NULL, c_arrd050000l, c_nSized050000l}, + { NULL, NULL, NULL, NULL, 0 } + }; + //------------------------------------------------------------------------------------------------------------------------------- + // GlobalParams + //------------------------------------------------------------------------------------------------------------------------------- + GlobalParams::GlobalParams() : m_pFontManager(NULL) + { + // Просматриваем кодировку в обратном порядке, чтобы присвоить символу наименьше возможный номер + // (если у символа их несколько, например, как у 'space') + m_pMacRomanReverseMap = new NameToCharCode(); + for (int nIndex = 255; nIndex >= 0; --nIndex) + { + if (c_arrMacRomanEncoding[nIndex]) + { + m_pMacRomanReverseMap->Add(c_arrMacRomanEncoding[nIndex], (CharCode)nIndex); + } + } + + // Инициализируем талицу m_pNameToUnicode + m_pNameToUnicode = new NameToCharCode(); + for (int nIndex = 0; c_arrNameToUnicodeTable[nIndex].sName; ++nIndex) + { + m_pNameToUnicode->Add(c_arrNameToUnicodeTable[nIndex].sName, c_arrNameToUnicodeTable[nIndex].nUnicode); + } + + m_bMapNumericCharNames = true; + m_bMapUnknownCharNames = false; + m_pCMapCache = new CMapCache(); + m_wsTempDirectory = L""; + } + GlobalParams::~GlobalParams() + { + if (m_pMacRomanReverseMap) + delete m_pMacRomanReverseMap; + + if (m_pNameToUnicode) + delete m_pNameToUnicode; + + if (m_pCMapCache) + delete m_pCMapCache; + } + bool GlobalParams::GetMapNumericCharNames() + { + return m_bMapNumericCharNames; + } + bool GlobalParams::GetMapUnknownCharNames() + { + return m_bMapUnknownCharNames; + } + void GlobalParams::SetMapNumericCharNames(bool bMap) + { + m_bMapNumericCharNames = bMap; + } + void GlobalParams::SetMapUnknownCharNames(bool bMap) + { + m_bMapUnknownCharNames = bMap; + } + CharCode GlobalParams::GetMacRomanCharCode(char* sCharName) + { + return m_pMacRomanReverseMap->Lookup(sCharName); + } + CharCodeToUnicode* GlobalParams::GetUnicodeToUnicode(StringExt* seFontName) + { + // TODO: Как только будем хранить отдельную папку с файлами Unicode to Unicode реализовать тут + return NULL; + } + CharCodeToUnicode* GlobalParams::GetCIDToUnicode(StringExt* seCollection) + { + // TODO: Как только будем хранить отдельную папку с файлами Cid to Unicode реализовать тут + return NULL; + } + Unicode GlobalParams::MapNameToUnicode(char* sCharName) + { + return m_pNameToUnicode->Lookup(sCharName); + } + CMap* GlobalParams::GetCMap(StringExt* seCollection, StringExt* seCMapName, wchar_t* wsFilePath) + { + return m_pCMapCache->GetCMap(seCollection, seCMapName, this, wsFilePath); + } + FILE* GlobalParams::FindToUnicodeFile(StringExt* seName) + { + // TODO: Как только будем хранить отдельную папку с файлами ToUnicode реализовать тут + return NULL; + } + FILE* GlobalParams::FindCMapFile(StringExt* seCollection, StringExt* seCMapName) + { + if (m_wsCMapDirectory != L"") + { + std::wstring wsFilePath = m_wsCMapDirectory + seCMapName->GetWString(); + NSFile::CFileBinary oFile; + oFile.OpenFile(wsFilePath); + return oFile.GetFileNative(); + } + + return NULL; + } + FILE* GlobalParams::GetUnicodeMapFile(StringExt* seEncodingName) + { + // Как только будем работать с папкой UnicodeMap реализовать тут + return NULL; + } + std::wstring& GlobalParams::GetTempFolder() + { + return m_wsTempDirectory; + } + void GlobalParams::SetTempFolder(const wchar_t* wsTempFolder) + { + if (wsTempFolder) + m_wsTempDirectory = wsTempFolder; + else + m_wsTempDirectory = L""; + } + std::wstring GlobalParams::FindFontFile(StringExt* seFontName, wchar_t** pwsExts) + { + // TODO: Возможно стоит перенести сюда подбор шрифтов + return L""; + } + void GlobalParams::SetCMapFolder(const wchar_t* wsCMapDir) + { + if (wsCMapDir) + m_wsCMapDirectory = wsCMapDir; + else + m_wsCMapDirectory = L""; + } + void GlobalParams::SetFontManager(CFontManager* pFontManager) + { + m_pFontManager = pFontManager; + } + CFontManager* GlobalParams::GetFontManager() const + { + return m_pFontManager; + } +} \ No newline at end of file diff --git a/PdfReader/Src/GlobalParams.h b/PdfReader/Src/GlobalParams.h new file mode 100644 index 0000000000..960a24c080 --- /dev/null +++ b/PdfReader/Src/GlobalParams.h @@ -0,0 +1,71 @@ +#ifndef _PDF_READER_GLOBAL_PARAMS_H +#define _PDF_READER_GLOBAL_PARAMS_H + +#include +#include + +#include "CharTypes.h" + +#include "../../DesktopEditor/graphics/TemporaryCS.h" +#include "../../DesktopEditor/fontengine/FontManager.h" + + +namespace PdfReader +{ + class StringExt; + class CList; + class CHash; + class NameToCharCode; + class CharCodeToUnicode; + class CharCodeToUnicodeCache; + class UnicodeMap; + class UnicodeMapCache; + class CMap; + class CMapCache; + class GlobalParams; + //------------------------------------------------------------------------------------------------------------------------------- + // GlobalParams + //------------------------------------------------------------------------------------------------------------------------------- + class GlobalParams + { + public: + + GlobalParams(); + ~GlobalParams(); + + bool GetMapNumericCharNames(); + bool GetMapUnknownCharNames(); + void SetMapNumericCharNames(bool bMap); + void SetMapUnknownCharNames(bool bMap); + CharCode GetMacRomanCharCode(char* sCharName); + CharCodeToUnicode* GetUnicodeToUnicode(StringExt* seFontName); + CharCodeToUnicode* GetCIDToUnicode(StringExt* seCollection); + Unicode MapNameToUnicode(char* sCharName); + CMap* GetCMap(StringExt* seCollection, StringExt* seCMapName, wchar_t* wsFilePath = NULL); + FILE* FindToUnicodeFile(StringExt* seName); + FILE* FindCMapFile(StringExt *seCollection, StringExt *seCMapName); + FILE* GetUnicodeMapFile(StringExt* seEncodingName); + std::wstring& GetTempFolder(); + void SetTempFolder(const wchar_t* wsTempFolder); + std::wstring FindFontFile(StringExt* seFontName, wchar_t** pwsExts); + void SetCMapFolder(const wchar_t* wsDir); + void SetFontManager(CFontManager* pFontManager); + CFontManager* GetFontManager() const; + + private: + + bool m_bMapNumericCharNames; // Map numeric char names (from font subsets)? + bool m_bMapUnknownCharNames; // Map unknown char names? + + NameToCharCode* m_pMacRomanReverseMap; // Char name -> MacRomanEncoding + NameToCharCode* m_pNameToUnicode; // Char name -> Unicode + + CMapCache* m_pCMapCache; + std::wstring m_wsCMapDirectory; // Путь к папке с CMap файлами + std::wstring m_wsTempDirectory; + + CFontManager* m_pFontManager; + }; +} + +#endif // _PDF_READER_GLOBAL_PARAMS_H diff --git a/PdfReader/Src/Graphics.cpp b/PdfReader/Src/Graphics.cpp new file mode 100644 index 0000000000..38c6e95c8d --- /dev/null +++ b/PdfReader/Src/Graphics.cpp @@ -0,0 +1,4943 @@ +#include +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "GlobalParams.h" +#include "CharTypes.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "GFont.h" +#include "GState.h" +#include "RendererOutputDev.h" +#include "OutputDevice.h" +#include "Page.h" +#include "Annot.h" +#include "Graphics.h" + +// Под виндой переопределяется +#ifdef GetObject +#undef GetObject +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//------------------------------------------------------------------------------------------------------------------------------- +// Константы +//------------------------------------------------------------------------------------------------------------------------------- + +#define functionMaxDepth 6 + +#define functionColorDelta (DoubleToColor(1 / 256.0)) + +#define axialMaxSplits 256 + +#define axialColorDelta (DoubleToColor(1 / 256.0)) + +#define radialMaxSplits 256 + +#define radialColorDelta (DoubleToColor(1 / 256.0)) + +#define gouraudMaxDepth 1 + +#define gouraudColorDelta (DoubleToColor(1 / 256.0)) + +#define patchMaxDepth 6 + +#define patchColorDelta (DoubleToColor(1 / 256.0)) + +//------------------------------------------------------------------------------------------------------------------------------- +// Таблица графических операторов +//------------------------------------------------------------------------------------------------------------------------------- + +#ifdef WIN32 // this works around a bug in the VC7 compiler +# pragma optimize("",off) +#endif + +namespace PdfReader +{ + Operator Graphics::OperatorsTable[] = + { + { "\"", 3, { argNum, argNum, argString }, &Graphics::OperatorMoveSetShowText }, + { "'", 1, { argString }, &Graphics::OperatorMoveShowText }, + { "B", 0, { argNone }, &Graphics::OperatorFillStroke }, + { "B*", 0, { argNone }, &Graphics::OperatorEOFillStroke }, + { "BDC", 2, { argName, argProps }, &Graphics::OperatorBeginMarkedContent }, + { "BI", 0, { argNone }, &Graphics::OperatorBeginImage }, + { "BMC", 1, { argName }, &Graphics::OperatorBeginMarkedContent }, + { "BT", 0, { argNone }, &Graphics::OperatorBeginText }, + { "BX", 0, { argNone }, &Graphics::OperatorBeginIgnoreUndef }, + { "CS", 1, { argName }, &Graphics::OperatorSetStrokeColorSpace }, + { "DP", 2, { argName, argProps }, &Graphics::OperatorMarkPoint }, + { "Do", 1, { argName }, &Graphics::OperatorXObject }, + { "EI", 0, { argNone }, &Graphics::OperatorEndImage }, + { "EMC", 0, { argNone }, &Graphics::OperatorEndMarkedContent }, + { "ET", 0, { argNone }, &Graphics::OperatorEndText }, + { "EX", 0, { argNone }, &Graphics::OperatorEndIgnoreUndef }, + { "F", 0, { argNone }, &Graphics::OperatorFill }, + { "G", 1, { argNum }, &Graphics::OperatorSetStrokeGray }, + { "ID", 0, { argNone }, &Graphics::OperatorImageData }, + { "J", 1, { argInt }, &Graphics::OperatorSetLineCap }, + { "K", 4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorSetStrokeCMYKColor }, + { "M", 1, { argNum }, &Graphics::OperatorSetMiterLimit }, + { "MP", 1, { argName }, &Graphics::OperatorMarkPoint }, + { "Q", 0, { argNone }, &Graphics::OperatorRestore }, + { "RG", 3, { argNum, argNum, argNum }, &Graphics::OperatorSetStrokeRGBColor }, + { "S", 0, { argNone }, &Graphics::OperatorStroke }, + { "SC", -4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorSetStrokeColor }, + { "SCN", -33, { argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN }, &Graphics::OperatorSetStrokeColorN }, + { "T*", 0, { argNone }, &Graphics::OperatorTextNextLine }, + { "TD", 2, { argNum, argNum }, &Graphics::OperatorTextMoveSet }, + { "TJ", 1, { argArray }, &Graphics::OperatorShowSpaceText }, + { "TL", 1, { argNum }, &Graphics::OperatorSetTextLeading }, + { "Tc", 1, { argNum }, &Graphics::OperatorSetCharSpacing }, + { "Td", 2, { argNum, argNum }, &Graphics::OperatorTextMove }, + { "Tf", 2, { argName, argNum }, &Graphics::OperatorSetFont }, + { "Tj", 1, { argString }, &Graphics::OperatorShowText }, + { "Tm", 6, { argNum, argNum, argNum, argNum, argNum, argNum }, &Graphics::OperatorSetTextMatrix }, + { "Tr", 1, { argInt }, &Graphics::OperatorSetTextRender }, + { "Ts", 1, { argNum }, &Graphics::OperatorSetTextRise }, + { "Tw", 1, { argNum }, &Graphics::OperatorSetWordSpacing }, + { "Tz", 1, { argNum }, &Graphics::OperatorSetHorizScaling }, + { "W", 0, { argNone }, &Graphics::OperatorClip }, + { "W*", 0, { argNone }, &Graphics::OperatorEOClip }, + { "b", 0, { argNone }, &Graphics::OperatorCloseFillStroke }, + { "b*", 0, { argNone }, &Graphics::OperatorCloseEOFillStroke }, + { "c", 6, { argNum, argNum, argNum, argNum, argNum, argNum }, &Graphics::OperatorCurveTo }, + { "cm", 6, { argNum, argNum, argNum, argNum, argNum, argNum }, &Graphics::OperatorConcat }, + { "cs", 1, { argName }, &Graphics::OperatorSetFillColorSpace }, + { "d", 2, { argArray, argNum }, &Graphics::OperatorSetDash }, + { "d0", 2, { argNum, argNum }, &Graphics::OperatorSetCharWidth }, + { "d1", 6, { argNum, argNum, argNum, argNum, argNum, argNum }, &Graphics::OperatorSetCacheDevice }, + { "f", 0, { argNone }, &Graphics::OperatorFill }, + { "f*", 0, { argNone }, &Graphics::OperatorEOFill }, + { "g", 1, { argNum }, &Graphics::OperatorSetFillGray }, + { "gs", 1, { argName }, &Graphics::OperatorSetExtGState }, + { "h", 0, { argNone }, &Graphics::OperatorClosePath }, + { "i", 1, { argNum }, &Graphics::OperatorSetFlat }, + { "j", 1, { argInt }, &Graphics::OperatorSetLineJoin }, + { "k", 4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorSetFillCMYKColor }, + { "l", 2, { argNum, argNum }, &Graphics::OperatorLineTo }, + { "m", 2, { argNum, argNum }, &Graphics::OperatorMoveTo }, + { "n", 0, { argNone }, &Graphics::OperatorEndPath }, + { "q", 0, { argNone }, &Graphics::OperatorSave }, + { "re", 4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorRectangle }, + { "rg", 3, { argNum, argNum, argNum }, &Graphics::OperatorSetFillRGBColor }, + { "ri", 1, { argName }, &Graphics::OperatorSetRenderingIntent }, + { "s", 0, { argNone }, &Graphics::OperatorCloseStroke }, + { "sc", -4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorSetFillColor }, + { "scn", -33, { argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN, argSCN, argSCN, argSCN, + argSCN, argSCN, argSCN }, &Graphics::OperatorSetFillColorN }, + { "sh", 1, { argName }, &Graphics::OperatorShadingFill }, + { "v", 4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorCurveTo1 }, + { "w", 1, { argNum }, &Graphics::OperatorSetLineWidth }, + { "y", 4, { argNum, argNum, argNum, argNum }, &Graphics::OperatorCurveTo2 }, + }; + +#ifdef WIN32 // this works around a bug in the VC7 compiler +# pragma optimize("",on) +#endif + +#define OperatorsCount (sizeof(OperatorsTable) / sizeof(Operator)) + + //------------------------------------------------------------------------------------------------------------------------------- + // GrResources + //------------------------------------------------------------------------------------------------------------------------------- + + GrResources::GrResources(XRef *pXref, Dict *pResourcesDict, GrResources *pNext, GlobalParams *pGlobalParams) + { + m_pGlobalParams = pGlobalParams; + + if (pResourcesDict) + { + + // build font dictionary + m_pFonts = NULL; + Object oFont; + pResourcesDict->SearchAndCopy("Font", &oFont); + if (oFont.IsRef()) + { + Object oTemp; + oFont.Fetch(pXref, &oTemp); + if (oTemp.IsDict()) + { + Ref oRef = oFont.GetRef(); + m_pFonts = new GrFontDict(pXref, &oRef, oTemp.GetDict(), pGlobalParams); + } + oTemp.Free(); + } + else if (oFont.IsDict()) + { + m_pFonts = new GrFontDict(pXref, NULL, oFont.GetDict(), pGlobalParams); + } + oFont.Free(); + + //XObject + pResourcesDict->Search("XObject", &m_oXObjectDict); + + //ColorSpace + pResourcesDict->Search("ColorSpace", &m_oColorSpaceDict); + + //Pattern + pResourcesDict->Search("Pattern", &m_oPatternDict); + + //Shading + pResourcesDict->Search("Shading", &m_oShadingDict); + + //ExtGState + pResourcesDict->Search("ExtGState", &m_oExtGStateDict); + } + else + { + m_pFonts = NULL; + m_oXObjectDict.InitNull(); + m_oColorSpaceDict.InitNull(); + m_oPatternDict.InitNull(); + m_oShadingDict.InitNull(); + m_oExtGStateDict.InitNull(); + } + + m_pNext = pNext; + } + + GrResources::~GrResources() + { + if (m_pFonts) + { + delete m_pFonts; + } + m_oXObjectDict.Free(); + m_oColorSpaceDict.Free(); + m_oPatternDict.Free(); + m_oShadingDict.Free(); + m_oExtGStateDict.Free(); + } + + GrFont *GrResources::LookupFont(char *sName) + { + GrFont *pFont = NULL; + GrResources *pResources = NULL; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_pFonts) + { + if ((pFont = pResources->m_pFonts->Search(sName))) + return pFont; + } + } + // TO DO: Error "Unknown font tag" + return NULL; + } + + bool GrResources::LookupXObject(char *sName, Object *pObject) + { + GrResources *pResources = NULL; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oXObjectDict.IsDict()) + { + if (!pResources->m_oXObjectDict.DictLookup(sName, pObject)->IsNull()) + return true; + pObject->Free(); + } + } + // TO DO: Error "XObject is unknown" + return false; + } + + bool GrResources::LookupAndCopyXObject(char *sName, Object *pObject) + { + GrResources *pResources = NULL; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oXObjectDict.IsDict()) + { + if (!pResources->m_oXObjectDict.DictLookupAndCopy(sName, pObject)->IsNull()) + return true; + pObject->Free(); + } + } + // TO DO: Error "XObject is unknown" + return false; + } + + void GrResources::LookupColorSpace(char *sName, Object *pObject) + { + GrResources *pResources = NULL; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oColorSpaceDict.IsDict()) + { + if (!pResources->m_oColorSpaceDict.DictLookup(sName, pObject)->IsNull()) + { + return; + } + pObject->Free(); + } + } + pObject->InitNull(); + } + + GrPattern *GrResources::LookupPattern(char *sName) + { + GrResources *pResources = NULL; + GrPattern *pPattern = NULL; + Object oTemp; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oPatternDict.IsDict()) + { + if (!pResources->m_oPatternDict.DictLookup(sName, &oTemp)->IsNull()) + { + pPattern = GrPattern::Parse(&oTemp); + oTemp.Free(); + return pPattern; + } + oTemp.Free(); + } + } + // TO DO: Error "Unknown pattern" + return NULL; + } + + GrShading *GrResources::LookupShading(char *sName) + { + GrResources *pResources = NULL; + GrShading *pShading = NULL; + Object oTemp; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oShadingDict.IsDict()) + { + if (!pResources->m_oShadingDict.DictLookup(sName, &oTemp)->IsNull()) + { + pShading = GrShading::Parse(&oTemp); + oTemp.Free(); + return pShading; + } + oTemp.Free(); + } + } + // TO DO: Error "Unknown shading" + return NULL; + } + + bool GrResources::LookupExtGState(char *sName, Object *pObject) + { + GrResources *pResources = NULL; + + for (pResources = this; pResources; pResources = pResources->m_pNext) + { + if (pResources->m_oExtGStateDict.IsDict()) + { + if (!pResources->m_oExtGStateDict.DictLookup(sName, pObject)->IsNull()) + { + return true; + } + pObject->Free(); + } + } + // TO DO: Error "ExtGState is unknown" + return false; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Graphics + //------------------------------------------------------------------------------------------------------------------------------- + + Graphics::Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, int nPageNumber, Dict *pResorcesDict, double dHorDPI, double dVerDPI, PDFRectangle *pBox, PDFRectangle *pCropBox, int nRotate, bool(*pAbortCheckCallBack)(void *pData), void *pAbortCheckData) + { +#ifdef _DEBUG + std::wstring wsFileName = L"D:\\Output\\PDF Dump\\DumpPDF_Page" + std::to_wstring(nPageNumber) + L".bin"; + NSFile::CFileBinary oFile; + if (!oFile.CreateFileW(wsFileName)) + m_pDumpFile = NULL; + else + m_pDumpFile = oFile.GetFileNative(); +#endif + + m_pGlobalParams = pGlobalParams; + + m_pXref = pXref; + m_bSubPage = false; + + // Resource stack + m_pResources = new GrResources(m_pXref, pResorcesDict, NULL, m_pGlobalParams); + + // Initialize + m_pOut = pOut; + m_pGState = new GrState(dHorDPI, dVerDPI, pBox, nRotate, m_pOut->UpSideDown()); + m_bFontChanged = false; + m_eClip = clipNone; + m_nIgnoreUndef = 0; + m_pOut->StartPage(nPageNumber, m_pGState); + m_pOut->SetDefaultCTM(m_pGState->GetCTM()); + m_pOut->UpdateAll(m_pGState); + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrBaseMatrix[nIndex] = m_pGState->GetCTM()[nIndex]; + } + m_nFormDepth = 0; + m_pAbortCheckCallBack = pAbortCheckCallBack; + m_pAbortCheckData = pAbortCheckData; + + if (pCropBox) + { + m_pGState->MoveTo(pCropBox->m_dLeft, pCropBox->m_dBottom); + m_pGState->LineTo(pCropBox->m_dRight, pCropBox->m_dBottom); + m_pGState->LineTo(pCropBox->m_dRight, pCropBox->m_dTop); + m_pGState->LineTo(pCropBox->m_dLeft, pCropBox->m_dTop); + m_pGState->ClosePath(); + m_pGState->Clip(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + + m_pGState->ClearPath(); + } + } + + Graphics::Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, Dict *pResorcesDict, PDFRectangle *pBox, PDFRectangle *pCropBox, bool(*pAbortCheckCallBack)(void *pData), void *pAbortCheckData) + { +#ifdef _DEBUG + m_pDumpFile = NULL; +#endif + + m_pGlobalParams = pGlobalParams; + + m_pXref = pXref; + m_bSubPage = true; + + // Resource stack + m_pResources = new GrResources(m_pXref, pResorcesDict, NULL, m_pGlobalParams); + + // Initialize + m_pOut = pOut; + m_pGState = new GrState(72, 72, pBox, 0, false); + m_bFontChanged = false; + m_eClip = clipNone; + m_nIgnoreUndef = 0; + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrBaseMatrix[nIndex] = m_pGState->GetCTM()[nIndex]; + } + + m_nFormDepth = 0; + m_pAbortCheckCallBack = pAbortCheckCallBack; + m_pAbortCheckData = pAbortCheckData; + + if (pCropBox) + { + m_pGState->MoveTo(pCropBox->m_dLeft, pCropBox->m_dBottom); + m_pGState->LineTo(pCropBox->m_dRight, pCropBox->m_dBottom); + m_pGState->LineTo(pCropBox->m_dRight, pCropBox->m_dTop); + m_pGState->LineTo(pCropBox->m_dLeft, pCropBox->m_dTop); + m_pGState->ClosePath(); + m_pGState->Clip(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + + m_pGState->ClearPath(); + } + } + + Graphics::~Graphics() + { +#ifdef _DEBUG + + if (m_pDumpFile) + ::fclose(m_pDumpFile); + +#endif + while (m_pGState->HasSaves()) + { + RestoreGState(); + } + if (!m_bSubPage) + { + m_pOut->EndPage(); + } + while (m_pResources) + { + PopResources(); + } + if (m_pGState) + { + delete m_pGState; + } + } + + void Graphics::Display(Object *pObject, bool bTopLevel) + { + if (pObject->IsArray()) + { + for (int nIndex = 0; nIndex < pObject->ArrayGetLength(); ++nIndex) + { + Object oTemp; + pObject->ArrayGet(nIndex, &oTemp); + if (!oTemp.IsStream()) + { + // TO DO: Error "Weird page contents" + oTemp.Free(); + return; + } + oTemp.Free(); + } + } + else if (!pObject->IsStream()) + { + // TO DO: Error "Weird page contents" + return; + } + m_pParser = new Parser(m_pXref, new Lexer(m_pXref, pObject), false); + if (NULL == m_pParser) + return; + StartParse(bTopLevel); + delete m_pParser; + m_pParser = NULL; + } + + void Graphics::StartParse(bool bTopLevel) + { + Object arrArguments[maxArgs]; + int nArgumentsCount = 0; + int nLastAbortCheck = 0; + + m_nUpdateLevel = 0; + + Object oTemp; + m_pParser->GetObject(&oTemp); + while (!oTemp.IsEOF()) + { + if (m_pOut && m_pOut->IsStopped()) + break; + + if (oTemp.IsCommand()) // Если получили команду, тогда выполняем ее + { + // Тут распечатываются посланные команды + +#ifdef _DEBUG + if (m_pDumpFile) + { + oTemp.Print(m_pDumpFile); + for (int nIndex = 0; nIndex < nArgumentsCount; nIndex++) + { + ::fprintf(m_pDumpFile, " "); + arrArguments[nIndex].Print(m_pDumpFile); + } + ::fprintf(m_pDumpFile, "\n"); + ::fflush(m_pDumpFile); + } +#endif + + ExecuteOperator(&oTemp, arrArguments, nArgumentsCount); + oTemp.Free(); + + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + arrArguments[nIndex].Free(); + nArgumentsCount = 0; + + // Производим переодические обновления того что выводим + if (++m_nUpdateLevel >= 20000) + { + m_pOut->Dump(); + m_nUpdateLevel = 0; + } + + // Проверяем отмену + if (m_pAbortCheckCallBack) + { + if (m_nUpdateLevel - nLastAbortCheck > 10) + { + if ((*m_pAbortCheckCallBack)(m_pAbortCheckData)) + { + break; + } + nLastAbortCheck = m_nUpdateLevel; + } + } + } + else if (nArgumentsCount < maxArgs) // Считываем аргумент + { + arrArguments[nArgumentsCount++] = oTemp; + } + else // Аргументов слишком много, значит что-то неправильно + { + // TO DO: Error "Too many args in content stream" +#ifdef _DEBUG + if (m_pDumpFile) + { + ::fprintf(m_pDumpFile, "throwing away arg: "); + oTemp.Print(m_pDumpFile); + ::fprintf(m_pDumpFile, "\n"); + ::fflush(m_pDumpFile); + } +#endif + oTemp.Free(); + } + + // Считываем следующий объект + m_pParser->GetObject(&oTemp); + } + oTemp.Free(); + + // args at end with no command + if (nArgumentsCount > 0) + { + // TO DO: Error "Leftover args in content stream" + +#ifdef _DEBUG + if (m_pDumpFile) + { + ::fprintf(m_pDumpFile, "%d leftovers:", nArgumentsCount); + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + { + ::fprintf(m_pDumpFile, " "); + arrArguments[nIndex].Print(m_pDumpFile); + } + ::fprintf(m_pDumpFile, "\n"); + ::fflush(m_pDumpFile); + } +#endif + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + arrArguments[nIndex].Free(); + } + + if (bTopLevel && m_nUpdateLevel > 0) + { + m_pOut->Dump(); + } + } + + void Graphics::ExecuteOperator(Object *pCommand, Object arrArguments[], int nArgumentsCount) + { + Operator *pOperator = NULL; + // Ищем оператор + char* sName = pCommand->GetCommand(); + + if (!(pOperator = FindOperator(sName))) + { + if (m_nIgnoreUndef == 0) // Проверяем наличие незакрытого оператора BX + { + // TO DO: Error "Unknown operator" + } + return; + } + + // Проверяем количество аргументов + Object *pArguments = arrArguments; + if (pOperator->nArgumentsCount >= 0) + { + if (nArgumentsCount < pOperator->nArgumentsCount) + { + // TO DO: Error "Too few args in operator" + return; + } + if (nArgumentsCount > pOperator->nArgumentsCount) + { + // TO DO: Error "Too many args in operator" + + // Используем последние значения в качесте аргументов + pArguments += nArgumentsCount - pOperator->nArgumentsCount; + nArgumentsCount = pOperator->nArgumentsCount; + } + } + else + { + if (nArgumentsCount > -pOperator->nArgumentsCount) + { + // TO DO: Error "Too many args in operator" + return; + } + } + + // Проверяем типы аргументов + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + { + if (!CheckArgumentType(&pArguments[nIndex], pOperator->arrArguments[nIndex])) + { + // TO DO: Error "Some argument is wrong type" + return; + } + } + + // Выполняем сам оператор + (this->*pOperator->pFunction)(pArguments, nArgumentsCount); + } + Operator *Graphics::FindOperator(char *sName) + { + int nCompareRes = 0; + + int nStart = -1; + int nEnd = OperatorsCount; + // OperatorsTable[nStart] < sName < OperatorsTable[nEnd] + + while (nEnd - nStart > 1) + { + int nMiddle = (nStart + nEnd) / 2; + nCompareRes = strcmp(OperatorsTable[nMiddle].sName, sName); + if (nCompareRes < 0) + nStart = nMiddle; + else if (nCompareRes > 0) + nEnd = nMiddle; + else + nStart = nEnd = nMiddle; + } + if (nCompareRes != 0) + return NULL; + return &OperatorsTable[nStart]; + } + + bool Graphics::CheckArgumentType(Object *pArgument, ArgType eType) + { + switch (eType) + { + case argBool: return pArgument->IsBool(); + case argInt: return pArgument->IsInt(); + case argNum: return pArgument->IsNum(); + case argString: return pArgument->IsString(); + case argName: return pArgument->IsName(); + case argArray: return pArgument->IsArray(); + case argProps: return pArgument->IsDict() || pArgument->IsName(); + case argSCN: return pArgument->IsNum() || pArgument->IsName(); + case argNone: return false; + } + return false; + } + + int Graphics::GetPos() + { + return m_pParser ? m_pParser->GetPos() : -1; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Graphics state + //------------------------------------------------------------------------------------------------------------------------------- + + // q + void Graphics::OperatorSave(Object arrArguments[], int nArgumentsCount) + { + SaveGState(); + } + // Q + void Graphics::OperatorRestore(Object arrArguments[], int nArgumentsCount) + { + RestoreGState(); + } + // cm + void Graphics::OperatorConcat(Object arrArguments[], int nArgumentsCount) + { + m_pGState->ConcatCTM(arrArguments[0].GetNum(), arrArguments[1].GetNum(), arrArguments[2].GetNum(), arrArguments[3].GetNum(), arrArguments[4].GetNum(), arrArguments[5].GetNum()); + m_pOut->UpdateCTM(m_pGState, arrArguments[0].GetNum(), arrArguments[1].GetNum(), arrArguments[2].GetNum(), arrArguments[3].GetNum(), arrArguments[4].GetNum(), arrArguments[5].GetNum()); + m_bFontChanged = true; + } + // d + void Graphics::OperatorSetDash(Object arrArguments[], int nArgumentsCount) + { + double *pDash; + Array *pArray = arrArguments[0].GetArray(); + int nCount = pArray->GetCount(); + if (0 == nCount) + { + pDash = NULL; + } + else + { + pDash = (double *)MemUtilsMallocArray(nCount, sizeof(double)); + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + Object oTemp; + pDash[nIndex] = pArray->Get(nIndex, &oTemp)->GetNum(); + oTemp.Free(); + } + } + m_pGState->SetLineDash(pDash, nCount, arrArguments[1].GetNum()); + m_pOut->UpdateLineDash(m_pGState); + } + // i + void Graphics::OperatorSetFlat(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetFlatness((int)arrArguments[0].GetNum()); + m_pOut->UpdateFlatness(m_pGState); + } + // j + void Graphics::OperatorSetLineJoin(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetLineJoin(arrArguments[0].GetInt()); + m_pOut->UpdateLineJoin(m_pGState); + } + // J + void Graphics::OperatorSetLineCap(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetLineCap(arrArguments[0].GetInt()); + m_pOut->UpdateLineCap(m_pGState); + } + // M + void Graphics::OperatorSetMiterLimit(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetMiterLimit(arrArguments[0].GetNum()); + m_pOut->UpdateMiterLimit(m_pGState); + } + // w + void Graphics::OperatorSetLineWidth(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetLineWidth(arrArguments[0].GetNum()); + m_pOut->UpdateLineWidth(m_pGState); + } + // ri + void Graphics::OperatorSetRenderingIntent(Object arrArguments[], int nArgumentsCount) + { + } + // gs + void Graphics::OperatorSetExtGState(Object arrArguments[], int nArgumentsCount) + { + Object oDict; + if (!m_pResources->LookupExtGState(arrArguments[0].GetName(), &oDict)) + { + return; + } + if (!oDict.IsDict()) + { + // TO DO: Error "ExtGState is wrong type" + oDict.Free(); + return; + } + + // Прозрачность + Object oDictItem; + // BM (blend mode) + if (!oDict.DictLookup("BM", &oDictItem)->IsNull()) + { + GraphicsBlendMode eMode; + if (m_pGState->ParseBlendMode(&oDictItem, &eMode)) + { + m_pGState->SetBlendMode(eMode); + m_pOut->UpdateBlendMode(m_pGState); + } + else + { + // TO DO: Error "Invalid blend mode in ExtGState" + } + } + oDictItem.Free(); + + // ca (current alpha for filling) + if (oDict.DictLookup("ca", &oDictItem)->IsNum()) + { + m_pGState->SetFillOpacity(oDictItem.GetNum()); + m_pOut->UpdateFillOpacity(m_pGState); + } + oDictItem.Free(); + + // CA (current alpha for stroking) + if (oDict.DictLookup("CA", &oDictItem)->IsNum()) + { + m_pGState->SetStrokeOpacity(oDictItem.GetNum()); + m_pOut->UpdateStrokeOpacity(m_pGState); + } + oDictItem.Free(); + + // op (over print for filling) + bool bHaveFillOP; + if ((bHaveFillOP = (oDict.DictLookup("op", &oDictItem)->IsBool()))) + { + m_pGState->SetFillOverprint(oDictItem.GetBool()); + m_pOut->UpdateFillOverprint(m_pGState); + } + oDictItem.Free(); + + // OP (over print for stroking) + if (oDict.DictLookup("OP", &oDictItem)->IsBool()) + { + m_pGState->SetStrokeOverprint(oDictItem.GetBool()); + m_pOut->UpdateStrokeOverprint(m_pGState); + if (!bHaveFillOP) + { + m_pGState->SetFillOverprint(oDictItem.GetBool()); + m_pOut->UpdateFillOverprint(m_pGState); + } + } + oDictItem.Free(); + + // SA (stroke adjustment) + if (oDict.DictLookup("SA", &oDictItem)->IsBool()) + { + m_pGState->SetStrokeAdjust(oDictItem.GetBool()); + m_pOut->UpdateStrokeAdjust(m_pGState); + } + oDictItem.Free(); + + // TR2/TR (transfer function) + // приоритетной является TR2 + Function *ppFunctions[4]; + if (oDict.DictLookup("TR2", &oDictItem)->IsNull()) + { + oDictItem.Free(); + oDict.DictLookup("TR", &oDictItem); + } + if (oDictItem.IsName("Default") || oDictItem.IsName("Identity")) + { + ppFunctions[0] = ppFunctions[1] = ppFunctions[2] = ppFunctions[3] = NULL; + m_pGState->SetTransfer(ppFunctions); + m_pOut->UpdateTransfer(m_pGState); + } + else if (oDictItem.IsArray() && oDictItem.ArrayGetLength() == 4) + { + int nIndex = 0; + for (nIndex = 0; nIndex < 4; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + ppFunctions[nIndex] = Function::Parse(&oTemp); + oTemp.Free(); + if (!ppFunctions[nIndex]) + { + break; + } + } + if (4 == nIndex) // нормально ли все функции прочитались + { + m_pGState->SetTransfer(ppFunctions); + m_pOut->UpdateTransfer(m_pGState); + } + } + else if (oDictItem.IsName() || oDictItem.IsDict() || oDictItem.IsStream()) + { + if ((ppFunctions[0] = Function::Parse(&oDictItem))) + { + ppFunctions[1] = ppFunctions[2] = ppFunctions[3] = NULL; + m_pGState->SetTransfer(ppFunctions); + m_pOut->UpdateTransfer(m_pGState); + } + } + else if (!oDictItem.IsNull()) + { + // TO DO: Error "Invalid transfer function in ExtGState" + } + oDictItem.Free(); + + // SMask (soft mask) + if (!oDict.DictLookup("SMask", &oDictItem)->IsNull()) + { + if (oDictItem.IsName("None")) + { + m_pOut->ClearSoftMask(m_pGState); + } + else if (oDictItem.IsDict()) + { + Object oTemp; + bool bAlpha = false; + if (oDictItem.DictLookup("S", &oTemp)->IsName("Alpha")) + { + bAlpha = true; + } + else // "Luminosity" + { + bAlpha = false; + } + oTemp.Free(); + + ppFunctions[0] = NULL; + if (!oDictItem.DictLookup("TR", &oTemp)->IsNull()) + { + ppFunctions[0] = Function::Parse(&oTemp); + if (ppFunctions[0]->GetInputSize() != 1 || ppFunctions[0]->GetOutputSize() != 1) + { + // TO DO: Error "Invalid transfer function in soft mask in ExtGState" + if (ppFunctions[0]) + delete ppFunctions[0]; + ppFunctions[0] = NULL; + } + } + oTemp.Free(); + + bool bHaveBackDropColor = false; + GrColor oBackDropColor; + if ((bHaveBackDropColor = oDictItem.DictLookup("BC", &oTemp)->IsArray())) + { + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + oBackDropColor.arrComp[nIndex] = 0; + } + for (int nIndex = 0; nIndex < oTemp.ArrayGetLength() && nIndex < GrColorMaxComps; ++nIndex) + { + Object oArrayItem; + oTemp.ArrayGet(nIndex, &oArrayItem); + if (oArrayItem.IsNum()) + { + oBackDropColor.arrComp[nIndex] = DoubleToColor(oArrayItem.GetNum()); + } + oArrayItem.Free(); + } + } + oTemp.Free(); + + if (oDictItem.DictLookup("G", &oTemp)->IsStream()) + { + Object oDict2; + if (oTemp.StreamGetDict()->Search("Group", &oDict2)->IsDict()) + { + GrColorSpace *pBlendingColorSpace = NULL; + bool bIsolated = false, bKnockout = false; + Object oTemp2; + if (!oDict2.DictLookup("CS", &oTemp2)->IsNull()) + { + pBlendingColorSpace = GrColorSpace::Parse(&oTemp2); + } + oTemp2.Free(); + if (oDict2.DictLookup("I", &oTemp2)->IsBool()) + { + bIsolated = oTemp2.GetBool(); + } + oTemp2.Free(); + if (oDict2.DictLookup("K", &oTemp2)->IsBool()) + { + bKnockout = oTemp2.GetBool(); + } + oTemp2.Free(); + if (!bHaveBackDropColor) + { + if (pBlendingColorSpace) + { + pBlendingColorSpace->GetDefaultColor(&oBackDropColor); + } + else + { + for (int nIndex = 0; nIndex < GrColorMaxComps; ++nIndex) + { + oBackDropColor.arrComp[nIndex] = 0; + } + } + } + MakeSoftMask(&oTemp, bAlpha, pBlendingColorSpace, bIsolated, bKnockout, ppFunctions[0], &oBackDropColor); + if (ppFunctions[0]) + { + delete ppFunctions[0]; + } + } + else + { + // TO DO: Error "Invalid soft mask in ExtGState - missing group" + } + oDict2.Free(); + } + else + { + // TO DO: Error "Invalid soft mask in ExtGState - missing group" + } + oTemp.Free(); + } + else if (!oDictItem.IsNull()) + { + // TO DO: Error "Invalid soft mask in ExtGState" + } + } + oDictItem.Free(); + oDict.Free(); + } + + //------------------------------------------------------------------------------------------------------------------------------- + void Graphics::MakeSoftMask(Object *pStream, bool bAlpha, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, Function *pTransferFunction, GrColor *pBackDropColor) + { + // Проверяем на чрезмерную рекурсию + if (m_nFormDepth > 20) + { + return; + } + + Dict *pDict = pStream->StreamGetDict(); + + // Form type + Object oDictItem; + pDict->Search("FormType", &oDictItem); + if (!(oDictItem.IsNull() || (oDictItem.IsInt() && oDictItem.GetInt() == 1))) + { + // TO DO: Error "Unknown form type" + } + oDictItem.Free(); + + // BBox + pDict->Search("BBox", &oDictItem); + if (!oDictItem.IsArray()) + { + oDictItem.Free(); + // TO DO: Error "Bad form bounding box" + return; + } + double arrBBox[4]; + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + arrBBox[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + oDictItem.Free(); + + // Matrix + double arrMatrix[6]; + pDict->Search("Matrix", &oDictItem); + if (oDictItem.IsArray()) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + Object oTemp; + oDictItem.ArrayGet(nIndex, &oTemp); + arrMatrix[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + arrMatrix[0] = 1; arrMatrix[1] = 0; + arrMatrix[2] = 0; arrMatrix[3] = 1; + arrMatrix[4] = 0; arrMatrix[5] = 0; + } + oDictItem.Free(); + + // Resources + pDict->Search("Resources", &oDictItem); + Dict *pResourcesDict = (oDictItem.IsDict() ? oDictItem.GetDict() : (Dict *)NULL); + + // Рисуем + ++m_nFormDepth; + DoForm(pStream, pResourcesDict, arrMatrix, arrBBox, true, true, pBlendingColorSpace, bIsolated, bKnockout, bAlpha, pTransferFunction, pBackDropColor); + --m_nFormDepth; + + if (pBlendingColorSpace) + { + delete pBlendingColorSpace; + } + oDictItem.Free(); + } + //------------------------------------------------------------------------------------------------------------------------------- + // Color and Color spaces + //------------------------------------------------------------------------------------------------------------------------------- + + // g + void Graphics::OperatorSetFillGray(Object arrArguments[], int nArgumentsCount) + { + GrColor oColor; + + m_pGState->SetFillPattern(NULL); + m_pGState->SetFillColorSpace(new GrDeviceGrayColorSpace()); + m_pOut->UpdateFillColorSpace(m_pGState); + oColor.arrComp[0] = DoubleToColor(arrArguments[0].GetNum()); + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + + // G + void Graphics::OperatorSetStrokeGray(Object arrArguments[], int nArgumentsCount) + { + GrColor oColor; + + m_pGState->SetStrokePattern(NULL); + m_pGState->SetStrokeColorSpace(new GrDeviceGrayColorSpace()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + oColor.arrComp[0] = DoubleToColor(arrArguments[0].GetNum()); + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + + // k + void Graphics::OperatorSetFillCMYKColor(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetFillPattern(NULL); + m_pGState->SetFillColorSpace(new GrDeviceCMYKColorSpace()); + m_pOut->UpdateFillColorSpace(m_pGState); + + GrColor oColor; + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + + // K + void Graphics::OperatorSetStrokeCMYKColor(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetStrokePattern(NULL); + m_pGState->SetStrokeColorSpace(new GrDeviceCMYKColorSpace()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + + GrColor oColor; + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + + // rg + void Graphics::OperatorSetFillRGBColor(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetFillPattern(NULL); + m_pGState->SetFillColorSpace(new GrDeviceRGBColorSpace()); + m_pOut->UpdateFillColorSpace(m_pGState); + + GrColor oColor; + for (int nIndex = 0; nIndex < 3; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + + // RG + void Graphics::OperatorSetStrokeRGBColor(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetStrokePattern(NULL); + m_pGState->SetStrokeColorSpace(new GrDeviceRGBColorSpace()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + + GrColor oColor; + for (int nIndex = 0; nIndex < 3; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + + // cs + void Graphics::OperatorSetFillColorSpace(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetFillPattern(NULL); + Object oTemp; + m_pResources->LookupColorSpace(arrArguments[0].GetName(), &oTemp); + GrColorSpace *pColorSpace = NULL; + if (oTemp.IsNull()) + { + pColorSpace = GrColorSpace::Parse(&arrArguments[0]); + } + else + { + pColorSpace = GrColorSpace::Parse(&oTemp); + } + oTemp.Free(); + + if (pColorSpace) + { + m_pGState->SetFillColorSpace(pColorSpace); + m_pOut->UpdateFillColorSpace(m_pGState); + GrColor oColor; + pColorSpace->GetDefaultColor(&oColor); + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + else + { + // TO DO: Error "Bad color space (fill)" + } + } + + // CS + void Graphics::OperatorSetStrokeColorSpace(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetStrokePattern(NULL); + Object oTemp; + m_pResources->LookupColorSpace(arrArguments[0].GetName(), &oTemp); + GrColorSpace *pColorSpace = NULL; + if (oTemp.IsNull()) + { + pColorSpace = GrColorSpace::Parse(&arrArguments[0]); + } + else + { + pColorSpace = GrColorSpace::Parse(&oTemp); + } + oTemp.Free(); + + if (pColorSpace) + { + m_pGState->SetStrokeColorSpace(pColorSpace); + m_pOut->UpdateStrokeColorSpace(m_pGState); + GrColor oColor; + pColorSpace->GetDefaultColor(&oColor); + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + else + { + // TO DO: Error "Bad color space (stroke)" + } + } + + // sc + void Graphics::OperatorSetFillColor(Object arrArguments[], int nArgumentsCount) + { + if (nArgumentsCount != m_pGState->GetFillColorSpace()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'sc' command" + return; + } + m_pGState->SetFillPattern(NULL); + + GrColor oColor; + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + + // SC + void Graphics::OperatorSetStrokeColor(Object arrArguments[], int nArgumentsCount) + { + if (nArgumentsCount != m_pGState->GetStrokeColorSpace()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'SC' command" + return; + } + m_pGState->SetStrokePattern(NULL); + + GrColor oColor; + for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + + // scn + void Graphics::OperatorSetFillColorN(Object arrArguments[], int nArgumentsCount) + { + GrPattern *pPattern = NULL; + GrColor oColor; + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + if (nArgumentsCount > 1) + { + if (!((GrPatternColorSpace *)m_pGState->GetFillColorSpace())->GetUnder() || nArgumentsCount - 1 != ((GrPatternColorSpace *)m_pGState->GetFillColorSpace())->GetUnder()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'scn' command" + return; + } + for (int nIndex = 0; nIndex < nArgumentsCount - 1 && nIndex < GrColorMaxComps; ++nIndex) + { + if (arrArguments[nIndex].IsNum()) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + } + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + if (arrArguments[nArgumentsCount - 1].IsName() && (pPattern = m_pResources->LookupPattern(arrArguments[nArgumentsCount - 1].GetName()))) + { + m_pGState->SetFillPattern(pPattern); + } + } + else + { + if (nArgumentsCount != m_pGState->GetFillColorSpace()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'scn' command" + return; + } + m_pGState->SetFillPattern(NULL); + for (int nIndex = 0; nIndex < nArgumentsCount && nIndex < GrColorMaxComps; ++nIndex) + { + if (arrArguments[nIndex].IsNum()) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + } + m_pGState->SetFillColor(&oColor); + m_pOut->UpdateFillColor(m_pGState); + } + } + + // SCN + void Graphics::OperatorSetStrokeColorN(Object arrArguments[], int nArgumentsCount) + { + GrPattern *pPattern = NULL; + GrColor oColor; + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + if (nArgumentsCount > 1) + { + if (!((GrPatternColorSpace *)m_pGState->GetStrokeColorSpace())->GetUnder() || nArgumentsCount - 1 != ((GrPatternColorSpace *)m_pGState->GetStrokeColorSpace())->GetUnder()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'SCN' command" + return; + } + for (int nIndex = 0; nIndex < nArgumentsCount - 1 && nIndex < GrColorMaxComps; ++nIndex) + { + if (arrArguments[nIndex].IsNum()) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + } + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + if (arrArguments[nArgumentsCount - 1].IsName() && (pPattern = m_pResources->LookupPattern(arrArguments[nArgumentsCount - 1].GetName()))) + { + m_pGState->SetStrokePattern(pPattern); + } + } + else + { + if (nArgumentsCount != m_pGState->GetStrokeColorSpace()->GetComponentsCount()) + { + // TO DO: Error "Incorrect number of arguments in 'SCN' command" + return; + } + m_pGState->SetStrokePattern(NULL); + for (int nIndex = 0; nIndex < nArgumentsCount && nIndex < GrColorMaxComps; ++nIndex) + { + if (arrArguments[nIndex].IsNum()) + { + oColor.arrComp[nIndex] = DoubleToColor(arrArguments[nIndex].GetNum()); + } + } + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Path construction + //------------------------------------------------------------------------------------------------------------------------------- + + // m + void Graphics::OperatorMoveTo(Object arrArguments[], int nArgumentsCount) + { + m_pGState->MoveTo(arrArguments[0].GetNum(), arrArguments[1].GetNum()); + } + + // l + void Graphics::OperatorLineTo(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No current point in lineto" + return; + } + m_pGState->LineTo(arrArguments[0].GetNum(), arrArguments[1].GetNum()); + } + + // c + void Graphics::OperatorCurveTo(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No current point in curveto" + return; + } + m_pGState->CurveTo((double)arrArguments[0].GetNum(), (double)arrArguments[1].GetNum(), (double)arrArguments[2].GetNum(), (double)arrArguments[3].GetNum(), (double)arrArguments[4].GetNum(), (double)arrArguments[5].GetNum()); + } + + // v + void Graphics::OperatorCurveTo1(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No current point in curveto1" + return; + } + m_pGState->CurveTo(m_pGState->GetCurX(), m_pGState->GetCurY(), (double)arrArguments[0].GetNum(), (double)arrArguments[1].GetNum(), (double)arrArguments[2].GetNum(), (double)arrArguments[3].GetNum()); + } + + // y + void Graphics::OperatorCurveTo2(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No current point in curveto2" + return; + } + m_pGState->CurveTo((double)arrArguments[0].GetNum(), (double)arrArguments[1].GetNum(), (double)arrArguments[2].GetNum(), (double)arrArguments[3].GetNum(), (double)arrArguments[2].GetNum(), (double)arrArguments[3].GetNum()); + } + + // re + void Graphics::OperatorRectangle(Object arrArguments[], int nArgumentsCount) + { + double dX = arrArguments[0].GetNum(); + double dY = arrArguments[1].GetNum(); + double dWidth = arrArguments[2].GetNum(); + double dHeight = arrArguments[3].GetNum(); + m_pGState->MoveTo(dX, dY); + m_pGState->LineTo(dX + dWidth, dY); + m_pGState->LineTo(dX + dWidth, dY + dHeight); + m_pGState->LineTo(dX, dY + dHeight); + m_pGState->ClosePath(); + } + + // h + void Graphics::OperatorClosePath(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No current point in closepath" + return; + } + m_pGState->ClosePath(); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // path painting operators + //------------------------------------------------------------------------------------------------------------------------------- + + // n + void Graphics::OperatorEndPath(Object arrArguments[], int nArgumentsCount) + { + DoEndPath(); + } + + // S + void Graphics::OperatorStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + DoEndPath(); + } + + // s + void Graphics::OperatorCloseStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in closepath/stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + m_pGState->ClosePath(); + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + DoEndPath(); + } + + // f/F + void Graphics::OperatorFill(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in fill" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(false); + } + else + { + m_pOut->Fill(m_pGState); + } + } + DoEndPath(); + } + + // f* + void Graphics::OperatorEOFill(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in eofill" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(true); + } + else + { + m_pOut->EoFill(m_pGState); + } + } + DoEndPath(); + } + + // B + void Graphics::OperatorFillStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in fill/stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + if (!(m_pGState->GetFillColorSpace()->GetMode() == csPattern) && !(m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) && m_pOut->UseFillAndStroke()) + { + m_pOut->FillStroke(m_pGState); + } + else + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(false); + } + else + { + m_pOut->Fill(m_pGState); + } + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + } + DoEndPath(); + } + + // b + void Graphics::OperatorCloseFillStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in closepath/fill/stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + m_pGState->ClosePath(); + + if (!(m_pGState->GetFillColorSpace()->GetMode() == csPattern) && !(m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) && m_pOut->UseFillAndStroke()) + { + m_pOut->FillStroke(m_pGState); + } + else + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(false); + } + else + { + m_pOut->Fill(m_pGState); + } + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + } + DoEndPath(); + } + + // B* + void Graphics::OperatorEOFillStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in eofill/stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + if (!(m_pGState->GetFillColorSpace()->GetMode() == csPattern) && !(m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) && m_pOut->UseFillAndStroke()) + { + m_pOut->EoFillStroke(m_pGState); + } + else + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(true); + } + else + { + m_pOut->EoFill(m_pGState); + } + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + } + DoEndPath(); + } + + // b* + void Graphics::OperatorCloseEOFillStroke(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->IsCurPoint()) + { + // TO DO: Error "No path in closepath/eofill/stroke" + return; + } + if (m_pGState->IsPathNonEmpty()) + { + m_pGState->ClosePath(); + if (!(m_pGState->GetFillColorSpace()->GetMode() == csPattern) && !(m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) && m_pOut->UseFillAndStroke()) + { + m_pOut->EoFillStroke(m_pGState); + } + else + { + if (m_pGState->GetFillColorSpace()->GetMode() == csPattern) + { + DoPatternFill(true); + } + else + { + m_pOut->EoFill(m_pGState); + } + if (m_pGState->GetStrokeColorSpace()->GetMode() == csPattern) + { + DoPatternStroke(); + } + else + { + m_pOut->Stroke(m_pGState); + } + } + } + DoEndPath(); + } + + // sh + void Graphics::OperatorShadingFill(Object arrArguments[], int nArgumentsCount) + { + GrShading *pShading = NULL; + + if (!(pShading = m_pResources->LookupShading(arrArguments[0].GetName()))) + { + return; + } + + // Сохраняем текущий GState + GrPath *pSavedPath = m_pGState->GetPath()->Copy(); + SaveGState(); + + if (pShading->GetHasBBox()) + { + double dXMin, dYMin, dXMax, dYMax; + pShading->GetBBox(&dXMin, &dYMin, &dXMax, &dYMax); + m_pGState->MoveTo(dXMin, dYMin); + m_pGState->LineTo(dXMax, dYMin); + m_pGState->LineTo(dXMax, dYMax); + m_pGState->LineTo(dXMin, dYMax); + m_pGState->ClosePath(); + m_pGState->Clip(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + + m_pGState->ClearPath(); + } + + // Устанавливаем цветовое пространство + m_pGState->SetFillColorSpace(pShading->GetColorSpace()->Copy()); + m_pOut->UpdateFillColorSpace(m_pGState); + + bool bAntialias = m_pOut->GetVectorAntialias(); + if (bAntialias) + { + m_pOut->SetVectorAntialias(false); + } + + m_pOut->StartShadedFill(m_pGState); + + // Выполняем закраску, в зависимости от типа Shading + switch (pShading->GetType()) + { + case 1: + DoFunctionShadingFill((GrFunctionShading *)pShading); + break; + case 2: + DoAxialShadingFill((GrAxialShading *)pShading); + break; + case 3: + DoRadialShadingFill((GrRadialShading *)pShading); + break; + case 4: + case 5: + DoGouraudTriangleShadingFill((GrGouraudTriangleShading *)pShading); + break; + case 6: + case 7: + DoPatchMeshShadingFill((GrPatchMeshShading *)pShading); + break; + } + + m_pOut->EndShadedFill(); + + if (bAntialias) + { + m_pOut->SetVectorAntialias(true); + } + + // Восстанавливаем GState + RestoreGState(); + m_pGState->SetPath(pSavedPath); + + delete pShading; + } + + //------------------------------------------------------------------------------------------------------------------------------- + void Graphics::DoPatternFill(bool bEOFill) + { + // Пропускаем объект Patterns, если мы выводим только текст из PDF + if (!m_pOut->NeedNonText()) + { + return; + } + + GrPattern *pPattern = NULL; + if (!(pPattern = m_pGState->GetFillPattern())) + { + return; + } + switch (pPattern->GetType()) + { + case 1: + DoTilingPatternFill((GrTilingPattern *)pPattern, false, bEOFill); + break; + case 2: + DoShadingPatternFill((GrShadingPattern *)pPattern, false, bEOFill); + break; + default: + // TO DO: Error "Unimplemented pattern type in fill" + break; + } + } + + void Graphics::DoPatternStroke() + { + // Пропускаем объект Patterns, если мы выводим только текст из PDF + if (!m_pOut->NeedNonText()) + { + return; + } + + GrPattern *pPattern = NULL; + if (!(pPattern = m_pGState->GetStrokePattern())) + { + return; + } + switch (pPattern->GetType()) + { + case 1: + DoTilingPatternFill((GrTilingPattern *)pPattern, true, false); + break; + case 2: + DoShadingPatternFill((GrShadingPattern *)pPattern, true, false); + break; + default: + // TO DO: Error "Unimplemented pattern type in stroke" + break; + } + } + + void Graphics::DoTilingPatternFill(GrTilingPattern *pPattern, bool bStroke, bool bEOFill) + { + // Color space + GrPatternColorSpace *pPatternCS = (GrPatternColorSpace *)(bStroke ? m_pGState->GetStrokeColorSpace() : m_pGState->GetFillColorSpace()); + + // Строим матрицу преобразования (Pattern space) -> (Current space) + double *pCTM = m_pGState->GetCTM(); + double *pBaseMatrix = m_arrBaseMatrix; + double *pTilingMatrix = pPattern->GetMatrix(); + double dDet = 1 / (pCTM[0] * pCTM[3] - pCTM[1] * pCTM[2]); + // InvCTM = (CTM)^(-1) + double pInvCTM[6]; + pInvCTM[0] = pCTM[3] * dDet; + pInvCTM[1] = -pCTM[1] * dDet; + pInvCTM[2] = -pCTM[2] * dDet; + pInvCTM[3] = pCTM[0] * dDet; + pInvCTM[4] = (pCTM[2] * pCTM[5] - pCTM[3] * pCTM[4]) * dDet; + pInvCTM[5] = (pCTM[1] * pCTM[4] - pCTM[0] * pCTM[5]) * dDet; + // TempMatrix = TilingMatrix * BaseMatrix + double pTempMatrix[6]; + pTempMatrix[0] = pTilingMatrix[0] * pBaseMatrix[0] + pTilingMatrix[1] * pBaseMatrix[2]; + pTempMatrix[1] = pTilingMatrix[0] * pBaseMatrix[1] + pTilingMatrix[1] * pBaseMatrix[3]; + pTempMatrix[2] = pTilingMatrix[2] * pBaseMatrix[0] + pTilingMatrix[3] * pBaseMatrix[2]; + pTempMatrix[3] = pTilingMatrix[2] * pBaseMatrix[1] + pTilingMatrix[3] * pBaseMatrix[3]; + pTempMatrix[4] = pTilingMatrix[4] * pBaseMatrix[0] + pTilingMatrix[5] * pBaseMatrix[2] + pBaseMatrix[4]; + pTempMatrix[5] = pTilingMatrix[4] * pBaseMatrix[1] + pTilingMatrix[5] * pBaseMatrix[3] + pBaseMatrix[5]; + // Matrix = TempMatrix * InvCTM + double pMatrix[6]; + pMatrix[0] = pTempMatrix[0] * pInvCTM[0] + pTempMatrix[1] * pInvCTM[2]; + pMatrix[1] = pTempMatrix[0] * pInvCTM[1] + pTempMatrix[1] * pInvCTM[3]; + pMatrix[2] = pTempMatrix[2] * pInvCTM[0] + pTempMatrix[3] * pInvCTM[2]; + pMatrix[3] = pTempMatrix[2] * pInvCTM[1] + pTempMatrix[3] * pInvCTM[3]; + pMatrix[4] = pTempMatrix[4] * pInvCTM[0] + pTempMatrix[5] * pInvCTM[2] + pInvCTM[4]; + pMatrix[5] = pTempMatrix[4] * pInvCTM[1] + pTempMatrix[5] * pInvCTM[3] + pInvCTM[5]; + + // Строим матрицу преобразования (Device space) -> (Pattern space) + double pInvTemp[6]; + dDet = 1 / (pTempMatrix[0] * pTempMatrix[3] - pTempMatrix[1] * pTempMatrix[2]); + pInvTemp[0] = pTempMatrix[3] * dDet; + pInvTemp[1] = -pTempMatrix[1] * dDet; + pInvTemp[2] = -pTempMatrix[2] * dDet; + pInvTemp[3] = pTempMatrix[0] * dDet; + pInvTemp[4] = (pTempMatrix[2] * pTempMatrix[5] - pTempMatrix[3] * pTempMatrix[4]) * dDet; + pInvTemp[5] = (pTempMatrix[1] * pTempMatrix[4] - pTempMatrix[0] * pTempMatrix[5]) * dDet; + + // Сохраняем текущий GState + GrPath *pSavedPath = m_pGState->GetPath()->Copy(); + SaveGState(); + + // Устанавливаем цветовое пространство для подкладки (для не цветовых Tiling patterns); + // Устанавливаем разлиные параметры (цвет обводки, толщина линии) + GrColorSpace *pColorSpace = NULL; + if (pPattern->GetPaintType() == 2 && (pColorSpace = pPatternCS->GetUnder())) + { + m_pGState->SetFillColorSpace(pColorSpace->Copy()); + m_pOut->UpdateFillColorSpace(m_pGState); + m_pGState->SetStrokeColorSpace(pColorSpace->Copy()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + m_pGState->SetStrokeColor(m_pGState->GetFillColor()); + } + else + { + m_pGState->SetFillColorSpace(new GrDeviceGrayColorSpace()); + m_pOut->UpdateFillColorSpace(m_pGState); + m_pGState->SetStrokeColorSpace(new GrDeviceGrayColorSpace()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + } + m_pGState->SetFillPattern(NULL); + m_pOut->UpdateFillColor(m_pGState); + m_pGState->SetStrokePattern(NULL); + m_pOut->UpdateStrokeColor(m_pGState); + if (!bStroke) + { + m_pGState->SetLineWidth(0); + m_pOut->UpdateLineWidth(m_pGState); + } + + if (bStroke) + { + m_pGState->ClipToStrokePath(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->ClipToStrokePath(m_pGState); + } + else + { + m_pGState->Clip(); + if (bEOFill) + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), true); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), true); + else + m_pOut->EoClip(m_pGState); + } + else + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + } + } + m_pGState->ClearPath(); + + double dClipXMin, dClipYMin, dClipXMax, dClipYMax; + m_pGState->GetClipBBox(&dClipXMin, &dClipYMin, &dClipXMax, &dClipYMax); + if (dClipXMin > dClipXMax || dClipYMin > dClipYMax) + { + RestoreGState(); + m_pGState->SetPath(pSavedPath); + return; + } + + double dXMin, dYMin, dXMax, dYMax; + dXMin = dXMax = dClipXMin * pInvTemp[0] + dClipYMin * pInvTemp[2] + pInvTemp[4]; + dYMin = dYMax = dClipXMin * pInvTemp[1] + dClipYMin * pInvTemp[3] + pInvTemp[5]; + double dTempX = dClipXMin * pInvTemp[0] + dClipYMax * pInvTemp[2] + pInvTemp[4]; + double dTempY = dClipXMin * pInvTemp[1] + dClipYMax * pInvTemp[3] + pInvTemp[5]; + if (dTempX < dXMin) + { + dXMin = dTempX; + } + else if (dTempX > dXMax) + { + dXMax = dTempX; + } + if (dTempY < dYMin) + { + dYMin = dTempY; + } + else if (dTempY > dYMax) + { + dYMax = dTempY; + } + dTempX = dClipXMax * pInvTemp[0] + dClipYMin * pInvTemp[2] + pInvTemp[4]; + dTempY = dClipXMax * pInvTemp[1] + dClipYMin * pInvTemp[3] + pInvTemp[5]; + if (dTempX < dXMin) + { + dXMin = dTempX; + } + else if (dTempX > dXMax) + { + dXMax = dTempX; + } + if (dTempY < dYMin) + { + dYMin = dTempY; + } + else if (dTempY > dYMax) + { + dYMax = dTempY; + } + dTempX = dClipXMax * pInvTemp[0] + dClipYMax * pInvTemp[2] + pInvTemp[4]; + dTempY = dClipXMax * pInvTemp[1] + dClipYMax * pInvTemp[3] + pInvTemp[5]; + if (dTempX < dXMin) + { + dXMin = dTempX; + } + else if (dTempX > dXMax) + { + dXMax = dTempX; + } + if (dTempY < dYMin) + { + dYMin = dTempY; + } + else if (dTempY > dYMax) + { + dYMax = dTempY; + } + + double dStepX = fabs(pPattern->GetXStep()); + double dStepY = fabs(pPattern->GetYStep()); + int nX0 = (int)ceil((dXMin - pPattern->GetBBox()[2]) / dStepX); + int nX1 = (int)floor((dXMax - pPattern->GetBBox()[0]) / dStepX) + 1; + int nY0 = (int)ceil((dYMin - pPattern->GetBBox()[3]) / dStepY); + int nY1 = (int)floor((dYMax - pPattern->GetBBox()[1]) / dStepY) + 1; + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + pTempMatrix[nIndex] = pMatrix[nIndex]; + } + + m_pOut->StartTilingFill(m_pGState); + if (m_pOut->UseTilingPatternFill()) + { + pTempMatrix[4] = pMatrix[4]; + pTempMatrix[5] = pMatrix[5]; + m_pOut->TilingPatternFill(m_pGState, pPattern->GetContentStream(), pPattern->GetPaintType(), pPattern->GetResourcesDict(), pTempMatrix, pPattern->GetBBox(), nX0, nY0, nX1, nY1, dStepX, dStepY); + } + else + { + if (m_pOut->UseSimpleTilingPatternFill()) + { + m_pOut->StartSimpleTilingFill(m_pGState, nX0, nY0, nX1, nY1, dStepX, dStepY, dXMin, dYMin, dXMax, dYMax, pTempMatrix); + + for (int nY = nY0; nY < nY1; ++nY) + { + for (int nX = nX0; nX < nX1; ++nX) + { + double dX = nX * dStepX; + double dY = nY * dStepY; + pTempMatrix[4] = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4]; + pTempMatrix[5] = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5]; + DoForm(pPattern->GetContentStream(), pPattern->GetResourcesDict(), pTempMatrix, pPattern->GetBBox()); + } + } + + m_pOut->EndSimpleTilingFill(); + } + else + { + for (int nY = nY0; nY < nY1; ++nY) + { + for (int nX = nX0; nX < nX1; ++nX) + { + if (m_pOut->IsStopped()) + { + // Восстанавливаем GState + RestoreGState(); + m_pGState->SetPath(pSavedPath); + return; + } + + m_pOut->StartTilingFillIteration(); + + double dX = nX * dStepX; + double dY = nY * dStepY; + pTempMatrix[4] = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4]; + pTempMatrix[5] = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5]; + DoForm(pPattern->GetContentStream(), pPattern->GetResourcesDict(), pTempMatrix, pPattern->GetBBox()); + + m_pOut->EndTilingFillIteration(); + } + } + } + } + + m_pOut->EndTilingFill(); + + // Восстанавливаем GState + RestoreGState(); + m_pGState->SetPath(pSavedPath); + } + + void Graphics::DoShadingPatternFill(GrShadingPattern *pPattern, bool bStroke, bool bEOFill) + { + GrShading *pShading = pPattern->GetShading(); + + // Сохраняем текущий GState + GrPath *pSavedPath = m_pGState->GetPath()->Copy(); + SaveGState(); + + if (pShading->GetHasBBox()) + { + double dXMin, dYMin, dXMax, dYMax; + pShading->GetBBox(&dXMin, &dYMin, &dXMax, &dYMax); + m_pGState->MoveTo(dXMin, dYMin); + m_pGState->LineTo(dXMax, dYMin); + m_pGState->LineTo(dXMax, dYMax); + m_pGState->LineTo(dXMin, dYMax); + m_pGState->ClosePath(); + m_pGState->Clip(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + + m_pGState->SetPath(pSavedPath->Copy()); + } + + if (bStroke) + { + m_pGState->ClipToStrokePath(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->ClipToStrokePath(m_pGState); + } + else + { + m_pGState->Clip(); + if (bEOFill) + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), true); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), true); + else + m_pOut->EoClip(m_pGState); + } + else + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + } + } + + // Устанавливаем цветовое пространство + m_pGState->SetFillColorSpace(pShading->GetColorSpace()->Copy()); + m_pOut->UpdateFillColorSpace(m_pGState); + + // Задний фон + if (pShading->GetHasBackground()) + { + m_pGState->SetFillColor(pShading->GetBackground()); + m_pOut->UpdateFillColor(m_pGState); + m_pOut->Fill(m_pGState); + } + m_pGState->ClearPath(); + + // Строим матрицу преобразования (Pattern space) -> (Current space) + double *pCTM = m_pGState->GetCTM(); + double *pBaseMatrix = m_arrBaseMatrix; + double *pPatternMatrix = pPattern->GetMatrix(); + + // InvCTM = (CTM)^(-1) + double pInvCTM[6]; + double dDet = 1 / (pCTM[0] * pCTM[3] - pCTM[1] * pCTM[2]); + pInvCTM[0] = pCTM[3] * dDet; + pInvCTM[1] = -pCTM[1] * dDet; + pInvCTM[2] = -pCTM[2] * dDet; + pInvCTM[3] = pCTM[0] * dDet; + pInvCTM[4] = (pCTM[2] * pCTM[5] - pCTM[3] * pCTM[4]) * dDet; + pInvCTM[5] = (pCTM[1] * pCTM[4] - pCTM[0] * pCTM[5]) * dDet; + // TempMatrix = PatternMatrix * BaseMatrix + double pTempMatrix[6]; + pTempMatrix[0] = pPatternMatrix[0] * pBaseMatrix[0] + pPatternMatrix[1] * pBaseMatrix[2]; + pTempMatrix[1] = pPatternMatrix[0] * pBaseMatrix[1] + pPatternMatrix[1] * pBaseMatrix[3]; + pTempMatrix[2] = pPatternMatrix[2] * pBaseMatrix[0] + pPatternMatrix[3] * pBaseMatrix[2]; + pTempMatrix[3] = pPatternMatrix[2] * pBaseMatrix[1] + pPatternMatrix[3] * pBaseMatrix[3]; + pTempMatrix[4] = pPatternMatrix[4] * pBaseMatrix[0] + pPatternMatrix[5] * pBaseMatrix[2] + pBaseMatrix[4]; + pTempMatrix[5] = pPatternMatrix[4] * pBaseMatrix[1] + pPatternMatrix[5] * pBaseMatrix[3] + pBaseMatrix[5]; + // Matrix = TempMatrix * InvCTM + double pMatrix[6]; + pMatrix[0] = pTempMatrix[0] * pInvCTM[0] + pTempMatrix[1] * pInvCTM[2]; + pMatrix[1] = pTempMatrix[0] * pInvCTM[1] + pTempMatrix[1] * pInvCTM[3]; + pMatrix[2] = pTempMatrix[2] * pInvCTM[0] + pTempMatrix[3] * pInvCTM[2]; + pMatrix[3] = pTempMatrix[2] * pInvCTM[1] + pTempMatrix[3] * pInvCTM[3]; + pMatrix[4] = pTempMatrix[4] * pInvCTM[0] + pTempMatrix[5] * pInvCTM[2] + pInvCTM[4]; + pMatrix[5] = pTempMatrix[4] * pInvCTM[1] + pTempMatrix[5] * pInvCTM[3] + pInvCTM[5]; + + // Устанавливаем новую матрицу + m_pGState->ConcatCTM(pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); + m_pOut->UpdateCTM(m_pGState, pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); + + bool bAntialias = m_pOut->GetVectorAntialias(); + if (bAntialias) + { + m_pOut->SetVectorAntialias(false); + } + + m_pOut->StartShadedFill(m_pGState); + + // Выполняем закраску, в зависимости от типа Shading + switch (pShading->GetType()) + { + case 1: + DoFunctionShadingFill((GrFunctionShading *)pShading); + break; + case 2: + DoAxialShadingFill((GrAxialShading *)pShading); + break; + case 3: + DoRadialShadingFill((GrRadialShading *)pShading); + break; + case 4: + case 5: + DoGouraudTriangleShadingFill((GrGouraudTriangleShading *)pShading); + break; + case 6: + case 7: + DoPatchMeshShadingFill((GrPatchMeshShading *)pShading); + break; + } + + m_pOut->EndShadedFill(); + + if (bAntialias) + { + m_pOut->SetVectorAntialias(true); + } + + // Восстанавливаем GState + RestoreGState(); + m_pGState->SetPath(pSavedPath); + } + + void Graphics::DoFunctionShadingFill(GrFunctionShading *pShading) + { + // Сначала предоставляем возможность OuputDevice самому сделать Shading + if (m_pOut->UseFunctionalShadedFills() && m_pOut->FunctionShadedFill(m_pGState, pShading)) + { + return; + } + + // Если Output Device не поддерживает данный ShadingType, тогда делаем его сами + // с помощью GrPath. + double dMinX, dMinY, dMaxX, dMaxY; + GrColor arrColors[4]; + + pShading->GetDomain(&dMinX, &dMinY, &dMaxX, &dMaxY); + pShading->GetColor(dMinX, dMinY, &arrColors[0]); + pShading->GetColor(dMinX, dMaxY, &arrColors[1]); + pShading->GetColor(dMaxX, dMinY, &arrColors[2]); + pShading->GetColor(dMaxX, dMaxY, &arrColors[3]); + DoFunctionShadingFill(pShading, dMinX, dMinY, dMaxX, dMaxY, arrColors, 0); + } + + void Graphics::DoFunctionShadingFill(GrFunctionShading *pShading, double dMinX, double dMinY, double dMaxX, double dMaxY, GrColor *pColors, int nDepth) + { + if (m_pOut->IsStopped()) + return; + + int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); + + // Сравниваем цвета в углах + int nColorIndex = 0; + for (nColorIndex = 0; nColorIndex < 4; ++nColorIndex) + { + int nComponentIndex; + for (nComponentIndex = 0; nComponentIndex < nComponentsCount; ++nComponentIndex) + { + if (abs(pColors[nColorIndex].arrComp[nComponentIndex] - pColors[(nColorIndex + 1) & 3].arrComp[nComponentIndex]) > functionColorDelta) + { + break; + } + } + if (nComponentIndex < nComponentsCount) + { + break; + } + } + + double dCenterX = 0.5 * (dMinX + dMaxX); + double dCenterY = 0.5 * (dMinY + dMaxY); + + // Угловые вершины прямоугольников достаточно близки (или мы достигли предела количетсву иттераций) + // Заливаем прямоугольник. Даже если изначально вершины близки проводим одну иттерацию деления, чтобы + // случая, когда все 4 вершины имеют одинаковый цвет. + if ((nColorIndex == 4 && nDepth > 0) || nDepth == functionMaxDepth) + { + // Используем цвет центра прямоугольника + GrColor oFillColor; + pShading->GetColor(dCenterX, dCenterY, &oFillColor); + m_pGState->SetFillColor(&oFillColor); + m_pOut->UpdateFillColor(m_pGState); + + double *pMatrix = pShading->GetMatrix(); + // Заливка прямоугольника + m_pGState->MoveTo(dMinX * pMatrix[0] + dMinY * pMatrix[2] + pMatrix[4], dMinX * pMatrix[1] + dMinY * pMatrix[3] + pMatrix[5]); + m_pGState->LineTo(dMaxX * pMatrix[0] + dMinY * pMatrix[2] + pMatrix[4], dMaxX * pMatrix[1] + dMinY * pMatrix[3] + pMatrix[5]); + m_pGState->LineTo(dMaxX * pMatrix[0] + dMaxY * pMatrix[2] + pMatrix[4], dMaxX * pMatrix[1] + dMaxY * pMatrix[3] + pMatrix[5]); + m_pGState->LineTo(dMinX * pMatrix[0] + dMaxY * pMatrix[2] + pMatrix[4], dMinX * pMatrix[1] + dMaxY * pMatrix[3] + pMatrix[5]); + m_pGState->ClosePath(); + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + } + else // 4 угловые вершины не достаточно близки, делим дальше на прямоугольники + { + + // pColors[0] oColorCT pColors[2] + // (dMinX,dMinY) (dCenterX,dMinY) (dMaxX,dMinY) + // +---------------------+---------------------+ + // | | | + // | Top Left | Top Right | + // oColorLC | oColorCC| | oColorRC + // +---------------------+---------------------+ + // (dMinX,dCenterY) (dCenterX,dCenterY) (dMaxX,dCenterY) + // | Bottom Left | Bottom Right | + // | | | + // +---------------------+---------------------+ + // (dMinX,dMaxY) (dCenterX,dMaxY) (dMaxX,dMaxY) + // pColors[1] oColorCB pColors[3] + + GrColor oColorLC, oColorRC, oColorCT, oColorCB, oColorCC, arrSubColors[4]; + pShading->GetColor(dMinX, dCenterY, &oColorLC); + pShading->GetColor(dMaxX, dCenterY, &oColorRC); + pShading->GetColor(dCenterX, dMinY, &oColorCT); + pShading->GetColor(dCenterX, dMaxY, &oColorCB); + pShading->GetColor(dCenterX, dCenterY, &oColorCC); + + // Верхний левый прямоугольник + arrSubColors[0] = pColors[0]; + arrSubColors[1] = oColorLC; + arrSubColors[2] = oColorCT; + arrSubColors[3] = oColorCC; + DoFunctionShadingFill(pShading, dMinX, dMinY, dCenterX, dCenterY, arrSubColors, nDepth + 1); + + // Левый нижний прямоугольник + arrSubColors[0] = oColorLC; + arrSubColors[1] = pColors[1]; + arrSubColors[2] = oColorCC; + arrSubColors[3] = oColorCB; + DoFunctionShadingFill(pShading, dMinX, dCenterY, dCenterX, dMaxY, arrSubColors, nDepth + 1); + + // Правый верхний прямоугольник + arrSubColors[0] = oColorCT; + arrSubColors[1] = oColorCC; + arrSubColors[2] = pColors[2]; + arrSubColors[3] = oColorRC; + DoFunctionShadingFill(pShading, dCenterX, dMinY, dMaxX, dCenterY, arrSubColors, nDepth + 1); + + // Правый нижний прямоугольник + arrSubColors[0] = oColorCC; + arrSubColors[1] = oColorCB; + arrSubColors[2] = oColorRC; + arrSubColors[3] = pColors[3]; + DoFunctionShadingFill(pShading, dCenterX, dCenterY, dMaxX, dMaxY, arrSubColors, nDepth + 1); + } + } + + void Graphics::DoAxialShadingFill(GrAxialShading *pShading) + { + int nJ, nK, nKK; + + // Сначала предоставляем возможность OuputDevice самому сделать Shading + if (m_pOut->UseAxialShadedFills() && m_pOut->AxialShadedFill(m_pGState, pShading)) + { + return; + } + + // get the clip region bbox + double dMinX, dMinY, dMaxX, dMaxY; + m_pGState->GetUserClipBBox(&dMinX, &dMinY, &dMaxX, &dMaxY); + + // Вычисляем макимальное и минимальное значения параметра T + double dTmin, dTmax; + double dX0, dY0, dX1, dY1; + pShading->GetCoords(&dX0, &dY0, &dX1, &dY1); + double dDx = dX1 - dX0; + double dDy = dY1 - dY0; + bool bDxZero = fabs(dDx) < 0.01; + bool bDyZero = fabs(dDy) < 0.01; + if (bDxZero && bDyZero) + { + dTmin = dTmax = 0; + } + else + { + double dMult = 1 / (dDx * dDx + dDy * dDy); + dTmin = dTmax = ((dMinX - dX0) * dDx + (dMinY - dY0) * dDy) * dMult; + double dTemp = ((dMinX - dX0) * dDx + (dMaxY - dY0) * dDy) * dMult; + if (dTemp < dTmin) + { + dTmin = dTemp; + } + else if (dTemp > dTmax) + { + dTmax = dTemp; + } + dTemp = ((dMaxX - dX0) * dDx + (dMinY - dY0) * dDy) * dMult; + if (dTemp < dTmin) + { + dTmin = dTemp; + } + else if (dTemp > dTmax) + { + dTmax = dTemp; + } + dTemp = ((dMaxX - dX0) * dDx + (dMaxY - dY0) * dDy) * dMult; + if (dTemp < dTmin) + { + dTmin = dTemp; + } + else if (dTemp > dTmax) + { + dTmax = dTemp; + } + if (dTmin < 0 && !pShading->GetExtendStart()) + { + dTmin = 0; + } + if (dTmax > 1 && !pShading->GetExtendEnd()) + { + dTmax = 1; + } + } + + // Считываем пределы параметра T + double dT0 = pShading->GetDomain0(); + double dT1 = pShading->GetDomain1(); + + // Для каждой точки (Tx, Ty) оси, рассмотрим линию ,проходяющую через данную точку перпендикулярно оси: + // + // x(s) = Tx + s * -dDy --> s = (x - Tx) / -dDy + // y(s) = Ty + s * dDx --> s = (y - Ty) / dDx + // + // Рассмотрим точки пересечения данной линии с внешним ректом(в котором все рисуем Bbox). В общем случае + // мы имеем 4 точки пересечения: + // + // s0 = (dMinX - Tx) / -dDy + // s1 = (dMaxX - Tx) / -dDy + // s2 = (dMinY - Ty) / dDx + // s3 = (dMaxY - Ty) / dDx + // + // нас интересуют два средних значения s. + // + // В случае, когда dDx = 0, возьмем s0 и s1; в случае, когда dDy = 0, возьмем s2 и s3. + // + // Далее каждый полигон, который мы будем заполнять будет ограничен двумя такими линиями, перпендикулярными оси. + // + // Делим ось таким образом до тех пор, пока разница цветов между двумя соседними линиями не станет достаточно + // малой. Далее кажды отдельный полигон закрашиваем одним цветом. + + // Делаем как минимум одну такую иттерацию, чтобы избежать проблем в случае, когда оба конца оси имеют + // одинаковый цвет. + + int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); + double arrTa[axialMaxSplits + 1]; + arrTa[0] = dTmin; + int arrNext[axialMaxSplits + 1]; + arrNext[0] = axialMaxSplits / 2; + arrTa[axialMaxSplits / 2] = 0.5 * (dTmin + dTmax); + arrNext[axialMaxSplits / 2] = axialMaxSplits; + arrTa[axialMaxSplits] = dTmax; + + // Вычисляем значение цвета при t = dTmin + double dTt = 0; + if (dTmin < 0) + { + dTt = dT0; + } + else if (dTmin > 1) + { + dTt = dT1; + } + else + { + dTt = dT0 + (dT1 - dT0) * dTmin; + } + GrColor oColor0, oColor1; + pShading->GetColor(dTt, &oColor0); + + // Вычисляем координаты точки, лежаще на оси, при значении параметра t = dTmin; + // после этого вычисляем координаты точек пересечения для линии при t = dTmin. + double dTx = dX0 + dTmin * dDx; + double dTy = dY0 + dTmin * dDy; + double arrS[4]; + + double dSmin, dSmax; + + if (bDxZero && bDyZero) + { + dSmin = dSmax = 0; + } + else if (bDxZero) + { + dSmin = (dMinX - dTx) / -dDy; + dSmax = (dMaxX - dTx) / -dDy; + if (dSmin > dSmax) + { + double dTemp = dSmin; + dSmin = dSmax; + dSmax = dTemp; + } + } + else if (bDyZero) + { + dSmin = (dMinY - dTy) / dDx; + dSmax = (dMaxY - dTy) / dDx; + if (dSmin > dSmax) + { + double dTemp = dSmin; + dSmin = dSmax; + dSmax = dTemp; + } + } + else + { + arrS[0] = (dMinY - dTy) / dDx; + arrS[1] = (dMaxY - dTy) / dDx; + arrS[2] = (dMinX - dTx) / -dDy; + arrS[3] = (dMaxX - dTx) / -dDy; + for (nJ = 0; nJ < 3; ++nJ) + { + nKK = nJ; + for (nK = nJ + 1; nK < 4; ++nK) + { + if (arrS[nK] < arrS[nKK]) + { + nKK = nK; + } + } + double dTemp = arrS[nJ]; + arrS[nJ] = arrS[nKK]; + arrS[nKK] = dTemp; + } + dSmin = arrS[1]; + dSmax = arrS[2]; + } + double dStartX0 = dTx - dSmin * dDy; + double dStartY0 = dTy + dSmin * dDx; + double dEndX0 = dTx - dSmax * dDy; + double dEndY0 = dTy + dSmax * dDx; + + int nSplitsCount = 0; + while (nSplitsCount < axialMaxSplits) + { + if (m_pOut->IsStopped()) + return; + + // Делим пока разница цветов не станет достаточной маленькой или пока мы не достигнем предела количеству иттераций + nJ = arrNext[nSplitsCount]; + while (nJ > nSplitsCount + 1) + { + if (m_pOut->IsStopped()) + return; + + if (arrTa[nJ] < 0) + { + dTt = dT0; + } + else if (arrTa[nJ] > 1) + { + dTt = dT1; + } + else + { + dTt = dT0 + (dT1 - dT0) * arrTa[nJ]; + } + pShading->GetColor(dTt, &oColor1); + for (nK = 0; nK < nComponentsCount; ++nK) + { + if (abs(oColor1.arrComp[nK] - oColor0.arrComp[nK]) > axialColorDelta) + { + break; + } + } + if (nK == nComponentsCount) + { + break; + } + nK = (nSplitsCount + nJ) / 2; + arrTa[nK] = 0.5 * (arrTa[nSplitsCount] + arrTa[nJ]); + arrNext[nSplitsCount] = nK; + arrNext[nK] = nJ; + nJ = nK; + } + + // Используем среднее значение цвета + for (nK = 0; nK < nComponentsCount; ++nK) + { + oColor0.arrComp[nK] = (oColor0.arrComp[nK] + oColor1.arrComp[nK]) / 2; + } + + // Вычисляем координаты точки, лежаще на оси, при данном значении параметра t; + // после этого вычисляем координаты точек пересечения для линии данном t. + dTx = dX0 + arrTa[nJ] * dDx; + dTy = dY0 + arrTa[nJ] * dDy; + if (bDxZero && bDyZero) + { + dSmin = dSmax = 0; + } + else if (bDxZero) + { + dSmin = (dMinX - dTx) / -dDy; + dSmax = (dMaxX - dTx) / -dDy; + if (dSmin > dSmax) + { + double dTemp = dSmin; + dSmin = dSmax; + dSmax = dTemp; + } + } + else if (bDyZero) + { + dSmin = (dMinY - dTy) / dDx; + dSmax = (dMaxY - dTy) / dDx; + if (dSmin > dSmax) + { + double dTemp = dSmin; + dSmin = dSmax; + dSmax = dTemp; + } + } + else + { + arrS[0] = (dMinY - dTy) / dDx; + arrS[1] = (dMaxY - dTy) / dDx; + arrS[2] = (dMinX - dTx) / -dDy; + arrS[3] = (dMaxX - dTx) / -dDy; + for (nJ = 0; nJ < 3; ++nJ) + { + nKK = nJ; + for (nK = nJ + 1; nK < 4; ++nK) + { + if (arrS[nK] < arrS[nKK]) + { + nKK = nK; + } + } + double dTemp = arrS[nJ]; + arrS[nJ] = arrS[nKK]; + arrS[nKK] = dTemp; + } + dSmin = arrS[1]; + dSmax = arrS[2]; + } + double dStartX1 = dTx - dSmin * dDy; + double dStartY1 = dTy + dSmin * dDx; + double dEndX1 = dTx - dSmax * dDy; + double dEndY1 = dTy + dSmax * dDx; + + // Устанавливаем цвет + m_pGState->SetFillColor(&oColor0); + m_pOut->UpdateFillColor(m_pGState); + + // Закрашиваем + m_pGState->MoveTo(dStartX0, dStartY0); + m_pGState->LineTo(dEndX0, dEndY0); + m_pGState->LineTo(dEndX1, dEndY1); + m_pGState->LineTo(dStartX1, dStartY1); + m_pGState->ClosePath(); + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + + // Начальные значения для следующего полигона + dStartX0 = dStartX1; + dStartY0 = dStartY1; + dEndX0 = dEndX1; + dEndY0 = dEndY1; + oColor0 = oColor1; + nSplitsCount = arrNext[nSplitsCount]; + } + } + + void Graphics::DoRadialShadingFill(GrRadialShading *pShading) + { + // Сначала предоставляем возможность OuputDevice самому сделать Shading + if (m_pOut->UseRadialShadedFills() && m_pOut->RadialShadedFill(m_pGState, pShading)) + { + return; + } + // Если Output Device не поддерживает данный ShadingType, тогда делаем его сами + // с помощью GrPath. + + double dFirstX, dFirstY, dFirstRad, dSecondX, dSecondY, dSecondRad; + pShading->GetCoords(&dFirstX, &dFirstY, &dFirstRad, &dSecondX, &dSecondY, &dSecondRad); + double dT0 = pShading->GetDomain0(); + double dT1 = pShading->GetDomain1(); + int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); + + // Вычисляем точку, в которой r(s) = 0; проверяме вложенность окружностей; и + // вычисляем углы тангенциальных линий + bool bEnclosed = false; + double dTheta = 0, dAlpha = 0;; + double dZeroS = 0; + if (dFirstX == dSecondX && dFirstY == dSecondY) + { + bEnclosed = true; + dTheta = 0; + dZeroS = 0; + } + else if (dFirstRad == dSecondRad) + { + bEnclosed = false; + dTheta = 0; + dZeroS = 0; + } + else + { + dZeroS = -dFirstRad / (dSecondRad - dFirstRad); + double dZeroX = dFirstX + dZeroS * (dSecondX - dFirstX); + double dZeroY = dFirstY + dZeroS * (dSecondY - dFirstY); + bEnclosed = ((dZeroX - dFirstX) * (dZeroX - dFirstX) + (dZeroY - dFirstY) * (dZeroY - dFirstY) <= dFirstRad * dFirstRad); + dTheta = asin(dFirstRad / sqrt((dFirstX - dZeroX) * (dFirstX - dZeroX) + (dFirstY - dZeroY) * (dFirstY - dZeroY))); + if (dFirstRad > dSecondRad) + { + dTheta = -dTheta; + } + } + if (bEnclosed) + { + dAlpha = 0; + } + else + { + dAlpha = atan2(dSecondY - dFirstY, dSecondX - dFirstX); + } + + double dXMin, dYMin, dXMax, dYMax; + m_pGState->GetUserClipBBox(&dXMin, &dYMin, &dXMax, &dYMax); + + double dSmin, dSmax; + if (bEnclosed) + { + dSmin = 0; + dSmax = 1; + } + else + { + dSmin = 1; + dSmax = 0; + // x(s) + r(s) = dXMin + if ((dSecondX + dSecondRad) - (dFirstX + dFirstRad) != 0) + { + double dTempS = (dXMin - (dFirstX + dFirstRad)) / ((dSecondX + dSecondRad) - (dFirstX + dFirstRad)); + if (dTempS < dSmin) + { + dSmin = dTempS; + } + else if (dTempS > dSmax) + { + dSmax = dTempS; + } + } + // x(s) - r(s) = dXMax + if ((dSecondX - dSecondRad) - (dFirstX - dFirstRad) != 0) + { + double dTempS = (dXMax - (dFirstX - dFirstRad)) / ((dSecondX - dSecondRad) - (dFirstX - dFirstRad)); + if (dTempS < dSmin) + { + dSmin = dTempS; + } + else if (dTempS > dSmax) + { + dSmax = dTempS; + } + } + // y(s) + r(s) = dYMin + if ((dSecondY + dSecondRad) - (dFirstY + dFirstRad) != 0) + { + double dTempS = (dYMin - (dFirstY + dFirstRad)) / ((dSecondY + dSecondRad) - (dFirstY + dFirstRad)); + if (dTempS < dSmin) + { + dSmin = dTempS; + } + else if (dTempS > dSmax) + { + dSmax = dTempS; + } + } + // y(s) - r(s) = dYMax + if ((dSecondY - dSecondRad) - (dFirstY - dFirstRad) != 0) + { + double dTempS = (dYMax - (dFirstY - dFirstRad)) / ((dSecondY - dSecondRad) - (dFirstY - dFirstRad)); + if (dTempS < dSmin) + { + dSmin = dTempS; + } + else if (dTempS > dSmax) + { + dSmax = dTempS; + } + } + + // Проверяем относительно dZeroS + if (dFirstRad < dSecondRad) + { + if (dSmin < dZeroS) + { + dSmin = dZeroS; + } + } + else if (dFirstRad > dSecondRad) + { + if (dSmax > dZeroS) + { + dSmax = dZeroS; + } + } + + if (!pShading->GetExtendFirst() && dSmin < 0) + { + dSmin = 0; + } + if (!pShading->GetExtendSecond() && dSmax > 1) + { + dSmax = 1; + } + } + + double *pCTM = m_pGState->GetCTM(); + double dTemp = fabs(pCTM[0]); + if (fabs(pCTM[1]) > dTemp) + { + dTemp = fabs(pCTM[1]); + } + if (fabs(pCTM[2]) > dTemp) + { + dTemp = fabs(pCTM[2]); + } + if (fabs(pCTM[3]) > dTemp) + { + dTemp = fabs(pCTM[3]); + } + if (dFirstRad > dSecondRad) + { + dTemp *= dFirstRad; + } + else + { + dTemp *= dSecondRad; + } + int nStepsCount = 0; + if (dTemp < 1) + { + nStepsCount = 3; + } + else + { + nStepsCount = (int)(M_PI / acos(1 - 0.1 / dTemp)); + if (nStepsCount < 3) + { + nStepsCount = 3; + } + else if (nStepsCount > 200) + { + nStepsCount = 200; + } + } + + // Везде далее A - первая окружность, B - вторая + int nIndexA = 0; + double dSA = dSmin; + double dTA = dT0 + dSA * (dT1 - dT0); + double dXA = dFirstX + dSA * (dSecondX - dFirstX); + double dYA = dFirstY + dSA * (dSecondY - dFirstY); + double dRadA = dFirstRad + dSA * (dSecondRad - dFirstRad); + double dAngle = 0; + int nCounter = 0; + GrColor oColorA; + if (dTA < dT0) + { + pShading->GetColor(dT0, &oColorA); + } + else if (dTA > dT1) + { + pShading->GetColor(dT1, &oColorA); + } + else + { + pShading->GetColor(dTA, &oColorA); + } + + while (nIndexA < radialMaxSplits) + { + if (m_pOut->IsStopped()) + return; + + int nIndexB = radialMaxSplits; + double dSB = dSmax; + double dTB = dT0 + dSB * (dT1 - dT0); + GrColor oColorB; + if (dTB < dT0) + { + pShading->GetColor(dT0, &oColorB); + } + else if (dTB > dT1) + { + pShading->GetColor(dT1, &oColorB); + } + else + { + pShading->GetColor(dTB, &oColorB); + } + + while (nIndexB - nIndexA > 1) + { + if (m_pOut->IsStopped()) + return; + + for (nCounter = 0; nCounter < nComponentsCount; ++nCounter) + { + if (abs(oColorB.arrComp[nCounter] - oColorA.arrComp[nCounter]) > radialColorDelta) + { + break; + } + } + if (nCounter == nComponentsCount && nIndexB < radialMaxSplits) + { + break; + } + nIndexB = (nIndexA + nIndexB) / 2; + dSB = dSmin + ((double)nIndexB / (double)radialMaxSplits) * (dSmax - dSmin); + dTB = dT0 + dSB * (dT1 - dT0); + if (dTB < dT0) + { + pShading->GetColor(dT0, &oColorB); + } + else if (dTB > dT1) + { + pShading->GetColor(dT1, &oColorB); + } + else + { + pShading->GetColor(dTB, &oColorB); + } + } + + // Вычислим центр и радиус окружности + double dXB = dFirstX + dSB * (dSecondX - dFirstX); + double dYB = dFirstY + dSB * (dSecondY - dFirstY); + double dRadB = dFirstRad + dSB * (dSecondRad - dFirstRad); + + // Используем среднее значение цвета двух окружностей + for (nCounter = 0; nCounter < nComponentsCount; ++nCounter) + { + oColorA.arrComp[nCounter] = (oColorA.arrComp[nCounter] + oColorB.arrComp[nCounter]) / 2; + } + m_pGState->SetFillColor(&oColorA); + m_pOut->UpdateFillColor(m_pGState); + + if (bEnclosed) + { + + // Строим Path для первой окружности (против часовой) + m_pGState->MoveTo(dXA + dRadA, dYA); + for (nCounter = 1; nCounter < nStepsCount; ++nCounter) + { + dAngle = ((double)nCounter / (double)nStepsCount) * 2 * M_PI; + m_pGState->LineTo(dXA + dRadA * cos(dAngle), dYA + dRadA * sin(dAngle)); + } + m_pGState->ClosePath(); + + // Строим Path для второй окружности (по часовой) + m_pGState->MoveTo(dXB + dRadB, dYB); + for (nCounter = 1; nCounter < nStepsCount; ++nCounter) + { + dAngle = -((double)nCounter / (double)nStepsCount) * 2 * M_PI; + m_pGState->LineTo(dXB + dRadB * cos(dAngle), dYB + dRadB * sin(dAngle)); + } + m_pGState->ClosePath(); + + } + else + { + + // Строим первый subpath (по часовой) + m_pGState->MoveTo(dXA + dRadA * cos(dAlpha + dTheta + 0.5 * M_PI), dYA + dRadA * sin(dAlpha + dTheta + 0.5 * M_PI)); + for (nCounter = 0; nCounter < nStepsCount; ++nCounter) + { + dAngle = dAlpha + dTheta + 0.5 * M_PI - ((double)nCounter / (double)nStepsCount) * (2 * dTheta + M_PI); + m_pGState->LineTo(dXB + dRadB * cos(dAngle), dYB + dRadB * sin(dAngle)); + } + for (nCounter = 0; nCounter < nStepsCount; ++nCounter) + { + dAngle = dAlpha - dTheta - 0.5 * M_PI + ((double)nCounter / (double)nStepsCount) * (2 * dTheta - M_PI); + m_pGState->LineTo(dXA + dRadA * cos(dAngle), dYA + dRadA * sin(dAngle)); + } + m_pGState->ClosePath(); + + // Строим второй subpath (против часовой) + m_pGState->MoveTo(dXA + dRadA * cos(dAlpha + dTheta + 0.5 * M_PI), dYA + dRadA * sin(dAlpha + dTheta + 0.5 * M_PI)); + for (nCounter = 0; nCounter < nStepsCount; ++nCounter) + { + dAngle = dAlpha + dTheta + 0.5 * M_PI + ((double)nCounter / (double)nStepsCount) * (-2 * dTheta + M_PI); + m_pGState->LineTo(dXB + dRadB * cos(dAngle), dYB + dRadB * sin(dAngle)); + } + for (nCounter = 0; nCounter < nStepsCount; ++nCounter) + { + dAngle = dAlpha - dTheta - 0.5 * M_PI + ((double)nCounter / (double)nStepsCount) * (2 * dTheta + M_PI); + m_pGState->LineTo(dXA + dRadA * cos(dAngle), dYA + dRadA * sin(dAngle)); + } + m_pGState->ClosePath(); + } + + // Закрашиваем + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + + // Начальные данные для следующего шага + nIndexA = nIndexB; + dSA = dSB; + dTA = dTB; + dXA = dXB; + dYA = dYB; + dRadA = dRadB; + oColorA = oColorB; + } + + // Если выставлены флаги продолжать рисовать за пределами двух окружностей + if (bEnclosed) + { + // Продолжаем за меньшую окружность + if ((pShading->GetExtendFirst() && dFirstRad <= dSecondRad) || (pShading->GetExtendSecond() && dSecondRad < dFirstRad)) + { + if (dFirstRad <= dSecondRad) + { + dTA = dT0; + dRadA = dFirstRad; + dXA = dFirstX; + dYA = dFirstY; + } + else + { + dTA = dT1; + dRadA = dSecondRad; + dXA = dSecondX; + dYA = dSecondY; + } + pShading->GetColor(dTA, &oColorA); + m_pGState->SetFillColor(&oColorA); + m_pOut->UpdateFillColor(m_pGState); + m_pGState->MoveTo(dXA + dRadA, dYA); + for (nCounter = 1; nCounter < nStepsCount; ++nCounter) + { + dAngle = ((double)nCounter / (double)nStepsCount) * 2 * M_PI; + m_pGState->LineTo(dXA + dRadA * cos(dAngle), dYA + dRadA * sin(dAngle)); + } + m_pGState->ClosePath(); + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + } + + // Продолжаем за большую окружность + if ((pShading->GetExtendFirst() && dFirstRad > dSecondRad) || (pShading->GetExtendSecond() && dSecondRad >= dFirstRad)) + { + if (dFirstRad > dSecondRad) + { + dTA = dT0; + dRadA = dFirstRad; + dXA = dFirstX; + dYA = dFirstY; + } + else + { + dTA = dT1; + dRadA = dSecondRad; + dXA = dSecondX; + dYA = dSecondY; + } + pShading->GetColor(dTA, &oColorA); + m_pGState->SetFillColor(&oColorA); + m_pOut->UpdateFillColor(m_pGState); + m_pGState->MoveTo(dXMin, dYMin); + m_pGState->LineTo(dXMin, dYMax); + m_pGState->LineTo(dXMax, dYMax); + m_pGState->LineTo(dXMax, dYMin); + m_pGState->ClosePath(); + m_pGState->MoveTo(dXA + dRadA, dYA); + for (nCounter = 1; nCounter < nStepsCount; ++nCounter) + { + dAngle = ((double)nCounter / (double)nStepsCount) * 2 * M_PI; + m_pGState->LineTo(dXA + dRadA * cos(dAngle), dYA + dRadA * sin(dAngle)); + } + m_pGState->ClosePath(); + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + } + } + } + + void Graphics::DoGouraudTriangleShadingFill(GrGouraudTriangleShading *pShading) + { + double dAx, dAy, dBx, dBy, dCx, dCy; + GrColor oColorA, oColorB, oColorC; + for (int nIndex = 0; nIndex < pShading->GetTrianglesCount(); ++nIndex) + { + pShading->GetTriangle(nIndex, &dAx, &dAy, &oColorA, &dBx, &dBy, &oColorB, &dCx, &dCy, &oColorC); + GouraudFillTriangle(dAx, dAy, &oColorA, dBx, dBy, &oColorB, dCx, dCy, &oColorC, pShading->GetColorSpace()->GetComponentsCount(), 0); + } + } + + void Graphics::GouraudFillTriangle(double dAx, double dAy, GrColor *pColorA, double dBx, double dBy, GrColor *pColorB, double dCx, double dCy, GrColor *pColorC, int nComponentsCount, int nDepth) + { + if (m_pOut->IsStopped()) + return; + + double dABx, dABy, dBCx, dBCy, dACx, dACy; + GrColor oColorAB, oColorBC, oColorAC; + int nIndex; + + for (nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + if (abs(pColorA->arrComp[nIndex] - pColorB->arrComp[nIndex]) > gouraudColorDelta || abs(pColorB->arrComp[nIndex] - pColorC->arrComp[nIndex]) > gouraudColorDelta) + { + break; + } + } + if (nIndex == nComponentsCount || nDepth == gouraudMaxDepth) + { + m_pGState->SetFillColor(pColorA); + m_pOut->UpdateFillColor(m_pGState); + m_pGState->MoveTo(dAx, dAy); + m_pGState->LineTo(dBx, dBy); + m_pGState->LineTo(dCx, dCy); + m_pGState->ClosePath(); + m_pOut->Fill(m_pGState); + m_pGState->ClearPath(); + } + else + { + dABx = 0.5 * (dAx + dBx); + dABy = 0.5 * (dAy + dBy); + dBCx = 0.5 * (dBx + dCx); + dBCy = 0.5 * (dBy + dCy); + dACx = 0.5 * (dCx + dAx); + dACy = 0.5 * (dCy + dAy); + for (nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + oColorAB.arrComp[nIndex] = (pColorA->arrComp[nIndex] + pColorB->arrComp[nIndex]) / 2; + oColorBC.arrComp[nIndex] = (pColorB->arrComp[nIndex] + pColorC->arrComp[nIndex]) / 2; + oColorAC.arrComp[nIndex] = (pColorC->arrComp[nIndex] + pColorA->arrComp[nIndex]) / 2; + } + GouraudFillTriangle(dAx, dAy, pColorA, dABx, dABy, &oColorAB, dACx, dACy, &oColorAC, nComponentsCount, nDepth + 1); + GouraudFillTriangle(dABx, dABy, &oColorAB, dBx, dBy, pColorB, dBCx, dBCy, &oColorBC, nComponentsCount, nDepth + 1); + GouraudFillTriangle(dABx, dABy, &oColorAB, dBCx, dBCy, &oColorBC, dACx, dACy, &oColorAC, nComponentsCount, nDepth + 1); + GouraudFillTriangle(dACx, dACy, &oColorAC, dBCx, dBCy, &oColorBC, dCx, dCy, pColorC, nComponentsCount, nDepth + 1); + } + } + + void Graphics::DoPatchMeshShadingFill(GrPatchMeshShading *pShading) + { + // Устанавливаем цветовое пространство + m_pGState->SetStrokeColorSpace(pShading->GetColorSpace()->Copy()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + + int nStart; + + if (pShading->GetPatchesCount() > 128) + { + nStart = 3; + } + else if (pShading->GetPatchesCount() > 64) + { + nStart = 2; + } + else if (pShading->GetPatchesCount() > 16) + { + nStart = 1; + } + else + { + nStart = 0; + } + for (int nIndex = 0; nIndex < pShading->GetPatchesCount(); ++nIndex) + { + MeshFillPatch(pShading->GetPatch(nIndex), pShading->GetColorSpace()->GetComponentsCount(), nStart); + } + } + + void Graphics::MeshFillPatch(GrPatch *pPatch, int nComponentsCount, int nDepth) + { + if (m_pOut->IsStopped()) + return; + + GrPatch oPatch00, oPatch01, oPatch10, oPatch11; + double arrX[4][8], arrY[4][8]; + double dMidX, dMidY; + int nIndex; + + for (nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + if (abs(pPatch->arrColor[0][0].arrComp[nIndex] - pPatch->arrColor[0][1].arrComp[nIndex]) > patchColorDelta || + abs(pPatch->arrColor[0][1].arrComp[nIndex] - pPatch->arrColor[1][1].arrComp[nIndex]) > patchColorDelta || + abs(pPatch->arrColor[1][1].arrComp[nIndex] - pPatch->arrColor[1][0].arrComp[nIndex]) > patchColorDelta || + abs(pPatch->arrColor[1][0].arrComp[nIndex] - pPatch->arrColor[0][0].arrComp[nIndex]) > patchColorDelta + ) + { + break; + } + } + if (nIndex == nComponentsCount || nDepth == patchMaxDepth) + { + m_pGState->SetFillColor(&pPatch->arrColor[0][0]); + m_pGState->SetStrokeColor(&pPatch->arrColor[0][0]); + m_pOut->UpdateFillColor(m_pGState); + m_pOut->UpdateStrokeColor(m_pGState); + m_pGState->MoveTo(pPatch->arrX[0][0], pPatch->arrY[0][0]); + m_pGState->CurveTo(pPatch->arrX[0][1], pPatch->arrY[0][1], pPatch->arrX[0][2], pPatch->arrY[0][2], pPatch->arrX[0][3], pPatch->arrY[0][3]); + m_pGState->CurveTo(pPatch->arrX[1][3], pPatch->arrY[1][3], pPatch->arrX[2][3], pPatch->arrY[2][3], pPatch->arrX[3][3], pPatch->arrY[3][3]); + m_pGState->CurveTo(pPatch->arrX[3][2], pPatch->arrY[3][2], pPatch->arrX[3][1], pPatch->arrY[3][1], pPatch->arrX[3][0], pPatch->arrY[3][0]); + m_pGState->CurveTo(pPatch->arrX[2][0], pPatch->arrY[2][0], pPatch->arrX[1][0], pPatch->arrY[1][0], pPatch->arrX[0][0], pPatch->arrY[0][0]); + m_pGState->ClosePath(); + m_pOut->FillStroke(m_pGState); + m_pGState->ClearPath(); + } + else + { + for (nIndex = 0; nIndex < 4; ++nIndex) + { + arrX[nIndex][0] = pPatch->arrX[nIndex][0]; + arrY[nIndex][0] = pPatch->arrY[nIndex][0]; + arrX[nIndex][1] = 0.5 * (pPatch->arrX[nIndex][0] + pPatch->arrX[nIndex][1]); + arrY[nIndex][1] = 0.5 * (pPatch->arrY[nIndex][0] + pPatch->arrY[nIndex][1]); + dMidX = 0.5 * (pPatch->arrX[nIndex][1] + pPatch->arrX[nIndex][2]); + dMidY = 0.5 * (pPatch->arrY[nIndex][1] + pPatch->arrY[nIndex][2]); + arrX[nIndex][6] = 0.5 * (pPatch->arrX[nIndex][2] + pPatch->arrX[nIndex][3]); + arrY[nIndex][6] = 0.5 * (pPatch->arrY[nIndex][2] + pPatch->arrY[nIndex][3]); + arrX[nIndex][2] = 0.5 * (arrX[nIndex][1] + dMidX); + arrY[nIndex][2] = 0.5 * (arrY[nIndex][1] + dMidY); + arrX[nIndex][5] = 0.5 * (dMidX + arrX[nIndex][6]); + arrY[nIndex][5] = 0.5 * (dMidY + arrY[nIndex][6]); + arrX[nIndex][3] = arrX[nIndex][4] = 0.5 * (arrX[nIndex][2] + arrX[nIndex][5]); + arrY[nIndex][3] = arrY[nIndex][4] = 0.5 * (arrY[nIndex][2] + arrY[nIndex][5]); + arrX[nIndex][7] = pPatch->arrX[nIndex][3]; + arrY[nIndex][7] = pPatch->arrY[nIndex][3]; + } + for (nIndex = 0; nIndex < 4; ++nIndex) + { + oPatch00.arrX[0][nIndex] = arrX[0][nIndex]; + oPatch00.arrY[0][nIndex] = arrY[0][nIndex]; + oPatch00.arrX[1][nIndex] = 0.5 * (arrX[0][nIndex] + arrX[1][nIndex]); + oPatch00.arrY[1][nIndex] = 0.5 * (arrY[0][nIndex] + arrY[1][nIndex]); + dMidX = 0.5 * (arrX[1][nIndex] + arrX[2][nIndex]); + dMidY = 0.5 * (arrY[1][nIndex] + arrY[2][nIndex]); + oPatch10.arrX[2][nIndex] = 0.5 * (arrX[2][nIndex] + arrX[3][nIndex]); + oPatch10.arrY[2][nIndex] = 0.5 * (arrY[2][nIndex] + arrY[3][nIndex]); + oPatch00.arrX[2][nIndex] = 0.5 * (oPatch00.arrX[1][nIndex] + dMidX); + oPatch00.arrY[2][nIndex] = 0.5 * (oPatch00.arrY[1][nIndex] + dMidY); + oPatch10.arrX[1][nIndex] = 0.5 * (dMidX + oPatch10.arrX[2][nIndex]); + oPatch10.arrY[1][nIndex] = 0.5 * (dMidY + oPatch10.arrY[2][nIndex]); + oPatch00.arrX[3][nIndex] = 0.5 * (oPatch00.arrX[2][nIndex] + oPatch10.arrX[1][nIndex]); + oPatch00.arrY[3][nIndex] = 0.5 * (oPatch00.arrY[2][nIndex] + oPatch10.arrY[1][nIndex]); + oPatch10.arrX[0][nIndex] = oPatch00.arrX[3][nIndex]; + oPatch10.arrY[0][nIndex] = oPatch00.arrY[3][nIndex]; + oPatch10.arrX[3][nIndex] = arrX[3][nIndex]; + oPatch10.arrY[3][nIndex] = arrY[3][nIndex]; + } + for (nIndex = 4; nIndex < 8; ++nIndex) + { + oPatch01.arrX[0][nIndex - 4] = arrX[0][nIndex]; + oPatch01.arrY[0][nIndex - 4] = arrY[0][nIndex]; + oPatch01.arrX[1][nIndex - 4] = 0.5 * (arrX[0][nIndex] + arrX[1][nIndex]); + oPatch01.arrY[1][nIndex - 4] = 0.5 * (arrY[0][nIndex] + arrY[1][nIndex]); + dMidX = 0.5 * (arrX[1][nIndex] + arrX[2][nIndex]); + dMidY = 0.5 * (arrY[1][nIndex] + arrY[2][nIndex]); + oPatch11.arrX[2][nIndex - 4] = 0.5 * (arrX[2][nIndex] + arrX[3][nIndex]); + oPatch11.arrY[2][nIndex - 4] = 0.5 * (arrY[2][nIndex] + arrY[3][nIndex]); + oPatch01.arrX[2][nIndex - 4] = 0.5 * (oPatch01.arrX[1][nIndex - 4] + dMidX); + oPatch01.arrY[2][nIndex - 4] = 0.5 * (oPatch01.arrY[1][nIndex - 4] + dMidY); + oPatch11.arrX[1][nIndex - 4] = 0.5 * (dMidX + oPatch11.arrX[2][nIndex - 4]); + oPatch11.arrY[1][nIndex - 4] = 0.5 * (dMidY + oPatch11.arrY[2][nIndex - 4]); + oPatch01.arrX[3][nIndex - 4] = 0.5 * (oPatch01.arrX[2][nIndex - 4] + oPatch11.arrX[1][nIndex - 4]); + oPatch01.arrY[3][nIndex - 4] = 0.5 * (oPatch01.arrY[2][nIndex - 4] + oPatch11.arrY[1][nIndex - 4]); + oPatch11.arrX[0][nIndex - 4] = oPatch01.arrX[3][nIndex - 4]; + oPatch11.arrY[0][nIndex - 4] = oPatch01.arrY[3][nIndex - 4]; + oPatch11.arrX[3][nIndex - 4] = arrX[3][nIndex]; + oPatch11.arrY[3][nIndex - 4] = arrY[3][nIndex]; + } + for (nIndex = 0; nIndex < nComponentsCount; ++nIndex) + { + oPatch00.arrColor[0][0].arrComp[nIndex] = pPatch->arrColor[0][0].arrComp[nIndex]; + oPatch00.arrColor[0][1].arrComp[nIndex] = (pPatch->arrColor[0][0].arrComp[nIndex] + pPatch->arrColor[0][1].arrComp[nIndex]) / 2; + oPatch01.arrColor[0][0].arrComp[nIndex] = oPatch00.arrColor[0][1].arrComp[nIndex]; + oPatch01.arrColor[0][1].arrComp[nIndex] = pPatch->arrColor[0][1].arrComp[nIndex]; + oPatch01.arrColor[1][1].arrComp[nIndex] = (pPatch->arrColor[0][1].arrComp[nIndex] + pPatch->arrColor[1][1].arrComp[nIndex]) / 2; + oPatch11.arrColor[0][1].arrComp[nIndex] = oPatch01.arrColor[1][1].arrComp[nIndex]; + oPatch11.arrColor[1][1].arrComp[nIndex] = pPatch->arrColor[1][1].arrComp[nIndex]; + oPatch11.arrColor[1][0].arrComp[nIndex] = (pPatch->arrColor[1][1].arrComp[nIndex] + pPatch->arrColor[1][0].arrComp[nIndex]) / 2; + oPatch10.arrColor[1][1].arrComp[nIndex] = oPatch11.arrColor[1][0].arrComp[nIndex]; + oPatch10.arrColor[1][0].arrComp[nIndex] = pPatch->arrColor[1][0].arrComp[nIndex]; + oPatch10.arrColor[0][0].arrComp[nIndex] = (pPatch->arrColor[1][0].arrComp[nIndex] + pPatch->arrColor[0][0].arrComp[nIndex]) / 2; + oPatch00.arrColor[1][0].arrComp[nIndex] = oPatch10.arrColor[0][0].arrComp[nIndex]; + oPatch00.arrColor[1][1].arrComp[nIndex] = (oPatch00.arrColor[1][0].arrComp[nIndex] + oPatch01.arrColor[1][1].arrComp[nIndex]) / 2; + oPatch01.arrColor[1][0].arrComp[nIndex] = oPatch00.arrColor[1][1].arrComp[nIndex]; + oPatch11.arrColor[0][0].arrComp[nIndex] = oPatch00.arrColor[1][1].arrComp[nIndex]; + oPatch10.arrColor[0][1].arrComp[nIndex] = oPatch00.arrColor[1][1].arrComp[nIndex]; + } + MeshFillPatch(&oPatch00, nComponentsCount, nDepth + 1); + MeshFillPatch(&oPatch10, nComponentsCount, nDepth + 1); + MeshFillPatch(&oPatch01, nComponentsCount, nDepth + 1); + MeshFillPatch(&oPatch11, nComponentsCount, nDepth + 1); + } + } + + void Graphics::DoEndPath() + { + if (m_pGState->IsCurPoint() && m_eClip != clipNone) + { + m_pGState->Clip(); + if (m_eClip == clipNormal) + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + } + else + { + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), true); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), true); + else + m_pOut->EoClip(m_pGState); + } + } + m_eClip = clipNone; + m_pGState->ClearPath(); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Clipping paths + //------------------------------------------------------------------------------------------------------------------------------- + + // W + void Graphics::OperatorClip(Object arrArguments[], int nArgumentsCount) + { + m_eClip = clipNormal; + } + + // W* + void Graphics::OperatorEOClip(Object arrArguments[], int nArgumentsCount) + { + m_eClip = clipEO; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Text objects + //------------------------------------------------------------------------------------------------------------------------------- + + // BT + void Graphics::OperatorBeginText(Object arrArguments[], int nArgumentsCount) + { + m_pOut->BegintTextObject(m_pGState); + m_pGState->SetTextMatrix(1, 0, 0, 1, 0, 0); + m_pGState->TextMoveTo(0, 0); + m_pOut->UpdateTextMatrix(m_pGState); + m_pOut->UpdateTextPos(m_pGState); + m_bFontChanged = true; + } + + // ET + void Graphics::OperatorEndText(Object arrArguments[], int nArgumentsCount) + { + m_pOut->EndTextObject(m_pGState); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Text state + //------------------------------------------------------------------------------------------------------------------------------- + + // Tc + void Graphics::OperatorSetCharSpacing(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetCharSpace(arrArguments[0].GetNum()); + m_pOut->UpdateCharSpace(m_pGState); + } + + // Tf + void Graphics::OperatorSetFont(Object arrArguments[], int nArgumentsCount) + { + GrFont *pFont = NULL; + + if (!(pFont = m_pResources->LookupFont(arrArguments[0].GetName()))) + { + return; + } +#ifdef _DEBUG + if (m_pDumpFile) + { + ::fprintf(m_pDumpFile, " Font:\n"); + ::fprintf(m_pDumpFile, " Tag = %s\n", pFont->GetTag()->GetBuffer()); + ::fprintf(m_pDumpFile, " Name = %s\n", pFont->GetBaseName() ? pFont->GetBaseName()->GetBuffer() : "???"); + ::fprintf(m_pDumpFile, " %g\n", arrArguments[1].GetNum()); + ::fflush(m_pDumpFile); + } +#endif + m_pGState->SetFont(pFont, arrArguments[1].GetNum()); + m_bFontChanged = true; + } + + // TL + void Graphics::OperatorSetTextLeading(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetLeading(arrArguments[0].GetNum()); + } + + // Tr + void Graphics::OperatorSetTextRender(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetRenderMode(arrArguments[0].GetInt()); + m_pOut->UpdateRender(m_pGState); + } + + // Ts + void Graphics::OperatorSetTextRise(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetRise(arrArguments[0].GetNum()); + m_pOut->UpdateRise(m_pGState); + } + + // Tw + void Graphics::OperatorSetWordSpacing(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetWordSpace(arrArguments[0].GetNum()); + m_pOut->UpdateWordSpace(m_pGState); + } + + // Tz + void Graphics::OperatorSetHorizScaling(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetHorizScaling(arrArguments[0].GetNum()); + m_pOut->UpdateHorizScaling(m_pGState); + m_bFontChanged = true; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Text positioning + //------------------------------------------------------------------------------------------------------------------------------- + + // Td + void Graphics::OperatorTextMove(Object arrArguments[], int nArgumentsCount) + { + double dDX = m_pGState->GetTextLineX() + arrArguments[0].GetNum(); + double dDy = m_pGState->GetTextLineY() + arrArguments[1].GetNum(); + m_pGState->TextMoveTo(dDX, dDy); + m_pOut->UpdateTextPos(m_pGState); + } + + // TD + void Graphics::OperatorTextMoveSet(Object arrArguments[], int nArgumentsCount) + { + double dDx = m_pGState->GetTextLineX() + arrArguments[0].GetNum(); + double dDy = arrArguments[1].GetNum(); + m_pGState->SetLeading(-dDy); + dDy += m_pGState->GetTextLineY(); + m_pGState->TextMoveTo(dDx, dDy); + m_pOut->UpdateTextPos(m_pGState); + } + + // Tm + void Graphics::OperatorSetTextMatrix(Object arrArguments[], int nArgumentsCount) + { + m_pGState->SetTextMatrix(arrArguments[0].GetNum(), arrArguments[1].GetNum(), arrArguments[2].GetNum(), arrArguments[3].GetNum(), arrArguments[4].GetNum(), arrArguments[5].GetNum()); + m_pGState->TextMoveTo(0, 0); + m_pOut->UpdateTextMatrix(m_pGState); + m_pOut->UpdateTextPos(m_pGState); + m_bFontChanged = true; + } + + // T* + void Graphics::OperatorTextNextLine(Object arrArguments[], int nArgumentsCount) + { + double dDx = m_pGState->GetTextLineX(); + double dDy = m_pGState->GetTextLineY() - m_pGState->GetLeading(); + m_pGState->TextMoveTo(dDx, dDy); + m_pOut->UpdateTextPos(m_pGState); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Text showing + //------------------------------------------------------------------------------------------------------------------------------- + + // Tj + void Graphics::OperatorShowText(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->GetFont()) + { + // TO DO: Error "No font in show") + return; + } + if (m_bFontChanged) + { + m_pOut->UpdateFont(m_pGState); + m_bFontChanged = false; + } + m_pOut->BeginStringOperator(m_pGState); + DoShowText(arrArguments[0].GetString()); + m_pOut->EndStringOperator(m_pGState); + } + + // ' + void Graphics::OperatorMoveShowText(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->GetFont()) + { + // TO DO: Error "No font in move/show" + return; + } + if (m_bFontChanged) + { + m_pOut->UpdateFont(m_pGState); + m_bFontChanged = false; + } + double dDx = m_pGState->GetTextLineX(); + double dDy = m_pGState->GetTextLineY() - m_pGState->GetLeading(); + m_pGState->TextMoveTo(dDx, dDy); + m_pOut->UpdateTextPos(m_pGState); + m_pOut->BeginStringOperator(m_pGState); + DoShowText(arrArguments[0].GetString()); + m_pOut->EndStringOperator(m_pGState); + } + + // \ + void Graphics::OperatorMoveSetShowText(Object arrArguments[], int nArgumentsCount) + { + if (m_pGState->GetFont()) + { + // TO DO: Error "No font in move/set/show" + return; + } + if (m_bFontChanged) + { + m_pOut->UpdateFont(m_pGState); + m_bFontChanged = false; + } + m_pGState->SetWordSpace(arrArguments[0].GetNum()); + m_pGState->SetCharSpace(arrArguments[1].GetNum()); + + double dDx = m_pGState->GetTextLineX(); + double dDy = m_pGState->GetTextLineY() - m_pGState->GetLeading(); + + m_pGState->TextMoveTo(dDx, dDy); + m_pOut->UpdateWordSpace(m_pGState); + m_pOut->UpdateCharSpace(m_pGState); + m_pOut->UpdateTextPos(m_pGState); + m_pOut->BeginStringOperator(m_pGState); + DoShowText(arrArguments[2].GetString()); + m_pOut->EndStringOperator(m_pGState); + } + + // TJ + void Graphics::OperatorShowSpaceText(Object arrArguments[], int nArgumentsCount) + { + if (!m_pGState->GetFont()) + { + // TO DO: Error "No font in show/space" + return; + } + if (m_bFontChanged) + { + m_pOut->UpdateFont(m_pGState); + m_bFontChanged = false; + } + m_pOut->BeginStringOperator(m_pGState); + int nWMode = m_pGState->GetFont()->GetWMode(); + Array *pArray = arrArguments[0].GetArray(); + + for (int nIndex = 0; nIndex < pArray->GetCount(); ++nIndex) + { + Object oTemp; + pArray->Get(nIndex, &oTemp); + if (oTemp.IsNum()) + { + if (nWMode) + { + m_pGState->TextShift(0, -oTemp.GetNum() * 0.001 * fabs(m_pGState->GetFontSize())); + } + else + { + m_pGState->TextShift(-oTemp.GetNum() * 0.001 * fabs(m_pGState->GetFontSize()), 0); + } + m_pOut->UpdateTextShift(m_pGState, oTemp.GetNum()); + } + else if (oTemp.IsString()) + { + DoShowText(oTemp.GetString()); + } + else + { + // TO DO: Error "Element of show/space array must be number or string" + } + oTemp.Free(); + } + m_pOut->EndStringOperator(m_pGState); + } + + //------------------------------------------------------------------------------------------------------------------------------- + void Graphics::DoShowText(StringExt *seString) + { + CharCode nCode; + Unicode arrUnicode[8]; + double x, y, dx, dy, dx2, dy2, tdx, tdy; + double originX, originY, tOriginX, tOriginY; + + char *pBuffer; + int nLen, nCurLen, uLen; + + GrFont *pFont = m_pGState->GetFont(); + int nWMode = pFont->GetWMode(); + + if (m_pOut->UseDrawChar()) + { + m_pOut->BeginString(m_pGState, seString); + } + + // Обработка шрифта Type 3 + if (pFont->GetType() == fontType3 && m_pOut->InterpretType3Chars()) + { + double *pMatrix = m_pGState->GetCTM(); + double pOldCTM[6], pNewCTM[6]; + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + pOldCTM[nIndex] = pMatrix[nIndex]; + } + pMatrix = m_pGState->GetTextMatrix(); + pNewCTM[0] = pMatrix[0] * pOldCTM[0] + pMatrix[1] * pOldCTM[2]; + pNewCTM[1] = pMatrix[0] * pOldCTM[1] + pMatrix[1] * pOldCTM[3]; + pNewCTM[2] = pMatrix[2] * pOldCTM[0] + pMatrix[3] * pOldCTM[2]; + pNewCTM[3] = pMatrix[2] * pOldCTM[1] + pMatrix[3] * pOldCTM[3]; + + pMatrix = pFont->GetFontMatrix(); + pNewCTM[0] = pMatrix[0] * pNewCTM[0] + pMatrix[1] * pNewCTM[2]; + pNewCTM[1] = pMatrix[0] * pNewCTM[1] + pMatrix[1] * pNewCTM[3]; + pNewCTM[2] = pMatrix[2] * pNewCTM[0] + pMatrix[3] * pNewCTM[2]; + pNewCTM[3] = pMatrix[2] * pNewCTM[1] + pMatrix[3] * pNewCTM[3]; + + pNewCTM[0] *= m_pGState->GetFontSize(); + pNewCTM[1] *= m_pGState->GetFontSize(); + pNewCTM[2] *= m_pGState->GetFontSize(); + pNewCTM[3] *= m_pGState->GetFontSize(); + pNewCTM[0] *= m_pGState->GetHorizScaling(); + pNewCTM[2] *= m_pGState->GetHorizScaling(); + + double dRiseX, dRiseY; + m_pGState->TextTransformDelta(0, m_pGState->GetRise(), &dRiseX, &dRiseY); + double dCurX = m_pGState->GetCurX(); + double dCurY = m_pGState->GetCurY(); + double dLineX = m_pGState->GetTextLineX(); + double dLineY = m_pGState->GetTextLineY(); + Parser *pOldParser = m_pParser; + pBuffer = seString->GetBuffer(); + nLen = seString->GetLength(); + while (nLen > 0) + { + nCurLen = pFont->GetNextChar(pBuffer, nLen, &nCode, arrUnicode, (int)(sizeof(arrUnicode) / sizeof(Unicode)), &uLen, &dx, &dy, &originX, &originY); + dx = dx * m_pGState->GetFontSize() + m_pGState->GetCharSpace(); + if (nCurLen == 1 && *pBuffer == ' ') + { + dx += m_pGState->GetWordSpace(); + } + dx *= m_pGState->GetHorizScaling(); + dy *= m_pGState->GetFontSize(); + m_pGState->TextTransformDelta(dx, dy, &tdx, &tdy); + m_pGState->Transform(dCurX + dRiseX, dCurY + dRiseY, &x, &y); + SaveGState(); + m_pGState->SetCTM(pNewCTM[0], pNewCTM[1], pNewCTM[2], pNewCTM[3], x, y); + //Значения CTM concat здесь неправильные (но они никогда не используются) + m_pOut->UpdateCTM(m_pGState, 1, 0, 0, 1, 0, 0); + if (!m_pOut->BeginType3Char(m_pGState, dCurX + dRiseX, dCurY + dRiseY, tdx, tdy, nCode, arrUnicode, uLen)) + { + Object oCharProc; + ((Gr8BitFont *)pFont)->GetCharProc(nCode, &oCharProc); + Dict *pResourcesDict; + if ((pResourcesDict = ((Gr8BitFont *)pFont)->GetResources())) + { + PushResources(pResourcesDict); + } + if (oCharProc.IsStream()) + { + Display(&oCharProc, false); + } + else + { + // TO DO: Error "Missing or bad Type3 CharProc entry" + } + m_pOut->EndType3Char(m_pGState); + if (pResourcesDict) + { + PopResources(); + } + oCharProc.Free(); + } + RestoreGState(); + // Поскольку функция RestoreGState() не восстанавливает текущей позиции, + // поэтому нам нужно сохранять и восстанавливать ее самим + dCurX += tdx; + dCurY += tdy; + m_pGState->MoveTo(dCurX, dCurY); + m_pGState->TextSetPos(dLineX, dLineY); + pBuffer += nCurLen; + nLen -= nCurLen; + } + m_pParser = pOldParser; + } + else if (m_pOut->UseDrawChar()) + { + double dRiseX, dRiseY; + m_pGState->TextTransformDelta(0, m_pGState->GetRise(), &dRiseX, &dRiseY); + pBuffer = seString->GetBuffer(); + nLen = seString->GetLength(); + while (nLen > 0) + { + nCurLen = pFont->GetNextChar(pBuffer, nLen, &nCode, arrUnicode, (int)(sizeof(arrUnicode) / sizeof(Unicode)), &uLen, &dx, &dy, &originX, &originY); + if (nWMode) + { + dx *= m_pGState->GetFontSize(); + dy = dy * m_pGState->GetFontSize() + m_pGState->GetCharSpace(); + if (nCurLen == 1 && *pBuffer == ' ') + { + dy += m_pGState->GetWordSpace(); + } + } + else + { + dx = dx * m_pGState->GetFontSize() + m_pGState->GetCharSpace(); + if (nCurLen == 1 && *pBuffer == ' ') + { + dx += m_pGState->GetWordSpace(); + } + dx *= m_pGState->GetHorizScaling(); + dy *= m_pGState->GetFontSize(); + } + m_pGState->TextTransformDelta(dx, dy, &tdx, &tdy); + originX *= m_pGState->GetFontSize(); + originY *= m_pGState->GetFontSize(); + m_pGState->TextTransformDelta(originX, originY, &tOriginX, &tOriginY); + m_pOut->DrawChar(m_pGState, m_pGState->GetCurX() + dRiseX, m_pGState->GetCurY() + dRiseY, tdx, tdy, tOriginX, tOriginY, nCode, nCurLen, arrUnicode, uLen); + m_pGState->Shift(tdx, tdy); + pBuffer += nCurLen; + nLen -= nCurLen; + } + } + else + { + dx = dy = 0; + pBuffer = seString->GetBuffer(); + nLen = seString->GetLength(); + int nCharsCount = 0, nSpacesCount = 0; + while (nLen > 0) + { + nCurLen = pFont->GetNextChar(pBuffer, nLen, &nCode, arrUnicode, (int)(sizeof(arrUnicode) / sizeof(Unicode)), &uLen, &dx2, &dy2, &originX, &originY); + dx += dx2; + dy += dy2; + if (nCurLen == 1 && *pBuffer == ' ') + { + ++nSpacesCount; + } + ++nCharsCount; + pBuffer += nCurLen; + nLen -= nCurLen; + } + if (nWMode) + { + dx *= m_pGState->GetFontSize(); + dy = dy * m_pGState->GetFontSize() + nCharsCount * m_pGState->GetCharSpace() + nSpacesCount * m_pGState->GetWordSpace(); + } + else + { + dx = dx * m_pGState->GetFontSize() + nCharsCount * m_pGState->GetCharSpace() + nSpacesCount * m_pGState->GetWordSpace(); + dx *= m_pGState->GetHorizScaling(); + dy *= m_pGState->GetFontSize(); + } + m_pGState->TextTransformDelta(dx, dy, &tdx, &tdy); + m_pOut->DrawString(m_pGState, seString); + m_pGState->Shift(tdx, tdy); + } + + if (m_pOut->UseDrawChar()) + { + m_pOut->EndString(m_pGState); + } + + m_nUpdateLevel += 10 * seString->GetLength(); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // XObjects + //------------------------------------------------------------------------------------------------------------------------------- + + // Do + void Graphics::OperatorXObject(Object arrArguments[], int nArgumentsCount) + { + char *sName = arrArguments[0].GetName(); + Object oXObject; + if (!m_pResources->LookupXObject(sName, &oXObject)) + { + return; + } + if (!oXObject.IsStream()) + { + // TO DO: Error "XObject is wrong type" + oXObject.Free(); + return; + } +#if OPI_SUPPORT + Object oOPI; + oXObject.streamGetDict()->lookup("OPI", &oOPI); + if ( oOPI.IsDict() ) + { + m_pOut->opiBegin( state, oOPI.GetDict() ); + } +#endif + Object oSub; + oXObject.StreamGetDict()->Search("Subtype", &oSub); + if (oSub.IsName("Image")) + { + if (m_pOut->NeedNonText()) + { + Object oRef; + m_pResources->LookupAndCopyXObject(sName, &oRef); + DoImage(&oRef, oXObject.GetStream(), false); + oRef.Free(); + } + } + else if (oSub.IsName("Form")) + { + Object oRef; + m_pResources->LookupAndCopyXObject(sName, &oRef); + if (m_pOut->UseDrawForm() && oRef.IsRef()) + { + m_pOut->DrawForm(oRef.GetRef()); + } + else + { + DoForm(&oXObject); + } + oRef.Free(); + } + else if (oSub.IsName("PS")) + { + Object oLevel; + oXObject.StreamGetDict()->Search("Level1", &oLevel); + m_pOut->PSXObject(oXObject.GetStream(), oLevel.IsStream() ? oLevel.GetStream() : (Stream *)NULL); + // Добавленно + oLevel.Free(); + } + else if (oSub.IsName()) + { + // TO DO: Error "Unknown XObject subtype" + } + else + { + // TO DO: Error "XObject subtype is missing or wrong type" + } + oSub.Free(); +#if OPI_SUPPORT + if ( oOPI.IsDict() ) + { + m_pOut->opiEnd( state, oOPI.GetDict() ); + } + oOPI.Free(); +#endif + oXObject.Free(); + } + + void Graphics::DoImage(Object *pRef, Stream *pStream, bool bInlineImage) + { + // Считываем информацию из потока + int nBitsPerComponent = 0; + StreamColorSpaceMode eCSMode = streamCSNone; + pStream->GetImageParams(&nBitsPerComponent, &eCSMode); + + Dict *pDict = pStream->GetDict(); + + // Width + Object oDictItem; + pDict->Search("Width", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("W", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + int nWidth = oDictItem.GetInt(); + oDictItem.Free(); + + // Height + pDict->Search("Height", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("H", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + int nHeight = oDictItem.GetInt(); + oDictItem.Free(); + + // Проверяем: может быть это маска? + pDict->Search("ImageMask", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("IM", &oDictItem); + } + bool bMask = false; + if (oDictItem.IsBool()) + { + bMask = oDictItem.GetBool(); + } + else if (!oDictItem.IsNull()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + oDictItem.Free(); + + // BitsPerComponent + if (nBitsPerComponent == 0) + { + pDict->Search("BitsPerComponent", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("BPC", &oDictItem); + } + if (oDictItem.IsInt()) + { + nBitsPerComponent = oDictItem.GetInt(); + } + else if (bMask) + { + nBitsPerComponent = 1; + } + else + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + oDictItem.Free(); + } + + if (bMask) + { + // У маски это значение nBitsPerComponent должно быть 1 + if (nBitsPerComponent != 1) + { + // TO DO: Error "Bad image parameters" + return; + } + bool bInvert = false; + pDict->Search("Decode", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("D", &oDictItem); + } + if (oDictItem.IsArray()) + { + Object oTemp; + oDictItem.ArrayGet(0, &oTemp); + if (oTemp.IsInt() && oTemp.GetInt() == 1) + bInvert = true; + oTemp.Free(); + } + else if (!oDictItem.IsNull()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + oDictItem.Free(); + + // Рисуем маску + m_pOut->DrawImageMask(m_pGState, pRef, pStream, nWidth, nHeight, bInvert, bInlineImage); + } + else + { + // ColorSpace + pDict->Search("ColorSpace", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("CS", &oDictItem); + } + if (oDictItem.IsName()) + { + Object oTemp; + m_pResources->LookupColorSpace(oDictItem.GetName(), &oTemp); + if (!oTemp.IsNull()) + { + oDictItem.Free(); + oDictItem = oTemp; + } + else + { + oTemp.Free(); + } + } + GrColorSpace *pColorSpace; + if (!oDictItem.IsNull()) + { + pColorSpace = GrColorSpace::Parse(&oDictItem); + } + else if (eCSMode == streamCSDeviceGray) + { + pColorSpace = new GrDeviceGrayColorSpace(); + } + else if (eCSMode == streamCSDeviceRGB) + { + pColorSpace = new GrDeviceRGBColorSpace(); + } + else if (eCSMode == streamCSDeviceCMYK) + { + pColorSpace = new GrDeviceCMYKColorSpace(); + } + else + { + pColorSpace = NULL; + } + oDictItem.Free(); + if (!pColorSpace) + { + // TO DO: Error "Bad image parameters" + return; + } + + // Decode + pDict->Search("Decode", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pDict->Search("D", &oDictItem); + } + GrImageColorMap *pColorMap = new GrImageColorMap(nBitsPerComponent, &oDictItem, pColorSpace); + oDictItem.Free(); + if (!pColorMap->IsValid()) + { + delete pColorMap; + // TO DO: Error "Bad image parameters" + return; + } + + // Mask/SMask + bool bHaveColorKeyMask = false, bHaveExplicitMask = false, bHaveSoftMask = false; + Stream *pMaskStream = NULL; + int nMaskWidth = 0, nMaskHeight = 0; + bool bMaskInvert = false; + GrImageColorMap *pMaskColorMap = NULL; + int arrMaskColors[2 * GrColorMaxComps]; + + Object oMask, oSMask; + pDict->Search("Mask", &oMask); + pDict->Search("SMask", &oSMask); + + Dict *pMaskDict = NULL; + + if (oSMask.IsStream()) + { + if (bInlineImage) + { + // Тут наверное нужно освободить память oMask, oSMask + // TO DO: Error "Bad image parameters" + return; + } + pMaskStream = oSMask.GetStream(); + pMaskDict = oSMask.StreamGetDict(); + + // Width + pMaskDict->Search("Width", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("W", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + nMaskWidth = oDictItem.GetInt(); + oDictItem.Free(); + + // Height + pMaskDict->Search("Height", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("H", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + nMaskHeight = oDictItem.GetInt(); + oDictItem.Free(); + + // BitsPerComponent + pMaskDict->Search("BitsPerComponent", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("BPC", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + int nMaskBitsPerComponent = oDictItem.GetInt(); + oDictItem.Free(); + + // ColorSpace + pMaskDict->Search("ColorSpace", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("CS", &oDictItem); + } + if (oDictItem.IsName()) + { + Object oTemp; + m_pResources->LookupColorSpace(oDictItem.GetName(), &oTemp); + if (!oTemp.IsNull()) + { + oDictItem.Free(); + oDictItem = oTemp; + } + else + { + oTemp.Free(); + } + } + GrColorSpace *pMaskColorSpace = GrColorSpace::Parse(&oDictItem); + oDictItem.Free(); + if (!pMaskColorSpace || pMaskColorSpace->GetMode() != csDeviceGray) + { + // TO DO: Error "Bad image parameters" + return; + } + + // Decode + pMaskDict->Search("Decode", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("D", &oDictItem); + } + pMaskColorMap = new GrImageColorMap(nMaskBitsPerComponent, &oDictItem, pMaskColorSpace); + oDictItem.Free(); + if (!pMaskColorMap->IsValid()) + { + delete pMaskColorMap; + // TO DO: Error "Bad image parameters" + return; + } + + bHaveSoftMask = true; + } + else if (oMask.IsArray()) + { + for (int nIndex = 0; nIndex < oMask.ArrayGetLength() && nIndex < 2 * GrColorMaxComps; ++nIndex) + { + Object oTemp; + oMask.ArrayGet(nIndex, &oTemp); + arrMaskColors[nIndex] = oTemp.GetInt(); + oTemp.Free(); + } + bHaveColorKeyMask = true; + } + else if (oMask.IsStream()) + { + if (bInlineImage) + { + // TO DO: Error "Bad image parameters" + return; + } + pMaskStream = oMask.GetStream(); + pMaskDict = oMask.StreamGetDict(); + + // Width + pMaskDict->Search("Width", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("W", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + nMaskWidth = oDictItem.GetInt(); + oDictItem.Free(); + + // Height + pMaskDict->Search("Height", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("H", &oDictItem); + } + if (!oDictItem.IsInt()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + nMaskHeight = oDictItem.GetInt(); + oDictItem.Free(); + + // ImageMask + pMaskDict->Search("ImageMask", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("IM", &oDictItem); + } + if (!oDictItem.IsBool() || !oDictItem.GetBool()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + oDictItem.Free(); + + // Decode + bMaskInvert = false; + pMaskDict->Search("Decode", &oDictItem); + if (oDictItem.IsNull()) + { + oDictItem.Free(); + pMaskDict->Search("D", &oDictItem); + } + if (oDictItem.IsArray()) + { + Object oTemp; + oDictItem.ArrayGet(0, &oTemp); + if (oTemp.IsInt() && oTemp.GetInt() == 1) + { + bMaskInvert = true; + } + oTemp.Free(); + } + else if (!oDictItem.IsNull()) + { + oDictItem.Free(); + // TO DO: Error "Bad image parameters" + return; + } + oDictItem.Free(); + bHaveExplicitMask = true; + } + + // Рисуем + if (bHaveSoftMask) + { + m_pOut->DrawSoftMaskedImage(m_pGState, pRef, pStream, nWidth, nHeight, pColorMap, pMaskStream, nMaskWidth, nMaskHeight, pMaskColorMap); + delete pMaskColorMap; + } + else if (bHaveExplicitMask) + { + m_pOut->DrawMaskedImage(m_pGState, pRef, pStream, nWidth, nHeight, pColorMap, pMaskStream, nMaskWidth, nMaskHeight, bMaskInvert); + } + else + { + m_pOut->DrawImage(m_pGState, pRef, pStream, nWidth, nHeight, pColorMap, bHaveColorKeyMask ? arrMaskColors : (int *)NULL, bInlineImage); + } + delete pColorMap; + + oMask.Free(); + oSMask.Free(); + } + + + int nUpdater = 0; + if ((nUpdater = nWidth * nHeight) > 1000) + { + nUpdater = 1000; + } + m_nUpdateLevel += nUpdater; + + return; + } + + void Graphics::DoForm(Object *pStream) + { + double arrMatrix[6], arrBBox[4]; + + // Проверяем глубину рекурсии + if (m_nFormDepth > 20) + { + return; + } + + Dict *pDict = pStream->StreamGetDict(); + Object oDictItem; + + // FormType + pDict->Search("FormType", &oDictItem); + if (!(oDictItem.IsNull() || (oDictItem.IsInt() && oDictItem.GetInt() == 1))) + { + // TO DO: Error "Unknown form type" + } + oDictItem.Free(); + + // BBox + Object oBBox; + pDict->Search("BBox", &oBBox); + if (!oBBox.IsArray()) + { + oBBox.Free(); + // TO DO: Error "Bad form bounding box" + return; + } + + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + Object oTemp; + oBBox.ArrayGet(nIndex, &oTemp); + arrBBox[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + oBBox.Free(); + + // Matrix + Object oMatrix; + pDict->Search("Matrix", &oMatrix); + if (oMatrix.IsArray()) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + Object oTemp; + oMatrix.ArrayGet(nIndex, &oTemp); + arrMatrix[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + arrMatrix[0] = 1; arrMatrix[1] = 0; + arrMatrix[2] = 0; arrMatrix[3] = 1; + arrMatrix[4] = 0; arrMatrix[5] = 0; + } + oMatrix.Free(); + + // Resources + Object oResources; + pDict->Search("Resources", &oResources); + Dict *pResourcesDict = oResources.IsDict() ? oResources.GetDict() : (Dict *)NULL; + + // Transparency Group + bool bTranspGroup = false, bIsolated = false, bKnockout = false; + GrColorSpace *pBlendingColorSpace = NULL; + if (pDict->Search("Group", &oDictItem)->IsDict()) + { + Object oTransp; + if (oDictItem.DictLookup("S", &oTransp)->IsName("Transparency")) + { + bTranspGroup = true; + Object oTemp; + if (!oDictItem.DictLookup("CS", &oTemp)->IsNull()) + { + pBlendingColorSpace = GrColorSpace::Parse(&oTemp); + } + oTemp.Free(); + if (oDictItem.DictLookup("I", &oTemp)->IsBool()) + { + bIsolated = oTemp.GetBool(); + } + oTemp.Free(); + if (oDictItem.DictLookup("K", &oTemp)->IsBool()) + { + bKnockout = oTemp.GetBool(); + } + oTemp.Free(); + } + oTransp.Free(); + } + oDictItem.Free(); + + // Рисуем + ++m_nFormDepth; + DoForm(pStream, pResourcesDict, arrMatrix, arrBBox, bTranspGroup, false, pBlendingColorSpace, bIsolated, bKnockout); + --m_nFormDepth; + + if (pBlendingColorSpace) + { + delete pBlendingColorSpace; + } + oResources.Free(); + } + + void Graphics::DoForm(Object *pStream, Dict *pResourcesDict, double *pMatrix, double *pBBox, bool bTranspGroup, bool bSMask, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bAlpha, Function *pTransferFunctions, GrColor *pBackdropColor) + { + // Записываем текущую директорию ресурсов в стек + PushResources(pResourcesDict); + + // Сохраняем текущий GState + SaveGState(); + + // Очищаем Path(если там что-то было) + m_pGState->ClearPath(); + + // Сохраняем текущий парсер + Parser *pOldParser = m_pParser; + + // CTM + m_pGState->ConcatCTM(pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); + m_pOut->UpdateCTM(m_pGState, pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); + + // BBox + m_pGState->MoveTo(pBBox[0], pBBox[1]); + m_pGState->LineTo(pBBox[2], pBBox[1]); + m_pGState->LineTo(pBBox[2], pBBox[3]); + m_pGState->LineTo(pBBox[0], pBBox[3]); + m_pGState->ClosePath(); + m_pGState->Clip(); + m_pGState->GetClip()->ClipToPath(m_pGState->GetPath()->Copy(), m_pGState->GetCTM(), false); + + if (m_pOut->UseClipTo()) + m_pOut->ClipToPath(m_pGState, m_pGState->GetPath(), m_pGState->GetCTM(), false); + else + m_pOut->Clip(m_pGState); + + m_pGState->ClearPath(); + + if (bSMask || bTranspGroup) + { + if (m_pGState->GetBlendMode() != grBlendNormal) + { + m_pGState->SetBlendMode(grBlendNormal); + m_pOut->UpdateBlendMode(m_pGState); + } + if (!m_pOut->UseSimpleTransparentGroup()) + { + if (m_pGState->GetFillOpacity() != 1) + { + m_pGState->SetFillOpacity(1); + m_pOut->UpdateFillOpacity(m_pGState); + } + if (m_pGState->GetStrokeOpacity() != 1) + { + m_pGState->SetStrokeOpacity(1); + m_pOut->UpdateStrokeOpacity(m_pGState); + } + } + m_pOut->ClearSoftMask(m_pGState); + m_pOut->BeginTransparencyGroup(m_pGState, pBBox, pBlendingColorSpace, bIsolated, bKnockout, bSMask); + } + + double arrOldBaseMatrix[6]; + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + arrOldBaseMatrix[nIndex] = m_arrBaseMatrix[nIndex]; + m_arrBaseMatrix[nIndex] = m_pGState->GetCTM()[nIndex]; + } + + // Рисуем саму форму + Display(pStream, false); + + if (bSMask || bTranspGroup) + { + m_pOut->EndTransparencyGroup(m_pGState); + } + + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrBaseMatrix[nIndex] = arrOldBaseMatrix[nIndex]; + } + + + // Восстанавливаем начальные данные + m_pParser = pOldParser; + RestoreGState(); + PopResources(); + + if (bSMask) + { + m_pOut->SetSoftMask(m_pGState, pBBox, bAlpha, pTransferFunctions, pBackdropColor); + } + else if (bTranspGroup) + { + m_pOut->PaintTransparencyGroup(m_pGState, pBBox); + } + + return; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Inline images + //------------------------------------------------------------------------------------------------------------------------------- + + // BI + void Graphics::OperatorBeginImage(Object arrArguments[], int nArgumentsCount) + { + Stream *pStream = BuildImageStream(); + + if (pStream) + { + DoImage(NULL, pStream, true); + + // Ищем оператор EI + int nChar1 = pStream->GetUndecodedStream()->GetChar(); + int nChar2 = pStream->GetUndecodedStream()->GetChar(); + + while (!(nChar1 == 'E' && nChar2 == 'I') && nChar2 != EOF) + { + nChar1 = nChar2; + nChar2 = pStream->GetUndecodedStream()->GetChar(); + } + delete pStream; + } + } + + // ID + void Graphics::OperatorImageData(Object arrArguments[], int nArgumentsCount) + { + // TO DO: Error "Internal: got 'ID' operator" + } + + // EI + void Graphics::OperatorEndImage(Object arrArguments[], int nArgumentsCount) + { + // TO DO: Error "Internal: got 'EI' operator" + } + + //------------------------------------------------------------------------------------------------------------------------------- + Stream *Graphics::BuildImageStream() + { + Object oDict; + oDict.InitDict(m_pXref); + Object oObject; + m_pParser->GetObject(&oObject); + + while (!oObject.IsCommand("ID") && !oObject.IsEOF()) + { + if (!oObject.IsName()) + { + // TO DO: Error "Inline image dictionary key must be a name object" + oObject.Free(); + } + else + { + char* sKey = CopyString(oObject.GetName()); + oObject.Free(); + m_pParser->GetObject(&oObject); + if (oObject.IsEOF() || oObject.IsError()) + { + MemUtilsFree(sKey); + break; + } + oDict.DictAdd(sKey, &oObject); + } + m_pParser->GetObject(&oObject); + } + if (oObject.IsEOF()) + { + // TO DO: Error "End of file in inline image" + oObject.Free(); + oDict.Free(); + return NULL; + } + oObject.Free(); + + Stream *pStream = new EmbedStream(m_pParser->GetStream(), &oDict, false, 0); + pStream = pStream->AddFilters(&oDict); + + return pStream; + } + + + //------------------------------------------------------------------------------------------------------------------------------- + // Type 3 fonts + //------------------------------------------------------------------------------------------------------------------------------- + + // d0 + void Graphics::OperatorSetCharWidth(Object arrArguments[], int nArgumentsCount) + { + m_pOut->Type3D0(m_pGState, arrArguments[0].GetNum(), arrArguments[1].GetNum()); + } + + // d1 + void Graphics::OperatorSetCacheDevice(Object arrArguments[], int nArgumentsCount) + { + m_pOut->Type3D1(m_pGState, arrArguments[0].GetNum(), arrArguments[1].GetNum(), arrArguments[2].GetNum(), arrArguments[3].GetNum(), arrArguments[4].GetNum(), arrArguments[5].GetNum()); + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Compatibility + //------------------------------------------------------------------------------------------------------------------------------- + + // BX + void Graphics::OperatorBeginIgnoreUndef(Object arrArguments[], int nArgumentsCount) + { + ++m_nIgnoreUndef; + } + + // EX + void Graphics::OperatorEndIgnoreUndef(Object arrArguments[], int nArgumentsCount) + { + if (m_nIgnoreUndef > 0) + --m_nIgnoreUndef; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Marked content + //------------------------------------------------------------------------------------------------------------------------------- + + // BDC/BMC + void Graphics::OperatorBeginMarkedContent(Object arrArguments[], int nArgumentsCount) + { + } + + // EMC + void Graphics::OperatorEndMarkedContent(Object arrArguments[], int nArgumentsCount) + { + } + + // DP/MP + void Graphics::OperatorMarkPoint(Object arrArguments[], int nArgumentsCount) + { + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Дополнительные функции + //------------------------------------------------------------------------------------------------------------------------------- + + void Graphics::DrawAnnotation(Object *pStream, AnnotBorderStyle *pBorderStyle, double dMinX, double dMinY, double dMaxX, double dMaxY) + { + double dX, dY; + + // Преобразовываем Annotation BBox из стандартного пользовательского пространства в + // текущее пользовательское пространство: (BBox * BaseMatrix) * InvCTM + double *pCTM = m_pGState->GetCTM(); + double dDet = 1 / (pCTM[0] * pCTM[3] - pCTM[1] * pCTM[2]); + double arrInvCTM[6]; + arrInvCTM[0] = pCTM[3] * dDet; + arrInvCTM[1] = -pCTM[1] * dDet; + arrInvCTM[2] = -pCTM[2] * dDet; + arrInvCTM[3] = pCTM[0] * dDet; + arrInvCTM[4] = (pCTM[2] * pCTM[5] - pCTM[3] * pCTM[4]) * dDet; + arrInvCTM[5] = (pCTM[1] * pCTM[4] - pCTM[0] * pCTM[5]) * dDet; + + dX = m_arrBaseMatrix[0] * dMinX + m_arrBaseMatrix[2] * dMinY + m_arrBaseMatrix[4]; + dY = m_arrBaseMatrix[1] * dMinX + m_arrBaseMatrix[3] * dMinY + m_arrBaseMatrix[5]; + double dAnnotX0 = arrInvCTM[0] * dX + arrInvCTM[2] * dY + arrInvCTM[4]; + double dAnnotY0 = arrInvCTM[1] * dX + arrInvCTM[3] * dY + arrInvCTM[5]; + + dX = m_arrBaseMatrix[0] * dMaxX + m_arrBaseMatrix[2] * dMaxY + m_arrBaseMatrix[4]; + dY = m_arrBaseMatrix[1] * dMaxX + m_arrBaseMatrix[3] * dMaxY + m_arrBaseMatrix[5]; + double dAnnotX1 = arrInvCTM[0] * dX + arrInvCTM[2] * dY + arrInvCTM[4]; + double dAnnotY1 = arrInvCTM[1] * dX + arrInvCTM[3] * dY + arrInvCTM[5]; + + if (dAnnotX0 > dAnnotX1) + { + dX = dAnnotX0; + dAnnotX0 = dAnnotX1; + dAnnotX1 = dX; + } + if (dAnnotY0 > dAnnotY1) + { + dY = dAnnotY0; + dAnnotY0 = dAnnotY1; + dAnnotY1 = dY; + } + + if (pStream->IsStream()) + { + Dict *pDict = pStream->StreamGetDict(); + + // BBox + Object oBBox; + pDict->Search("BBox", &oBBox); + double arrBBox[4]; + if (!oBBox.IsArray()) + { + oBBox.Free(); + // TO DO: Error "Bad form bounding box" + return; + } + for (int nIndex = 0; nIndex < 4; ++nIndex) + { + Object oTemp; + oBBox.ArrayGet(nIndex, &oTemp); + arrBBox[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + oBBox.Free(); + + // Matrix + Object oMatrix; + pDict->Search("Matrix", &oMatrix); + double arrMatrix[6]; + if (oMatrix.IsArray()) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + Object oTemp; + oMatrix.ArrayGet(nIndex, &oTemp); + arrMatrix[nIndex] = oTemp.GetNum(); + oTemp.Free(); + } + } + else + { + arrMatrix[0] = 1; arrMatrix[1] = 0; + arrMatrix[2] = 0; arrMatrix[3] = 1; + arrMatrix[4] = 0; arrMatrix[5] = 0; + } + oMatrix.Free(); + + double dFormX0 = arrBBox[0] * arrMatrix[0] + arrBBox[1] * arrMatrix[2] + arrMatrix[4]; + double dFormY0 = arrBBox[0] * arrMatrix[1] + arrBBox[1] * arrMatrix[3] + arrMatrix[5]; + double dFormX1 = arrBBox[2] * arrMatrix[0] + arrBBox[3] * arrMatrix[2] + arrMatrix[4]; + double dFormY1 = arrBBox[2] * arrMatrix[1] + arrBBox[3] * arrMatrix[3] + arrMatrix[5]; + + if (dFormX0 > dFormX1) + { + dX = dFormX0; + dFormX0 = dFormX1; + dFormX1 = dX; + } + if (dFormY0 > dFormY1) + { + dY = dFormY0; + dFormY0 = dFormY1; + dFormY1 = dY; + } + + // Растягиваем до размеров Annotation BBox + double dScaleX, dScaleY; + if (dFormX1 == dFormX0) + { + // Такого не должно быть + dScaleX = 1; + } + else + { + dScaleX = (dAnnotX1 - dAnnotX0) / (dFormX1 - dFormX0); + } + if (dFormY1 == dFormY0) + { + // Такого не должно быть + dScaleY = 1; + } + else + { + dScaleY = (dAnnotY1 - dAnnotY0) / (dFormY1 - dFormY0); + } + + arrMatrix[0] *= dScaleX; + arrMatrix[2] *= dScaleX; + arrMatrix[4] = (arrMatrix[4] - dFormX0) * dScaleX + dAnnotX0; + arrMatrix[1] *= dScaleY; + arrMatrix[3] *= dScaleY; + arrMatrix[5] = (arrMatrix[5] - dFormY0) * dScaleY + dAnnotY0; + + // Resources + Object oResources; + pDict->Search("Resources", &oResources); + Dict *pResourcesDict = oResources.IsDict() ? oResources.GetDict() : (Dict *)NULL; + + // Рисуем + DoForm(pStream, pResourcesDict, arrMatrix, arrBBox); + + oResources.Free(); + } + + // Рисуем рамку + if (pBorderStyle && pBorderStyle->GetWidth() > 0) + { + if (m_pGState->GetStrokeColorSpace()->GetMode() != csDeviceRGB) + { + m_pGState->SetStrokePattern(NULL); + m_pGState->SetStrokeColorSpace(new GrDeviceRGBColorSpace()); + m_pOut->UpdateStrokeColorSpace(m_pGState); + } + double dR, dG, dB; + pBorderStyle->GetColor(&dR, &dG, &dB); + GrColor oColor; + oColor.arrComp[0] = DoubleToColor(dR); + oColor.arrComp[1] = DoubleToColor(dG); + oColor.arrComp[2] = DoubleToColor(dB); + m_pGState->SetStrokeColor(&oColor); + m_pOut->UpdateStrokeColor(m_pGState); + + dX = (m_arrBaseMatrix[0] + m_arrBaseMatrix[2]) * arrInvCTM[0] + (m_arrBaseMatrix[1] + m_arrBaseMatrix[3]) * arrInvCTM[2]; + dY = (m_arrBaseMatrix[0] + m_arrBaseMatrix[2]) * arrInvCTM[1] + (m_arrBaseMatrix[1] + m_arrBaseMatrix[3]) * arrInvCTM[3]; + dX = sqrt(0.5 * (dX * dX + dY * dY)); + m_pGState->SetLineWidth(dX * pBorderStyle->GetWidth()); + m_pOut->UpdateLineWidth(m_pGState); + + double *pDash; + int nDashLength; + + pBorderStyle->GetDash(&pDash, &nDashLength); + + if (pBorderStyle->GetType() == annotBorderDashed && nDashLength > 0) + { + double *pDashNew = (double *)MemUtilsMallocArray(nDashLength, sizeof(double)); + for (int nIndex = 0; nIndex < nDashLength; ++nIndex) + { + pDashNew[nIndex] = dX * pDash[nIndex]; + } + m_pGState->SetLineDash(pDashNew, nDashLength, 0); + m_pOut->UpdateLineDash(m_pGState); + } + + m_pGState->ClearPath(); + m_pGState->MoveTo(dAnnotX0, m_pOut->UpSideDown() ? dAnnotY1 : dAnnotY0); + m_pGState->LineTo(dAnnotX1, m_pOut->UpSideDown() ? dAnnotY1 : dAnnotY0); + if (pBorderStyle->GetType() != annotBorderUnderlined) + { + m_pGState->LineTo(dAnnotX1, m_pOut->UpSideDown() ? dAnnotY0 : dAnnotY1); + m_pGState->LineTo(dAnnotX0, m_pOut->UpSideDown() ? dAnnotY0 : dAnnotY1); + m_pGState->ClosePath(); + } + m_pOut->Stroke(m_pGState); + } + } + //------------------------------------------------------------------------------------------------------------------------------- + // Работаем со стеками GState и ResourcesDict + //------------------------------------------------------------------------------------------------------------------------------- + void Graphics::SaveGState() + { + m_pOut->SaveGState(m_pGState); + m_pGState = m_pGState->Save(); + } + + void Graphics::RestoreGState() + { + m_pGState = m_pGState->Restore(); + m_pOut->RestoreGState(m_pGState); + } + + void Graphics::PushResources(Dict *pResourcesDict) + { + m_pResources = new GrResources(m_pXref, pResourcesDict, m_pResources, m_pGlobalParams); + } + + void Graphics::PopResources() + { + if (m_pResources) + { + GrResources *pResourcesNext = m_pResources->GetNext(); + delete m_pResources; + m_pResources = pResourcesNext; + } + else + m_pResources = NULL; + } +} \ No newline at end of file diff --git a/PdfReader/Src/Graphics.h b/PdfReader/Src/Graphics.h new file mode 100644 index 0000000000..1434de990f --- /dev/null +++ b/PdfReader/Src/Graphics.h @@ -0,0 +1,293 @@ +#ifndef _PDF_READER_GRAPHICS_H +#define _PDF_READER_GRAPHICS_H + +#include "GlobalParams.h" + +namespace PdfReader +{ + class StringExt; + class XRef; + class Array; + class Stream; + class Parser; + class Dict; + class Function; + class OutputDev; + class GrFontDict; + class GrFont; + class GrPattern; + class GrTilingPattern; + class GrShadingPattern; + class GrShading; + class GrFunctionShading; + class GrAxialShading; + class GrRadialShading; + class GrGouraudTriangleShading; + class GrPatchMeshShading; + struct GrPatch; + class GrState; + struct GrColor; + class GrColorSpace; + class Graphics; + class PDFRectangle; + class AnnotBorderStyle; + + //------------------------------------------------------------------------------------------------------------------------------- + + enum GrClipType + { + clipNone, + clipNormal, + clipEO + }; + + enum ArgType + { + argBool, // Boolean + argInt, // Integer + argNum, // Number (integer or real) + argString, // String + argName, // Name + argArray, // Array + argProps, // Properties (Dictionary или Name) + argSCN, // scn/SCN + argNone // используется, чтобы избежать пустых полей при инициализации + }; + +#define maxArgs 33 + + struct Operator + { + char sName[4]; + int nArgumentsCount; + ArgType arrArguments[maxArgs]; + void (Graphics::*pFunction)(Object pArgs[], int nArgsCount); + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // GrResources + //------------------------------------------------------------------------------------------------------------------------------- + + class GrResources + { + public: + + GrResources(XRef *pXref, Dict *pResourcesDict, GrResources *pNext, GlobalParams *pGlobalParams); + ~GrResources(); + + GrFont *LookupFont(char *sName); + bool LookupXObject(char *sName, Object *pObject); + bool LookupAndCopyXObject(char *sName, Object *pObject); + void LookupColorSpace(char *sName, Object *pObject); + GrPattern *LookupPattern(char *sName); + GrShading *LookupShading(char *sName); + bool LookupExtGState(char *sName, Object *pObject); + + GrResources *GetNext() + { + return m_pNext; + } + + private: + + GrFontDict *m_pFonts; + Object m_oXObjectDict; + Object m_oColorSpaceDict; + Object m_oPatternDict; + Object m_oShadingDict; + Object m_oExtGStateDict; + GrResources *m_pNext; + + GlobalParams *m_pGlobalParams; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Graphics + //------------------------------------------------------------------------------------------------------------------------------- + + class Graphics + { + public: + + Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, int nPageNumber, Dict *pResourcesDict, double dHorDPI, double dVerDPI, PDFRectangle *pBox, PDFRectangle *pCropBox, int nRotate, bool(*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL); + + Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, Dict *pResourcesDict, PDFRectangle *pBox, PDFRectangle *pCropBox, bool(*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL); + + ~Graphics(); + + // Инициализируем Парсер по pObject, предварительно проводим проверку: Является ли pObject потоком или массивом потоков. + void Display(Object *pObject, bool bTopLevel = true); + + // Рисуем annotation + void DrawAnnotation(Object *pStream, AnnotBorderStyle *pBorderStyle, double dMinX, double dMinY, double dMaxX, double dMaxY); + + // Сохраняем GState. + void SaveGState(); + + // Восстанавливаем предыдущий GState. + void RestoreGState(); + + // Считываем текущий GState. + GrState *GetGState() + { + return m_pGState; + } + + private: + + void StartParse(bool bTopLevel); + void ExecuteOperator(Object *pCommand, Object arrArguments[], int nArgumentsCount); + Operator *FindOperator(char *sName); + bool CheckArgumentType(Object *pArgument, ArgType eType); + int GetPos(); + + // Graphics state + void OperatorSave(Object arrArguments[], int nArgumentsCount); + void OperatorRestore(Object arrArguments[], int nArgumentsCount); + void OperatorConcat(Object arrArguments[], int nArgumentsCount); + void OperatorSetDash(Object arrArguments[], int nArgumentsCount); + void OperatorSetFlat(Object arrArguments[], int nArgumentsCount); + void OperatorSetLineJoin(Object arrArguments[], int nArgumentsCount); + void OperatorSetLineCap(Object arrArguments[], int nArgumentsCount); + void OperatorSetMiterLimit(Object arrArguments[], int nArgumentsCount); + void OperatorSetLineWidth(Object arrArguments[], int nArgumentsCount); + void OperatorSetRenderingIntent(Object arrArguments[], int nArgumentsCount); + void OperatorSetExtGState(Object arrArguments[], int nArgumentsCount); + void MakeSoftMask(Object *pStream, bool bAlpha, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, Function *pTransferFunc, GrColor *pBackdropColor); + + // Colour spaces + void OperatorSetFillGray(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeGray(Object arrArguments[], int nArgumentsCount); + void OperatorSetFillCMYKColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeCMYKColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetFillRGBColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeRGBColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetFillColorSpace(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeColorSpace(Object arrArguments[], int nArgumentsCount); + void OperatorSetFillColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeColor(Object arrArguments[], int nArgumentsCount); + void OperatorSetFillColorN(Object arrArguments[], int nArgumentsCount); + void OperatorSetStrokeColorN(Object arrArguments[], int nArgumentsCount); + + // Path construction + void OperatorMoveTo(Object arrArguments[], int nArgumentsCount); + void OperatorLineTo(Object arrArguments[], int nArgumentsCount); + void OperatorCurveTo(Object arrArguments[], int nArgumentsCount); + void OperatorCurveTo1(Object arrArguments[], int nArgumentsCount); + void OperatorCurveTo2(Object arrArguments[], int nArgumentsCount); + void OperatorRectangle(Object arrArguments[], int nArgumentsCount); + void OperatorClosePath(Object arrArguments[], int nArgumentsCount); + + // Path-painting + void OperatorEndPath(Object arrArguments[], int nArgumentsCount); + void OperatorStroke(Object arrArguments[], int nArgumentsCount); + void OperatorCloseStroke(Object arrArguments[], int nArgumentsCount); + void OperatorFill(Object arrArguments[], int nArgumentsCount); + void OperatorEOFill(Object arrArguments[], int nArgumentsCount); + void OperatorFillStroke(Object arrArguments[], int nArgumentsCount); + void OperatorCloseFillStroke(Object arrArguments[], int nArgumentsCount); + void OperatorEOFillStroke(Object arrArguments[], int nArgumentsCount); + void OperatorCloseEOFillStroke(Object arrArguments[], int nArgumentsCount); + void OperatorShadingFill(Object arrArguments[], int nArgumentsCount); + void DoPatternFill(bool bEOFill); + void DoPatternStroke(); + void DoTilingPatternFill(GrTilingPattern *pPattern, bool bStroke, bool bEOFill); + void DoShadingPatternFill(GrShadingPattern *pPattern, bool bStroke, bool bEOFill); + void DoFunctionShadingFill(GrFunctionShading *pShading); + void DoFunctionShadingFill(GrFunctionShading *pShading, double dMinX, double dMinY, double dMaxX, double dMaxY, GrColor *pColors, int nDepth); + void DoAxialShadingFill(GrAxialShading *pShading); + void DoRadialShadingFill(GrRadialShading *pShading); + void DoGouraudTriangleShadingFill(GrGouraudTriangleShading *pShading); + void GouraudFillTriangle(double dAx, double dAy, GrColor *pColorA, double dBx, double dBy, GrColor *pColorB, double dCx, double dCy, GrColor *pColorC, int nComponentsCount, int nDepth); + void DoPatchMeshShadingFill(GrPatchMeshShading *pShading); + void MeshFillPatch(GrPatch *pPatch, int nComponentsCount, int nDepth); + void DoEndPath(); + + // Clipping paths + void OperatorClip(Object arrArguments[], int nArgumentsCount); + void OperatorEOClip(Object arrArguments[], int nArgumentsCount); + + // Text objects + void OperatorBeginText(Object arrArguments[], int nArgumentsCount); + void OperatorEndText(Object arrArguments[], int nArgumentsCount); + + // Text state + void OperatorSetCharSpacing(Object arrArguments[], int nArgumentsCount); + void OperatorSetFont(Object arrArguments[], int nArgumentsCount); + void OperatorSetTextLeading(Object arrArguments[], int nArgumentsCount); + void OperatorSetTextRender(Object arrArguments[], int nArgumentsCount); + void OperatorSetTextRise(Object arrArguments[], int nArgumentsCount); + void OperatorSetWordSpacing(Object arrArguments[], int nArgumentsCount); + void OperatorSetHorizScaling(Object arrArguments[], int nArgumentsCount); + + // Text positioning + void OperatorTextMove(Object arrArguments[], int nArgumentsCount); + void OperatorTextMoveSet(Object arrArguments[], int nArgumentsCount); + void OperatorSetTextMatrix(Object arrArguments[], int nArgumentsCount); + void OperatorTextNextLine(Object arrArguments[], int nArgumentsCount); + + // Text showing + void OperatorShowText(Object arrArguments[], int nArgumentsCount); + void OperatorMoveShowText(Object arrArguments[], int nArgumentsCount); + void OperatorMoveSetShowText(Object arrArguments[], int nArgumentsCount); + void OperatorShowSpaceText(Object arrArguments[], int nArgumentsCount); + void DoShowText(StringExt *seString); + + // XObjects + void OperatorXObject(Object arrArguments[], int nArgumentsCount); + void DoImage(Object *pRef, Stream *pStream, bool bInlineImage); + void DoForm(Object *pStream); + void DoForm(Object *pStream, Dict *pResourcesDict, double *pMatrix, double *pBBox, bool bTranspGroup = false, bool bSoftMask = false, GrColorSpace *pBlendingColorSpace = NULL, bool bIsolated = false, bool bKnockout = false, bool bAlpha = false, Function *pTransferFunctions = NULL, GrColor *pBackdropColor = NULL); + + // Inline images + void OperatorBeginImage(Object arrArguments[], int nArgumentsCount); + void OperatorImageData(Object arrArguments[], int nArgumentsCount); + void OperatorEndImage(Object arrArguments[], int nArgumentsCount); + Stream *BuildImageStream(); + + // Type 3 fonts + void OperatorSetCharWidth(Object arrArguments[], int nArgumentsCount); + void OperatorSetCacheDevice(Object arrArguments[], int nArgumentsCount); + + // Compatibility + void OperatorBeginIgnoreUndef(Object arrArguments[], int nArgumentsCount); + void OperatorEndIgnoreUndef(Object arrArguments[], int nArgumentsCount); + + // Marked content + void OperatorBeginMarkedContent(Object arrArguments[], int nArgumentsCount); + void OperatorEndMarkedContent(Object arrArguments[], int nArgumentsCount); + void OperatorMarkPoint(Object arrArguments[], int nArgumentsCount); + + void PushResources(Dict *pResourcesDict); + void PopResources(); + + private: + + XRef *m_pXref; // Таблица Xref для данного PDF - документа + OutputDev *m_pOut; // Output device + bool m_bSubPage; // Sub-page object? + GrResources *m_pResources; // Resources + int m_nUpdateLevel; + + GrState *m_pGState; // Текущий GState + bool m_bFontChanged; // True, если шрифт или текстовая матрица изменились + GrClipType m_eClip; // Clip type + int m_nIgnoreUndef; // Текущий уровень вложенности для BX/EX + double m_arrBaseMatrix[6]; // Стандартная матрица для последних объектов Page/Form/Pattern + int m_nFormDepth; + + Parser *m_pParser; // Парсер для содержимого страницы + + bool(*m_pAbortCheckCallBack)(void *pData); // Проверка на отмену + void *m_pAbortCheckData; + + static Operator OperatorsTable[]; // Таблица графических операторов + +#ifdef _DEBUG + FILE *m_pDumpFile; // Файл для распечатки команд, записанных в PDF +#endif + + GlobalParams *m_pGlobalParams; + }; +} +#endif // _PDF_READER_GRAPHICS_H diff --git a/PdfReader/Src/Hash.cpp b/PdfReader/Src/Hash.cpp new file mode 100644 index 0000000000..65a6ea0d00 --- /dev/null +++ b/PdfReader/Src/Hash.cpp @@ -0,0 +1,376 @@ +#include "MemoryUtils.h" +#include "StringExt.h" +#include "Hash.h" + +namespace PdfReader +{ + struct THashBucket + { + StringExt *seKey; + union + { + void *p; + int i; + } uValue; + THashBucket *pNext; + }; + + struct THashIter + { + int nHashIndex; + THashBucket *pBucket; + }; + + //------------------------------------------------------------------------ + + CHash::CHash(bool bDeleteKeys) + { + m_bDeleteKeys = bDeleteKeys; + m_nBucketsCount = 7; + m_ppTable = (THashBucket **)MemUtilsMallocArray(m_nBucketsCount, sizeof(THashBucket *)); + for (int nHashIndex = 0; nHashIndex < m_nBucketsCount; ++nHashIndex) + m_ppTable[nHashIndex] = NULL; + m_nLength = 0; + } + + CHash::~CHash() + { + THashBucket *pBucket = NULL; + + for (int nHashIndex = 0; nHashIndex < m_nBucketsCount; ++nHashIndex) + { + while (m_ppTable[nHashIndex]) + { + pBucket = m_ppTable[nHashIndex]; + m_ppTable[nHashIndex] = pBucket->pNext; + if (m_bDeleteKeys) + { + delete pBucket->seKey; + } + delete pBucket; + } + } + MemUtilsFree(m_ppTable); + } + + void CHash::Add(StringExt *seKey, void *pValue) + { + if (m_nLength >= m_nBucketsCount) + Expand(); + + THashBucket *pBucket = new THashBucket; + pBucket->seKey = seKey; + pBucket->uValue.p = pValue; + int nHashIndex = Hash(seKey); + pBucket->pNext = m_ppTable[nHashIndex]; + m_ppTable[nHashIndex] = pBucket; + ++m_nLength; + } + + void CHash::Add(StringExt *seKey, int nValue) + { + if (m_nLength >= m_nBucketsCount) + Expand(); + + THashBucket *pBucket = new THashBucket; + pBucket->seKey = seKey; + pBucket->uValue.i = nValue; + int nHashIndex = Hash(seKey); + pBucket->pNext = m_ppTable[nHashIndex]; + m_ppTable[nHashIndex] = pBucket; + ++m_nLength; + } + + void CHash::Replace(StringExt *seKey, void *pValue) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if ((pBucket = Find(seKey, &nHashIndex))) + { + pBucket->uValue.p = pValue; + delete seKey; + } + else + Add(seKey, pValue); + } + + void CHash::Replace(StringExt *seKey, int nValue) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if ((pBucket = Find(seKey, &nHashIndex))) + { + pBucket->uValue.i = nValue; + delete seKey; + } + else + Add(seKey, nValue); + } + + void *CHash::Lookup(StringExt *seKey) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if (!(pBucket = Find(seKey, &nHashIndex))) + return NULL; + return pBucket->uValue.p; + } + + int CHash::LookupInt(StringExt *seKey) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if (!(pBucket = Find(seKey, &nHashIndex))) + return 0; + + return pBucket->uValue.i; + } + + void *CHash::Lookup(char *sKey) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if (!(pBucket = Find(sKey, &nHashIndex))) + return NULL; + return pBucket->uValue.p; + } + + int CHash::LookupInt(char *sKey) + { + THashBucket *pBucket = NULL; + int nHashIndex = 0; + + if (!(pBucket = Find(sKey, &nHashIndex))) + return 0; + + return pBucket->uValue.i; + } + + void *CHash::Remove(StringExt *seKey) + { + THashBucket *pBucket; + THashBucket **ppBucket; + int nHashIndex = 0; + + if (!(pBucket = Find(seKey, &nHashIndex))) + return NULL; + + ppBucket = &m_ppTable[nHashIndex]; + while (*ppBucket != pBucket) + ppBucket = &((*ppBucket)->pNext); + + *ppBucket = pBucket->pNext; + if (m_bDeleteKeys) + delete pBucket->seKey; + void *pValue = pBucket->uValue.p; + delete pBucket; + --m_nLength; + return pValue; + } + + int CHash::RemoveInt(StringExt *seKey) + { + THashBucket *pBucket; + THashBucket **ppBucket; + int nHashIndex = 0; + + if (!(pBucket = Find(seKey, &nHashIndex))) + return 0; + + ppBucket = &m_ppTable[nHashIndex]; + while (*ppBucket != pBucket) + ppBucket = &((*ppBucket)->pNext); + + *ppBucket = pBucket->pNext; + if (m_bDeleteKeys) + delete pBucket->seKey; + + int nValue = pBucket->uValue.i; + delete pBucket; + --m_nLength; + return nValue; + } + + void *CHash::Remove(char *sKey) + { + THashBucket *pBucket; + THashBucket **ppBucket; + int nHashIndex = 0; + + if (!(pBucket = Find(sKey, &nHashIndex))) + return NULL; + ppBucket = &m_ppTable[nHashIndex]; + while (*ppBucket != pBucket) + ppBucket = &((*ppBucket)->pNext); + + *ppBucket = pBucket->pNext; + + if (m_bDeleteKeys) + delete pBucket->pNext; + + void *pValue = pBucket->uValue.p; + delete pBucket; + --m_nLength; + return pValue; + } + + int CHash::RemoveInt(char *sKey) + { + THashBucket *pBucket; + THashBucket **ppBucket; + int nHashIndex = 0; + + if (!(pBucket = Find(sKey, &nHashIndex))) + return 0; + + ppBucket = &m_ppTable[nHashIndex]; + while (*ppBucket != pBucket) + ppBucket = &((*ppBucket)->pNext); + + *ppBucket = pBucket->pNext; + if (m_bDeleteKeys) + delete pBucket->seKey; + + int nValue = pBucket->uValue.i; + delete pBucket; + --m_nLength; + return nValue; + } + + void CHash::StartIter(THashIter **ppIter) + { + *ppIter = new THashIter; + (*ppIter)->nHashIndex = -1; + (*ppIter)->pBucket = NULL; + } + + bool CHash::GetNext(THashIter **ppIter, StringExt **pseKey, void **ppValue) + { + if (!*ppIter) + return false; + + if ((*ppIter)->pBucket) + (*ppIter)->pBucket = (*ppIter)->pBucket->pNext; + + while (!(*ppIter)->pBucket) + { + if (++(*ppIter)->nHashIndex == m_nBucketsCount) + { + delete *ppIter; + *ppIter = NULL; + return false; + } + (*ppIter)->pBucket = m_ppTable[(*ppIter)->nHashIndex]; + } + *pseKey = (*ppIter)->pBucket->seKey; + *ppValue = (*ppIter)->pBucket->uValue.p; + return true; + } + + bool CHash::GetNext(THashIter **ppIter, StringExt **pseKey, int *pnValue) + { + if (!*ppIter) + return false; + + if ((*ppIter)->pBucket) + (*ppIter)->pBucket = (*ppIter)->pBucket->pNext; + + while (!(*ppIter)->pBucket) + { + if (++(*ppIter)->nHashIndex == m_nBucketsCount) + { + delete *ppIter; + *ppIter = NULL; + return false; + } + (*ppIter)->pBucket = m_ppTable[(*ppIter)->nHashIndex]; + } + *pseKey = (*ppIter)->pBucket->seKey; + *pnValue = (*ppIter)->pBucket->uValue.i; + return true; + } + + void CHash::DeleteIter(THashIter **ppIter) + { + delete *ppIter; + *ppIter = NULL; + } + + void CHash::Expand() + { + int nHashIndex = 0; + + int nOldSize = m_nBucketsCount; + THashBucket **ppOldTab = m_ppTable; + m_nBucketsCount = 2 * m_nBucketsCount + 1; + m_ppTable = (THashBucket **)MemUtilsMallocArray(m_nBucketsCount, sizeof(THashBucket *)); + for (nHashIndex = 0; nHashIndex < m_nBucketsCount; ++nHashIndex) + m_ppTable[nHashIndex] = NULL; + + for (int nIndex = 0; nIndex < nOldSize; ++nIndex) + { + while (ppOldTab[nIndex]) + { + THashBucket *pBucket = ppOldTab[nIndex]; + ppOldTab[nIndex] = ppOldTab[nIndex]->pNext; + nHashIndex = Hash(pBucket->seKey); + pBucket->pNext = m_ppTable[nHashIndex]; + m_ppTable[nHashIndex] = pBucket; + } + } + MemUtilsFree(ppOldTab); + } + + THashBucket *CHash::Find(StringExt *seKey, int *pnHashIndex) + { + THashBucket *pBucket; + + *pnHashIndex = Hash(seKey); + for (pBucket = m_ppTable[*pnHashIndex]; pBucket; pBucket = pBucket->pNext) + { + if (!pBucket->seKey->Compare(seKey)) + return pBucket; + } + return NULL; + } + THashBucket *CHash::Find(char *sKey, int *pnHashIndex) + { + THashBucket *pBucket; + + *pnHashIndex = Hash(sKey); + for (pBucket = m_ppTable[*pnHashIndex]; pBucket; pBucket = pBucket->pNext) + { + if (!pBucket->seKey->Compare(sKey)) + return pBucket; + } + return NULL; + } + + int CHash::Hash(StringExt *seKey) + { + char *sTemp; + unsigned int nHash = 0; + int nIndex; + + for (sTemp = seKey->GetBuffer(), nIndex = 0; nIndex < seKey->GetLength(); ++sTemp, ++nIndex) + nHash = 17 * nHash + (int)(*sTemp & 0xff); + + return (int)(nHash % m_nBucketsCount); + } + + int CHash::Hash(char *sKey) + { + char *sTemp; + unsigned int nHash = 0; + + for (sTemp = sKey; *sTemp; ++sTemp) + nHash = 17 * nHash + (int)(*sTemp & 0xff); + + return (int)(nHash % m_nBucketsCount); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Hash.h b/PdfReader/Src/Hash.h new file mode 100644 index 0000000000..700a744ad8 --- /dev/null +++ b/PdfReader/Src/Hash.h @@ -0,0 +1,86 @@ +#ifndef _PDF_READER_HASH_H +#define _PDF_READER_HASH_H + +namespace PdfReader +{ + class StringExt; + struct THashBucket; + struct THashIter; + + //------------------------------------------------------------------------ + // CHash + //------------------------------------------------------------------------ + + class CHash + { + + public: + + CHash(bool bDeleteKeys = false); + ~CHash(); + + void Add(StringExt *seKey, void *pValue); + void Add(StringExt *seKey, int nValue); + + void Replace(StringExt *seKey, void *pValue); + void Replace(StringExt *seKey, int nValue); + + void *Lookup(StringExt *seKey); + void *Lookup(char *sKey); + int LookupInt(StringExt *seKey); + int LookupInt(char *sKey); + + void *Remove(StringExt *seKey); + void *Remove(char *seKey); + int RemoveInt(StringExt *seKey); + int RemoveInt(char *sKey); + + int GetLength() + { + return m_nLength; + } + + void StartIter(THashIter **ppIter); + + bool GetNext(THashIter **ppIter, StringExt **pseKey, void **ppValue); + bool GetNext(THashIter **ppIter, StringExt **pseKey, int *pnValue); + + void DeleteIter(THashIter **ppIter); + + private: + + void Expand(); + THashBucket *Find(StringExt *seKey, int *pnHashIndex); + THashBucket *Find(char *sKey, int *pnHashIndex); + + int Hash(StringExt *seKey); + int Hash(char *sKey); + + private: + + bool m_bDeleteKeys; // Будем ли удалять имена? set if key strings should be deleted + int m_nBucketsCount; // Количество наборов + int m_nLength; // Количество вхождений + THashBucket **m_ppTable; + }; + +#define DeleteCHash(hash, T) \ + do \ + { \ + CHash *_hash = (hash); \ + { \ + THashIter *_iter; \ + StringExt *_key; \ + void *_p; \ + _hash->StartIter(&_iter); \ + while (_hash->GetNext(&_iter, &_key, &_p)) \ + { \ + delete (T*)_p; \ + } \ + delete _hash; \ + } \ + } while(0); + +} + +#endif // _PDF_READER_HASH_H diff --git a/PdfReader/Src/JArithmeticDecoder.cpp b/PdfReader/Src/JArithmeticDecoder.cpp new file mode 100644 index 0000000000..4785e94966 --- /dev/null +++ b/PdfReader/Src/JArithmeticDecoder.cpp @@ -0,0 +1,376 @@ +#include "Object.h" +#include "Stream.h" +#include "JArithmeticDecoder.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // JArithmeticDecoderStates + //------------------------------------------------------------------------------------------------------------------------------- + + JArithmeticDecoderStats::JArithmeticDecoderStats(int nContextSize) + { + m_nContextSize = nContextSize; + m_pContextTable = (unsigned char *)MemUtilsMallocArray(m_nContextSize, sizeof(unsigned char)); + Reset(); + } + + JArithmeticDecoderStats::~JArithmeticDecoderStats() + { + MemUtilsFree(m_pContextTable); + } + + JArithmeticDecoderStats *JArithmeticDecoderStats::Copy() + { + JArithmeticDecoderStats *pStats = new JArithmeticDecoderStats(m_nContextSize); + memcpy(pStats->m_pContextTable, m_pContextTable, m_nContextSize); + return pStats; + } + + void JArithmeticDecoderStats::Reset() + { + memset(m_pContextTable, 0, m_nContextSize); + } + + void JArithmeticDecoderStats::CopyFrom(JArithmeticDecoderStats *pStats) + { + memcpy(m_pContextTable, pStats->m_pContextTable, m_nContextSize); + } + + void JArithmeticDecoderStats::SetEntry(unsigned int unCx, int nIndex, int nMPS) + { + m_pContextTable[unCx] = (nIndex << 1) + nMPS; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // JArithmeticDecoder + //------------------------------------------------------------------------------------------------------------------------------- + + unsigned int JArithmeticDecoder::arrunQeTable[47] = + { + 0x56010000, 0x34010000, 0x18010000, 0x0AC10000, + 0x05210000, 0x02210000, 0x56010000, 0x54010000, + 0x48010000, 0x38010000, 0x30010000, 0x24010000, + 0x1C010000, 0x16010000, 0x56010000, 0x54010000, + 0x51010000, 0x48010000, 0x38010000, 0x34010000, + 0x30010000, 0x28010000, 0x24010000, 0x22010000, + 0x1C010000, 0x18010000, 0x16010000, 0x14010000, + 0x12010000, 0x11010000, 0x0AC10000, 0x09C10000, + 0x08A10000, 0x05210000, 0x04410000, 0x02A10000, + 0x02210000, 0x01410000, 0x01110000, 0x00850000, + 0x00490000, 0x00250000, 0x00150000, 0x00090000, + 0x00050000, 0x00010000, 0x56010000 + }; + + int JArithmeticDecoder::arrnNMPSTable[47] = + { + 1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46 + }; + + int JArithmeticDecoder::arrnNLPSTable[47] = + { + 1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14, + 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46 + }; + + int JArithmeticDecoder::arrnSwitchTable[47] = + { + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + JArithmeticDecoder::JArithmeticDecoder() + { + m_pStream = NULL; + m_nDataSize = 0; + m_bLimitStream = false; + } + + inline unsigned int JArithmeticDecoder::ReadByte() + { + if (m_bLimitStream) + { + --m_nDataSize; + if (m_nDataSize < 0) + { + return 0xff; + } + } + return (unsigned int)m_pStream->GetChar() & 0xff; + } + + JArithmeticDecoder::~JArithmeticDecoder() + { + Cleanup(); + } + + void JArithmeticDecoder::Start() + { + m_unBuffer0 = ReadByte(); + m_unBuffer1 = ReadByte(); + + // INITDEC + m_unC = (m_unBuffer0 ^ 0xff) << 16; + ByteIn(); + m_unC <<= 7; + m_nCT -= 7; + m_unA = 0x80000000; + } + + void JArithmeticDecoder::Restart(int nDatasize) + { + int nOldDataSize = m_nDataSize; + m_nDataSize = nDatasize; + if (nOldDataSize == -1) + { + m_unBuffer1 = ReadByte(); + } + else if (nOldDataSize <= -2) + { + m_unBuffer0 = ReadByte(); + m_unBuffer1 = ReadByte(); + } + } + + void JArithmeticDecoder::Cleanup() + { + if (m_bLimitStream) + { + while (m_nDataSize > 0) + { + m_unBuffer0 = m_unBuffer1; + m_unBuffer1 = ReadByte(); + } + } + } + + int JArithmeticDecoder::DecodeBit(unsigned int unContext, JArithmeticDecoderStats *pStats) + { + int nBit = 0; + + int nICX = pStats->m_pContextTable[unContext] >> 1; + int nMPSCX = pStats->m_pContextTable[unContext] & 1; + unsigned int unQe = arrunQeTable[nICX]; + m_unA -= unQe; + if (m_unC < m_unA) + { + if (m_unA & 0x80000000) + { + nBit = nMPSCX; + } + else + { + // MPS_EXCHANGE + if (m_unA < unQe) + { + nBit = 1 - nMPSCX; + if (arrnSwitchTable[nICX]) + { + pStats->m_pContextTable[unContext] = (arrnNLPSTable[nICX] << 1) | (1 - nMPSCX); + } + else + { + pStats->m_pContextTable[unContext] = (arrnNLPSTable[nICX] << 1) | nMPSCX; + } + } + else + { + nBit = nMPSCX; + pStats->m_pContextTable[unContext] = (arrnNMPSTable[nICX] << 1) | nMPSCX; + } + // RENORMD + do + { + if (m_nCT == 0) + { + ByteIn(); + } + m_unA <<= 1; + m_unC <<= 1; + --m_nCT; + } while (!(m_unA & 0x80000000)); + } + } + else + { + m_unC -= m_unA; + // LPS_EXCHANGE + if (m_unA < unQe) + { + nBit = nMPSCX; + pStats->m_pContextTable[unContext] = (arrnNMPSTable[nICX] << 1) | nMPSCX; + } + else + { + nBit = 1 - nMPSCX; + if (arrnSwitchTable[nICX]) + { + pStats->m_pContextTable[unContext] = (arrnNLPSTable[nICX] << 1) | (1 - nMPSCX); + } + else + { + pStats->m_pContextTable[unContext] = (arrnNLPSTable[nICX] << 1) | nMPSCX; + } + } + m_unA = unQe; + // RENORMD + do + { + if (m_nCT == 0) + { + ByteIn(); + } + m_unA <<= 1; + m_unC <<= 1; + --m_nCT; + } while (!(m_unA & 0x80000000)); + } + return nBit; + } + + int JArithmeticDecoder::DecodeByte(unsigned int unContext, JArithmeticDecoderStats *pStats) + { + int nByte = 0; + for (int nIndex = 0; nIndex < 8; ++nIndex) + { + nByte = (nByte << 1) | DecodeBit(unContext, pStats); + } + return nByte; + } + + bool JArithmeticDecoder::DecodeInt(int *pnValue, JArithmeticDecoderStats *pStats) + { + unsigned int unVal = 0; + m_unPrev = 1; + int nSign = DecodeIntBit(pStats); + if (DecodeIntBit(pStats)) + { + if (DecodeIntBit(pStats)) + { + if (DecodeIntBit(pStats)) + { + if (DecodeIntBit(pStats)) + { + if (DecodeIntBit(pStats)) + { + unVal = 0; + for (int nIndex = 0; nIndex < 32; ++nIndex) + { + unVal = (unVal << 1) | DecodeIntBit(pStats); + } + unVal += 4436; + } + else + { + unVal = 0; + for (int nIndex = 0; nIndex < 12; ++nIndex) + { + unVal = (unVal << 1) | DecodeIntBit(pStats); + } + unVal += 340; + } + } + else + { + unVal = 0; + for (int nIndex = 0; nIndex < 8; ++nIndex) + { + unVal = (unVal << 1) | DecodeIntBit(pStats); + } + unVal += 84; + } + } + else + { + unVal = 0; + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + unVal = (unVal << 1) | DecodeIntBit(pStats); + } + unVal += 20; + } + } + else + { + unVal = DecodeIntBit(pStats); + unVal = (unVal << 1) | DecodeIntBit(pStats); + unVal = (unVal << 1) | DecodeIntBit(pStats); + unVal = (unVal << 1) | DecodeIntBit(pStats); + unVal += 4; + } + } + else + { + unVal = DecodeIntBit(pStats); + unVal = (unVal << 1) | DecodeIntBit(pStats); + } + + if (nSign) + { + if (unVal == 0) + { + return false; + } + *pnValue = -(int)unVal; + } + else + { + *pnValue = (int)unVal; + } + return true; + } + + int JArithmeticDecoder::DecodeIntBit(JArithmeticDecoderStats *pStats) + { + int nBit = DecodeBit(m_unPrev, pStats); + if (m_unPrev < 0x100) + { + m_unPrev = (m_unPrev << 1) | nBit; + } + else + { + m_unPrev = (((m_unPrev << 1) | nBit) & 0x1ff) | 0x100; + } + return nBit; + } + + unsigned int JArithmeticDecoder::DecodeIAID(unsigned int unCodeLen, JArithmeticDecoderStats *pStats) + { + m_unPrev = 1; + for (unsigned int unIndex = 0; unIndex < unCodeLen; ++unIndex) + { + int nBit = DecodeBit(m_unPrev, pStats); + m_unPrev = (m_unPrev << 1) | nBit; + } + return m_unPrev - (1 << unCodeLen); + } + + void JArithmeticDecoder::ByteIn() + { + if (m_unBuffer0 == 0xff) + { + if (m_unBuffer1 > 0x8f) + { + m_nCT = 8; + } + else + { + m_unBuffer0 = m_unBuffer1; + m_unBuffer1 = ReadByte(); + m_unC = m_unC + 0xfe00 - (m_unBuffer0 << 9); + m_nCT = 7; + } + } + else + { + m_unBuffer0 = m_unBuffer1; + m_unBuffer1 = ReadByte(); + m_unC = m_unC + 0xff00 - (m_unBuffer0 << 8); + m_nCT = 8; + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/JArithmeticDecoder.h b/PdfReader/Src/JArithmeticDecoder.h new file mode 100644 index 0000000000..b71d06a622 --- /dev/null +++ b/PdfReader/Src/JArithmeticDecoder.h @@ -0,0 +1,106 @@ +#ifndef _PDF_READER_JARITHMETICDECODER_H +#define _PDF_READER_JARITHMETICDECODER_H + +namespace PdfReader +{ + class Stream; + + //------------------------------------------------------------------------------------------------------------------------------- + // JArithmeticDecoderStats + //------------------------------------------------------------------------------------------------------------------------------- + + class JArithmeticDecoderStats + { + public: + + JArithmeticDecoderStats(int nContextSize); + ~JArithmeticDecoderStats(); + JArithmeticDecoderStats *Copy(); + void Reset(); + int GetContextSize() + { + return m_nContextSize; + } + void CopyFrom(JArithmeticDecoderStats *pStats); + void SetEntry(unsigned int unCx, int nIndex, int nMPS); + + private: + + unsigned char *m_pContextTable; // cxTab[cx] = (i[cx] << 1) + mps[cx] + int m_nContextSize; + + friend class JArithmeticDecoder; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // JArithmeticDecoder + //------------------------------------------------------------------------------------------------------------------------------- + + class JArithmeticDecoder + { + public: + + JArithmeticDecoder(); + ~JArithmeticDecoder(); + + void SetStream(Stream *pStream) + { + m_pStream = pStream; + m_nDataSize = 0; + m_bLimitStream = false; + } + void SetStream(Stream *pStream, int nDataSize) + { + m_pStream = pStream; + m_nDataSize = nDataSize; + m_bLimitStream = true; + } + + // Начинаем декодировать новый поток. Заполняем буффер и запускаем INITDEC. + void Start(); + + // Заново декодируем прервынный поток. Заново заполняем буффер, но не запускаем INITDEC. (Используется в потоках JPEG 2000, где + // данные могут быть разделены на блоки.) + void Restart(int nDataSize); + + // Читаем оставшиеся данные в потоке. + void Cleanup(); + + // Декодируем один бит. + int DecodeBit(unsigned int unContext, JArithmeticDecoderStats *pStats); + + // Декодируем один байт. + int DecodeByte(unsigned int unContext, JArithmeticDecoderStats *pStats); + + bool DecodeInt(int *pnValue, JArithmeticDecoderStats *pStats); + + unsigned int DecodeIAID(unsigned int unCodeLen, JArithmeticDecoderStats *pStats); + + private: + + unsigned int ReadByte(); + int DecodeIntBit(JArithmeticDecoderStats *pStats); + void ByteIn(); + + private: + + static unsigned int arrunQeTable[47]; + static int arrnNMPSTable[47]; + static int arrnNLPSTable[47]; + static int arrnSwitchTable[47]; + + unsigned int m_unBuffer0; + unsigned int m_unBuffer1; + unsigned int m_unC; + unsigned int m_unA; + int m_nCT; + + unsigned int m_unPrev; + + Stream *m_pStream; + int m_nDataSize; + bool m_bLimitStream; + }; +} + +#endif // _PDF_READER_JARITHMETICDECODER_H diff --git a/PdfReader/Src/JBIG2Stream.cpp b/PdfReader/Src/JBIG2Stream.cpp new file mode 100644 index 0000000000..9eacaadd6b --- /dev/null +++ b/PdfReader/Src/JBIG2Stream.cpp @@ -0,0 +1,3937 @@ +#include +#include +#include "List.h" +#include "JArithmeticDecoder.h" +#include "JBIG2Stream.h" + +//~ share these tables +#include "CCITT-Tables.h" + +namespace PdfReader +{ + static int c_arrContextSize[4] ={ 16, 13, 10, 10 }; + static int c_arrRefContextSize[2] ={ 13, 10 }; + + //------------------------------------------------------------------------ + // JBIG2HuffmanTable + //------------------------------------------------------------------------ + +#define jbig2HuffmanLOW 0xfffffffd +#define jbig2HuffmanOOB 0xfffffffe +#define jbig2HuffmanEOT 0xffffffff + + struct JBIG2HuffmanTable + { + int nValue; + unsigned int unPrefixLen; + unsigned int unRangeLen; // can also be LOW, OOB, or EOT + unsigned int unPrefix; + }; + + JBIG2HuffmanTable c_oHuffTableA[] = + { + { 0, 1, 4, 0x000 }, + { 16, 2, 8, 0x002 }, + { 272, 3, 16, 0x006 }, + { 65808, 3, 32, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableB[] = + { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 75, 6, 32, 0x03e }, + { 0, 6, jbig2HuffmanOOB, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableC[] = + { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 0, 6, jbig2HuffmanOOB, 0x03e }, + { 75, 7, 32, 0x0fe }, + { -256, 8, 8, 0x0fe }, + { -257, 8, jbig2HuffmanLOW, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableD[] = + { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableE[] = + { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 6, 32, 0x03e }, + { -255, 7, 8, 0x07e }, + { -256, 7, jbig2HuffmanLOW, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableF[] = + { + { 0, 2, 7, 0x000 }, + { 128, 3, 7, 0x002 }, + { 256, 3, 8, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -512, 4, 8, 0x009 }, + { -256, 4, 7, 0x00a }, + { -32, 4, 5, 0x00b }, + { 512, 4, 9, 0x00c }, + { 1024, 4, 10, 0x00d }, + { -2048, 5, 10, 0x01c }, + { -128, 5, 6, 0x01d }, + { -64, 5, 5, 0x01e }, + { -2049, 6, jbig2HuffmanLOW, 0x03e }, + { 2048, 6, 32, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableG[] = + { + { -512, 3, 8, 0x000 }, + { 256, 3, 8, 0x001 }, + { 512, 3, 9, 0x002 }, + { 1024, 3, 10, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -256, 4, 7, 0x009 }, + { -32, 4, 5, 0x00a }, + { 0, 4, 5, 0x00b }, + { 128, 4, 7, 0x00c }, + { -128, 5, 6, 0x01a }, + { -64, 5, 5, 0x01b }, + { 32, 5, 5, 0x01c }, + { 64, 5, 6, 0x01d }, + { -1025, 5, jbig2HuffmanLOW, 0x01e }, + { 2048, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableH[] = + { + { 0, 2, 1, 0x000 }, + { 0, 2, jbig2HuffmanOOB, 0x001 }, + { 4, 3, 4, 0x004 }, + { -1, 4, 0, 0x00a }, + { 22, 4, 4, 0x00b }, + { 38, 4, 5, 0x00c }, + { 2, 5, 0, 0x01a }, + { 70, 5, 6, 0x01b }, + { 134, 5, 7, 0x01c }, + { 3, 6, 0, 0x03a }, + { 20, 6, 1, 0x03b }, + { 262, 6, 7, 0x03c }, + { 646, 6, 10, 0x03d }, + { -2, 7, 0, 0x07c }, + { 390, 7, 8, 0x07d }, + { -15, 8, 3, 0x0fc }, + { -5, 8, 1, 0x0fd }, + { -7, 9, 1, 0x1fc }, + { -3, 9, 0, 0x1fd }, + { -16, 9, jbig2HuffmanLOW, 0x1fe }, + { 1670, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableI[] = + { + { 0, 2, jbig2HuffmanOOB, 0x000 }, + { -1, 3, 1, 0x002 }, + { 1, 3, 1, 0x003 }, + { 7, 3, 5, 0x004 }, + { -3, 4, 1, 0x00a }, + { 43, 4, 5, 0x00b }, + { 75, 4, 6, 0x00c }, + { 3, 5, 1, 0x01a }, + { 139, 5, 7, 0x01b }, + { 267, 5, 8, 0x01c }, + { 5, 6, 1, 0x03a }, + { 39, 6, 2, 0x03b }, + { 523, 6, 8, 0x03c }, + { 1291, 6, 11, 0x03d }, + { -5, 7, 1, 0x07c }, + { 779, 7, 9, 0x07d }, + { -31, 8, 4, 0x0fc }, + { -11, 8, 2, 0x0fd }, + { -15, 9, 2, 0x1fc }, + { -7, 9, 1, 0x1fd }, + { -32, 9, jbig2HuffmanLOW, 0x1fe }, + { 3339, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableJ[] = + { + { -2, 2, 2, 0x000 }, + { 6, 2, 6, 0x001 }, + { 0, 2, jbig2HuffmanOOB, 0x002 }, + { -3, 5, 0, 0x018 }, + { 2, 5, 0, 0x019 }, + { 70, 5, 5, 0x01a }, + { 3, 6, 0, 0x036 }, + { 102, 6, 5, 0x037 }, + { 134, 6, 6, 0x038 }, + { 198, 6, 7, 0x039 }, + { 326, 6, 8, 0x03a }, + { 582, 6, 9, 0x03b }, + { 1094, 6, 10, 0x03c }, + { -21, 7, 4, 0x07a }, + { -4, 7, 0, 0x07b }, + { 4, 7, 0, 0x07c }, + { 2118, 7, 11, 0x07d }, + { -5, 8, 0, 0x0fc }, + { 5, 8, 0, 0x0fd }, + { -22, 8, jbig2HuffmanLOW, 0x0fe }, + { 4166, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableK[] = + { + { 1, 1, 0, 0x000 }, + { 2, 2, 1, 0x002 }, + { 4, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 7, 5, 1, 0x01c }, + { 9, 5, 2, 0x01d }, + { 13, 6, 2, 0x03c }, + { 17, 7, 2, 0x07a }, + { 21, 7, 3, 0x07b }, + { 29, 7, 4, 0x07c }, + { 45, 7, 5, 0x07d }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableL[] = + { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 1, 0x006 }, + { 5, 5, 0, 0x01c }, + { 6, 5, 1, 0x01d }, + { 8, 6, 1, 0x03c }, + { 10, 7, 0, 0x07a }, + { 11, 7, 1, 0x07b }, + { 13, 7, 2, 0x07c }, + { 17, 7, 3, 0x07d }, + { 25, 7, 4, 0x07e }, + { 41, 8, 5, 0x0fe }, + { 73, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableM[] = + { + { 1, 1, 0, 0x000 }, + { 2, 3, 0, 0x004 }, + { 7, 3, 3, 0x005 }, + { 3, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 4, 5, 0, 0x01c }, + { 15, 6, 1, 0x03a }, + { 17, 6, 2, 0x03b }, + { 21, 6, 3, 0x03c }, + { 29, 6, 4, 0x03d }, + { 45, 6, 5, 0x03e }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableN[] = + { + { 0, 1, 0, 0x000 }, + { -2, 3, 0, 0x004 }, + { -1, 3, 0, 0x005 }, + { 1, 3, 0, 0x006 }, + { 2, 3, 0, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + JBIG2HuffmanTable c_oHuffTableO[] = + { + { 0, 1, 0, 0x000 }, + { -1, 3, 0, 0x004 }, + { 1, 3, 0, 0x005 }, + { -2, 4, 0, 0x00c }, + { 2, 4, 0, 0x00d }, + { -4, 5, 1, 0x01c }, + { 3, 5, 1, 0x01d }, + { -8, 6, 2, 0x03c }, + { 5, 6, 2, 0x03d }, + { -24, 7, 4, 0x07c }, + { 9, 7, 4, 0x07d }, + { -25, 7, jbig2HuffmanLOW, 0x07e }, + { 25, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } + }; + + //------------------------------------------------------------------------ + // JBIG2HuffmanDecoder + //------------------------------------------------------------------------ + + class JBIG2HuffmanDecoder + { + public: + + JBIG2HuffmanDecoder() + { + m_pStream = NULL; + Reset(); + } + + ~JBIG2HuffmanDecoder() + { + } + void SetStream(Stream *pStream) + { + m_pStream = pStream; + } + void Reset() + { + unBuffer = 0; + unBufferLen = 0; + } + + // Returns false for OOB, otherwise sets * and returns true. + //~ optimize this + bool DecodeInt(int *pnValue, JBIG2HuffmanTable *pTable) + { + unsigned int unIndex = 0, unPrefix = 0, unLen = 0; + while (pTable[unIndex].unRangeLen != jbig2HuffmanEOT) + { + while (unLen < pTable[unIndex].unPrefixLen) + { + unPrefix = (unPrefix << 1) | ReadBit(); + ++unLen; + } + if (unPrefix == pTable[unIndex].unPrefix) + { + if (pTable[unIndex].unRangeLen == jbig2HuffmanOOB) + { + return false; + } + if (pTable[unIndex].unRangeLen == jbig2HuffmanLOW) + { + *pnValue = pTable[unIndex].nValue - ReadBits(32); + } + else if (pTable[unIndex].unRangeLen > 0) + { + *pnValue = pTable[unIndex].nValue + ReadBits(pTable[unIndex].unRangeLen); + } + else + { + *pnValue = pTable[unIndex].nValue; + } + return true; + } + ++unIndex; + } + return false; + } + unsigned int ReadBits(unsigned int unCount) + { + unsigned int unMask = (unCount == 32) ? 0xffffffff : ((1 << unCount) - 1); + unsigned int unValue; + if (unBufferLen >= unCount) + { + unValue = (unBuffer >> (unBufferLen - unCount)) & unMask; + unBufferLen -= unCount; + } + else + { + unValue = unBuffer & ((1 << unBufferLen) - 1); + unsigned int unLeftCount = unCount - unBufferLen; + unBufferLen = 0; + while (unLeftCount >= 8) + { + unValue = (unValue << 8) | (m_pStream->GetChar() & 0xff); + unLeftCount -= 8; + } + if (unLeftCount > 0) + { + unBuffer = m_pStream->GetChar(); + unBufferLen = 8 - unLeftCount; + unValue = (unValue << unLeftCount) | ((unBuffer >> unBufferLen) & ((1 << unLeftCount) - 1)); + } + } + return unValue; + } + + unsigned int ReadBit() + { + if (unBufferLen == 0) + { + unBuffer = m_pStream->GetChar(); + unBufferLen = 8; + } + + --unBufferLen; + return (unBuffer >> unBufferLen) & 1; + } + + + // Sort the table by prefix length and assign prefix values. + void BuildTable(JBIG2HuffmanTable *pTable, unsigned int unLen) + { + // stable selection sort: + // - entries with prefixLen > 0, in ascending prefixLen order + // - entry with prefixLen = 0, rangeLen = EOT + // - all other entries with prefixLen = 0 + // (on entry, table[len] has prefixLen = 0, rangeLen = EOT) + + unsigned int unI, unJ, unK; + for (unI = 0; unI < unLen; ++unI) + { + for (unJ = unI; unJ < unLen && pTable[unJ].unPrefixLen == 0; ++unJ); + if (unJ == unLen) + { + break; + } + for (unK = unJ + 1; unK < unLen; ++unK) + { + if (pTable[unK].unPrefixLen > 0 && pTable[unK].unPrefixLen < pTable[unJ].unPrefixLen) + { + unJ = unK; + } + } + if (unJ != unI) + { + JBIG2HuffmanTable oTable = pTable[unJ]; + for (unK = unJ; unK > unI; --unK) + { + pTable[unK] = pTable[unK - 1]; + } + pTable[unI] = oTable; + } + } + pTable[unI] = pTable[unLen]; + + // assign prefixes + unI = 0; + unsigned int unPrefix = 0; + pTable[unI++].unPrefix = unPrefix++; + for (; pTable[unI].unRangeLen != jbig2HuffmanEOT; ++unI) + { + unPrefix <<= pTable[unI].unPrefixLen - pTable[unI - 1].unPrefixLen; + pTable[unI].unPrefix = unPrefix++; + } + } + + + private: + + Stream *m_pStream; + unsigned int unBuffer; + unsigned int unBufferLen; + }; + + //------------------------------------------------------------------------ + // JBIG2MMRDecoder + //------------------------------------------------------------------------ + + class JBIG2MMRDecoder + { + public: + + JBIG2MMRDecoder() + { + m_pStream = NULL; + Reset(); + } + ~JBIG2MMRDecoder() + { + } + void SetStream(Stream *pStream) + { + m_pStream = pStream; + } + void Reset() + { + unBuffer = 0; + unBufferLen = 0; + unBytesReadCount = 0; + } + int Get2DCode() + { + CCITTCode *pCode = NULL; + + if (unBufferLen == 0) + { + unBuffer = m_pStream->GetChar() & 0xff; + unBufferLen = 8; + ++unBytesReadCount; + pCode = &c_arrTable2D[(unBuffer >> 1) & 0x7f]; + } + else if (unBufferLen == 8) + { + pCode = &c_arrTable2D[(unBuffer >> 1) & 0x7f]; + } + else + { + pCode = &c_arrTable2D[(unBuffer << (7 - unBufferLen)) & 0x7f]; + if (pCode->nBitsCount < 0 || pCode->nBitsCount >(int)unBufferLen) + { + unBuffer = (unBuffer << 8) | (m_pStream->GetChar() & 0xff); + unBufferLen += 8; + ++unBytesReadCount; + pCode = &c_arrTable2D[(unBuffer >> (unBufferLen - 7)) & 0x7f]; + } + } + + if (pCode->nBitsCount < 0) + { + return 0; + } + unBufferLen -= pCode->nBitsCount; + return pCode->nCode; + } + + int GetWhiteCode() + { + if (unBufferLen == 0) + { + unBuffer = m_pStream->GetChar() & 0xff; + unBufferLen = 8; + ++unBytesReadCount; + } + while (1) + { + CCITTCode *pCode = NULL; + if (unBufferLen >= 7 && ((unBuffer >> (unBufferLen - 7)) & 0x7f) == 0) + { + unsigned int unCode; + if (unBufferLen <= 12) + { + unCode = unBuffer << (12 - unBufferLen); + } + else + { + unCode = unBuffer >> (unBufferLen - 12); + } + pCode = &c_arrWhiteTable1[unCode & 0x1f]; + } + else + { + unsigned int unCode; + if (unBufferLen <= 9) + { + unCode = unBuffer << (9 - unBufferLen); + } + else + { + unCode = unBuffer >> (unBufferLen - 9); + } + pCode = &c_arrWhiteTable2[unCode & 0x1ff]; + } + + if (pCode->nBitsCount > 0 && pCode->nBitsCount <= (int)unBufferLen) + { + unBufferLen -= pCode->nBitsCount; + return pCode->nCode; + } + if (unBufferLen >= 12) + { + break; + } + + unBuffer = (unBuffer << 8) | (m_pStream->GetChar() & 0xff); + unBufferLen += 8; + ++unBytesReadCount; + } + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --unBufferLen; + return 1; + } + int GetBlackCode() + { + if (unBufferLen == 0) + { + unBuffer = m_pStream->GetChar() & 0xff; + unBufferLen = 8; + ++unBytesReadCount; + } + while (1) + { + CCITTCode *pCode = NULL; + if (unBufferLen >= 6 && ((unBuffer >> (unBufferLen - 6)) & 0x3f) == 0) + { + unsigned int unCode; + if (unBufferLen <= 13) + { + unCode = unBuffer << (13 - unBufferLen); + } + else + { + unCode = unBuffer >> (unBufferLen - 13); + } + pCode = &c_arrBlackTable1[unCode & 0x7f]; + } + else if (unBufferLen >= 4 && ((unBuffer >> (unBufferLen - 4)) & 0x0f) == 0) + { + unsigned int unCode; + if (unBufferLen <= 12) + { + unCode = unBuffer << (12 - unBufferLen); + } + else + { + unCode = unBuffer >> (unBufferLen - 12); + } + pCode = &c_arrBlackTable2[(unCode & 0xff) - 64]; + } + else + { + unsigned int unCode; + if (unBufferLen <= 6) + { + unCode = unBuffer << (6 - unBufferLen); + } + else + { + unCode = unBuffer >> (unBufferLen - 6); + } + pCode = &c_arrBlackTable3[unCode & 0x3f]; + } + + if (pCode->nBitsCount > 0 && pCode->nBitsCount <= (int)unBufferLen) + { + unBufferLen -= pCode->nBitsCount; + return pCode->nCode; + } + + if (unBufferLen >= 13) + { + break; + } + unBuffer = (unBuffer << 8) | (m_pStream->GetChar() & 0xff); + unBufferLen += 8; + ++unBytesReadCount; + } + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --unBufferLen; + return 1; + } + + unsigned int Get24Bits() + { + while (unBufferLen < 24) + { + unBuffer = (unBuffer << 8) | (m_pStream->GetChar() & 0xff); + unBufferLen += 8; + ++unBytesReadCount; + } + return (unBuffer >> (unBufferLen - 24)) & 0xffffff; + } + void SkipTo(unsigned int unLength) + { + while (unBytesReadCount < unLength) + { + m_pStream->GetChar(); + ++unBytesReadCount; + } + } + + + private: + + Stream *m_pStream; + unsigned int unBuffer; + unsigned int unBufferLen; + unsigned int unBytesReadCount; + }; + + //------------------------------------------------------------------------ + // JBIG2Segment + //------------------------------------------------------------------------ + + enum JBIG2SegmentType + { + jbig2SegBitmap, + jbig2SegSymbolDict, + jbig2SegPatternDict, + jbig2SegCodeTable + }; + + class JBIG2Segment + { + public: + + JBIG2Segment(unsigned int unSegNum) + { + m_unSegNum = unSegNum; + } + virtual ~JBIG2Segment() + { + } + void SetSegNum(unsigned int unSegNum) + { + m_unSegNum = unSegNum; + } + unsigned int GetSegNum() + { + return m_unSegNum; + } + virtual JBIG2SegmentType GetType() = 0; + + private: + + unsigned int m_unSegNum; + }; + + //------------------------------------------------------------------------ + // JBIG2Bitmap + //------------------------------------------------------------------------ + + struct JBIG2BitmapPtr + { + unsigned char *pDataPtr; + int nShift; + int nX; + }; + + class JBIG2Bitmap : public JBIG2Segment + { + public: + + JBIG2Bitmap(unsigned int unSegNum, int nW, int nH) : JBIG2Segment(unSegNum) + { + m_nW = nW; + m_nH = nH; + m_nLine = (nW + 7) >> 3; + + if (m_nW <= 0 || m_nH <= 0 || m_nLine <= 0 || m_nH >= (INT_MAX - 1) / m_nLine) + { + m_pData = NULL; + return; + } + + // need to allocate one extra guard byte for use in Combine() + m_pData = (unsigned char *)MemUtilsMalloc(m_nH * m_nLine + 1); + m_pData[m_nH * m_nLine] = 0; + } + virtual ~JBIG2Bitmap() + { + MemUtilsFree(m_pData); + } + + virtual JBIG2SegmentType GetType() + { + return jbig2SegBitmap; + } + JBIG2Bitmap *Copy() + { + return new JBIG2Bitmap(0, this); + } + //~ optimize this + JBIG2Bitmap *GetSlice(unsigned int unX, unsigned int unY, unsigned int unW, unsigned int unH) + { + JBIG2Bitmap *pSlice = new JBIG2Bitmap(0, unW, unH); + pSlice->ClearToZero(); + + for (unsigned int unCurY = 0; unCurY < unH; ++unCurY) + { + for (unsigned int unCurX = 0; unCurX < unW; ++unCurX) + { + if (GetPixel(unX + unCurX, unY + unCurY)) + { + pSlice->SetPixel(unCurX, unCurY); + } + } + } + + return pSlice; + } + void Expand(int nNewH, unsigned int unPixel) + { + if (nNewH <= m_nH || m_nLine <= 0 || nNewH >= (INT_MAX - 1) / m_nLine) + { + return; + } + + // need to allocate one extra guard byte for use in combine() + m_pData = (unsigned char *)MemUtilsRealloc(m_pData, nNewH * m_nLine + 1); + if (unPixel) + { + memset(m_pData + m_nH * m_nLine, 0xff, (nNewH - m_nH) * m_nLine); + } + else + { + memset(m_pData + m_nH * m_nLine, 0x00, (nNewH - m_nH) * m_nLine); + } + + m_nH = nNewH; + m_pData[m_nH * m_nLine] = 0; + } + + void ClearToZero() + { + memset(m_pData, 0, m_nH * m_nLine); + } + void ClearToOne() + { + memset(m_pData, 0xff, m_nH * m_nLine); + } + int GetWidth() + { + return m_nW; + } + int GetHeight() + { + return m_nH; + } + int GetPixel(int nX, int nY) + { + return (nX < 0 || nX >= m_nW || nY < 0 || nY >= m_nH) ? 0 : (m_pData[nY * m_nLine + (nX >> 3)] >> (7 - (nX & 7))) & 1; + } + void SetPixel(int nX, int nY) + { + m_pData[nY * m_nLine + (nX >> 3)] |= 1 << (7 - (nX & 7)); + } + void ClearPixel(int nX, int nY) + { + m_pData[nY * m_nLine + (nX >> 3)] &= 0x7f7f >> (nX & 7); + } + inline void GetPixelPtr(int nX, int nY, JBIG2BitmapPtr *pPtr) + { + if (nY < 0 || nY >= m_nH || nX >= m_nW) + { + pPtr->pDataPtr = NULL; + } + else if (nX < 0) + { + pPtr->pDataPtr = &m_pData[nY * m_nLine]; + pPtr->nShift = 7; + pPtr->nX = nX; + } + else + { + pPtr->pDataPtr = &m_pData[nY * m_nLine + (nX >> 3)]; + pPtr->nShift = 7 - (nX & 7); + pPtr->nX = nX; + } + } + inline int NextPixel(JBIG2BitmapPtr *pPtr) + { + int nPixel; + + if (!pPtr->pDataPtr) + { + nPixel = 0; + } + else if (pPtr->nX < 0) + { + ++pPtr->nX; + nPixel = 0; + } + else + { + nPixel = (*pPtr->pDataPtr >> pPtr->nShift) & 1; + if (++pPtr->nX == m_nW) + { + pPtr->pDataPtr = NULL; + } + else if (pPtr->nShift == 0) + { + ++pPtr->pDataPtr; + pPtr->nShift = 7; + } + else + { + --pPtr->nShift; + } + } + return nPixel; + } + + void DuplicateRow(int nDstY, int nSrcY) + { + memcpy(m_pData + nDstY * m_nLine, m_pData + nSrcY * m_nLine, m_nLine); + } + void Combine(JBIG2Bitmap *pBitmap, int nX, int nY, unsigned int unCombOp) + { + int nY0; + if (nY < 0) + { + nY0 = -nY; + } + else + { + nY0 = 0; + } + + int nY1; + if (nY + pBitmap->m_nH > m_nH) + { + nY1 = m_nH - nY; + } + else + { + nY1 = pBitmap->m_nH; + } + + if (nY0 >= nY1) + { + return; + } + + int nX0; + if (nX >= 0) + { + nX0 = nX & ~7; + } + else + { + nX0 = 0; + } + + int nX1 = nX + pBitmap->m_nW; + if (nX1 > m_nW) + { + nX1 = m_nW; + } + if (nX0 >= nX1) + { + return; + } + + unsigned int unS1 = nX & 7; + unsigned int unS2 = 8 - unS1; + + unsigned int unM1 = 0xff >> (nX1 & 7); + unsigned int unM2 = 0xff << (((nX1 & 7) == 0) ? 0 : 8 - (nX1 & 7)); + unsigned int unM3 = (0xff >> unS1) & unM2; + + bool bOneByte = (nX0 == ((nX1 - 1) & ~7)); + + unsigned char *pSrcPtr, *pDstPtr; + for (int nCurY = nY0; nCurY < nY1; ++nCurY) + { + // one byte per line -- need to mask both left and right side + if (bOneByte) + { + unsigned int unSrc1, unDst; + if (nX >= 0) + { + pDstPtr = m_pData + (nY + nCurY) * m_nLine + (nX >> 3); + pSrcPtr = pBitmap->m_pData + nCurY * pBitmap->m_nLine; + + unDst = *pDstPtr; + unSrc1 = *pSrcPtr; + + switch (unCombOp) + { + case 0: // or + unDst |= (unSrc1 >> unS1) & unM2; + break; + case 1: // and + unDst &= ((0xff00 | unSrc1) >> unS1) | unM1; + break; + case 2: // xor + unDst ^= (unSrc1 >> unS1) & unM2; + break; + case 3: // xnor + unDst ^= ((unSrc1 ^ 0xff) >> unS1) & unM2; + break; + case 4: // replace + unDst = (unDst & ~unM3) | ((unSrc1 >> unS1) & unM3); + break; + } + *pDstPtr = unDst; + } + else + { + pDstPtr = m_pData + (nY + nCurY) * m_nLine; + pSrcPtr = pBitmap->m_pData + nCurY * pBitmap->m_nLine + (-nX >> 3); + + unDst = *pDstPtr; + unSrc1 = *pSrcPtr; + + switch (unCombOp) + { + case 0: // or + unDst |= unSrc1 & unM2; + break; + case 1: // and + unDst &= unSrc1 | unM1; + break; + case 2: // xor + unDst ^= unSrc1 & unM2; + break; + case 3: // xnor + unDst ^= (unSrc1 ^ 0xff) & unM2; + break; + case 4: // replace + unDst = (unSrc1 & unM2) | (unDst & unM1); + break; + } + *pDstPtr = unDst; + } + } + else // multiple bytes per line -- need to mask left side of left-most byte and right side of right-most byte + { + int nCurX; + unsigned int unSrc0, unSrc1, unSrc, unDst; + if (nX >= 0) // left-most byte + { + pDstPtr = m_pData + (nY + nCurY) * m_nLine + (nX >> 3); + pSrcPtr = pBitmap->m_pData + nCurY * pBitmap->m_nLine; + + unSrc1 = *pSrcPtr++; + unDst = *pDstPtr; + + switch (unCombOp) + { + case 0: // or + unDst |= unSrc1 >> unS1; + break; + case 1: // and + unDst &= (0xff00 | unSrc1) >> unS1; + break; + case 2: // xor + unDst ^= unSrc1 >> unS1; + break; + case 3: // xnor + unDst ^= (unSrc1 ^ 0xff) >> unS1; + break; + case 4: // replace + unDst = (unDst & (0xff << unS2)) | (unSrc1 >> unS1); + break; + } + *pDstPtr++ = unDst; + nCurX = nX0 + 8; + } + else + { + pDstPtr = m_pData + (nY + nCurY) * m_nLine; + pSrcPtr = pBitmap->m_pData + nCurY * pBitmap->m_nLine + (-nX >> 3); + + unSrc1 = *pSrcPtr++; + nCurX = nX0; + } + + // middle bytes + for (; nCurX < nX1 - 8; nCurX += 8) + { + unDst = *pDstPtr; + unSrc0 = unSrc1; + unSrc1 = *pSrcPtr++; + unSrc = (((unSrc0 << 8) | unSrc1) >> unS1) & 0xff; + + switch (unCombOp) + { + case 0: // or + unDst |= unSrc; + break; + case 1: // and + unDst &= unSrc; + break; + case 2: // xor + unDst ^= unSrc; + break; + case 3: // xnor + unDst ^= unSrc ^ 0xff; + break; + case 4: // replace + unDst = unSrc; + break; + } + *pDstPtr++ = unDst; + } + + // right-most byte + // note: this last byte (src1) may not actually be used, depending + // on the values of s1, m1, and m2 - and in fact, it may be off + // the edge of the source bitmap, which means we need to allocate + // one extra guard byte at the end of each bitmap + unDst = *pDstPtr; + unSrc0 = unSrc1; + unSrc1 = *pSrcPtr++; + unSrc = (((unSrc0 << 8) | unSrc1) >> unS1) & 0xff; + + switch (unCombOp) + { + case 0: // or + unDst |= unSrc & unM2; + break; + case 1: // and + unDst &= unSrc | unM1; + break; + case 2: // xor + unDst ^= unSrc & unM2; + break; + case 3: // xnor + unDst ^= (unSrc ^ 0xff) & unM2; + break; + case 4: // replace + unDst = (unSrc & unM2) | (unDst & unM1); + break; + } + *pDstPtr = unDst; + } + } + } + + unsigned char *GetDataPtr() + { + return m_pData; + } + int GetDataSize() + { + return m_nH * m_nLine; + } + + private: + + JBIG2Bitmap(unsigned int unSegNum, JBIG2Bitmap *pBitmap) : JBIG2Segment(unSegNum) + { + m_nW = pBitmap->m_nW; + m_nH = pBitmap->m_nH; + m_nLine = pBitmap->m_nLine; + + if (m_nW <= 0 || m_nH <= 0 || m_nLine <= 0 || m_nH >= (INT_MAX - 1) / m_nLine) + { + m_pData = NULL; + return; + } + + // need to allocate one extra guard byte for use in Combine() + m_pData = (unsigned char *)MemUtilsMalloc(m_nH * m_nLine + 1); + memcpy(m_pData, pBitmap->m_pData, m_nH * m_nLine); + m_pData[m_nH * m_nLine] = 0; + } + + private: + + int m_nW; + int m_nH; + int m_nLine; + unsigned char *m_pData; + }; + + //------------------------------------------------------------------------ + // JBIG2SymbolDict + //------------------------------------------------------------------------ + + class JBIG2SymbolDict : public JBIG2Segment + { + public: + + JBIG2SymbolDict::JBIG2SymbolDict(unsigned int unSegNum, unsigned int unSize) : JBIG2Segment(unSegNum) + { + m_unSize = unSize; + m_ppBitmaps = (JBIG2Bitmap **)MemUtilsMallocArray(m_unSize, sizeof(JBIG2Bitmap *)); + + m_pGenericRegionStats = NULL; + m_pRefinementRegionStats = NULL; + } + virtual ~JBIG2SymbolDict() + { + for (unsigned int unIndex = 0; unIndex < m_unSize; ++unIndex) + { + delete m_ppBitmaps[unIndex]; + } + + MemUtilsFree(m_ppBitmaps); + + if (m_pGenericRegionStats) + { + delete m_pGenericRegionStats; + } + if (m_pRefinementRegionStats) + { + delete m_pRefinementRegionStats; + } + } + virtual JBIG2SegmentType GetType() + { + return jbig2SegSymbolDict; + } + unsigned int GetSize() + { + return m_unSize; + } + void SetBitmap(unsigned int unIndex, JBIG2Bitmap *pBitmap) + { + m_ppBitmaps[unIndex] = pBitmap; + } + JBIG2Bitmap *GetBitmap(unsigned int unIndex) + { + return m_ppBitmaps[unIndex]; + } + void SetGenericRegionStats(JArithmeticDecoderStats *pStats) + { + m_pGenericRegionStats = pStats; + } + void SetRefinementRegionStats(JArithmeticDecoderStats *pStats) + { + m_pRefinementRegionStats = pStats; + } + JArithmeticDecoderStats *GetGenericRegionStats() + { + return m_pGenericRegionStats; + } + JArithmeticDecoderStats *GetRefinementRegionStats() + { + return m_pRefinementRegionStats; + } + + private: + + unsigned int m_unSize; + JBIG2Bitmap **m_ppBitmaps; + JArithmeticDecoderStats *m_pGenericRegionStats; + JArithmeticDecoderStats *m_pRefinementRegionStats; + }; + + //------------------------------------------------------------------------ + // JBIG2PatternDict + //------------------------------------------------------------------------ + + class JBIG2PatternDict : public JBIG2Segment + { + public: + + JBIG2PatternDict(unsigned int unSegNum, unsigned int unSize) : JBIG2Segment(unSegNum) + { + m_unSize = unSize; + m_ppBitmaps = (JBIG2Bitmap **)MemUtilsMallocArray(m_unSize, sizeof(JBIG2Bitmap *)); + } + virtual ~JBIG2PatternDict() + { + for (unsigned int unIndex = 0; unIndex < m_unSize; ++unIndex) + { + delete m_ppBitmaps[unIndex]; + } + MemUtilsFree(m_ppBitmaps); + } + virtual JBIG2SegmentType GetType() { return jbig2SegPatternDict; } + unsigned int GetSize() + { + return m_unSize; + } + void SetBitmap(unsigned int unIndex, JBIG2Bitmap *pBitmap) + { + m_ppBitmaps[unIndex] = pBitmap; + } + JBIG2Bitmap *GetBitmap(unsigned int unIndex) + { + return m_ppBitmaps[unIndex]; + } + + private: + + unsigned int m_unSize; + JBIG2Bitmap **m_ppBitmaps; + }; + + //------------------------------------------------------------------------ + // JBIG2CodeTable + //------------------------------------------------------------------------ + + class JBIG2CodeTable : public JBIG2Segment + { + public: + + JBIG2CodeTable(unsigned int unSegNum, JBIG2HuffmanTable *pTable) : JBIG2Segment(unSegNum) + { + m_pTable = pTable; + } + virtual ~JBIG2CodeTable() + { + MemUtilsFree(m_pTable); + } + virtual JBIG2SegmentType GetType() + { + return jbig2SegCodeTable; + } + JBIG2HuffmanTable *GetHuffTable() + { + return m_pTable; + } + + private: + + JBIG2HuffmanTable *m_pTable; + }; + + //------------------------------------------------------------------------ + // JBIG2Stream + //------------------------------------------------------------------------ + + JBIG2Stream::JBIG2Stream(Stream *pStream, Object *pGlobalsStream) : + FilterStream(pStream) + { + m_pPageBitmap = NULL; + + m_pArithDecoder = new JArithmeticDecoder(); + + m_pGenericRegionStats = new JArithmeticDecoderStats(1 << 1); + m_pRefinementRegionStats = new JArithmeticDecoderStats(1 << 1); + + m_pIadhStats = new JArithmeticDecoderStats(1 << 9); + m_pIadwStats = new JArithmeticDecoderStats(1 << 9); + m_pIaexStats = new JArithmeticDecoderStats(1 << 9); + m_pIaaiStats = new JArithmeticDecoderStats(1 << 9); + m_pIadtStats = new JArithmeticDecoderStats(1 << 9); + m_pIaitStats = new JArithmeticDecoderStats(1 << 9); + m_pIafsStats = new JArithmeticDecoderStats(1 << 9); + m_pIadsStats = new JArithmeticDecoderStats(1 << 9); + m_pIardxStats = new JArithmeticDecoderStats(1 << 9); + m_pIardyStats = new JArithmeticDecoderStats(1 << 9); + m_pIardwStats = new JArithmeticDecoderStats(1 << 9); + m_pIardhStats = new JArithmeticDecoderStats(1 << 9); + m_pIariStats = new JArithmeticDecoderStats(1 << 9); + m_pIaidStats = new JArithmeticDecoderStats(1 << 1); + + m_pHuffDecoder = new JBIG2HuffmanDecoder(); + m_pMMrDecoder = new JBIG2MMRDecoder(); + + pGlobalsStream->Copy(&m_oGlobalsStream); + + m_pSegments = m_pGlobalSegments = NULL; + m_pCurStream = NULL; + m_pDataPtr = m_pDataEnd = NULL; + } + + JBIG2Stream::~JBIG2Stream() + { + Close(); + m_oGlobalsStream.Free(); + + delete m_pArithDecoder; + delete m_pGenericRegionStats; + delete m_pRefinementRegionStats; + delete m_pIadhStats; + delete m_pIadwStats; + delete m_pIaexStats; + delete m_pIaaiStats; + delete m_pIadtStats; + delete m_pIaitStats; + delete m_pIafsStats; + delete m_pIadsStats; + delete m_pIardxStats; + delete m_pIardyStats; + delete m_pIardwStats; + delete m_pIardhStats; + delete m_pIariStats; + delete m_pIaidStats; + delete m_pHuffDecoder; + delete m_pMMrDecoder; + delete m_pStream; + } + + void JBIG2Stream::Reset() + { + // read the globals stream + m_pGlobalSegments = new CList(); + if (m_oGlobalsStream.IsStream()) + { + m_pSegments = m_pGlobalSegments; + + m_pCurStream = m_oGlobalsStream.GetStream(); + m_pCurStream->Reset(); + + m_pArithDecoder->SetStream(m_pCurStream); + m_pHuffDecoder->SetStream(m_pCurStream); + m_pMMrDecoder->SetStream(m_pCurStream); + ReadSegments(); + m_pCurStream->Close(); + } + + // read the main stream + m_pSegments = new CList(); + + m_pCurStream = m_pStream; + m_pCurStream->Reset(); + + m_pArithDecoder->SetStream(m_pCurStream); + m_pHuffDecoder->SetStream(m_pCurStream); + m_pMMrDecoder->SetStream(m_pCurStream); + + ReadSegments(); + + if (m_pPageBitmap) + { + m_pDataPtr = m_pPageBitmap->GetDataPtr(); + m_pDataEnd = m_pDataPtr + m_pPageBitmap->GetDataSize(); + } + else + { + m_pDataPtr = m_pDataEnd = NULL; + } + } + + void JBIG2Stream::Close() + { + if (m_pPageBitmap) + { + delete m_pPageBitmap; + m_pPageBitmap = NULL; + } + if (m_pSegments) + { + DeleteCList(m_pSegments, JBIG2Segment); + m_pSegments = NULL; + } + if (m_pGlobalSegments) + { + DeleteCList(m_pGlobalSegments, JBIG2Segment); + m_pGlobalSegments = NULL; + } + m_pDataPtr = m_pDataEnd = NULL; + FilterStream::Close(); + } + + int JBIG2Stream::GetChar() + { + if (m_pDataPtr && m_pDataPtr < m_pDataEnd) + { + return (*m_pDataPtr++ ^ 0xff) & 0xff; + } + return EOF; + } + + int JBIG2Stream::LookChar() + { + if (m_pDataPtr && m_pDataPtr < m_pDataEnd) + { + return (*m_pDataPtr ^ 0xff) & 0xff; + } + return EOF; + } + + StringExt *JBIG2Stream::GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + + bool JBIG2Stream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + void JBIG2Stream::ReadSegments() + { + unsigned int unSegNum; + while (ReadULong(&unSegNum)) + { + // segment header flags + unsigned int unSegFlags; + if (!ReadUByte(&unSegFlags)) + { + return; + } + + unsigned int unSegType = unSegFlags & 0x3f; + + // referred-to segment count and retention flags + unsigned int unRefFlags; + if (!ReadUByte(&unRefFlags)) + { + return; + } + unsigned int unRefSegsCount = unRefFlags >> 5; + + if (7 == unRefSegsCount) + { + int nChar1, nChar2, nChar3; + if (EOF == (nChar1 = m_pCurStream->GetChar()) || EOF == (nChar2 = m_pCurStream->GetChar()) || EOF == (nChar3 = m_pCurStream->GetChar())) + { + return; + } + unRefFlags = (unRefFlags << 24) | (nChar1 << 16) | (nChar2 << 8) | nChar3; + unRefSegsCount = unRefFlags & 0x1fffffff; + for (unsigned int unIndex = 0; unIndex < (unRefSegsCount + 9) >> 3; ++unIndex) + { + nChar1 = m_pCurStream->GetChar(); + } + } + + // referred-to segment numbers + unsigned int *punRefSegs = (unsigned int *)MemUtilsMallocArray(unRefSegsCount, sizeof(unsigned int)); + if (unSegNum <= 256) + { + for (unsigned int unIndex = 0; unIndex < unRefSegsCount; ++unIndex) + { + if (!ReadUByte(&punRefSegs[unIndex])) + { + MemUtilsFree(punRefSegs); + return; + } + } + } + else if (unSegNum <= 65536) + { + for (unsigned int unIndex = 0; unIndex < unRefSegsCount; ++unIndex) + { + if (!ReadUWord(&punRefSegs[unIndex])) + { + MemUtilsFree(punRefSegs); + return; + } + } + } + else + { + for (unsigned int unIndex = 0; unIndex < unRefSegsCount; ++unIndex) + { + if (!ReadULong(&punRefSegs[unIndex])) + { + MemUtilsFree(punRefSegs); + return; + } + } + } + + // segment page association + unsigned int unPage; + if (unSegFlags & 0x40) + { + if (!ReadULong(&unPage)) + { + MemUtilsFree(punRefSegs); + return; + } + } + else + { + if (!ReadUByte(&unPage)) + { + MemUtilsFree(punRefSegs); + return; + } + } + + // segment data length + unsigned int unSegLength; + if (!ReadULong(&unSegLength)) + { + MemUtilsFree(punRefSegs); + return; + } + + // read the segment data + switch (unSegType) + { + case 0: + if (!ReadSymbolDictSegment(unSegNum, unSegLength, punRefSegs, unRefSegsCount)) + { + MemUtilsFree(punRefSegs); + return; + } + break; + case 4: + ReadTextRegionSegment(unSegNum, false, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 6: + ReadTextRegionSegment(unSegNum, true, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 7: + ReadTextRegionSegment(unSegNum, true, true, unSegLength, punRefSegs, unRefSegsCount); + break; + case 16: + ReadPatternDictSegment(unSegNum, unSegLength); + break; + case 20: + ReadHalftoneRegionSegment(unSegNum, false, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 22: + ReadHalftoneRegionSegment(unSegNum, true, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 23: + ReadHalftoneRegionSegment(unSegNum, true, true, unSegLength, punRefSegs, unRefSegsCount); + break; + case 36: + ReadGenericRegionSegment(unSegNum, false, false, unSegLength); + break; + case 38: + ReadGenericRegionSegment(unSegNum, true, false, unSegLength); + break; + case 39: + ReadGenericRegionSegment(unSegNum, true, true, unSegLength); + break; + case 40: + ReadGenericRefinementRegionSegment(unSegNum, false, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 42: + ReadGenericRefinementRegionSegment(unSegNum, true, false, unSegLength, punRefSegs, unRefSegsCount); + break; + case 43: + ReadGenericRefinementRegionSegment(unSegNum, true, true, unSegLength, punRefSegs, unRefSegsCount); + break; + case 48: + ReadPageInfoSegment(unSegLength); + break; + case 50: + ReadEndOfStripeSegment(unSegLength); + break; + case 52: + ReadProfilesSegment(unSegLength); + break; + case 53: + ReadCodeTableSegment(unSegNum, unSegLength); + break; + case 62: + ReadExtensionSegment(unSegLength); + break; + default: + for (unsigned int unIndex = 0; unIndex < unSegLength; ++unIndex) + { + int nChar; + if (EOF == (nChar = m_pCurStream->GetChar())) + { + MemUtilsFree(punRefSegs); + return; + } + } + break; + } + + MemUtilsFree(punRefSegs); + } + + return; + } + + bool JBIG2Stream::ReadSymbolDictSegment(unsigned int unSegNum, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount) + { + // symbol dictionary flags + unsigned int unFlags; + if (!ReadUWord(&unFlags)) + { + return false; + } + unsigned int unHuff = unFlags & 1; + unsigned int unRefAgg = (unFlags >> 1) & 1; + unsigned int unHuffDH = (unFlags >> 2) & 3; + unsigned int unHuffDW = (unFlags >> 4) & 3; + unsigned int unHuffBMSize = (unFlags >> 6) & 1; + unsigned int unHuffAggInst = (unFlags >> 7) & 1; + unsigned int unContextUsed = (unFlags >> 8) & 1; + unsigned int unContextRetained = (unFlags >> 9) & 1; + unsigned int unSDTemplate = (unFlags >> 10) & 3; + unsigned int unSDRTemplate = (unFlags >> 12) & 1; + + // symbol dictionary AT flags + int arrSDATx[4], arrSDATy[4]; + if (!unHuff) + { + if (unSDTemplate == 0) + { + if (!ReadByte(&arrSDATx[0]) || !ReadByte(&arrSDATy[0]) || !ReadByte(&arrSDATx[1]) || !ReadByte(&arrSDATy[1]) || + !ReadByte(&arrSDATx[2]) || !ReadByte(&arrSDATy[2]) || !ReadByte(&arrSDATx[3]) || !ReadByte(&arrSDATy[3])) + { + return false; + } + } + else + { + if (!ReadByte(&arrSDATx[0]) || !ReadByte(&arrSDATy[0])) + { + return false; + } + } + } + + // symbol dictionary refinement AT flags + int arrSDRATx[2], arrSDRATy[2]; + if (unRefAgg && !unSDRTemplate) + { + if (!ReadByte(&arrSDRATx[0]) || !ReadByte(&arrSDRATy[0]) || !ReadByte(&arrSDRATx[1]) || !ReadByte(&arrSDRATy[1])) + { + return false; + } + } + + // SDNUMEXSYMS and SDNUMNEWSYMS + unsigned int unNumExSyms, unNumNewSyms; + if (!ReadULong(&unNumExSyms) || !ReadULong(&unNumNewSyms)) + { + return false; + } + + // get referenced segments: input symbol dictionaries and code tables + CList *pCodeTables = new CList(); + unsigned int unNumInputSyms = 0, unI; + for (unI = 0; unI < unRefSegsCount; ++unI) + { + JBIG2Segment *pSegment = FindSegment(punRefSegs[unI]); + if (pSegment->GetType() == jbig2SegSymbolDict) + { + unNumInputSyms += ((JBIG2SymbolDict *)pSegment)->GetSize(); + } + else if (pSegment->GetType() == jbig2SegCodeTable) + { + pCodeTables->Append(pSegment); + } + } + + // compute symbol code length + unsigned int unSymCodeLen = 0; + unI = 1; + while (unI < unNumInputSyms + unNumNewSyms) + { + ++unSymCodeLen; + unI <<= 1; + } + + // get the input symbol bitmaps + JBIG2Bitmap **ppBitmaps = (JBIG2Bitmap **)MemUtilsMallocArray(unNumInputSyms + unNumNewSyms, sizeof(JBIG2Bitmap *)); + for (unI = 0; unI < unNumInputSyms + unNumNewSyms; ++unI) + { + ppBitmaps[unI] = NULL; + } + + unsigned int unK = 0, unJ; + JBIG2SymbolDict *pInputSymbolDict = NULL; + for (unI = 0; unI < unRefSegsCount; ++unI) + { + JBIG2Segment *pSegment = FindSegment(punRefSegs[unI]); + if (pSegment->GetType() == jbig2SegSymbolDict) + { + pInputSymbolDict = (JBIG2SymbolDict *)pSegment; + for (unJ = 0; unJ < pInputSymbolDict->GetSize(); ++unJ) + { + ppBitmaps[unK++] = pInputSymbolDict->GetBitmap(unJ); + } + } + } + + // get the Huffman tables + JBIG2HuffmanTable *pHuffDHTable = NULL, *pHuffDWTable = NULL, *pHuffBMSizeTable = NULL, *pHuffAggInstTable = NULL; + unI = 0; + if (unHuff) + { + if (unHuffDH == 0) + { + pHuffDHTable = c_oHuffTableD; + } + else if (unHuffDH == 1) + { + pHuffDHTable = c_oHuffTableE; + } + else + { + pHuffDHTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unI++))->GetHuffTable(); + } + + if (unHuffDW == 0) + { + pHuffDWTable = c_oHuffTableB; + } + else if (unHuffDW == 1) + { + pHuffDWTable = c_oHuffTableC; + } + else + { + pHuffDWTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unI++))->GetHuffTable(); + } + + if (unHuffBMSize == 0) + { + pHuffBMSizeTable = c_oHuffTableA; + } + else + { + pHuffBMSizeTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unI++))->GetHuffTable(); + } + + if (unHuffAggInst == 0) + { + pHuffAggInstTable = c_oHuffTableA; + } + else + { + pHuffAggInstTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unI++))->GetHuffTable(); + } + } + delete pCodeTables; + + // set up the Huffman decoder + if (unHuff) + { + m_pHuffDecoder->Reset(); + } + else // set up the arithmetic decoder + { + if (unContextUsed && pInputSymbolDict) + { + ResetGenericStats(unSDTemplate, pInputSymbolDict->GetGenericRegionStats()); + } + else + { + ResetGenericStats(unSDTemplate, NULL); + } + ResetIntStats(unSymCodeLen); + m_pArithDecoder->Start(); + } + + // set up the arithmetic decoder for refinement/aggregation + if (unRefAgg) + { + if (unContextUsed && pInputSymbolDict) + { + ResetRefinementStats(unSDRTemplate, pInputSymbolDict->GetRefinementRegionStats()); + } + else + { + ResetRefinementStats(unSDRTemplate, NULL); + } + } + + // allocate symbol widths storage + unsigned int *pSymWidths = NULL; + if (unHuff && !unRefAgg) + { + pSymWidths = (unsigned int *)MemUtilsMallocArray(unNumNewSyms, sizeof(unsigned int)); + } + + unsigned int unSymHeight = 0; + unI = 0; + while (unI < unNumNewSyms) + { + // read the height class delta height + int nDh; + if (unHuff) + { + m_pHuffDecoder->DecodeInt(&nDh, pHuffDHTable); + } + else + { + m_pArithDecoder->DecodeInt(&nDh, m_pIadhStats); + } + if (nDh < 0 && (unsigned int)-nDh >= unSymHeight) + { + // SyntaxError + for (unsigned int unIndex = 0; unIndex < unNumNewSyms; ++unIndex) + { + if (ppBitmaps[unNumInputSyms + unIndex]) + { + delete ppBitmaps[unNumInputSyms + unIndex]; + } + } + + MemUtilsFree(ppBitmaps); + if (pSymWidths) + { + MemUtilsFree(pSymWidths); + } + return false; + } + unSymHeight += nDh; + unsigned int unSymWidth = 0, unTotalWidth = 0; + unJ = unI; + + // read the symbols in this height class + while (1) + { + // read the delta width + int nDw; + if (unHuff) + { + if (!m_pHuffDecoder->DecodeInt(&nDw, pHuffDWTable)) + { + break; + } + } + else + { + if (!m_pArithDecoder->DecodeInt(&nDw, m_pIadwStats)) + { + break; + } + } + if (nDw < 0 && (unsigned int)-nDw >= unSymWidth) + { + // SyntaxError + for (unsigned int unIndex = 0; unIndex < unNumNewSyms; ++unIndex) + { + if (ppBitmaps[unNumInputSyms + unIndex]) + { + delete ppBitmaps[unNumInputSyms + unIndex]; + } + } + + MemUtilsFree(ppBitmaps); + if (pSymWidths) + { + MemUtilsFree(pSymWidths); + } + return false; + } + unSymWidth += nDw; + + // using a collective bitmap, so don't read a bitmap here + if (unHuff && !unRefAgg) + { + pSymWidths[unI] = unSymWidth; + unTotalWidth += unSymWidth; + } + else if (unRefAgg) // refinement/aggregate coding + { + int nRefAggNum; + if (unHuff) + { + if (!m_pHuffDecoder->DecodeInt(&nRefAggNum, pHuffAggInstTable)) + { + break; + } + } + else + { + if (!m_pArithDecoder->DecodeInt(&nRefAggNum, m_pIaaiStats)) + { + break; + } + } +#if 0 //~ This special case was added about a year before the final draft + //~ of the JBIG2 spec was released. I have encountered some old + //~ JBIG2 images that predate it. + if ( 0 ) + { +#else + if (nRefAggNum == 1) + { +#endif + unsigned int unSymID; + int nRefDX, nRefDY, nBMSize; + if (unHuff) + { + unSymID = m_pHuffDecoder->ReadBits(unSymCodeLen); + m_pHuffDecoder->DecodeInt(&nRefDX, c_oHuffTableO); + m_pHuffDecoder->DecodeInt(&nRefDY, c_oHuffTableO); + m_pHuffDecoder->DecodeInt(&nBMSize, c_oHuffTableA); + m_pHuffDecoder->Reset(); + m_pArithDecoder->Start(); + } + else + { + unSymID = m_pArithDecoder->DecodeIAID(unSymCodeLen, m_pIaidStats); + m_pArithDecoder->DecodeInt(&nRefDX, m_pIardxStats); + m_pArithDecoder->DecodeInt(&nRefDY, m_pIardyStats); + } + JBIG2Bitmap *pRefBitmap = ppBitmaps[unSymID]; + ppBitmaps[unNumInputSyms + unI] = ReadGenericRefinementRegion(unSymWidth, unSymHeight, unSDRTemplate, false, pRefBitmap, nRefDX, nRefDY, arrSDRATx, arrSDRATy); + } + else //~ do we need to use the bmSize value here (in Huffman mode)? + { + ppBitmaps[unNumInputSyms + unI] = ReadTextRegion(unHuff ? true : false, true, unSymWidth, unSymHeight, nRefAggNum, 0, unNumInputSyms + unI, NULL, unSymCodeLen, ppBitmaps, 0, 0, 0, 1, 0, c_oHuffTableF, c_oHuffTableH, c_oHuffTableK, c_oHuffTableO, c_oHuffTableO, c_oHuffTableO, c_oHuffTableO, c_oHuffTableA, unSDRTemplate, arrSDRATx, arrSDRATy); + } + } + else // non-ref/agg coding + { + ppBitmaps[unNumInputSyms + unI] = ReadGenericBitmap(false, unSymWidth, unSymHeight, unSDTemplate, false, false, NULL, arrSDATx, arrSDATy, 0); + } + + ++unI; + } + + // read the collective bitmap + if (unHuff && !unRefAgg) + { + int nBMSize; + m_pHuffDecoder->DecodeInt(&nBMSize, pHuffBMSizeTable); + m_pHuffDecoder->Reset(); + + JBIG2Bitmap *pCollBitmap; + if (nBMSize == 0) + { + pCollBitmap = new JBIG2Bitmap(0, unTotalWidth, unSymHeight); + nBMSize = unSymHeight * ((unTotalWidth + 7) >> 3); + unsigned char *pDataPtr = pCollBitmap->GetDataPtr(); + for (unK = 0; unK < (unsigned int)nBMSize; ++unK) + { + *pDataPtr++ = m_pCurStream->GetChar(); + } + } + else + { + pCollBitmap = ReadGenericBitmap(true, unTotalWidth, unSymHeight, 0, false, false, NULL, NULL, NULL, nBMSize); + } + unsigned int unX = 0; + for (; unJ < unI; ++unJ) + { + ppBitmaps[unNumInputSyms + unJ] = pCollBitmap->GetSlice(unX, 0, pSymWidths[unJ], unSymHeight); + unX += pSymWidths[unJ]; + } + delete pCollBitmap; + } + } + + // create the symbol dict object + JBIG2SymbolDict *pSymbolDict = new JBIG2SymbolDict(unSegNum, unNumExSyms); + + // exported symbol list + unI = unJ = 0; + bool bEx = false; + while (unI < unNumInputSyms + unNumNewSyms) + { + int nRun; + if (unHuff) + { + m_pHuffDecoder->DecodeInt(&nRun, c_oHuffTableA); + } + else + { + m_pArithDecoder->DecodeInt(&nRun, m_pIaexStats); + } + if (bEx) + { + for (int nCounter = 0; nCounter < nRun; ++nCounter) + { + pSymbolDict->SetBitmap(unJ++, ppBitmaps[unI++]->Copy()); + } + } + else + { + unI += nRun; + } + bEx = !bEx; + } + + for (unI = 0; unI < unNumNewSyms; ++unI) + { + delete ppBitmaps[unNumInputSyms + unI]; + } + MemUtilsFree(ppBitmaps); + if (pSymWidths) + { + MemUtilsFree(pSymWidths); + } + + // save the arithmetic decoder stats + if (!unHuff && unContextRetained) + { + pSymbolDict->SetGenericRegionStats(m_pGenericRegionStats->Copy()); + if (unRefAgg) + { + pSymbolDict->SetRefinementRegionStats(m_pRefinementRegionStats->Copy()); + } + } + + // store the new symbol dict + m_pSegments->Append(pSymbolDict); + + return true; + } + + void JBIG2Stream::ReadTextRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount) + { + // region segment info field + unsigned int unW, unH, unX, unY, unSegInfoFlags; + if (!ReadULong(&unW) || !ReadULong(&unH) || !ReadULong(&unX) || !ReadULong(&unY) || !ReadUByte(&unSegInfoFlags)) + { + return; + } + + unsigned int unExtCombOp = unSegInfoFlags & 7; + + // rest of the text region header + unsigned int unFlags; + if (!ReadUWord(&unFlags)) + { + return; + } + + unsigned int unHuff = unFlags & 1; + unsigned int unRefine = (unFlags >> 1) & 1; + unsigned int unLogStrips = (unFlags >> 2) & 3; + unsigned int unRefCorner = (unFlags >> 4) & 3; + unsigned int unTransposed = (unFlags >> 6) & 1; + unsigned int unCombOp = (unFlags >> 7) & 3; + unsigned int unDefPixel = (unFlags >> 9) & 1; + int nSOffset = (unFlags >> 10) & 0x1f; + unsigned int unTempl = (unFlags >> 15) & 1; + + if (nSOffset & 0x10) + { + nSOffset |= -1 - 0x0f; + } + + unsigned int unHuffFS = 0, unHuffDS = 0, unHuffDT = 0, unHuffRDW = 0, unHuffRDH = 0, unHuffRDX = 0, unHuffRDY = 0, unHuffRSize = 0; + if (unHuff) + { + unsigned int unHuffFlags; + if (!ReadUWord(&unHuffFlags)) + { + return; + } + unHuffFS = unHuffFlags & 3; + unHuffDS = (unHuffFlags >> 2) & 3; + unHuffDT = (unHuffFlags >> 4) & 3; + unHuffRDW = (unHuffFlags >> 6) & 3; + unHuffRDH = (unHuffFlags >> 8) & 3; + unHuffRDX = (unHuffFlags >> 10) & 3; + unHuffRDY = (unHuffFlags >> 12) & 3; + unHuffRSize = (unHuffFlags >> 14) & 1; + } + + int arrATx[2], arrATy[2]; + if (unRefine && unTempl == 0) + { + if (!ReadByte(&arrATx[0]) || !ReadByte(&arrATy[0]) || !ReadByte(&arrATx[1]) || !ReadByte(&arrATy[1])) + { + return; + } + } + + unsigned int unNumInstances; + if (!ReadULong(&unNumInstances)) + { + return; + } + + // get symbol dictionaries and tables + CList *pCodeTables = new CList(); + unsigned int unNumSyms = 0; + unsigned int unIndex; + for (unIndex = 0; unIndex < unRefSegsCount; ++unIndex) + { + JBIG2Segment *pSegment = NULL; + if ((pSegment = FindSegment(punRefSegs[unIndex]))) + { + if (pSegment->GetType() == jbig2SegSymbolDict) + { + unNumSyms += ((JBIG2SymbolDict *)pSegment)->GetSize(); + } + else if (pSegment->GetType() == jbig2SegCodeTable) + { + pCodeTables->Append(pSegment); + } + } + else + { + } + } + + unsigned int unSymCodeLen = 0; + unIndex = 1; + while (unIndex < unNumSyms) + { + ++unSymCodeLen; + unIndex <<= 1; + } + + // get the symbol bitmaps + JBIG2Bitmap **ppSyms = (JBIG2Bitmap **)MemUtilsMallocArray(unNumSyms, sizeof(JBIG2Bitmap *)); + unsigned int unSymsIndex = 0; + for (unIndex = 0; unIndex < unRefSegsCount; ++unIndex) + { + JBIG2Segment *pSegment = NULL; + if ((pSegment = FindSegment(punRefSegs[unIndex]))) + { + if (pSegment->GetType() == jbig2SegSymbolDict) + { + JBIG2SymbolDict *pSymbolDict = (JBIG2SymbolDict *)pSegment; + for (unsigned int unK = 0; unK < pSymbolDict->GetSize(); ++unK) + { + ppSyms[unSymsIndex++] = pSymbolDict->GetBitmap(unK); + } + } + } + } + + // get the Huffman tables + JBIG2HuffmanTable *pHuffFSTable = NULL, *pHuffDSTable = NULL, *pHuffDTTable = NULL, *pHuffRDWTable = NULL, *pHuffRDHTable = NULL, *pHuffRDXTable = NULL, *pHuffRDYTable = NULL, *pHuffRSizeTable = NULL; + unIndex = 0; + if (unHuff) + { + if (unHuffFS == 0) + { + pHuffFSTable = c_oHuffTableF; + } + else if (unHuffFS == 1) + { + pHuffFSTable = c_oHuffTableG; + } + else + { + pHuffFSTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + if (unHuffDS == 0) + { + pHuffDSTable = c_oHuffTableH; + } + else if (unHuffDS == 1) + { + pHuffDSTable = c_oHuffTableI; + } + else if (unHuffDS == 2) + { + pHuffDSTable = c_oHuffTableJ; + } + else + { + pHuffDSTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffDT == 0) + { + pHuffDTTable = c_oHuffTableK; + } + else if (unHuffDT == 1) + { + pHuffDTTable = c_oHuffTableL; + } + else if (unHuffDT == 2) + { + pHuffDTTable = c_oHuffTableM; + } + else + { + pHuffDTTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffRDW == 0) + { + pHuffRDWTable = c_oHuffTableN; + } + else if (unHuffRDW == 1) + { + pHuffRDWTable = c_oHuffTableO; + } + else + { + pHuffRDWTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffRDH == 0) + { + pHuffRDHTable = c_oHuffTableN; + } + else if (unHuffRDH == 1) + { + pHuffRDHTable = c_oHuffTableO; + } + else + { + pHuffRDHTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffRDX == 0) + { + pHuffRDXTable = c_oHuffTableN; + } + else if (unHuffRDX == 1) + { + pHuffRDXTable = c_oHuffTableO; + } + else + { + pHuffRDXTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffRDY == 0) + { + pHuffRDYTable = c_oHuffTableN; + } + else if (unHuffRDY == 1) + { + pHuffRDYTable = c_oHuffTableO; + } + else + { + pHuffRDYTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + + if (unHuffRSize == 0) + { + pHuffRSizeTable = c_oHuffTableA; + } + else + { + pHuffRSizeTable = ((JBIG2CodeTable *)pCodeTables->GetByIndex(unIndex++))->GetHuffTable(); + } + } + delete pCodeTables; + + // symbol ID Huffman decoding table + JBIG2HuffmanTable *pSymCodeTab; + if (unHuff) + { + m_pHuffDecoder->Reset(); + JBIG2HuffmanTable arrRunLengthTab[36]; + + for (unIndex = 0; unIndex < 32; ++unIndex) + { + arrRunLengthTab[unIndex].nValue = unIndex; + arrRunLengthTab[unIndex].unPrefixLen = m_pHuffDecoder->ReadBits(4); + arrRunLengthTab[unIndex].unRangeLen = 0; + } + arrRunLengthTab[32].nValue = 0x103; + arrRunLengthTab[32].unPrefixLen = m_pHuffDecoder->ReadBits(4); + arrRunLengthTab[32].unRangeLen = 2; + + arrRunLengthTab[33].nValue = 0x203; + arrRunLengthTab[33].unPrefixLen = m_pHuffDecoder->ReadBits(4); + arrRunLengthTab[33].unRangeLen = 3; + + arrRunLengthTab[34].nValue = 0x20b; + arrRunLengthTab[34].unPrefixLen = m_pHuffDecoder->ReadBits(4); + arrRunLengthTab[34].unRangeLen = 7; + + arrRunLengthTab[35].unPrefixLen = 0; + arrRunLengthTab[35].unRangeLen = jbig2HuffmanEOT; + + m_pHuffDecoder->BuildTable(arrRunLengthTab, 35); + pSymCodeTab = (JBIG2HuffmanTable *)MemUtilsMallocArray(unNumSyms + 1, sizeof(JBIG2HuffmanTable)); + + for (unIndex = 0; unIndex < unNumSyms; ++unIndex) + { + pSymCodeTab[unIndex].nValue = unIndex; + pSymCodeTab[unIndex].unRangeLen = 0; + } + unIndex = 0; + + int nJ; + while (unIndex < unNumSyms) + { + m_pHuffDecoder->DecodeInt(&nJ, arrRunLengthTab); + if (nJ > 0x200) + { + for (nJ -= 0x200; nJ && unIndex < unNumSyms; --nJ) + { + pSymCodeTab[unIndex++].unPrefixLen = 0; + } + } + else if (nJ > 0x100) + { + for (nJ -= 0x100; nJ && unIndex < unNumSyms; --nJ) + { + pSymCodeTab[unIndex].unPrefixLen = pSymCodeTab[unIndex - 1].unPrefixLen; + ++unIndex; + } + } + else + { + pSymCodeTab[unIndex++].unPrefixLen = nJ; + } + } + pSymCodeTab[unNumSyms].unPrefixLen = 0; + pSymCodeTab[unNumSyms].unRangeLen = jbig2HuffmanEOT; + m_pHuffDecoder->BuildTable(pSymCodeTab, unNumSyms); + m_pHuffDecoder->Reset(); + } + else // set up the arithmetic decoder + { + pSymCodeTab = NULL; + ResetIntStats(unSymCodeLen); + m_pArithDecoder->Start(); + } + if (unRefine) + { + ResetRefinementStats(unTempl, NULL); + } + + JBIG2Bitmap *pBitmap = ReadTextRegion(unHuff ? true : false, unRefine ? true : false, unW, unH, unNumInstances, unLogStrips, unNumSyms, pSymCodeTab, unSymCodeLen, ppSyms, unDefPixel, unCombOp, unTransposed, unRefCorner, nSOffset, pHuffFSTable, pHuffDSTable, pHuffDTTable, pHuffRDWTable, pHuffRDHTable, pHuffRDXTable, pHuffRDYTable, pHuffRSizeTable, unTempl, arrATx, arrATy); + + MemUtilsFree(ppSyms); + + // combine the region bitmap into the page bitmap + if (bImm) + { + if (m_unPageH == 0xffffffff && unY + unH > m_unCurPageH) + { + m_pPageBitmap->Expand(unY + unH, m_unPageDefPixel); + } + m_pPageBitmap->Combine(pBitmap, unX, unY, unExtCombOp); + delete pBitmap; + } + else // store the region bitmap + { + pBitmap->SetSegNum(unSegNum); + m_pSegments->Append(pBitmap); + } + + // clean up the Huffman decoder + if (unHuff) + { + MemUtilsFree(pSymCodeTab); + } + + return; + } + + JBIG2Bitmap *JBIG2Stream::ReadTextRegion(bool bHuff, bool bRefine, int nW, int nH, unsigned int unNumInstances, unsigned int unLogStrips, int nNumSyms, JBIG2HuffmanTable *pSymCodeTab, unsigned int unSymCodeLen, JBIG2Bitmap **ppSyms, unsigned int unDefPixel, unsigned int unCombOp, unsigned int transposed, unsigned int refCorner, int nSOffset, JBIG2HuffmanTable *pHuffFSTable, JBIG2HuffmanTable *pHuffDSTable, JBIG2HuffmanTable *pHuffDTTable, JBIG2HuffmanTable *pHuffRDWTable, JBIG2HuffmanTable *pHuffRDHTable, JBIG2HuffmanTable *pHuffRDXTable, JBIG2HuffmanTable *pHuffRDYTable, JBIG2HuffmanTable *pHuffRSizeTable, unsigned int unTempl, int *pnATx, int *pnATy) + { + unsigned int unStrips = 1 << unLogStrips; + + // allocate the bitmap + JBIG2Bitmap *pBitmap = new JBIG2Bitmap(0, nW, nH); + if (unDefPixel) + { + pBitmap->ClearToOne(); + } + else + { + pBitmap->ClearToZero(); + } + + // decode initial T value + int nT; + if (bHuff) + { + m_pHuffDecoder->DecodeInt(&nT, pHuffDTTable); + } + else + { + m_pArithDecoder->DecodeInt(&nT, m_pIadtStats); + } + nT *= -(int)unStrips; + + unsigned int unInstance = 0; + int nSFirst = 0; + while (unInstance < unNumInstances) + { + // decode delta-T + int nDeltaT; + if (bHuff) + { + m_pHuffDecoder->DecodeInt(&nDeltaT, pHuffDTTable); + } + else + { + m_pArithDecoder->DecodeInt(&nDeltaT, m_pIadtStats); + } + nT += nDeltaT * unStrips; + + // first S value + int nDS; + if (bHuff) + { + m_pHuffDecoder->DecodeInt(&nDS, pHuffFSTable); + } + else + { + m_pArithDecoder->DecodeInt(&nDS, m_pIafsStats); + } + nSFirst += nDS; + + int nCurS = nSFirst; + + // read the instances + while (1) + { + // T value + if (1 == unStrips) + { + nDeltaT = 0; + } + else if (bHuff) + { + nDeltaT = m_pHuffDecoder->ReadBits(unLogStrips); + } + else + { + m_pArithDecoder->DecodeInt(&nDeltaT, m_pIaitStats); + } + int nCurT = nT + nDeltaT; + + // symbol ID + unsigned int unSymID; + if (bHuff) + { + if (pSymCodeTab) + { + int nTemp; + m_pHuffDecoder->DecodeInt(&nTemp, pSymCodeTab); + unSymID = (unsigned int)nTemp; + } + else + { + unSymID = m_pHuffDecoder->ReadBits(unSymCodeLen); + } + } + else + { + unSymID = m_pArithDecoder->DecodeIAID(unSymCodeLen, m_pIaidStats); + } + + if (unSymID >= (unsigned int)nNumSyms) + { + } + else + { + // get the symbol bitmap + JBIG2Bitmap *pSymbolBitmap = NULL; + int nReadInt; + if (bRefine) + { + if (bHuff) + { + nReadInt = (int)m_pHuffDecoder->ReadBit(); + } + else + { + m_pArithDecoder->DecodeInt(&nReadInt, m_pIariStats); + } + } + else + { + nReadInt = 0; + } + + if (nReadInt) + { + int nRDW, nRDH, nRDX, nRDY, nBMSize; + if (bHuff) + { + m_pHuffDecoder->DecodeInt(&nRDW, pHuffRDWTable); + m_pHuffDecoder->DecodeInt(&nRDH, pHuffRDHTable); + m_pHuffDecoder->DecodeInt(&nRDX, pHuffRDXTable); + m_pHuffDecoder->DecodeInt(&nRDY, pHuffRDYTable); + m_pHuffDecoder->DecodeInt(&nBMSize, pHuffRSizeTable); + m_pHuffDecoder->Reset(); + m_pArithDecoder->Start(); + } + else + { + m_pArithDecoder->DecodeInt(&nRDW, m_pIardwStats); + m_pArithDecoder->DecodeInt(&nRDH, m_pIardhStats); + m_pArithDecoder->DecodeInt(&nRDX, m_pIardxStats); + m_pArithDecoder->DecodeInt(&nRDY, m_pIardyStats); + } + + int nRefDX = ((nRDW >= 0) ? nRDW : nRDW - 1) / 2 + nRDX; + int nRefDY = ((nRDH >= 0) ? nRDH : nRDH - 1) / 2 + nRDY; + + pSymbolBitmap = ReadGenericRefinementRegion(nRDW + ppSyms[unSymID]->GetWidth(), nRDH + ppSyms[unSymID]->GetHeight(), unTempl, false, ppSyms[unSymID], nRefDX, nRefDY, pnATx, pnATy); + } + else //~ do we need to use the bmSize value here (in Huffman mode)? + { + pSymbolBitmap = ppSyms[unSymID]; + } + + // combine the symbol bitmap into the region bitmap + //~ something is wrong here - refCorner shouldn't degenerate into + //~ two cases + unsigned int unBitmapW = pSymbolBitmap->GetWidth() - 1; + unsigned int unBitmapH = pSymbolBitmap->GetHeight() - 1; + if (transposed) + { + switch (refCorner) + { + case 0: // bottom left + pBitmap->Combine(pSymbolBitmap, nCurT, nCurS, unCombOp); + break; + case 1: // top left + pBitmap->Combine(pSymbolBitmap, nCurT, nCurS, unCombOp); + break; + case 2: // bottom right + pBitmap->Combine(pSymbolBitmap, nCurT - unBitmapW, nCurS, unCombOp); + break; + case 3: // top right + pBitmap->Combine(pSymbolBitmap, nCurT - unBitmapW, nCurS, unCombOp); + break; + } + nCurS += unBitmapH; + } + else + { + switch (refCorner) + { + case 0: // bottom left + pBitmap->Combine(pSymbolBitmap, nCurS, nCurT - unBitmapH, unCombOp); + break; + case 1: // top left + pBitmap->Combine(pSymbolBitmap, nCurS, nCurT, unCombOp); + break; + case 2: // bottom right + pBitmap->Combine(pSymbolBitmap, nCurS, nCurT - unBitmapH, unCombOp); + break; + case 3: // top right + pBitmap->Combine(pSymbolBitmap, nCurS, nCurT, unCombOp); + break; + } + nCurS += unBitmapW; + } + + if (nReadInt) + { + delete pSymbolBitmap; + } + } + + // next instance + ++unInstance; + + // next S value + if (bHuff) + { + if (!m_pHuffDecoder->DecodeInt(&nDS, pHuffDSTable)) + { + break; + } + } + else + { + if (!m_pArithDecoder->DecodeInt(&nDS, m_pIadsStats)) + { + break; + } + } + nCurS += nSOffset + nDS; + } + } + + return pBitmap; + } + + void JBIG2Stream::ReadPatternDictSegment(unsigned int unSegNum, unsigned int unLength) + { + // halftone dictionary flags, pattern width and height, max gray value + unsigned int unFlags, unPatternW, unPatternH, unGrayMax; + if (!ReadUByte(&unFlags) || !ReadUByte(&unPatternW) || !ReadUByte(&unPatternH) || !ReadULong(&unGrayMax)) + { + return; + } + unsigned int unTempl = (unFlags >> 1) & 3; + unsigned int unMMR = unFlags & 1; + + // set up the arithmetic decoder + if (!unMMR) + { + ResetGenericStats(unTempl, NULL); + m_pArithDecoder->Start(); + } + + // read the bitmap + int arrATx[4], arrATy[4]; + arrATx[0] = -(int)unPatternW; arrATy[0] = 0; + arrATx[1] = -3; arrATy[1] = -1; + arrATx[2] = 2; arrATy[2] = -2; + arrATx[3] = -2; arrATy[3] = -2; + JBIG2Bitmap *pBitmap = ReadGenericBitmap(unMMR ? true : false, (unGrayMax + 1) * unPatternW, unPatternH, unTempl, false, false, NULL, arrATx, arrATy, unLength - 7); + + // create the pattern dict object + JBIG2PatternDict *pPatternDict = new JBIG2PatternDict(unSegNum, unGrayMax + 1); + + // split up the bitmap + unsigned int unX = 0; + for (unsigned int unIndex = 0; unIndex <= unGrayMax; ++unIndex) + { + pPatternDict->SetBitmap(unIndex, pBitmap->GetSlice(unX, 0, unPatternW, unPatternH)); + unX += unPatternW; + } + + // free memory + delete pBitmap; + + // store the new pattern dict + m_pSegments->Append(pPatternDict); + + return; + } + + void JBIG2Stream::ReadHalftoneRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount) + { + // region segment info field + unsigned int unW, unH, unX, unY, unSegInfoFlags; + if (!ReadULong(&unW) || !ReadULong(&unH) || !ReadULong(&unX) || !ReadULong(&unY) || !ReadUByte(&unSegInfoFlags)) + { + return; + } + unsigned int unExtCombOp = unSegInfoFlags & 7; + + // rest of the halftone region header + unsigned int unFlags; + if (!ReadUByte(&unFlags)) + { + return; + } + unsigned int unMMR = unFlags & 1; + unsigned int unTempl = (unFlags >> 1) & 3; + unsigned int unEnableSkip = (unFlags >> 3) & 1; + unsigned int unCombOp = (unFlags >> 4) & 7; + + unsigned int unGridW, unGridH, unStepX, unStepY; + int nGridX, nGridY; + if (!ReadULong(&unGridW) || !ReadULong(&unGridH) || !ReadLong(&nGridX) || !ReadLong(&nGridY) || !ReadUWord(&unStepX) || !ReadUWord(&unStepY)) + { + return; + } + if (unW == 0 || unH == 0 || unW >= INT_MAX / unH) + { + return; + } + if (unGridH == 0 || unGridW >= INT_MAX / unGridH) + { + return; + } + + // get pattern dictionary + if (unRefSegsCount != 1) + { + return; + } + + JBIG2Segment *pSegment = FindSegment(punRefSegs[0]); + if (pSegment->GetType() != jbig2SegPatternDict) + { + return; + } + JBIG2PatternDict *pPatternDict = (JBIG2PatternDict *)pSegment; + + unsigned int unBPP = 0; + unsigned int unIndex = 1; + while (unIndex < pPatternDict->GetSize()) + { + ++unBPP; + unIndex <<= 1; + } + + unsigned int unPatternW = pPatternDict->GetBitmap(0)->GetWidth(); + unsigned int unPatternH = pPatternDict->GetBitmap(0)->GetHeight(); + + // set up the arithmetic decoder + if (!unMMR) + { + ResetGenericStats(unTempl, NULL); + m_pArithDecoder->Start(); + } + + // allocate the bitmap + JBIG2Bitmap *pBitmap = new JBIG2Bitmap(unSegNum, unW, unH); + if (unFlags & 0x80) // HDEFPIXEL + { + pBitmap->ClearToOne(); + } + else + { + pBitmap->ClearToZero(); + } + + // compute the skip bitmap + JBIG2Bitmap *pSkipBitmap = NULL; + if (unEnableSkip) + { + pSkipBitmap = new JBIG2Bitmap(0, unGridW, unGridH); + pSkipBitmap->ClearToZero(); + + for (unsigned int unM = 0; unM < unGridH; ++unM) + { + for (unsigned int unN = 0; unN < unGridW; ++unN) + { + int nCurX = nGridX + unM * unStepY + unN * unStepX; + int nCurY = nGridY + unM * unStepX - unN * unStepY; + if (((nCurX + (int)unPatternW) >> 8) <= 0 || (nCurX >> 8) >= (int)unW || ((nCurY + (int)unPatternH) >> 8) <= 0 || (nCurY >> 8) >= (int)unH) + { + pSkipBitmap->SetPixel(unN, unM); + } + } + } + } + + // read the gray-scale image + unsigned int *pGrayImage = (unsigned int *)MemUtilsMallocArray(unGridW * unGridH, sizeof(unsigned int)); + memset(pGrayImage, 0, unGridW * unGridH * sizeof(unsigned int)); + + int arrATx[4], arrATy[4]; + arrATx[0] = unTempl <= 1 ? 3 : 2; arrATy[0] = -1; + arrATx[1] = -3; arrATy[1] = -1; + arrATx[2] = 2; arrATy[2] = -2; + arrATx[3] = -2; arrATy[3] = -2; + + for (int nBitIndex = unBPP - 1; nBitIndex >= 0; --nBitIndex) + { + JBIG2Bitmap *pGrayBitmap = ReadGenericBitmap(0 != unMMR, unGridW, unGridH, unTempl, false, 0 != unEnableSkip, pSkipBitmap, arrATx, arrATy, -1); + unIndex = 0; + for (unsigned int unM = 0; unM < unGridH; ++unM) + { + for (unsigned int unN = 0; unN < unGridW; ++unN) + { + int nBit = pGrayBitmap->GetPixel(unN, unM) ^ (pGrayImage[unIndex] & 1); + pGrayImage[unIndex] = (pGrayImage[unIndex] << 1) | nBit; + ++unIndex; + } + } + delete pGrayBitmap; + } + + // decode the image + unIndex = 0; + for (unsigned int unM = 0; unM < unGridH; ++unM) + { + int nCurX = nGridX + unM * unStepY; + int nCurY = nGridY + unM * unStepX; + for (unsigned int unN = 0; unN < unGridW; ++unN) + { + if (!(unEnableSkip && pSkipBitmap->GetPixel(unN, unM))) + { + JBIG2Bitmap *pPatternBitmap = pPatternDict->GetBitmap(pGrayImage[unIndex]); + pBitmap->Combine(pPatternBitmap, nCurX >> 8, nCurY >> 8, unCombOp); + } + nCurX += unStepX; + nCurY -= unStepY; + ++unIndex; + } + } + + MemUtilsFree(pGrayImage); + if (pSkipBitmap) + { + delete pSkipBitmap; + } + + // combine the region bitmap into the page bitmap + if (bImm) + { + if (m_unPageH == 0xffffffff && unY + unH > m_unCurPageH) + { + m_pPageBitmap->Expand(unY + unH, m_unPageDefPixel); + } + m_pPageBitmap->Combine(pBitmap, unX, unY, unExtCombOp); + delete pBitmap; + } + else // store the region bitmap + { + m_pSegments->Append(pBitmap); + } + + return; + } + + void JBIG2Stream::ReadGenericRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength) + { + // region segment info field + unsigned int unW, unH, unX, unY, unSegInfoFlags; + if (!ReadULong(&unW) || !ReadULong(&unH) || !ReadULong(&unX) || !ReadULong(&unY) || !ReadUByte(&unSegInfoFlags)) + { + return; + } + unsigned int unExtCombOp = unSegInfoFlags & 7; + + // rest of the generic region segment header + unsigned int unFlags; + if (!ReadUByte(&unFlags)) + { + return; + } + unsigned int unMMR = unFlags & 1; + unsigned int unTempl = (unFlags >> 1) & 3; + unsigned int unTpgdOn = (unFlags >> 3) & 1; + + // AT flags + int arrATx[4], arrATy[4]; + if (!unMMR) + { + if (unTempl == 0) + { + if (!ReadByte(&arrATx[0]) || !ReadByte(&arrATy[0]) || !ReadByte(&arrATx[1]) || !ReadByte(&arrATy[1]) || + !ReadByte(&arrATx[2]) || !ReadByte(&arrATy[2]) || !ReadByte(&arrATx[3]) || !ReadByte(&arrATy[3])) + { + return; + } + } + else + { + if (!ReadByte(&arrATx[0]) || !ReadByte(&arrATy[0])) + { + return; + } + } + } + + // set up the arithmetic decoder + if (!unMMR) + { + ResetGenericStats(unTempl, NULL); + m_pArithDecoder->Start(); + } + + // read the bitmap + JBIG2Bitmap *pBitmap = ReadGenericBitmap(0 != unMMR, unW, unH, unTempl, 0 != unTpgdOn, false, NULL, arrATx, arrATy, unMMR ? 0 : unLength - 18); + + // combine the region bitmap into the page bitmap + if (bImm) + { + if (m_unPageH == 0xffffffff && unY + unH > m_unCurPageH) + { + m_pPageBitmap->Expand(unY + unH, m_unPageDefPixel); + } + m_pPageBitmap->Combine(pBitmap, unX, unY, unExtCombOp); + delete pBitmap; + } + else // store the region bitmap + { + pBitmap->SetSegNum(unSegNum); + m_pSegments->Append(pBitmap); + } + + return; + } + + JBIG2Bitmap *JBIG2Stream::ReadGenericBitmap(bool bMMR, int nW, int nH, int unTempl, bool bTpgdOn, bool bUseSkip, JBIG2Bitmap *pSkip, int *pnATx, int *pnATy, int nMMrDataLength) + { + JBIG2Bitmap *pBitmap = new JBIG2Bitmap(0, nW, nH); + pBitmap->ClearToZero(); + + if (bMMR) //----- MMR decode + { + m_pMMrDecoder->Reset(); + + int *pRefLine = (int *)MemUtilsMallocArray(nW + 2, sizeof(int)); + int *pCodingLine = (int *)MemUtilsMallocArray(nW + 2, sizeof(int)); + + pCodingLine[0] = pCodingLine[1] = nW; + + for (int nY = 0; nY < nH; ++nY) + { + // copy coding line to ref line + int nIndex; + for (nIndex = 0; pCodingLine[nIndex] < nW; ++nIndex) + { + pRefLine[nIndex] = pCodingLine[nIndex]; + } + pRefLine[nIndex] = pRefLine[nIndex + 1] = nW; + + // decode a line + int nRefIndex = 0; // nB1 = pRefLine[refI] + int nCodingIndex = 0; // nA1 = pCodingLine[codingI] + int nA0 = 0; + + do + { + int nCode1 = m_pMMrDecoder->Get2DCode(); + switch (nCode1) + { + case Pass_2D: + + if (pRefLine[nRefIndex] < nW) + { + nA0 = pRefLine[nRefIndex + 1]; + nRefIndex += 2; + } + break; + + case Horiz_2D: + + { + int nCode2, nCode3; + + if (nCodingIndex & 1) + { + nCode1 = 0; + do + { + nCode1 += nCode3 = m_pMMrDecoder->GetBlackCode(); + } while (nCode3 >= 64); + + nCode2 = 0; + do + { + nCode2 += nCode3 = m_pMMrDecoder->GetWhiteCode(); + } while (nCode3 >= 64); + } + else + { + nCode1 = 0; + do + { + nCode1 += nCode3 = m_pMMrDecoder->GetWhiteCode(); + } while (nCode3 >= 64); + + nCode2 = 0; + do + { + nCode2 += nCode3 = m_pMMrDecoder->GetBlackCode(); + } while (nCode3 >= 64); + } + if (nCode1 > 0 || nCode2 > 0) + { + nA0 = pCodingLine[nCodingIndex++] = nA0 + nCode1; + nA0 = pCodingLine[nCodingIndex++] = nA0 + nCode2; + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + } + } + break; + + case Vert0_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex]; + if (pRefLine[nRefIndex] < nW) + { + ++nRefIndex; + } + break; + + case VertR1_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] + 1; + if (pRefLine[nRefIndex] < nW) + { + ++nRefIndex; + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + } + break; + + case VertR2_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] + 2; + if (pRefLine[nRefIndex] < nW) + { + ++nRefIndex; + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + } + break; + + case VertR3_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] + 3; + if (pRefLine[nRefIndex] < nW) + { + ++nRefIndex; + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + } + break; + + case VertL1_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] - 1; + if (nRefIndex > 0) + { + --nRefIndex; + } + else + { + ++nRefIndex; + } + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + break; + + case VertL2_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] - 2; + if (nRefIndex > 0) + { + --nRefIndex; + } + else + { + ++nRefIndex; + } + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + break; + + case VertL3_2D: + + nA0 = pCodingLine[nCodingIndex++] = pRefLine[nRefIndex] - 3; + if (nRefIndex > 0) + { + --nRefIndex; + } + else + { + ++nRefIndex; + } + while (pRefLine[nRefIndex] <= nA0 && pRefLine[nRefIndex] < nW) + { + nRefIndex += 2; + } + break; + + default: + + break; + + } + } while (nA0 < nW); + pCodingLine[nCodingIndex++] = nW; + + // convert the run lengths to a bitmap line + nIndex = 0; + while (pCodingLine[nIndex] < nW) + { + for (int nX = pCodingLine[nIndex]; nX < pCodingLine[nIndex + 1]; ++nX) + { + pBitmap->SetPixel(nX, nY); + } + nIndex += 2; + } + } + + if (nMMrDataLength >= 0) + { + m_pMMrDecoder->SkipTo(nMMrDataLength); + } + else + { + if (m_pMMrDecoder->Get24Bits() != 0x001001) + { + } + } + + MemUtilsFree(pRefLine); + MemUtilsFree(pCodingLine); + } + else //----- arithmetic decode + { + // set up the typical row context + unsigned int unLtpCX = 0; + if (bTpgdOn) + { + switch (unTempl) + { + case 0: + unLtpCX = 0x3953; // 001 11001 0101 0011 + break; + case 1: + unLtpCX = 0x079a; // 0011 11001 101 0 + break; + case 2: + unLtpCX = 0x0e3; // 001 1100 01 1 + break; + case 3: + unLtpCX = 0x18a; // 01100 0101 1 + break; + } + } + + bool bLtp = 0; + unsigned int unCX = 0, unCX0 = 0, unCX1 = 0, unCX2 = 0; + JBIG2BitmapPtr oCXPtr0, oCXPtr1; + JBIG2BitmapPtr oATPtr0, oATPtr1, oATPtr2, oATPtr3; + + for (int nY = 0; nY < nH; ++nY) + { + // check for a "typical" (duplicate) row + if (bTpgdOn) + { + if (m_pArithDecoder->DecodeBit(unLtpCX, m_pGenericRegionStats)) + { + bLtp = !bLtp; + } + if (bLtp) + { + pBitmap->DuplicateRow(nY, nY - 1); + continue; + } + } + + switch (unTempl) + { + case 0: + + // set up the context + pBitmap->GetPixelPtr(0, nY - 2, &oCXPtr0); + unCX0 = pBitmap->NextPixel(&oCXPtr0); + unCX0 = (unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0); + + pBitmap->GetPixelPtr(0, nY - 1, &oCXPtr1); + unCX1 = pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + + unCX2 = 0; + pBitmap->GetPixelPtr(pnATx[0], nY + pnATy[0], &oATPtr0); + pBitmap->GetPixelPtr(pnATx[1], nY + pnATy[1], &oATPtr1); + pBitmap->GetPixelPtr(pnATx[2], nY + pnATy[2], &oATPtr2); + pBitmap->GetPixelPtr(pnATx[3], nY + pnATy[3], &oATPtr3); + + // decode the row + for (int nX = 0; nX < nW; ++nX) + { + // build the context + unCX = (unCX0 << 13) | (unCX1 << 8) | (unCX2 << 4) | (pBitmap->NextPixel(&oATPtr0) << 3) | (pBitmap->NextPixel(&oATPtr1) << 2) | (pBitmap->NextPixel(&oATPtr2) << 1) | pBitmap->NextPixel(&oATPtr3); + + int nPixel; + if (bUseSkip && pSkip->GetPixel(nX, nY)) // check for a skipped pixel + { + nPixel = 0; + } + else if ((nPixel = m_pArithDecoder->DecodeBit(unCX, m_pGenericRegionStats))) // decode the pixel + { + pBitmap->SetPixel(nX, nY); + } + + // update the context + unCX0 = ((unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0)) & 0x07; + unCX1 = ((unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1)) & 0x1f; + unCX2 = ((unCX2 << 1) | nPixel) & 0x0f; + } + break; + + case 1: + + // set up the context + pBitmap->GetPixelPtr(0, nY - 2, &oCXPtr0); + unCX0 = pBitmap->NextPixel(&oCXPtr0); + unCX0 = (unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0); + unCX0 = (unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0); + + pBitmap->GetPixelPtr(0, nY - 1, &oCXPtr1); + unCX1 = pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + unCX2 = 0; + + pBitmap->GetPixelPtr(pnATx[0], nY + pnATy[0], &oATPtr0); + + // decode the row + for (int nX = 0; nX < nW; ++nX) + { + // build the context + unCX = (unCX0 << 9) | (unCX1 << 4) | (unCX2 << 1) | pBitmap->NextPixel(&oATPtr0); + + int nPixel; + if (bUseSkip && pSkip->GetPixel(nX, nY)) // check for a skipped pixel + { + nPixel = 0; + } + else if ((nPixel = m_pArithDecoder->DecodeBit(unCX, m_pGenericRegionStats))) // decode the pixel + { + pBitmap->SetPixel(nX, nY); + } + + // update the context + unCX0 = ((unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0)) & 0x0f; + unCX1 = ((unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1)) & 0x1f; + unCX2 = ((unCX2 << 1) | nPixel) & 0x07; + } + break; + + case 2: + + // set up the context + pBitmap->GetPixelPtr(0, nY - 2, &oCXPtr0); + unCX0 = pBitmap->NextPixel(&oCXPtr0); + unCX0 = (unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0); + + pBitmap->GetPixelPtr(0, nY - 1, &oCXPtr1); + unCX1 = pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + unCX2 = 0; + + pBitmap->GetPixelPtr(pnATx[0], nY + pnATy[0], &oATPtr0); + + // decode the row + for (int nX = 0; nX < nW; ++nX) + { + + // build the context + unCX = (unCX0 << 7) | (unCX1 << 3) | (unCX2 << 1) | pBitmap->NextPixel(&oATPtr0); + + int nPixel; + if (bUseSkip && pSkip->GetPixel(nX, nY)) // check for a skipped pixel + { + nPixel = 0; + } + else if ((nPixel = m_pArithDecoder->DecodeBit(unCX, m_pGenericRegionStats))) // decode the pixel + { + pBitmap->SetPixel(nX, nY); + } + + // update the context + unCX0 = ((unCX0 << 1) | pBitmap->NextPixel(&oCXPtr0)) & 0x07; + unCX1 = ((unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1)) & 0x0f; + unCX2 = ((unCX2 << 1) | nPixel) & 0x03; + } + break; + + case 3: + + // set up the context + pBitmap->GetPixelPtr(0, nY - 1, &oCXPtr1); + unCX1 = pBitmap->NextPixel(&oCXPtr1); + unCX1 = (unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1); + unCX2 = 0; + + pBitmap->GetPixelPtr(pnATx[0], nY + pnATy[0], &oATPtr0); + + // decode the row + for (int nX = 0; nX < nW; ++nX) + { + // build the context + unCX = (unCX1 << 5) | (unCX2 << 1) | pBitmap->NextPixel(&oATPtr0); + + int nPixel; + if (bUseSkip && pSkip->GetPixel(nX, nY)) // check for a skipped pixel + { + nPixel = 0; + } + else if ((nPixel = m_pArithDecoder->DecodeBit(unCX, m_pGenericRegionStats))) // decode the pixel + { + pBitmap->SetPixel(nX, nY); + } + // update the context + unCX1 = ((unCX1 << 1) | pBitmap->NextPixel(&oCXPtr1)) & 0x1f; + unCX2 = ((unCX2 << 1) | nPixel) & 0x0f; + } + break; + } + } + } + + return pBitmap; + } + + void JBIG2Stream::ReadGenericRefinementRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount) + { + unsigned int unW, unH, unX, unY, unSegInfoFlags; + + // region segment info field + if (!ReadULong(&unW) || !ReadULong(&unH) || !ReadULong(&unX) || !ReadULong(&unY) || !ReadUByte(&unSegInfoFlags)) + { + return; + } + unsigned int unExtCombOp = unSegInfoFlags & 7; + + // rest of the generic refinement region segment header + unsigned int unFlags; + if (!ReadUByte(&unFlags)) + { + return; + } + + unsigned int unTempl = unFlags & 1; + unsigned int unTpgrOn = (unFlags >> 1) & 1; + + // AT flags + int arrATx[2], arrATy[2]; + if (!unTempl) + { + if (!ReadByte(&arrATx[0]) || !ReadByte(&arrATy[0]) || !ReadByte(&arrATx[1]) || !ReadByte(&arrATy[1])) + { + return; + } + } + + // resize the page bitmap if needed + if (unRefSegsCount == 0 || bImm) + { + if (m_unPageH == 0xffffffff && unY + unH > m_unCurPageH) + { + m_pPageBitmap->Expand(unY + unH, m_unPageDefPixel); + } + } + + // get referenced bitmap + JBIG2Bitmap *pRefBitmap = NULL; + if (unRefSegsCount > 1) + { + return; + } + if (unRefSegsCount == 1) + { + JBIG2Segment *pSegment = FindSegment(punRefSegs[0]); + if (pSegment->GetType() != jbig2SegBitmap) + { + return; + } + pRefBitmap = (JBIG2Bitmap *)pSegment; + } + else + { + pRefBitmap = m_pPageBitmap->GetSlice(unX, unY, unW, unH); + } + + // set up the arithmetic decoder + ResetRefinementStats(unTempl, NULL); + m_pArithDecoder->Start(); + + // read + JBIG2Bitmap *pBitmap = ReadGenericRefinementRegion(unW, unH, unTempl, 0 != unTpgrOn, pRefBitmap, 0, 0, arrATx, arrATy); + + if (bImm) // combine the region bitmap into the page bitmap + { + m_pPageBitmap->Combine(pBitmap, unX, unY, unExtCombOp); + delete pBitmap; + } + else // store the region bitmap + { + pBitmap->SetSegNum(unSegNum); + m_pSegments->Append(pBitmap); + } + + // delete the referenced bitmap + if (unRefSegsCount == 1) + { + DiscardSegment(punRefSegs[0]); + } + else + { + delete pRefBitmap; + } + + return; + } + + JBIG2Bitmap *JBIG2Stream::ReadGenericRefinementRegion(int nW, int nH, int nTempl, bool bTpgrOn, JBIG2Bitmap *pRefBitmap, int nRefDX, int nRefDY, int *pnAtx, int *pnAty) + { + JBIG2Bitmap *pBitmap = new JBIG2Bitmap(0, nW, nH); + pBitmap->ClearToZero(); + + // Typical row context + unsigned int unLtpCX; + if (nTempl) + { + unLtpCX = 0x008; + } + else + { + unLtpCX = 0x0010; + } + + bool bLtp = 0; + unsigned int unCx0, unCx2, unCx3, unCx4; + JBIG2BitmapPtr oCxPtr0, oCxPtr1, oCxPtr2, oCxPtr3, oCxPtr4, oCxPtr5, oCxPtr6; + for (int nY = 0; nY < nH; ++nY) + { + if (nTempl) + { + // set up the context + pBitmap->GetPixelPtr(0, nY - 1, &oCxPtr0); + unCx0 = pBitmap->NextPixel(&oCxPtr0); + + pBitmap->GetPixelPtr(-1, nY, &oCxPtr1); + pRefBitmap->GetPixelPtr(-nRefDX, nY - 1 - nRefDY, &oCxPtr2); + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - nRefDY, &oCxPtr3); + + unCx3 = pRefBitmap->NextPixel(&oCxPtr3); + unCx3 = (unCx3 << 1) | pRefBitmap->NextPixel(&oCxPtr3); + + pRefBitmap->GetPixelPtr(-nRefDX, nY + 1 - nRefDY, &oCxPtr4); + unCx4 = pRefBitmap->NextPixel(&oCxPtr4); + + // set up the typical prediction context + unsigned int unTpgrCX0 = 0, unTpgrCX1 = 0, unTpgrCX2 = 0; + JBIG2BitmapPtr oTpgrCXPtr0, oTpgrCXPtr1, oTpgrCXPtr2; + if (bTpgrOn) + { + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - 1 - nRefDY, &oTpgrCXPtr0); + unTpgrCX0 = pRefBitmap->NextPixel(&oTpgrCXPtr0); + unTpgrCX0 = (unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0); + unTpgrCX0 = (unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - nRefDY, &oTpgrCXPtr1); + unTpgrCX1 = pRefBitmap->NextPixel(&oTpgrCXPtr1); + unTpgrCX1 = (unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1); + unTpgrCX1 = (unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY + 1 - nRefDY, &oTpgrCXPtr2); + unTpgrCX2 = pRefBitmap->NextPixel(&oTpgrCXPtr2); + unTpgrCX2 = (unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2); + unTpgrCX2 = (unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2); + } + + for (int nX = 0; nX < nW; ++nX) + { + + // update the context + unCx0 = ((unCx0 << 1) | pBitmap->NextPixel(&oCxPtr0)) & 7; + unCx3 = ((unCx3 << 1) | pRefBitmap->NextPixel(&oCxPtr3)) & 7; + unCx4 = ((unCx4 << 1) | pRefBitmap->NextPixel(&oCxPtr4)) & 3; + + if (bTpgrOn) + { + // update the typical predictor context + unTpgrCX0 = ((unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0)) & 7; + unTpgrCX1 = ((unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1)) & 7; + unTpgrCX2 = ((unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (m_pArithDecoder->DecodeBit(unLtpCX, m_pRefinementRegionStats)) + { + bLtp = !bLtp; + } + if (unTpgrCX0 == 0 && unTpgrCX1 == 0 && unTpgrCX2 == 0) + { + pBitmap->ClearPixel(nX, nY); + continue; + } + else if (unTpgrCX0 == 7 && unTpgrCX1 == 7 && unTpgrCX2 == 7) + { + pBitmap->SetPixel(nX, nY); + continue; + } + } + + // build the context + unsigned int unCx = (unCx0 << 7) | (pBitmap->NextPixel(&oCxPtr1) << 6) | (pRefBitmap->NextPixel(&oCxPtr2) << 5) | (unCx3 << 2) | unCx4; + + // decode the pixel + int nPix; + if ((nPix = m_pArithDecoder->DecodeBit(unCx, m_pRefinementRegionStats))) + { + pBitmap->SetPixel(nX, nY); + } + } + + } + else + { + + // set up the context + pBitmap->GetPixelPtr(0, nY - 1, &oCxPtr0); + unCx0 = pBitmap->NextPixel(&oCxPtr0); + + pBitmap->GetPixelPtr(-1, nY, &oCxPtr1); + + pRefBitmap->GetPixelPtr(-nRefDX, nY - 1 - nRefDY, &oCxPtr2); + unCx2 = pRefBitmap->NextPixel(&oCxPtr2); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - nRefDY, &oCxPtr3); + unCx3 = pRefBitmap->NextPixel(&oCxPtr3); + unCx3 = (unCx3 << 1) | pRefBitmap->NextPixel(&oCxPtr3); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY + 1 - nRefDY, &oCxPtr4); + unCx4 = pRefBitmap->NextPixel(&oCxPtr4); + unCx4 = (unCx4 << 1) | pRefBitmap->NextPixel(&oCxPtr4); + + pBitmap->GetPixelPtr(pnAtx[0], nY + pnAty[0], &oCxPtr5); + + pRefBitmap->GetPixelPtr(pnAtx[1] - nRefDX, nY + pnAty[1] - nRefDY, &oCxPtr6); + + // set up the typical prediction context + unsigned int unTpgrCX0 = 0, unTpgrCX1 = 0, unTpgrCX2 = 0; + JBIG2BitmapPtr oTpgrCXPtr0, oTpgrCXPtr1, oTpgrCXPtr2; + if (bTpgrOn) + { + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - 1 - nRefDY, &oTpgrCXPtr0); + unTpgrCX0 = pRefBitmap->NextPixel(&oTpgrCXPtr0); + unTpgrCX0 = (unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0); + unTpgrCX0 = (unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY - nRefDY, &oTpgrCXPtr1); + unTpgrCX1 = pRefBitmap->NextPixel(&oTpgrCXPtr1); + unTpgrCX1 = (unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1); + unTpgrCX1 = (unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1); + + pRefBitmap->GetPixelPtr(-1 - nRefDX, nY + 1 - nRefDY, &oTpgrCXPtr2); + unTpgrCX2 = pRefBitmap->NextPixel(&oTpgrCXPtr2); + unTpgrCX2 = (unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2); + unTpgrCX2 = (unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2); + } + + for (int nX = 0; nX < nW; ++nX) + { + + // update the context + unCx0 = ((unCx0 << 1) | pBitmap->NextPixel(&oCxPtr0)) & 3; + unCx2 = ((unCx2 << 1) | pRefBitmap->NextPixel(&oCxPtr2)) & 3; + unCx3 = ((unCx3 << 1) | pRefBitmap->NextPixel(&oCxPtr3)) & 7; + unCx4 = ((unCx4 << 1) | pRefBitmap->NextPixel(&oCxPtr4)) & 7; + + if (bTpgrOn) + { + // update the typical predictor context + unTpgrCX0 = ((unTpgrCX0 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr0)) & 7; + unTpgrCX1 = ((unTpgrCX1 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr1)) & 7; + unTpgrCX2 = ((unTpgrCX2 << 1) | pRefBitmap->NextPixel(&oTpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (m_pArithDecoder->DecodeBit(unLtpCX, m_pRefinementRegionStats)) + { + bLtp = !bLtp; + } + if (unTpgrCX0 == 0 && unTpgrCX1 == 0 && unTpgrCX2 == 0) + { + pBitmap->ClearPixel(nX, nY); + continue; + } + else if (unTpgrCX0 == 7 && unTpgrCX1 == 7 && unTpgrCX2 == 7) + { + pBitmap->SetPixel(nX, nY); + continue; + } + } + + // build the context + unsigned int unCx = (unCx0 << 11) | (pBitmap->NextPixel(&oCxPtr1) << 10) | (unCx2 << 8) | (unCx3 << 5) | (unCx4 << 2) | (pBitmap->NextPixel(&oCxPtr5) << 1) | pRefBitmap->NextPixel(&oCxPtr6); + + // decode the pixel + int nPix; + if ((nPix = m_pArithDecoder->DecodeBit(unCx, m_pRefinementRegionStats))) + { + pBitmap->SetPixel(nX, nY); + } + } + } + } + + return pBitmap; + } + + void JBIG2Stream::ReadPageInfoSegment(unsigned int unLength) + { + unsigned int unResX, unResY, unFlags, unStriping; + + if (!ReadULong(&m_unPageW) || !ReadULong(&m_unPageH) || !ReadULong(&unResX) || !ReadULong(&unResY) || !ReadUByte(&unFlags) || !ReadUWord(&unStriping)) + { + return; + } + m_unPageDefPixel = (unFlags >> 2) & 1; + m_unDefCombOp = (unFlags >> 3) & 3; + + if (0xffffffff == m_unPageH) + { + m_unCurPageH = unStriping & 0x7fff; + } + else + { + m_unCurPageH = m_unPageH; + } + m_pPageBitmap = new JBIG2Bitmap(0, m_unPageW, m_unPageH); + + // Очищаем картинку + if (m_unPageDefPixel) + { + m_pPageBitmap->ClearToOne(); + } + else + { + m_pPageBitmap->ClearToZero(); + } + + return; + } + + void JBIG2Stream::ReadEndOfStripeSegment(unsigned int unLength) + { + // Пропускаем данный сегмент + for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) + { + m_pCurStream->GetChar(); + } + } + + void JBIG2Stream::ReadProfilesSegment(unsigned int unLength) + { + // Пропускаем данный сегмент + for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) + { + m_pCurStream->GetChar(); + } + } + void JBIG2Stream::ReadCodeTableSegment(unsigned int unSegNum, unsigned int unLength) + { + unsigned int unFlags; + int nLowVal, nHighVal; + if (!ReadUByte(&unFlags) || !ReadLong(&nLowVal) || !ReadLong(&nHighVal)) + { + return; + } + unsigned int unOOB = unFlags & 1; + unsigned int unPrefixBits = ((unFlags >> 1) & 7) + 1; + unsigned int unRangeBits = ((unFlags >> 4) & 7) + 1; + + m_pHuffDecoder->Reset(); + + unsigned int unHuffTabSize = 8; + JBIG2HuffmanTable *pHuffTable = (JBIG2HuffmanTable *)MemUtilsMallocArray(unHuffTabSize, sizeof(JBIG2HuffmanTable)); + + unsigned int unIndex = 0; + int nVal = nLowVal; + while (nVal < nHighVal) + { + if (unIndex == unHuffTabSize) + { + unHuffTabSize *= 2; + pHuffTable = (JBIG2HuffmanTable *)MemUtilsReallocArray(pHuffTable, unHuffTabSize, sizeof(JBIG2HuffmanTable)); + } + pHuffTable[unIndex].nValue = nVal; + pHuffTable[unIndex].unPrefixLen = m_pHuffDecoder->ReadBits(unPrefixBits); + pHuffTable[unIndex].unRangeLen = m_pHuffDecoder->ReadBits(unRangeBits); + nVal += 1 << pHuffTable[unIndex].unRangeLen; + ++unIndex; + } + if (unIndex + unOOB + 3 > unHuffTabSize) + { + unHuffTabSize = unIndex + unOOB + 3; + pHuffTable = (JBIG2HuffmanTable *)MemUtilsReallocArray(pHuffTable, unHuffTabSize, sizeof(JBIG2HuffmanTable)); + } + pHuffTable[unIndex].nValue = nLowVal - 1; + pHuffTable[unIndex].unPrefixLen = m_pHuffDecoder->ReadBits(unPrefixBits); + pHuffTable[unIndex].unRangeLen = jbig2HuffmanLOW; + ++unIndex; + + pHuffTable[unIndex].nValue = nHighVal; + pHuffTable[unIndex].unPrefixLen = m_pHuffDecoder->ReadBits(unPrefixBits); + pHuffTable[unIndex].unRangeLen = 32; + ++unIndex; + + if (unOOB) + { + pHuffTable[unIndex].nValue = 0; + pHuffTable[unIndex].unPrefixLen = m_pHuffDecoder->ReadBits(unPrefixBits); + pHuffTable[unIndex].unRangeLen = jbig2HuffmanOOB; + ++unIndex; + } + + pHuffTable[unIndex].nValue = 0; + pHuffTable[unIndex].unPrefixLen = 0; + pHuffTable[unIndex].unRangeLen = jbig2HuffmanEOT; + m_pHuffDecoder->BuildTable(pHuffTable, unIndex); + + // Создаем и сохраняем новый сегмент таблицы + m_pSegments->Append(new JBIG2CodeTable(unSegNum, pHuffTable)); + + return; + } + + void JBIG2Stream::ReadExtensionSegment(unsigned int unLength) + { + // Пропускаем данный сегмент + for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) + { + m_pCurStream->GetChar(); + } + } + + JBIG2Segment *JBIG2Stream::FindSegment(unsigned int unSegNum) + { + JBIG2Segment *pSegment = NULL; + + for (int nIndex = 0; nIndex < m_pGlobalSegments->GetLength(); ++nIndex) + { + pSegment = (JBIG2Segment *)m_pGlobalSegments->GetByIndex(nIndex); + if (pSegment->GetSegNum() == unSegNum) + { + return pSegment; + } + } + + for (int nIndex = 0; nIndex < m_pSegments->GetLength(); ++nIndex) + { + pSegment = (JBIG2Segment *)m_pSegments->GetByIndex(nIndex); + if (pSegment->GetSegNum() == unSegNum) + { + return pSegment; + } + } + + return NULL; + } + + void JBIG2Stream::DiscardSegment(unsigned int unSegNum) + { + JBIG2Segment *pSegment = NULL; + + for (int nIndex = 0; nIndex < m_pGlobalSegments->GetLength(); ++nIndex) + { + pSegment = (JBIG2Segment *)m_pGlobalSegments->GetByIndex(nIndex); + if (pSegment->GetSegNum() == unSegNum) + { + m_pGlobalSegments->Delete(nIndex); + return; + } + } + for (int nIndex = 0; nIndex < m_pSegments->GetLength(); ++nIndex) + { + pSegment = (JBIG2Segment *)m_pSegments->GetByIndex(nIndex); + if (pSegment->GetSegNum() == unSegNum) + { + m_pSegments->Delete(nIndex); + return; + } + } + } + + void JBIG2Stream::ResetGenericStats(unsigned int unTempl, JArithmeticDecoderStats *pPrevStats) + { + int nSize = c_arrContextSize[unTempl]; + if (pPrevStats && pPrevStats->GetContextSize() == nSize) + { + if (m_pGenericRegionStats->GetContextSize() == nSize) + { + m_pGenericRegionStats->CopyFrom(pPrevStats); + } + else + { + delete m_pGenericRegionStats; + m_pGenericRegionStats = pPrevStats->Copy(); + } + } + else + { + if (m_pGenericRegionStats->GetContextSize() == nSize) + { + m_pGenericRegionStats->Reset(); + } + else + { + delete m_pGenericRegionStats; + m_pGenericRegionStats = new JArithmeticDecoderStats(1 << nSize); + } + } + } + + void JBIG2Stream::ResetRefinementStats(unsigned int unTempl, JArithmeticDecoderStats *pPrevStats) + { + int nSize = c_arrRefContextSize[unTempl]; + if (pPrevStats && pPrevStats->GetContextSize() == nSize) + { + if (m_pRefinementRegionStats->GetContextSize() == nSize) + { + m_pRefinementRegionStats->CopyFrom(pPrevStats); + } + else + { + delete m_pRefinementRegionStats; + m_pRefinementRegionStats = pPrevStats->Copy(); + } + } + else + { + if (m_pRefinementRegionStats->GetContextSize() == nSize) + { + m_pRefinementRegionStats->Reset(); + } + else + { + delete m_pRefinementRegionStats; + m_pRefinementRegionStats = new JArithmeticDecoderStats(1 << nSize); + } + } + } + + void JBIG2Stream::ResetIntStats(int nSymCodeLen) + { + m_pIadhStats->Reset(); + m_pIadwStats->Reset(); + m_pIaexStats->Reset(); + m_pIaaiStats->Reset(); + m_pIadtStats->Reset(); + m_pIaitStats->Reset(); + m_pIafsStats->Reset(); + m_pIadsStats->Reset(); + m_pIardxStats->Reset(); + m_pIardyStats->Reset(); + m_pIardwStats->Reset(); + m_pIardhStats->Reset(); + m_pIariStats->Reset(); + + if (m_pIaidStats->GetContextSize() == 1 << (nSymCodeLen + 1)) + { + m_pIaidStats->Reset(); + } + else + { + delete m_pIaidStats; + m_pIaidStats = new JArithmeticDecoderStats(1 << (nSymCodeLen + 1)); + } + } + + bool JBIG2Stream::ReadUByte(unsigned int *pBuffer) + { + int nChar; + + if (EOF == (nChar = m_pCurStream->GetChar())) + { + return false; + } + *pBuffer = (unsigned int)nChar; + + return true; + } + + bool JBIG2Stream::ReadByte(int *pBuffer) + { + int nChar; + + if (EOF == (nChar = m_pCurStream->GetChar())) + { + return false; + } + + *pBuffer = nChar; + if (nChar & 0x80) + { + *pBuffer |= -1 - 0xff; + } + + return true; + } + + bool JBIG2Stream::ReadUWord(unsigned int *pBuffer) + { + int nChar0, nChar1; + + if (EOF == (nChar0 = m_pCurStream->GetChar()) || EOF == (nChar1 = m_pCurStream->GetChar())) + { + return false; + } + + *pBuffer = (unsigned int)((nChar0 << 8) | nChar1); + + return true; + } + + bool JBIG2Stream::ReadULong(unsigned int *pBuffer) + { + int nChar0, nChar1, nChar2, nChar3; + + if (EOF == (nChar0 = m_pCurStream->GetChar()) || EOF == (nChar1 = m_pCurStream->GetChar()) || + EOF == (nChar2 = m_pCurStream->GetChar()) || EOF == (nChar3 = m_pCurStream->GetChar())) + { + return false; + } + + *pBuffer = (unsigned int)((nChar0 << 24) | (nChar1 << 16) | (nChar2 << 8) | nChar3); + + return true; + } + + bool JBIG2Stream::ReadLong(int *pBuffer) + { + int nChar0, nChar1, nChar2, nChar3; + + if (EOF == (nChar0 = m_pCurStream->GetChar()) || EOF == (nChar1 = m_pCurStream->GetChar()) || + EOF == (nChar2 = m_pCurStream->GetChar()) || EOF == (nChar3 = m_pCurStream->GetChar())) + { + return false; + } + + *pBuffer = ((nChar0 << 24) | (nChar1 << 16) | (nChar2 << 8) | nChar3); + if (nChar0 & 0x80) + { + *pBuffer |= -1 - (int)0xffffffff; + } + + return true; + } +} \ No newline at end of file diff --git a/PdfReader/Src/JBIG2Stream.h b/PdfReader/Src/JBIG2Stream.h new file mode 100644 index 0000000000..a3552e0e56 --- /dev/null +++ b/PdfReader/Src/JBIG2Stream.h @@ -0,0 +1,106 @@ +#ifndef _PDF_READER_JBIG2STREAM_H +#define _PDF_READER_JBIG2STREAM_H + +#include "Object.h" +#include "Stream.h" + +namespace PdfReader +{ + class CList; + class JBIG2Segment; + class JBIG2Bitmap; + class JArithmeticDecoder; + class JArithmeticDecoderStats; + class JBIG2HuffmanDecoder; + struct JBIG2HuffmanTable; + class JBIG2MMRDecoder; + + //------------------------------------------------------------------------ + + class JBIG2Stream : public FilterStream + { + public: + + JBIG2Stream(Stream *pStream, Object *pGlobalsStream); + virtual ~JBIG2Stream(); + virtual StreamType GetType() + { + return strJBIG2; + } + virtual void Reset(); + virtual void Close(); + virtual int GetChar(); + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + void ReadSegments(); + bool ReadSymbolDictSegment(unsigned int unSegNum, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount); + void ReadTextRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount); + JBIG2Bitmap *ReadTextRegion(bool bHuff, bool bRefine, int nW, int nH, unsigned int nNumInstances, unsigned int unLogStrips, int nNumSyms, JBIG2HuffmanTable *pSymCodeTab, unsigned int unSymCodeLen, JBIG2Bitmap **ppSyms, unsigned int unDefPixel, unsigned int unCombOp, unsigned int unTransposed, unsigned int unRefCorner, int nSOffset, JBIG2HuffmanTable *pHuffFSTable, JBIG2HuffmanTable *pHuffDSTable, JBIG2HuffmanTable *pHuffDTTable, JBIG2HuffmanTable *pHuffRDWTable, JBIG2HuffmanTable *pHuffRDHTable, JBIG2HuffmanTable *pHuffRDXTable, JBIG2HuffmanTable *pHuffRDYTable, JBIG2HuffmanTable *pHuffRSizeTable, unsigned int unTempl, int *pnATx, int *pnATy); + void ReadPatternDictSegment(unsigned int unSegNum, unsigned int unLength); + void ReadHalftoneRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount); + void ReadGenericRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength); + JBIG2Bitmap *ReadGenericBitmap(bool bMMr, int nW, int nH, int unTempl, bool bTpgdOn, bool bUseSkip, JBIG2Bitmap *pSkip, int *pATx, int *pATy, int nMMrDataLength); + void ReadGenericRefinementRegionSegment(unsigned int unSegNum, bool bImm, bool bLossless, unsigned int unLength, unsigned int *punRefSegs, unsigned int unRefSegsCount); + JBIG2Bitmap *ReadGenericRefinementRegion(int nW, int nH, int nTempl, bool bTpgrOn, JBIG2Bitmap *pRefBitmap, int nRefDX, int nRefDY, int *pnAtx, int *pnAty); + + void ReadPageInfoSegment(unsigned int unLength); + void ReadEndOfStripeSegment(unsigned int unLength); + void ReadProfilesSegment(unsigned int unLength); + void ReadCodeTableSegment(unsigned int unSegNum, unsigned int unLength); + void ReadExtensionSegment(unsigned int unLength); + + JBIG2Segment *FindSegment(unsigned int unSegNum); + void DiscardSegment(unsigned int unSegNum); + + void ResetGenericStats(unsigned int unTempl, JArithmeticDecoderStats *pPrevStats); + void ResetRefinementStats(unsigned int unTempl, JArithmeticDecoderStats *pPrevStats); + void ResetIntStats(int nSymCodeLen); + + bool ReadUByte(unsigned int *pBuffer); + bool ReadByte(int *pBuffer); + bool ReadUWord(unsigned int *pBuffer); + bool ReadULong(unsigned int *pBuffer); + bool ReadLong(int *pBuffer); + + private: + + Object m_oGlobalsStream; + unsigned int m_unPageW; + unsigned int m_unPageH; + unsigned int m_unCurPageH; + unsigned int m_unPageDefPixel; + JBIG2Bitmap *m_pPageBitmap; + unsigned int m_unDefCombOp; + CList *m_pSegments; // [JBIG2Segment] + CList *m_pGlobalSegments; // [JBIG2Segment] + Stream *m_pCurStream; + unsigned char *m_pDataPtr; + unsigned char *m_pDataEnd; + + JArithmeticDecoder *m_pArithDecoder; + JArithmeticDecoderStats *m_pGenericRegionStats; + JArithmeticDecoderStats *m_pRefinementRegionStats; + JArithmeticDecoderStats *m_pIadhStats; + JArithmeticDecoderStats *m_pIadwStats; + JArithmeticDecoderStats *m_pIaexStats; + JArithmeticDecoderStats *m_pIaaiStats; + JArithmeticDecoderStats *m_pIadtStats; + JArithmeticDecoderStats *m_pIaitStats; + JArithmeticDecoderStats *m_pIafsStats; + JArithmeticDecoderStats *m_pIadsStats; + JArithmeticDecoderStats *m_pIardxStats; + JArithmeticDecoderStats *m_pIardyStats; + JArithmeticDecoderStats *m_pIardwStats; + JArithmeticDecoderStats *m_pIardhStats; + JArithmeticDecoderStats *m_pIariStats; + JArithmeticDecoderStats *m_pIaidStats; + JBIG2HuffmanDecoder *m_pHuffDecoder; + JBIG2MMRDecoder *m_pMMrDecoder; + }; +} + +#endif // _PDF_READER_JBIG2STREAM_H diff --git a/PdfReader/Src/JPXStream.cpp b/PdfReader/Src/JPXStream.cpp new file mode 100644 index 0000000000..2268dec9d5 --- /dev/null +++ b/PdfReader/Src/JPXStream.cpp @@ -0,0 +1,190 @@ +#include "MemoryUtils.h" +#include "JPXStream.h" +#include "File.h" +#include "../../DesktopEditor/common/File.h" + +namespace PdfReader +{ + JPXStream::JPXStream(Stream *pStream) : + FilterStream(pStream) + { + m_lCurPos = 0; + m_lBufferSize = 0; + m_pSourceBuffer = NULL; + } + + JPXStream::~JPXStream() + { + Close(); + delete m_pStream; + } + + void JPXStream::Reset() + { + m_pStream->Reset(); + + // Инициализация + m_lCurPos = 0; + m_lBufferSize = 0; + m_pSourceBuffer = NULL; + + // Создаем темповый файл, в который сбрасываем картинку + FILE *pTempFile = NULL; + + std::wstring wsTempFile = L""; + if (!NSFile::CFileBinary::OpenTempFile(&wsTempFile, &pTempFile, L"wb", NULL, NULL)) + { + NSFile::CFileBinary::Remove(wsTempFile); + return; + } + + int nChar = 0; + unsigned char *pBuffer = (unsigned char*)MemUtilsMalloc(32); + if (pBuffer) + { + int nSize = 32, nLen = 0; + while (EOF != (nChar = m_pStream->GetChar())) + { + if (nLen >= nSize) + { + nSize *= 2; + pBuffer = (unsigned char*)MemUtilsRealloc(pBuffer, nSize); + } + + pBuffer[nLen] = nChar; + nLen++; + } + fwrite(pBuffer, 1, nLen, pTempFile); + fclose(pTempFile); + MemUtilsFree(pBuffer); + } + else + { + while (EOF != (nChar = m_pStream->GetChar())) + { + fputc(nChar, pTempFile); + } + fclose(pTempFile); + } + + // TODO: Jpeg2000 реализовать в DesktopEditor + NSFile::CFileBinary::Remove(wsTempFile); + + //// Создаем интерфейс для сохранения картинки + //MediaCore::IAVSUncompressedVideoFrame *pImageMediaData = NULL; + //CoCreateInstance(MediaCore::CLSID_CAVSMediaData, NULL, CLSCTX_ALL, MediaCore::IID_IAVSMediaData, (void**)(&pImageMediaData)); + //if (!pImageMediaData) + //{ + // _wunlink(wsTempFile.GetBuffer()); + // return; + //} + + //// Конвертируем картинку в интерфейс + //AVSImageJpeg2000::IJ2kFile *pJpeg = NULL; + //CoCreateInstance(__uuidof(AVSImageJpeg2000::CJ2kFile), NULL, CLSCTX_INPROC_SERVER, __uuidof(AVSImageJpeg2000::IJ2kFile), (void **)(&pJpeg)); + //if (!pJpeg) + //{ + // _wunlink(wsTempFile.GetBuffer()); + // RELEASEINTERFACE(pImageMediaData); + // return; + //} + + //IUnknown **ppImage = (IUnknown**)&pImageMediaData; + //pJpeg->J2kToInterface(wsTempFile.GetBuffer(), ppImage, L""); + //// Удаляем временный файл + //_wunlink(wsTempFile.GetBuffer()); + + //if (NULL == ppImage || NULL == (*ppImage)) + //{ + // RELEASEINTERFACE(pImageMediaData); + // RELEASEINTERFACE(pJpeg); + // return; + //} + + //MediaCore::IAVSUncompressedVideoFrame* pMediaDataIn = NULL; + //(*ppImage)->QueryInterface(MediaCore::IID_IAVSUncompressedVideoFrame, (void**)(&pMediaDataIn)); + //if (NULL == pMediaDataIn) + //{ + // RELEASEINTERFACE(pImageMediaData); + // RELEASEINTERFACE(pJpeg); + // return; + //} + + //LONG lWidth = 0; pMediaDataIn->get_Width(&lWidth); + //LONG lHeight = 0; pMediaDataIn->get_Height(&lHeight); + //LONG lAspectX = 0; pMediaDataIn->get_AspectRatioX(&lAspectX); + //LONG lAspectY = 0; pMediaDataIn->get_AspectRatioY(&lAspectY); + //LONG lStride = 0; pMediaDataIn->get_Stride(0, &lStride); + //unsigned char *pBufferPointer = NULL; pMediaDataIn->get_BufferSize(&m_lBufferSize); + + //pMediaDataIn->get_Buffer(&pBufferPointer); + + //// Копируем данные в буфер + //m_pSourceBuffer = (unsigned char*)MemUtilsMalloc(m_lBufferSize); + //if (!m_pSourceBuffer) + //{ + // m_lBufferSize = 0; + // RELEASEINTERFACE(pMediaDataIn); + // RELEASEINTERFACE(pImageMediaData); + // RELEASEINTERFACE(pJpeg); + // return; + //} + + //// Переворачиваем картинку + //for (int nY = 0; nY < lHeight; nY++) + //{ + // ::memcpy(m_pSourceBuffer + lStride * nY, pBufferPointer + lStride * (lHeight - nY - 1), lStride); + //} + + //// Освобождаем все интерфейсы + //RELEASEINTERFACE(pMediaDataIn); + //RELEASEINTERFACE(pJpeg); + //RELEASEINTERFACE(pImageMediaData); + } + + void JPXStream::Close() + { + MemUtilsFree(m_pSourceBuffer); + m_pSourceBuffer = NULL; + + FilterStream::Close(); + } + + int JPXStream::GetChar() + { + int nChar = 0; + + if (m_lCurPos < m_lBufferSize) + { + nChar = m_pSourceBuffer[m_lCurPos]; + m_lCurPos++; + } + else + return EOF; + + return nChar; + } + + int JPXStream::LookChar() + { + if (m_lBufferSize > 0 && m_lCurPos < m_lBufferSize) + return m_pSourceBuffer[m_lCurPos]; + + return EOF; + } + StringExt *JPXStream::GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + + bool JPXStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + void JPXStream::GetImageParams(int *pBitsPerComponent, StreamColorSpaceMode *peModeCS) + { + *pBitsPerComponent = 8; + *peModeCS = streamCSDeviceRGB; + } +} \ No newline at end of file diff --git a/PdfReader/Src/JPXStream.h b/PdfReader/Src/JPXStream.h new file mode 100644 index 0000000000..3262cbdcdc --- /dev/null +++ b/PdfReader/Src/JPXStream.h @@ -0,0 +1,40 @@ +#ifndef _PDF_READER_JPXSTREAM_H +#define _PDF_READER_JPXSTREAM_H + +#include "Object.h" +#include "Stream.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // JPXStream + //------------------------------------------------------------------------------------------------------------------------------- + + class JPXStream : public FilterStream + { + public: + + JPXStream(Stream *pStream); + virtual ~JPXStream(); + virtual StreamType GetType() + { + return strJPX; + } + virtual void Reset(); + virtual void Close(); + virtual int GetChar(); + virtual int LookChar(); + virtual StringExt *GetPSFilter(int psLevel, char *indent); + virtual bool IsBinary(bool bLast = true); + virtual void GetImageParams(int *pBitsPerComponent, StreamColorSpaceMode *peModeCS); + + private: + + long m_lBufferSize; + unsigned char* m_pSourceBuffer; + long m_lCurPos; + + }; +} + +#endif // _PDF_READER_JPXSTREAM_H diff --git a/PdfReader/Src/Lexer.cpp b/PdfReader/Src/Lexer.cpp new file mode 100644 index 0000000000..7617bcb88f --- /dev/null +++ b/PdfReader/Src/Lexer.cpp @@ -0,0 +1,555 @@ +#include +#include +#include +#include +#include "Lexer.h" + +namespace PdfReader +{ + // '1' - означает пробел. '1' или '2' означает, что данным символом заканчивается + // имя или команда. + + static char c_sSpecialChars[256] = + { + // 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x ax bx cx dx ex fx + + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx + }; + + //------------------------------------------------------------------------ + // Lexer + //------------------------------------------------------------------------ + + Lexer::Lexer(XRef *pXref, Stream *pStream) + { + Object oTemp; + + m_oCurStream.InitStream(pStream); + m_pStreams = new Array(pXref); + m_pStreams->Add(m_oCurStream.Copy(&oTemp)); + m_nCurStreamIndex = 0; + m_bFreeArray = true; + m_oCurStream.StreamReset(); + } + + Lexer::Lexer(XRef *pXref, Object *pObject) + { + // Предполагаем, что в pObject либо поток, либо массив потоков + Object oTemp; + + if (pObject->IsStream()) + { + m_pStreams = new Array(pXref); + m_bFreeArray = true; + m_pStreams->Add(pObject->Copy(&oTemp)); + } + else + { + m_pStreams = pObject->GetArray(); + m_bFreeArray = false; + } + + m_nCurStreamIndex = 0; + + if (m_pStreams->GetCount() > 0) + { + m_pStreams->Get(m_nCurStreamIndex, &m_oCurStream); + m_oCurStream.StreamReset(); + } + } + + Lexer::~Lexer() + { + if (!m_oCurStream.IsNone()) + { + m_oCurStream.StreamClose(); + m_oCurStream.Free(); + } + if (m_bFreeArray) + { + delete m_pStreams; + } + } + + int Lexer::GetChar() + { + int nChar = EOF; + while (!m_oCurStream.IsNone() && (nChar = m_oCurStream.StreamGetChar()) == EOF) + { + m_oCurStream.StreamClose(); + m_oCurStream.Free(); + ++m_nCurStreamIndex; + if (m_nCurStreamIndex < m_pStreams->GetCount()) + { + m_pStreams->Get(m_nCurStreamIndex, &m_oCurStream); + m_oCurStream.StreamReset(); + } + } + return nChar; + } + + int Lexer::LookChar() + { + if (m_oCurStream.IsNone()) + { + return EOF; + } + return m_oCurStream.StreamLookChar(); + } + + Object *Lexer::GetObject(Object *pObject) + { + char *pCurPointer; + int nChar, nTempChar; + bool bNegative = false, bDone = false; + int nBracketCount = 0; + int nInt = 0; + double dFloat = 0, dScale = 0; + StringExt *seString; + int nCount = 0, nHexCharLen = 0; + + // Пропускаем комментарии и пробелы + bool bComment = false; + while (1) + { + if ((nChar = GetChar()) == EOF) + { + return pObject->InitEOF(); + } + if (bComment) + { + if (nChar == '\r' || nChar == '\n') + bComment = false; + } + else if (nChar == '%') + { + bComment = true; + } + else if (c_sSpecialChars[nChar] != 1) + { + break; + } + } + + // начинаем чтение объекта + switch (nChar) + { + + // Число + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': case '.': + bNegative = false; + nInt = 0; + if (nChar == '-') + { + bNegative = true; + } + else if (nChar == '.') + { + goto doReal; + } + else + { + nInt = nChar - '0'; + } + while (1) + { + nChar = LookChar(); + if (isdigit(nChar)) + { + GetChar(); + nInt = nInt * 10 + (nChar - '0'); + } + else if (nChar == '.') + { + GetChar(); + goto doReal; + } + else + { + break; + } + } + if (bNegative) + nInt = -nInt; + pObject->InitInt(nInt); + break; + doReal: + dFloat = nInt; + dScale = 0.1; + while (1) + { + nChar = LookChar(); + if (nChar == '-') + { + // игнорируем знаки минус, появляющиеся по середине числа + // (Adobe игнорирует такие ситуации) + + // TO DO: Error "Badly formatted number" + GetChar(); + continue; + } + if (!isdigit(nChar)) + { + break; + } + GetChar(); + dFloat = dFloat + dScale * (nChar - '0'); + dScale *= 0.1; + } + if (bNegative) + dFloat = -dFloat; + pObject->InitReal(dFloat); + break; + + // Строка + case '(': + pCurPointer = m_sTempBuffer; + nCount = 0; + nBracketCount = 1; // счетчик собок + bDone = false; + seString = NULL; + do { + nTempChar = EOF; + switch (nChar = GetChar()) + { + + case EOF: +#if 0 + // This breaks some PDF files, e.g., ones from Photoshop. + case '\r': + case '\n': +#endif + // TO DO: Error "Unterminated string" + bDone = true; + break; + + case '(': + ++nBracketCount; + nTempChar = nChar; + break; + + case ')': + if (--nBracketCount == 0) + { + bDone = true; + } + else + { + nTempChar = nChar; + } + break; + case '\\': + switch (nChar = GetChar()) + { + case 'n': nTempChar = '\n'; break; + case 'r': nTempChar = '\r'; break; + case 't': nTempChar = '\t'; break; + case 'b': nTempChar = '\b'; break; + case 'f': nTempChar = '\f'; break; + case '\\': + case '(': + case ')': nTempChar = nChar; break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + nTempChar = nChar - '0'; + nChar = LookChar(); + if (nChar >= '0' && nChar <= '7') + { + GetChar(); + nTempChar = (nTempChar << 3) + (nChar - '0'); + nChar = LookChar(); + if (nChar >= '0' && nChar <= '7') + { + GetChar(); + nTempChar = (nTempChar << 3) + (nChar - '0'); + } + } + break; + case '\r': + nChar = LookChar(); + if (nChar == '\n') + { + GetChar(); + } + break; + case '\n': + break; + case EOF: + // TO DO: Error "Unterminated string" + bDone = true; + break; + default: + nTempChar = nChar; + break; + } + break; + + default: + nTempChar = nChar; + break; + } + + if (nTempChar != EOF) + { + if (nCount == TokenBufferSize) + { + if (!seString) + seString = new StringExt(m_sTempBuffer, TokenBufferSize); + else + seString->Append(m_sTempBuffer, TokenBufferSize); + pCurPointer = m_sTempBuffer; + nCount = 0; + } + *pCurPointer++ = (char)nTempChar; + ++nCount; + } + } while (!bDone); + + if (!seString) + seString = new StringExt(m_sTempBuffer, nCount); + else + seString->Append(m_sTempBuffer, nCount); + pObject->InitString(seString); + break; + // Имя + case '/': + pCurPointer = m_sTempBuffer; + nCount = 0; + while ((nChar = LookChar()) != EOF && !c_sSpecialChars[nChar]) + { + GetChar(); + if (nChar == '#') + { + nTempChar = LookChar(); + if (nTempChar >= '0' && nTempChar <= '9') + { + nChar = nTempChar - '0'; + } + else if (nTempChar >= 'A' && nTempChar <= 'F') + { + nChar = nTempChar - 'A' + 10; + } + else if (nTempChar >= 'a' && nTempChar <= 'f') + { + nChar = nTempChar - 'a' + 10; + } + else + { + goto notEscChar; + } + GetChar(); + nChar <<= 4; + nTempChar = GetChar(); + if (nTempChar >= '0' && nTempChar <= '9') + { + nChar += nTempChar - '0'; + } + else if (nTempChar >= 'A' && nTempChar <= 'F') + { + nChar += nTempChar - 'A' + 10; + } + else if (nTempChar >= 'a' && nTempChar <= 'f') + { + nChar += nTempChar - 'a' + 10; + } + else + { + // TO DO: Error "Illegal digit in hex char in name" + } + } + notEscChar: + if (++nCount == TokenBufferSize) + { + // TO DO: Error "Name token too long" + break; + } + *pCurPointer++ = nChar; + } + *pCurPointer = '\0'; + pObject->InitName(m_sTempBuffer); + break; + + // Массив + case '[': + case ']': + m_sTempBuffer[0] = nChar; + m_sTempBuffer[1] = '\0'; + pObject->InitCommand(m_sTempBuffer); + break; + + // Hex или Dictionary + case '<': + nChar = LookChar(); + + // Dictionary + if (nChar == '<') + { + GetChar(); + m_sTempBuffer[0] = m_sTempBuffer[1] = '<'; + m_sTempBuffer[2] = '\0'; + pObject->InitCommand(m_sTempBuffer); + } + else // Hex string + { + pCurPointer = m_sTempBuffer; + nHexCharLen = nCount = 0; + nTempChar = 0; + seString = NULL; + while (1) + { + nChar = GetChar(); + if (nChar == '>') + { + break; + } + else if (nChar == EOF) + { + // TO DO: Error "Unterminated hex string" + break; + } + else if (c_sSpecialChars[nChar] != 1) + { + nTempChar = nTempChar << 4; + if (nChar >= '0' && nChar <= '9') + nTempChar += nChar - '0'; + else if (nChar >= 'A' && nChar <= 'F') + nTempChar += nChar - 'A' + 10; + else if (nChar >= 'a' && nChar <= 'f') + nTempChar += nChar - 'a' + 10; + else + { + // TO DO: Error "Illegal character in hex string" + } + if (++nHexCharLen == 2) + { + if (nCount == TokenBufferSize) + { + if (!seString) + seString = new StringExt(m_sTempBuffer, TokenBufferSize); + else + seString->Append(m_sTempBuffer, TokenBufferSize); + pCurPointer = m_sTempBuffer; + nCount = 0; + } + *pCurPointer++ = (char)nTempChar; + ++nCount; + nTempChar = 0; + nHexCharLen = 0; + } + } + } + if (!seString) + seString = new StringExt(m_sTempBuffer, nCount); + else + seString->Append(m_sTempBuffer, nCount); + if (nHexCharLen == 1) + seString->Append((char)(nTempChar << 4)); + pObject->InitString(seString); + } + break; + + // Dictionary + case '>': + nChar = LookChar(); + if (nChar == '>') + { + GetChar(); + m_sTempBuffer[0] = m_sTempBuffer[1] = '>'; + m_sTempBuffer[2] = '\0'; + pObject->InitCommand(m_sTempBuffer); + } + else + { + // TO DO: Error "Illegal character '>'" + pObject->InitError(); + } + break; + + // Error + case ')': + case '{': + case '}': + // TO DO: Error "Illegal character " + pObject->InitError(); + break; + + // Command (это просто какое нибудь зарезервированное слово, например 'obj' или 'stream') + default: + pCurPointer = m_sTempBuffer; + *pCurPointer++ = nChar; + nCount = 1; + while ((nChar = LookChar()) != EOF && !c_sSpecialChars[nChar]) + { + GetChar(); + if (++nCount == TokenBufferSize) + { + // TO DO: Error "Command token too long" + break; + } + *pCurPointer++ = nChar; + } + *pCurPointer = '\0'; + if (m_sTempBuffer[0] == 't' && !strcmp(m_sTempBuffer, "true")) + { + pObject->InitBool(true); + } + else if (m_sTempBuffer[0] == 'f' && !strcmp(m_sTempBuffer, "false")) + { + pObject->InitBool(false); + } + else if (m_sTempBuffer[0] == 'n' && !strcmp(m_sTempBuffer, "null")) + { + pObject->InitNull(); + } + else + { + pObject->InitCommand(m_sTempBuffer); + } + break; + } + + return pObject; + } + + void Lexer::SkipToNextLine() + { + while (1) + { + int nChar = GetChar(); + if (nChar == EOF || nChar == '\n') + { + return; + } + if (nChar == '\r') + { + if ((nChar = LookChar()) == '\n') + { + GetChar(); + } + return; + } + } + } + + bool Lexer::IsSpace(int nChar) + { + return nChar >= 0 && nChar <= 0xff && c_sSpecialChars[nChar] == 1; + } +} \ No newline at end of file diff --git a/PdfReader/Src/Lexer.h b/PdfReader/Src/Lexer.h new file mode 100644 index 0000000000..6522bae36d --- /dev/null +++ b/PdfReader/Src/Lexer.h @@ -0,0 +1,79 @@ +#ifndef _PDF_READER_LEXER_H +#define _PDF_READER_LEXER_H + +#include "Object.h" +#include "Stream.h" + +namespace PdfReader +{ + class XRef; + +#define TokenBufferSize 128 + + //------------------------------------------------------------------------ + // Lexer + //------------------------------------------------------------------------ + + class Lexer + { + public: + + // Конструктор для одного потока. Удаляем этот поток в деструкторе. + Lexer(XRef *pXref, Stream *pStream); + + // Конструкор для одного потока или массива потоков. + Lexer(XRef *pXref, Object *pObject); + + ~Lexer(); + + // Считваем следующий объект из потока. + Object *GetObject(Object *obj); + + // Переходим к началу новой строки. + void SkipToNextLine(); + + // Переходим к следующему символу. + void SkipChar() + { + GetChar(); + } + + + Stream *GetStream() + { + return m_oCurStream.IsNone() ? (Stream *)NULL : m_oCurStream.GetStream(); + } + + // Текущая позиция. Используется только для сообщений об ошибке, поэтому + // возвращаемое значение типа int, а не unsigned int. + int GetPos() + { + return m_oCurStream.IsNone() ? -1 : (int)m_oCurStream.StreamGetPos(); + } + + + void SetPos(unsigned int unPos, int nDir = 0) + { + if (!m_oCurStream.IsNone()) + m_oCurStream.StreamSetPos(unPos, nDir); + } + + // Проверяем является ли nChar пробелом. + static bool IsSpace(int nChar); + + private: + + int GetChar(); + int LookChar(); + + private: + + Array *m_pStreams; // Массив потоков + int m_nCurStreamIndex; // Номер текущего потока + Object m_oCurStream; // Текущий поток + bool m_bFreeArray; // Должны ли мы в данном классе осовбождать массив потоков? + char m_sTempBuffer[TokenBufferSize]; // Buffer + }; +} + +#endif // _PDF_READER_LEXER_H diff --git a/PdfReader/Src/Link.cpp b/PdfReader/Src/Link.cpp new file mode 100644 index 0000000000..e7861f7f2a --- /dev/null +++ b/PdfReader/Src/Link.cpp @@ -0,0 +1,919 @@ +#include +#include +#include "MemoryUtils.h" +#include "StringExt.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Link.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // LinkAction + //------------------------------------------------------------------------------------------------------------------------------- + + LinkAction *LinkAction::ParseDestination(Object *pObject) + { + LinkAction *pAction = new LinkGoTo(pObject); + + if (!pAction->CheckValidate()) + { + delete pAction; + return NULL; + } + return pAction; + } + + LinkAction *LinkAction::ParseAction(Object *pObject, StringExt *seBaseURI) + { + LinkAction *pAction = NULL; + + if (!pObject->IsDict()) + { + // TO DO: Error "Bad annotation action" + return NULL; + } + + // S (тип Action) + Object oType; + pObject->DictLookup("S", &oType); + + // GoTo action + if (oType.IsName("GoTo")) + { + Object oD; + pObject->DictLookup("D", &oD); + pAction = new LinkGoTo(&oD); + oD.Free(); + } + else if (oType.IsName("GoToR")) // GoToR action + { + Object oF, oD; + pObject->DictLookup("F", &oF); + pObject->DictLookup("D", &oD); + pAction = new LinkGoToR(&oF, &oD); + oF.Free(); + oD.Free(); + } + else if (oType.IsName("Launch")) // Launch action + { + pAction = new LinkLaunch(pObject); + } + else if (oType.IsName("URI")) // URI action + { + Object oURI; + pObject->DictLookup("URI", &oURI); + pAction = new LinkURI(&oURI, seBaseURI); + oURI.Free(); + } + else if (oType.IsName("Named")) // Named action + { + Object oN; + pObject->DictLookup("N", &oN); + pAction = new LinkNamed(&oN); + oN.Free(); + } + else if (oType.IsName("Movie")) // Movie action + { + Object oAnnot, oT; + pObject->DictLookupAndCopy("Annot", &oAnnot); + pObject->DictLookup("T", &oT); + pAction = new LinkMovie(&oAnnot, &oT); + oAnnot.Free(); + oT.Free(); + } + else if (oType.IsName()) // unknown action + { + pAction = new LinkUnknown(oType.GetName()); + } + else + { + // TO DO: Error "Bad annotation action" + pAction = NULL; + } + + oType.Free(); + + if (pAction && !pAction->CheckValidate()) + { + delete pAction; + return NULL; + } + return pAction; + } + + StringExt *LinkAction::GetFileSpecName(Object *pFileSpecObject) + { + StringExt *seName = NULL; + + if (pFileSpecObject->IsString()) + { + seName = pFileSpecObject->GetString()->Copy(); + } + else if (pFileSpecObject->IsDict()) + { + Object oTemp; + if (!pFileSpecObject->DictLookup("DOS", &oTemp)->IsString()) + { + oTemp.Free(); + pFileSpecObject->DictLookup("F", &oTemp); + } + if (oTemp.IsString()) + { + seName = oTemp.GetString()->Copy(); + } + else + { + // TO DO: Error "Illegal file spec in link" + } + oTemp.Free(); + } + else + { + // TO DO: Error "Illegal file spec in link" + } + + if (seName) + { + // Производим преобразования, связанные с формой записи путей + + // "//...." --> "\...." + // "/x/...." --> "x:\...." + // "/server/share/...." --> "\\server\share\...." + + int nCurIndex = 0; + if (seName->GetAt(0) == '/') + { + if (seName->GetLength() >= 2 && seName->GetAt(1) == '/') + { + seName->Delete(0); + nCurIndex = 0; + } + else if (seName->GetLength() >= 2 && ((seName->GetAt(1) >= 'a' && seName->GetAt(1) <= 'z') || (seName->GetAt(1) >= 'A' && seName->GetAt(1) <= 'Z')) && (seName->GetLength() == 2 || seName->GetAt(2) == '/')) + { + seName->SetAt(0, seName->GetAt(1)); + seName->SetAt(1, ':'); + nCurIndex = 2; + } + else + { + int nJ; + for (nJ = 2; nJ < seName->GetLength(); ++nJ) + { + if (seName->GetAt(nJ - 1) != '\\' && seName->GetAt(nJ) == '/') + { + break; + } + } + if (nJ < seName->GetLength()) + { + seName->SetAt(0, '\\'); + seName->Insert(0, '\\'); + nCurIndex = 2; + } + } + } + for (; nCurIndex < seName->GetLength(); ++nCurIndex) + { + if (seName->GetAt(nCurIndex) == '/') + { + seName->SetAt(nCurIndex, '\\'); + } + else if (seName->GetAt(nCurIndex) == '\\' && nCurIndex + 1 < seName->GetLength() && seName->GetAt(nCurIndex + 1) == '/') + { + seName->Delete(nCurIndex); + } + } + } + + return seName; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkDest + //------------------------------------------------------------------------------------------------------------------------------- + + LinkDestination::LinkDestination(Array *pArray) + { + m_dLeft = m_dBottom = m_dRight = m_dTop = m_dZoom = 0; + m_bValidate = false; + + if (pArray->GetCount() < 2) + { + // TO DO: Error "Annotation destination array is too short" + return; + } + + Object oArrayItem; + pArray->GetCopy(0, &oArrayItem); + + if (oArrayItem.IsInt()) + { + m_nPageNum = oArrayItem.GetInt() + 1; + m_bPageIsRef = false; + } + else if (oArrayItem.IsRef()) + { + m_oPageRef.nNum = oArrayItem.GetRefNum(); + m_oPageRef.nGen = oArrayItem.GetRefGen(); + m_bPageIsRef = true; + } + else + { + // TO DO: Error "Bad annotation destination" + oArrayItem.Free(); + return; + } + oArrayItem.Free(); + + // Destination type + pArray->Get(1, &oArrayItem); + + if (oArrayItem.IsName("XYZ")) + { + m_eType = destXYZ; + Object oTemp; + if (pArray->GetCount() < 3) + { + m_bChangeLeft = false; + } + else + { + pArray->Get(2, &oTemp); + if (oTemp.IsNull()) + { + m_bChangeLeft = false; + } + else if (oTemp.IsNum()) + { + m_bChangeLeft = true; + m_dLeft = oTemp.GetNum(); + } + else + { + // TO DO: Error "Bad annotation destination position" + oTemp.Free(); + oArrayItem.Free(); + return; + } + oTemp.Free(); + } + if (pArray->GetCount() < 4) + { + m_bChangeTop = false; + } + else + { + pArray->Get(3, &oTemp); + if (oTemp.IsNull()) + { + m_bChangeTop = false; + } + else if (oTemp.IsNum()) + { + m_bChangeTop = true; + m_dTop = oTemp.GetNum(); + } + else + { + // TO DO: Error "Bad annotation destination position" + oTemp.Free(); + oArrayItem.Free(); + return; + } + oTemp.Free(); + } + if (pArray->GetCount() < 5) + { + m_bChangeZoom = false; + } + else + { + pArray->Get(4, &oTemp); + if (oTemp.IsNull()) + { + m_bChangeZoom = false; + } + else if (oTemp.IsNum()) + { + m_bChangeZoom = true; + m_dZoom = oTemp.GetNum(); + } + else + { + // TO DO: Error "Bad annotation destination position" + oTemp.Free(); + oArrayItem.Free(); + return; + } + oTemp.Free(); + } + } + else if (oArrayItem.IsName("Fit")) + { + if (pArray->GetCount() < 2) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFit; + } + else if (oArrayItem.IsName("FitH")) + { + if (pArray->GetCount() < 3) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitH; + + Object oTemp; + if (!pArray->Get(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dTop = oTemp.GetNum(); + oTemp.Free(); + } + else if (oArrayItem.IsName("FitV")) + { + if (pArray->GetCount() < 3) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitV; + + Object oTemp; + if (!pArray->Get(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dLeft = oTemp.GetNum(); + oTemp.Free(); + } + else if (oArrayItem.IsName("FitR")) + { + if (pArray->GetCount() < 6) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitR; + + Object oTemp; + if (!pArray->Get(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dLeft = oTemp.GetNum(); + oTemp.Free(); + + if (!pArray->Get(3, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dBottom = oTemp.GetNum(); + oTemp.Free(); + + if (!pArray->Get(4, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dRight = oTemp.GetNum(); + oTemp.Free(); + + if (!pArray->Get(5, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dTop = oTemp.GetNum(); + oTemp.Free(); + } + else if (oArrayItem.IsName("FitB")) + { + if (pArray->GetCount() < 2) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitB; + } + else if (oArrayItem.IsName("FitBH")) + { + if (pArray->GetCount() < 3) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitBH; + + Object oTemp; + if (!pArray->Get(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dTop = oTemp.GetNum(); + oTemp.Free(); + } + else if (oArrayItem.IsName("FitBV")) + { + if (pArray->GetCount() < 3) + { + // TO DO: Error "Annotation destination array is too short" + oArrayItem.Free(); + return; + } + m_eType = destFitBV; + + Object oTemp; + if (!pArray->Get(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation destination position" + m_eType = destFit; + } + m_dLeft = oTemp.GetNum(); + oTemp.Free(); + } + else + { + // TO DO: Error "Unknown annotation destination type" + oArrayItem.Free(); + return; + } + + oArrayItem.Free(); + m_bValidate = true; + return; + } + + LinkDestination::LinkDestination(LinkDestination *pDest) + { + m_eType = pDest->m_eType; + m_bPageIsRef = pDest->m_bPageIsRef; + + if (m_bPageIsRef) + m_oPageRef = pDest->m_oPageRef; + else + m_nPageNum = pDest->m_nPageNum; + + m_dLeft = pDest->m_dLeft; + m_dBottom = pDest->m_dBottom; + m_dRight = pDest->m_dRight; + m_dTop = pDest->m_dTop; + m_dZoom = pDest->m_dZoom; + m_bChangeLeft = pDest->m_bChangeLeft; + m_bChangeTop = pDest->m_bChangeTop; + m_bChangeZoom = pDest->m_bChangeZoom; + m_bValidate = true; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkGoTo + //------------------------------------------------------------------------------------------------------------------------------- + + LinkGoTo::LinkGoTo(Object *pDestObject) + { + m_pDestination = NULL; + m_pNamedDestination = NULL; + + if (pDestObject->IsName()) + { + m_pNamedDestination = new StringExt(pDestObject->GetName()); + } + else if (pDestObject->IsString()) + { + m_pNamedDestination = pDestObject->GetString()->Copy(); + } + else if (pDestObject->IsArray()) + { + m_pDestination = new LinkDestination(pDestObject->GetArray()); + if (!m_pDestination->CheckValidate()) + { + delete m_pDestination; + m_pDestination = NULL; + } + } + else + { + // TO DO: Error "Illegal annotation destination" + } + } + + LinkGoTo::~LinkGoTo() + { + if (m_pDestination) + delete m_pDestination; + if (m_pNamedDestination) + delete m_pNamedDestination; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkGoToR + //------------------------------------------------------------------------------------------------------------------------------- + + LinkGoToR::LinkGoToR(Object *pFileSpecObject, Object *pDestObject) + { + m_pDestination = NULL; + m_pNamedDestination = NULL; + + m_seFileName = GetFileSpecName(pFileSpecObject); + + if (pDestObject->IsName()) + { + m_pNamedDestination = new StringExt(pDestObject->GetName()); + } + else if (pDestObject->IsString()) + { + m_pNamedDestination = pDestObject->GetString()->Copy(); + } + else if (pDestObject->IsArray()) + { + m_pDestination = new LinkDestination(pDestObject->GetArray()); + if (!m_pDestination->CheckValidate()) + { + delete m_pDestination; + m_pDestination = NULL; + } + } + else + { + // TO DO: Error "Illegal annotation destination" + } + } + + LinkGoToR::~LinkGoToR() + { + if (m_seFileName) + delete m_seFileName; + if (m_pDestination) + delete m_pDestination; + if (m_pNamedDestination) + delete m_pNamedDestination; + } + + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkLaunch + //------------------------------------------------------------------------------------------------------------------------------- + + LinkLaunch::LinkLaunch(Object *pActionObject) + { + m_seFileName = NULL; + m_pParameters = NULL; + + if (pActionObject->IsDict()) + { + Object oSpecObject; + if (!pActionObject->DictLookup("F", &oSpecObject)->IsNull()) + { + m_seFileName = GetFileSpecName(&oSpecObject); + } + else + { + oSpecObject.Free(); + if (pActionObject->DictLookup("Win", &oSpecObject)->IsDict()) + { + Object oTemp; + oSpecObject.DictLookup("F", &oTemp); + m_seFileName = GetFileSpecName(&oTemp); + oTemp.Free(); + if (oSpecObject.DictLookup("P", &oTemp)->IsString()) + { + m_pParameters = oTemp.GetString()->Copy(); + } + oTemp.Free(); + } + else + { + // TO DO: Error "Bad launch-type link action" + } + } + oSpecObject.Free(); + } + } + + LinkLaunch::~LinkLaunch() + { + if (m_seFileName) + delete m_seFileName; + if (m_pParameters) + delete m_pParameters; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkURI + //------------------------------------------------------------------------------------------------------------------------------- + + LinkURI::LinkURI(Object *pUriObject, StringExt *seBaseURI) + { + m_seURI = NULL; + if (pUriObject->IsString()) + { + StringExt *seTempURI = pUriObject->GetString()->Copy(); + if (seBaseURI && seBaseURI->GetLength() > 0) + { + int nCount = strcspn(seTempURI->GetBuffer(), "/:"); + if (nCount == seTempURI->GetLength() || seTempURI->GetAt(nCount) == '/') + { + m_seURI = seBaseURI->Copy(); + int nChar = m_seURI->GetAt(m_seURI->GetLength() - 1); + if (nChar == '/' || nChar == '?') + { + if (seTempURI->GetAt(0) == '/') + { + seTempURI->Delete(0); + } + } + else + { + if (seTempURI->GetAt(0) != '/') + { + m_seURI->Append('/'); + } + } + m_seURI->Append(seTempURI); + delete seTempURI; + } + else + { + m_seURI = seTempURI; + } + } + else + { + m_seURI = seTempURI; + } + } + else + { + // TO DO: Error "Illegal URI-type link" + } + } + + LinkURI::~LinkURI() + { + if (m_seURI) + delete m_seURI; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkNamed + //------------------------------------------------------------------------------------------------------------------------------- + + LinkNamed::LinkNamed(Object *pNameObject) + { + m_seName = NULL; + if (pNameObject->IsName()) + { + m_seName = new StringExt(pNameObject->GetName()); + } + } + + LinkNamed::~LinkNamed() + { + if (m_seName) + { + delete m_seName; + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkMovie + //------------------------------------------------------------------------------------------------------------------------------- + + LinkMovie::LinkMovie(Object *pAnnotObject, Object *pTitleObject) + { + m_oAnnotRef.nNum = -1; + m_seTitle = NULL; + if (pAnnotObject->IsRef()) + { + m_oAnnotRef = pAnnotObject->GetRef(); + } + else if (pTitleObject->IsString()) + { + m_seTitle = pTitleObject->GetString()->Copy(); + } + else + { + // TO DO: Error "Movie action is missing both the Annot and T keys" + } + } + + LinkMovie::~LinkMovie() + { + if (m_seTitle) + { + delete m_seTitle; + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkUnknown + //------------------------------------------------------------------------------------------------------------------------------- + + LinkUnknown::LinkUnknown(char *sAction) + { + m_seAction = new StringExt(sAction); + } + + LinkUnknown::~LinkUnknown() + { + if (m_seAction) + delete m_seAction; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Link + //------------------------------------------------------------------------------------------------------------------------------- + + Link::Link(Dict *pDict, StringExt *seBaseURI) + { + m_pAction = NULL; + m_bValid = false; + + // Rect + Object oDictItem; + if (!pDict->Search("Rect", &oDictItem)->IsArray()) + { + // TO DO: Error "Annotation rectangle is wrong type" + oDictItem.Free(); + return; + } + + Object oTemp; + if (!oDictItem.ArrayGet(0, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation rectangle" + oTemp.Free(); + oDictItem.Free(); + return; + } + m_dLeft = oTemp.GetNum(); + oTemp.Free(); + + if (!oDictItem.ArrayGet(1, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation rectangle" + oTemp.Free(); + oDictItem.Free(); + return; + } + m_dBottom = oTemp.GetNum(); + oTemp.Free(); + + if (!oDictItem.ArrayGet(2, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation rectangle" + oTemp.Free(); + oDictItem.Free(); + return; + } + m_dRight = oTemp.GetNum(); + oTemp.Free(); + + if (!oDictItem.ArrayGet(3, &oTemp)->IsNum()) + { + // TO DO: Error "Bad annotation rectangle" + oTemp.Free(); + oDictItem.Free(); + return; + } + m_dTop = oTemp.GetNum(); + oTemp.Free(); + oDictItem.Free(); + + if (m_dLeft > m_dRight) + { + double dTemp = m_dLeft; + m_dLeft = m_dRight; + m_dRight = dTemp; + } + if (m_dBottom > m_dTop) + { + double dTemp = m_dBottom; + m_dBottom = m_dTop; + m_dTop = dTemp; + } + + // Dest + if (!pDict->Search("Dest", &oDictItem)->IsNull()) + { + m_pAction = LinkAction::ParseDestination(&oDictItem); + } + else // A (Action) + { + oDictItem.Free(); + if (pDict->Search("A", &oDictItem)->IsDict()) + { + m_pAction = LinkAction::ParseAction(&oDictItem, seBaseURI); + } + } + oDictItem.Free(); + + if (m_pAction) + { + m_bValid = true; + } + + return; + } + + Link::~Link() + { + if (m_pAction) + { + delete m_pAction; + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // Links + //------------------------------------------------------------------------------------------------------------------------------- + + Links::Links(Object *pAnnots, StringExt *seBaseURI) + { + m_ppLinks = NULL; + m_nLinksCount = 0; + + int nSize = 0; + + if (pAnnots->IsArray()) + { + for (int nIndex = 0; nIndex < pAnnots->ArrayGetLength(); ++nIndex) + { + Object oArrayItem; + if (pAnnots->ArrayGet(nIndex, &oArrayItem)->IsDict()) + { + Object oTemp; + if (oArrayItem.DictLookup("Subtype", &oTemp)->IsName("Link")) + { + Link *pLink = new Link(oArrayItem.GetDict(), seBaseURI); + if (pLink->CheckValidate()) + { + if (m_nLinksCount >= nSize) + { + nSize += 16; + m_ppLinks = (Link **)MemUtilsReallocArray(m_ppLinks, nSize, sizeof(Link *)); + } + m_ppLinks[m_nLinksCount++] = pLink; + } + else + { + if (pLink) + delete pLink; + } + } + oTemp.Free(); + } + oArrayItem.Free(); + } + } + } + + Links::~Links() + { + for (int nIndex = 0; nIndex < m_nLinksCount; ++nIndex) + { + if (m_ppLinks[nIndex]) + delete m_ppLinks[nIndex]; + } + MemUtilsFree(m_ppLinks); + } + + LinkAction *Links::Find(double dX, double dY) + { + for (int nIndex = m_nLinksCount - 1; nIndex >= 0; --nIndex) + { + if (m_ppLinks[nIndex]->InRect(dX, dY)) + { + return m_ppLinks[nIndex]->GetAction(); + } + } + return NULL; + } + + bool Links::OnLink(double dX, double dY) + { + for (int nIndex = 0; nIndex < m_nLinksCount; ++nIndex) + { + if (m_ppLinks[nIndex]->InRect(dX, dY)) + return true; + } + return false; + } +} \ No newline at end of file diff --git a/PdfReader/Src/Link.h b/PdfReader/Src/Link.h new file mode 100644 index 0000000000..78ab2129af --- /dev/null +++ b/PdfReader/Src/Link.h @@ -0,0 +1,493 @@ +#ifndef _PDF_READER_LINK_H +#define _PDF_READER_LINK_H + +#include "Object.h" + +namespace PdfReader +{ + class StringExt; + class Array; + class Dict; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkAction + //------------------------------------------------------------------------------------------------------------------------------- + + enum LinkActionType + { + actionGoTo, // Go to destination + actionGoToR, // Go to destination в новом файле + actionLaunch, // Запускаем приложение (или открываем документ) + actionURI, // URI + actionNamed, // Named + actionMovie, // Movie + actionUnknown // + }; + + class LinkAction + { + public: + + virtual ~LinkAction() {} + + // Нормально ли создался объект LinkAction? + virtual bool CheckValidate() = 0; + + // Тип LinkAction. + virtual LinkActionType GetType() = 0; + + // Парсим Destination (старый вариант Аction) Name, String или Array. + static LinkAction *ParseDestination(Object *pObject); + + // Парсим Action dictionary. + static LinkAction *ParseAction(Object *pObject, StringExt *seBaseURI = NULL); + + // Достаем название файла для File specification. + static StringExt *GetFileSpecName(Object *pFileSpecObject); + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkDestination + //------------------------------------------------------------------------------------------------------------------------------- + + enum LinkDestinationType + { + destXYZ, + destFit, + destFitH, + destFitV, + destFitR, + destFitB, + destFitBH, + destFitBV + }; + + class LinkDestination + { + public: + + LinkDestination(Array *pArray); + + LinkDestination *Copy() + { + return new LinkDestination(this); + } + + + bool CheckValidate() + { + return m_bValidate; + } + + LinkDestinationType GetType() + { + return m_eType; + } + bool IsPageRef() + { + return m_bPageIsRef; + } + int GetPageNum() + { + return m_nPageNum; + } + Ref GetPageRef() + { + return m_oPageRef; + } + double GetLeft() + { + return m_dLeft; + } + double GetBottom() + { + return m_dBottom; + } + double GetRight() + { + return m_dRight; + } + double GetTop() + { + return m_dTop; + } + double GetZoom() + { + return m_dZoom; + } + bool GetChangeLeft() + { + return m_bChangeLeft; + } + bool GetChangeTop() + { + return m_bChangeTop; + } + bool GetChangeZoom() + { + return m_bChangeZoom; + } + + private: + + LinkDestination(LinkDestination *pDest); + + private: + + LinkDestinationType m_eType; // Тип + bool m_bPageIsRef; // Страница задана ссылкой или номером? + union + { + Ref m_oPageRef; // Ссылка на страницу + int m_nPageNum; // Относительный номер страницы + }; + + double m_dLeft; // + double m_dBottom; // Позиция + double m_dRight; // + double m_dTop; // + + double m_dZoom; // Zoom + + bool m_bChangeLeft; // Для destXYZ. В данном случае может измениться + bool m_bChangeTop; // как позиция, так и зуммирование + bool m_bChangeZoom; // + + bool m_bValidate; // + + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkGoTo + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkGoTo : public LinkAction + { + public: + + LinkGoTo(Object *pDestObject); + + virtual ~LinkGoTo(); + + virtual bool CheckValidate() + { + return m_pDestination || m_pNamedDestination; + } + + virtual LinkActionType GetType() + { + return actionGoTo; + } + LinkDestination *GetDestination() + { + return m_pDestination; + } + StringExt *GetNamedDestination() + { + return m_pNamedDestination; + } + + private: + + LinkDestination *m_pDestination; + StringExt *m_pNamedDestination; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkGoToR + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkGoToR : public LinkAction + { + public: + + LinkGoToR(Object *pFileSpecObject, Object *pDestObject); + virtual ~LinkGoToR(); + + virtual bool CheckValidate() + { + return m_seFileName && (m_pDestination || m_pNamedDestination); + } + + virtual LinkActionType GetType() + { + return actionGoToR; + } + StringExt *GetFileName() + { + return m_seFileName; + } + LinkDestination *GetDestination() + { + return m_pDestination; + } + StringExt *GetNamedDestination() + { + return m_pNamedDestination; + } + + private: + + StringExt *m_seFileName; + LinkDestination *m_pDestination; + StringExt *m_pNamedDestination; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkLaunch + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkLaunch : public LinkAction + { + public: + + LinkLaunch(Object *pActionObject); + + virtual ~LinkLaunch(); + + virtual bool CheckValidate() + { + return m_seFileName != NULL; + } + + virtual LinkActionType GetType() + { + return actionLaunch; + } + StringExt *GetFileName() + { + return m_seFileName; + } + StringExt *GetParameters() + { + return m_pParameters; + } + + private: + + StringExt *m_seFileName; + StringExt *m_pParameters; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkURI + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkURI : public LinkAction + { + public: + + LinkURI(Object *pURIObject, StringExt *seBaseURI); + + virtual ~LinkURI(); + + virtual bool CheckValidate() + { + return m_seURI != NULL; + } + + virtual LinkActionType GetType() + { + return actionURI; + } + StringExt *GetURI() + { + return m_seURI; + } + + private: + + StringExt *m_seURI; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkNamed + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkNamed : public LinkAction + { + public: + + LinkNamed(Object *pNameObject); + + virtual ~LinkNamed(); + + virtual bool CheckValidate() + { + return m_seName != NULL; + } + + virtual LinkActionType GetType() + { + return actionNamed; + } + + StringExt *GetName() + { + return m_seName; + } + + private: + + StringExt *m_seName; + + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkMovie + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkMovie : public LinkAction + { + public: + + LinkMovie(Object *pAnnotObject, Object *pTitleObject); + + virtual ~LinkMovie(); + + virtual bool CheckValidate() + { + return m_oAnnotRef.nNum >= 0 || m_seTitle != NULL; + } + + virtual LinkActionType GetType() + { + return actionMovie; + } + + bool HasAnnotRef() + { + return m_oAnnotRef.nNum >= 0; + } + Ref *GetAnnotRef() + { + return &m_oAnnotRef; + } + StringExt *GetTitle() + { + return m_seTitle; + } + + private: + + Ref m_oAnnotRef; + StringExt *m_seTitle; + + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // LinkUnknown + //------------------------------------------------------------------------------------------------------------------------------- + + class LinkUnknown : public LinkAction + { + public: + + LinkUnknown(char *sAction); + + virtual ~LinkUnknown(); + + virtual bool CheckValidate() + { + return m_seAction != NULL; + } + + virtual LinkActionType GetType() + { + return actionUnknown; + } + + StringExt *GetAction() + { + return m_seAction; + } + + private: + + StringExt *m_seAction; + + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Link + //------------------------------------------------------------------------------------------------------------------------------- + + class Link + { + public: + + Link(Dict *pDict, StringExt *seBaseURI); + + ~Link(); + + bool CheckValidate() + { + return m_bValid; + } + + // Попала ли точка в рект + bool InRect(double dX, double dY) + { + return m_dLeft <= dX && dX <= m_dRight && m_dBottom <= dY && dY <= m_dTop; + } + + LinkAction *GetAction() + { + return m_pAction; + } + + void GetRect(double *pdLeft, double *pdBottom, double *pdRight, double *pdTop) + { + *pdLeft = m_dLeft; + *pdBottom = m_dBottom; + *pdRight = m_dRight; + *pdTop = m_dTop; + } + + private: + + double m_dLeft; + double m_dBottom; + double m_dRight; + double m_dTop; + + LinkAction *m_pAction; + bool m_bValid; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // Links + //------------------------------------------------------------------------------------------------------------------------------- + + class Links + { + public: + + Links(Object *pAnnots, StringExt *seBaseURI); + + ~Links(); + + int GetLinksCount() + { + return m_nLinksCount; + } + Link *GetLink(int nIndex) + { + return m_ppLinks[nIndex]; + } + + + // Если точка (dX, dY) попадает в Link, тогда возвращаем соответствующий Action. + LinkAction *Find(double dX, double dY); + + // Проверяем попадает ли точка в Link. + bool OnLink(double dX, double dY); + + private: + + Link **m_ppLinks; + int m_nLinksCount; + }; +} + +#endif // _PDF_READER_LINK_H diff --git a/PdfReader/Src/List.cpp b/PdfReader/Src/List.cpp new file mode 100644 index 0000000000..4e69e7586f --- /dev/null +++ b/PdfReader/Src/List.cpp @@ -0,0 +1,87 @@ +#include +#include +#include "MemoryUtils.h" +#include "List.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // CList + //------------------------------------------------------------------------ + + CList::CList() + { + m_nItemSize = 8; + m_ppData = (void **)MemUtilsMallocArray(m_nItemSize, sizeof(void*)); + m_nCount = 0; + m_nIncreament = 0; + } + + CList::CList(int nSize) + { + m_nItemSize = nSize; + m_ppData = (void **)MemUtilsMallocArray(m_nItemSize, sizeof(void*)); + m_nCount = 0; + m_nIncreament = 0; + } + + CList::~CList() + { + MemUtilsFree(m_ppData); + } + + void CList::Append(void *pItem) + { + if (m_nCount >= m_nItemSize) + Expand(); + m_ppData[m_nCount++] = pItem; + } + + void CList::Append(CList *pList) + { + while (m_nCount + pList->m_nCount > m_nItemSize) + Expand(); + for (int nIndex = 0; nIndex < pList->m_nCount; ++nIndex) + m_ppData[m_nCount++] = pList->m_ppData[nIndex]; + } + + void CList::Insert(int nIndex, void *pItem) + { + if (0 > nIndex || nIndex > m_nCount) + return; + if (m_nCount >= m_nItemSize) + Expand(); + if (nIndex < m_nCount) + memmove(m_ppData + nIndex + 1, m_ppData + nIndex, (m_nCount - nIndex) * sizeof(void *)); + m_ppData[nIndex] = pItem; + ++m_nCount; + } + + void *CList::Delete(int nIndex) + { + void *pItem = m_ppData[nIndex]; + if (nIndex < m_nCount - 1) + memmove(m_ppData + nIndex, m_ppData + nIndex + 1, (m_nCount - nIndex - 1) * sizeof(void *)); + --m_nCount; + if (m_nItemSize - m_nCount >= ((m_nIncreament > 0) ? m_nIncreament : m_nItemSize / 2)) + Shrink(); + return pItem; + } + + void CList::Sort(int(*CompareFunc)(const void *pItem1, const void *pItem2)) + { + qsort(m_ppData, m_nCount, sizeof(void *), CompareFunc); + } + + void CList::Expand() + { + m_nItemSize += (m_nIncreament > 0) ? m_nIncreament : m_nItemSize; + m_ppData = (void **)MemUtilsReallocArray(m_ppData, m_nItemSize, sizeof(void*)); + } + + void CList::Shrink() + { + m_nItemSize -= (m_nIncreament > 0) ? m_nIncreament : m_nItemSize / 2; + m_ppData = (void **)MemUtilsReallocArray(m_ppData, m_nItemSize, sizeof(void*)); + } +} \ No newline at end of file diff --git a/PdfReader/Src/List.h b/PdfReader/Src/List.h new file mode 100644 index 0000000000..6b8ef97360 --- /dev/null +++ b/PdfReader/Src/List.h @@ -0,0 +1,90 @@ +#ifndef _PDF_READER_LIST_H +#define _PDF_READER_LIST_H + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // CList + //------------------------------------------------------------------------ + + class CList + { + + public: + + // Создаем пустой список. + CList(); + + // Создаем пустой список с с выделенной памятью под элементов. + CList(int nSize); + + // Деструктор. + ~CList(); + + int GetLength() + { + return m_nCount; + } + + // Возвращает Ый элемент. + // Если 0 <= nIndex < m_nCount, возвращает NULL. + void *GetByIndex(int nIndex) + { + if (nIndex < 0 || nIndex >= m_nCount) + return NULL; + return m_ppData[nIndex]; + } + + // Добавляем элемент в окнец списка. + void Append(void *pItem); + + // Добавляем другой список в конец данного. + void Append(CList *pList); + + // Вставляем элемент на место . + // Если !(0 <= nIndex <= m_nCount), ничего не делаем. + void Insert(int nIndex, void *pItem); + + // Удаляем из списка и возвращаем ссылку на элемент. + // Если !(0 <= nIndex <= m_nCount), ничего не делаем. + void *Delete(int nIndex); + + // Сортируем список, в соответствии с данной функцией + // сранвения. + void Sort(int(*CompareFunc)(const void *pItem1, const void *pItem2)); + + // Если m_nIncreament > 0, тогда при расширении списка ровно + // m_nIncreament элементов будет добавляться. Если m_nIncreament <= 0, + // тогда список будем удваивать при расширении. + void SetAllocationIncreament(int nIncreament) + { + m_nIncreament = nIncreament; + } + + private: + + void Expand(); + void Shrink(); + + private: + + void **m_ppData; // список элементов + int m_nItemSize; // размер данных в массиве + int m_nCount; // количестов элементов в списке + int m_nIncreament; // на сколько будем увеличивать список + }; + +#define DeleteCList(list, T) \ + do { \ + CList *_list = (list); \ + { \ + int _i; \ + for (_i = 0; _i < _list->GetLength(); ++_i) { \ + delete (T*)_list->GetByIndex(_i); \ + } \ + delete _list; \ + } \ + } while (0) + +} +#endif // _PDF_READER_LIST_H diff --git a/PdfReader/Src/MemoryUtils.h b/PdfReader/Src/MemoryUtils.h new file mode 100644 index 0000000000..431101a255 --- /dev/null +++ b/PdfReader/Src/MemoryUtils.h @@ -0,0 +1,102 @@ +#ifndef _PDF_READER_MEMORY_UTILS_H +#define _PDF_READER_MEMORY_UTILS_H + +#include +#include +#include + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Аналогично malloc, но с обработкой ошибок. + static void *MemUtilsMalloc(int nSize) + { + void *pResult; + + if (nSize <= 0) + return NULL; + + if (!(pResult = malloc(nSize))) + { + // TO DO: Выдать ошибку выделения памяти + } + return pResult; + } + + + // Тоже что и realloc, но с обработкой ошибок. + // Если NULL, вызывается функция malloc вместо realloc. + static void *MemUtilsRealloc(void *pData, int nSize) + { + void *pResult; + + if (nSize <= 0) + { + if (pData) + free(pData); + return NULL; + } + if (pData) + pResult = realloc(pData, nSize); + else + pResult = malloc(nSize); + if (!pResult) + { + // TO DO: Выдать ошибку выделения памяти + } + return pResult; + } + + + // Тоже самое, что и MemUtilsMalloc and MemUtilsRelloc, толькоt + // учитывает количество элементов и размер элемента. В результате + // выделяется память размером nObjectsCount * nObjectSize байт. + // Кроме того присутствует обработка ошибок и проверка того, чтобы + // суммарный размер не превышал предел для int. + static void *MemUtilsMallocArray(int nObjectsCount, int nObjectSize) + { + if (0 == nObjectsCount) + return NULL; + + int nSize = nObjectsCount * nObjectSize; + if (nObjectSize <= 0 || nObjectsCount < 0 || nObjectsCount >= INT_MAX / nObjectSize) + { + // TO DO: Выдать ошибку выделения памяти + } + return MemUtilsMalloc(nSize); + } + + // Тоже что и free, но проверяет и игнорирует NULL-указатели. + static void MemUtilsFree(void *pData) + { + if (pData) + free(pData); + } + + static void *MemUtilsReallocArray(void *pData, int nObjectsCount, int nObjectSize) + { + if (0 == nObjectsCount) + { + if (pData) + MemUtilsFree(pData); + return NULL; + } + int nSize = nObjectsCount * nObjectSize; + + if (nObjectSize <= 0 || nObjectsCount < 0 || nObjectsCount >= INT_MAX / nObjectSize) + { + // TO DO: Выдать ошибку выделения памяти + } + return MemUtilsRealloc(pData, nSize); + } + + // Выделяем память и копируем туда строку. + static char *CopyString(char *sString) + { + char *sResult = (char *)MemUtilsMalloc(strlen(sString) + 1); + strcpy(sResult, sString); + return sResult; + } +} + +#endif // _PDF_READER_MEMORY_UTILS_H diff --git a/PdfReader/Src/NameToCharCode.cpp b/PdfReader/Src/NameToCharCode.cpp new file mode 100644 index 0000000000..456f5fedba --- /dev/null +++ b/PdfReader/Src/NameToCharCode.cpp @@ -0,0 +1,115 @@ +#include +#include "MemoryUtils.h" +#include "NameToCharCode.h" + +namespace PdfReader +{ + struct NameToCharCodeEntry + { + char *sName; + CharCode nCode; + }; + + //------------------------------------------------------------------------ + + NameToCharCode::NameToCharCode() + { + m_nSize = 31; + m_nLen = 0; + m_pTable = (NameToCharCodeEntry *)MemUtilsMallocArray(m_nSize, sizeof(NameToCharCodeEntry)); + + for (int nIndex = 0; nIndex < m_nSize; ++nIndex) + { + m_pTable[nIndex].sName = NULL; + } + } + + NameToCharCode::~NameToCharCode() + { + for (int nIndex = 0; nIndex < m_nSize; ++nIndex) + { + if (m_pTable[nIndex].sName) + { + MemUtilsFree(m_pTable[nIndex].sName); + } + } + MemUtilsFree(m_pTable); + } + + void NameToCharCode::Add(char *sName, CharCode nCode) + { + // Увеличиваем таблицу, в случае необходимости + if (m_nLen >= m_nSize / 2) + { + int nOldSize = m_nSize; + NameToCharCodeEntry *pOldTable = m_pTable; + m_nSize = 2 * m_nSize + 1; + m_pTable = (NameToCharCodeEntry *)MemUtilsMallocArray(m_nSize, sizeof(NameToCharCodeEntry)); + for (int nIndex = 0; nIndex < m_nSize; ++nIndex) + { + m_pTable[nIndex].sName = NULL; + } + for (int nIndex = 0; nIndex < nOldSize; ++nIndex) + { + if (pOldTable[nIndex].sName) + { + int nHash = Hash(pOldTable[nIndex].sName); + while (m_pTable[nHash].sName) + { + if (++nHash == m_nSize) + { + nHash = 0; + } + } + m_pTable[nHash] = pOldTable[nIndex]; + } + } + MemUtilsFree(pOldTable); + } + + // Добавляем новое имя + int nHash = Hash(sName); + while (m_pTable[nHash].sName && strcmp(m_pTable[nHash].sName, sName)) + { + if (++nHash == m_nSize) + { + nHash = 0; + } + } + if (!m_pTable[nHash].sName) + { + m_pTable[nHash].sName = CopyString(sName); + } + m_pTable[nHash].nCode = nCode; + + ++m_nLen; + } + + CharCode NameToCharCode::Lookup(char *sName) + { + int nHash = Hash(sName); + while (m_pTable[nHash].sName) + { + if (!strcmp(m_pTable[nHash].sName, sName)) + { + return m_pTable[nHash].nCode; + } + if (++nHash == m_nSize) + { + nHash = 0; + } + } + return 0; + } + + int NameToCharCode::Hash(char *sName) + { + char *pCur; + unsigned int unHash = 0; + for (pCur = sName; *pCur; ++pCur) + { + unHash = 17 * unHash + (int)(*pCur & 0xff); + } + return (int)(unHash % m_nSize); + } +} \ No newline at end of file diff --git a/PdfReader/Src/NameToCharCode.h b/PdfReader/Src/NameToCharCode.h new file mode 100644 index 0000000000..b1c822076c --- /dev/null +++ b/PdfReader/Src/NameToCharCode.h @@ -0,0 +1,36 @@ +#ifndef _PDF_READER_NAME_TO_CHAR_CODE_H +#define _PDF_READER_NAME_TO_CHAR_CODE_H + +#include "CharTypes.h" + +namespace PdfReader +{ + struct NameToCharCodeEntry; + + //------------------------------------------------------------------------------------------------------------------------------- + // NameToCharCode + //------------------------------------------------------------------------------------------------------------------------------- + + class NameToCharCode + { + public: + + NameToCharCode(); + ~NameToCharCode(); + + void Add(char *sName, CharCode nCode); + CharCode Lookup(char *sName); + + private: + + int Hash(char *sName); + + private: + + NameToCharCodeEntry *m_pTable; + int m_nSize; + int m_nLen; + }; +} + +#endif // _PDF_READER_NAME_TO_CHAR_CODE_H diff --git a/PdfReader/Src/NameToUnicodeTable.h b/PdfReader/Src/NameToUnicodeTable.h new file mode 100644 index 0000000000..4f6c466ca8 --- /dev/null +++ b/PdfReader/Src/NameToUnicodeTable.h @@ -0,0 +1,1099 @@ +#ifndef _PDF_READER_NAME_TO_UNICODE_TABLE +#define _PDF_READER_NAME_TO_UNICODE_TABLE + +namespace PdfReader +{ + static struct + { + Unicode nUnicode; + char *sName; + } c_arrNameToUnicodeTable[] = + { + { 0x0021, "!" }, + { 0x0023, "#" }, + { 0x0024, "$" }, + { 0x0025, "%" }, + { 0x0026, "&" }, + { 0x0027, "'" }, + { 0x0028, "(" }, + { 0x0029, ")" }, + { 0x002a, "*" }, + { 0x002b, "+" }, + { 0x002c, "," }, + { 0x002d, "-" }, + { 0x002e, "." }, + { 0x002f, "/" }, + { 0x0030, "0" }, + { 0x0031, "1" }, + { 0x0032, "2" }, + { 0x0033, "3" }, + { 0x0034, "4" }, + { 0x0035, "5" }, + { 0x0036, "6" }, + { 0x0037, "7" }, + { 0x0038, "8" }, + { 0x0039, "9" }, + { 0x003a, ":" }, + { 0x003b, ";" }, + { 0x003c, "<" }, + { 0x003d, "=" }, + { 0x003e, ">" }, + { 0x003f, "?" }, + { 0x0040, "@" }, + { 0x0041, "A" }, + { 0x00c6, "AE" }, + { 0x01fc, "AEacute" }, + { 0xf7e6, "AEsmall" }, + { 0x00c1, "Aacute" }, + { 0xf7e1, "Aacutesmall" }, + { 0x0102, "Abreve" }, + { 0x00c2, "Acircumflex" }, + { 0xf7e2, "Acircumflexsmall" }, + { 0xf6c9, "Acute" }, + { 0xf7b4, "Acutesmall" }, + { 0x00c4, "Adieresis" }, + { 0xf7e4, "Adieresissmall" }, + { 0x00c0, "Agrave" }, + { 0xf7e0, "Agravesmall" }, + { 0x0391, "Alpha" }, + { 0x0386, "Alphatonos" }, + { 0x0100, "Amacron" }, + { 0x0104, "Aogonek" }, + { 0x00c5, "Aring" }, + { 0x01fa, "Aringacute" }, + { 0xf7e5, "Aringsmall" }, + { 0xf761, "Asmall" }, + { 0x00c3, "Atilde" }, + { 0xf7e3, "Atildesmall" }, + { 0x0042, "B" }, + { 0x0392, "Beta" }, + { 0xf6f4, "Brevesmall" }, + { 0xf762, "Bsmall" }, + { 0x0043, "C" }, + { 0x0106, "Cacute" }, + { 0xf6ca, "Caron" }, + { 0xf6f5, "Caronsmall" }, + { 0x010c, "Ccaron" }, + { 0x00c7, "Ccedilla" }, + { 0xf7e7, "Ccedillasmall" }, + { 0x0108, "Ccircumflex" }, + { 0x010a, "Cdotaccent" }, + { 0xf7b8, "Cedillasmall" }, + { 0x03a7, "Chi" }, + { 0xf6f6, "Circumflexsmall" }, + { 0xf763, "Csmall" }, + { 0x0044, "D" }, + { 0x010e, "Dcaron" }, + { 0x0110, "Dcroat" }, + { 0x2206, "Delta" }, + { 0xf6cb, "Dieresis" }, + { 0xf6cc, "DieresisAcute" }, + { 0xf6cd, "DieresisGrave" }, + { 0xf7a8, "Dieresissmall" }, + { 0xf6f7, "Dotaccentsmall" }, + { 0xf764, "Dsmall" }, + { 0x0045, "E" }, + { 0x00c9, "Eacute" }, + { 0xf7e9, "Eacutesmall" }, + { 0x0114, "Ebreve" }, + { 0x011a, "Ecaron" }, + { 0x00ca, "Ecircumflex" }, + { 0xf7ea, "Ecircumflexsmall" }, + { 0x00cb, "Edieresis" }, + { 0xf7eb, "Edieresissmall" }, + { 0x0116, "Edotaccent" }, + { 0x00c8, "Egrave" }, + { 0xf7e8, "Egravesmall" }, + { 0x0112, "Emacron" }, + { 0x014a, "Eng" }, + { 0x0118, "Eogonek" }, + { 0x0395, "Epsilon" }, + { 0x0388, "Epsilontonos" }, + { 0xf765, "Esmall" }, + { 0x0397, "Eta" }, + { 0x0389, "Etatonos" }, + { 0x00d0, "Eth" }, + { 0xf7f0, "Ethsmall" }, + { 0x20ac, "Euro" }, + { 0x0046, "F" }, + { 0xf766, "Fsmall" }, + { 0x0047, "G" }, + { 0x0393, "Gamma" }, + { 0x011e, "Gbreve" }, + { 0x01e6, "Gcaron" }, + { 0x011c, "Gcircumflex" }, + { 0x0122, "Gcommaaccent" }, + { 0x0120, "Gdotaccent" }, + { 0xf6ce, "Grave" }, + { 0xf760, "Gravesmall" }, + { 0xf767, "Gsmall" }, + { 0x0048, "H" }, + { 0x25cf, "H18533" }, + { 0x25aa, "H18543" }, + { 0x25ab, "H18551" }, + { 0x25a1, "H22073" }, + { 0x0126, "Hbar" }, + { 0x0124, "Hcircumflex" }, + { 0xf768, "Hsmall" }, + { 0xf6cf, "Hungarumlaut" }, + { 0xf6f8, "Hungarumlautsmall" }, + { 0x0049, "I" }, + { 0x0132, "IJ" }, + { 0x00cd, "Iacute" }, + { 0xf7ed, "Iacutesmall" }, + { 0x012c, "Ibreve" }, + { 0x00ce, "Icircumflex" }, + { 0xf7ee, "Icircumflexsmall" }, + { 0x00cf, "Idieresis" }, + { 0xf7ef, "Idieresissmall" }, + { 0x0130, "Idotaccent" }, + { 0x2111, "Ifraktur" }, + { 0x00cc, "Igrave" }, + { 0xf7ec, "Igravesmall" }, + { 0x012a, "Imacron" }, + { 0x012e, "Iogonek" }, + { 0x0399, "Iota" }, + { 0x03aa, "Iotadieresis" }, + { 0x038a, "Iotatonos" }, + { 0xf769, "Ismall" }, + { 0x0128, "Itilde" }, + { 0x004a, "J" }, + { 0x0134, "Jcircumflex" }, + { 0xf76a, "Jsmall" }, + { 0x004b, "K" }, + { 0x039a, "Kappa" }, + { 0x0136, "Kcommaaccent" }, + { 0xf76b, "Ksmall" }, + { 0x004c, "L" }, + { 0xf6bf, "LL" }, + { 0x0139, "Lacute" }, + { 0x039b, "Lambda" }, + { 0x013d, "Lcaron" }, + { 0x013b, "Lcommaaccent" }, + { 0x013f, "Ldot" }, + { 0x0141, "Lslash" }, + { 0xf6f9, "Lslashsmall" }, + { 0xf76c, "Lsmall" }, + { 0x004d, "M" }, + { 0xf6d0, "Macron" }, + { 0xf7af, "Macronsmall" }, + { 0xf76d, "Msmall" }, + { 0x039c, "Mu" }, + { 0x004e, "N" }, + { 0x0143, "Nacute" }, + { 0x0147, "Ncaron" }, + { 0x0145, "Ncommaaccent" }, + { 0xf76e, "Nsmall" }, + { 0x00d1, "Ntilde" }, + { 0xf7f1, "Ntildesmall" }, + { 0x039d, "Nu" }, + { 0x004f, "O" }, + { 0x0152, "OE" }, + { 0xf6fa, "OEsmall" }, + { 0x00d3, "Oacute" }, + { 0xf7f3, "Oacutesmall" }, + { 0x014e, "Obreve" }, + { 0x00d4, "Ocircumflex" }, + { 0xf7f4, "Ocircumflexsmall" }, + { 0x00d6, "Odieresis" }, + { 0xf7f6, "Odieresissmall" }, + { 0xf6fb, "Ogoneksmall" }, + { 0x00d2, "Ograve" }, + { 0xf7f2, "Ogravesmall" }, + { 0x01a0, "Ohorn" }, + { 0x0150, "Ohungarumlaut" }, + { 0x014c, "Omacron" }, + { 0x2126, "Omega" }, + { 0x038f, "Omegatonos" }, + { 0x039f, "Omicron" }, + { 0x038c, "Omicrontonos" }, + { 0x00d8, "Oslash" }, + { 0x01fe, "Oslashacute" }, + { 0xf7f8, "Oslashsmall" }, + { 0xf76f, "Osmall" }, + { 0x00d5, "Otilde" }, + { 0xf7f5, "Otildesmall" }, + { 0x0050, "P" }, + { 0x03a6, "Phi" }, + { 0x03a0, "Pi" }, + { 0x03a8, "Psi" }, + { 0xf770, "Psmall" }, + { 0x0051, "Q" }, + { 0xf771, "Qsmall" }, + { 0x0052, "R" }, + { 0x0154, "Racute" }, + { 0x0158, "Rcaron" }, + { 0x0156, "Rcommaaccent" }, + { 0x211c, "Rfraktur" }, + { 0x03a1, "Rho" }, + { 0xf6fc, "Ringsmall" }, + { 0xf772, "Rsmall" }, + { 0x0053, "S" }, + { 0x250c, "SF010000" }, + { 0x2514, "SF020000" }, + { 0x2510, "SF030000" }, + { 0x2518, "SF040000" }, + { 0x253c, "SF050000" }, + { 0x252c, "SF060000" }, + { 0x2534, "SF070000" }, + { 0x251c, "SF080000" }, + { 0x2524, "SF090000" }, + { 0x2500, "SF100000" }, + { 0x2502, "SF110000" }, + { 0x2561, "SF190000" }, + { 0x2562, "SF200000" }, + { 0x2556, "SF210000" }, + { 0x2555, "SF220000" }, + { 0x2563, "SF230000" }, + { 0x2551, "SF240000" }, + { 0x2557, "SF250000" }, + { 0x255d, "SF260000" }, + { 0x255c, "SF270000" }, + { 0x255b, "SF280000" }, + { 0x255e, "SF360000" }, + { 0x255f, "SF370000" }, + { 0x255a, "SF380000" }, + { 0x2554, "SF390000" }, + { 0x2569, "SF400000" }, + { 0x2566, "SF410000" }, + { 0x2560, "SF420000" }, + { 0x2550, "SF430000" }, + { 0x256c, "SF440000" }, + { 0x2567, "SF450000" }, + { 0x2568, "SF460000" }, + { 0x2564, "SF470000" }, + { 0x2565, "SF480000" }, + { 0x2559, "SF490000" }, + { 0x2558, "SF500000" }, + { 0x2552, "SF510000" }, + { 0x2553, "SF520000" }, + { 0x256b, "SF530000" }, + { 0x256a, "SF540000" }, + { 0x015a, "Sacute" }, + { 0x0160, "Scaron" }, + { 0xf6fd, "Scaronsmall" }, + { 0x015e, "Scedilla" }, + { 0x015c, "Scircumflex" }, + { 0x0218, "Scommaaccent" }, + { 0x03a3, "Sigma" }, + { 0xf773, "Ssmall" }, + { 0x0054, "T" }, + { 0x03a4, "Tau" }, + { 0x0166, "Tbar" }, + { 0x0164, "Tcaron" }, + { 0x0162, "Tcommaaccent" }, + { 0x0398, "Theta" }, + { 0x00de, "Thorn" }, + { 0xf7fe, "Thornsmall" }, + { 0xf6fe, "Tildesmall" }, + { 0xf774, "Tsmall" }, + { 0x0055, "U" }, + { 0x00da, "Uacute" }, + { 0xf7fa, "Uacutesmall" }, + { 0x016c, "Ubreve" }, + { 0x00db, "Ucircumflex" }, + { 0xf7fb, "Ucircumflexsmall" }, + { 0x00dc, "Udieresis" }, + { 0xf7fc, "Udieresissmall" }, + { 0x00d9, "Ugrave" }, + { 0xf7f9, "Ugravesmall" }, + { 0x01af, "Uhorn" }, + { 0x0170, "Uhungarumlaut" }, + { 0x016a, "Umacron" }, + { 0x0172, "Uogonek" }, + { 0x03a5, "Upsilon" }, + { 0x03d2, "Upsilon1" }, + { 0x03ab, "Upsilondieresis" }, + { 0x038e, "Upsilontonos" }, + { 0x016e, "Uring" }, + { 0xf775, "Usmall" }, + { 0x0168, "Utilde" }, + { 0x0056, "V" }, + { 0xf776, "Vsmall" }, + { 0x0057, "W" }, + { 0x1e82, "Wacute" }, + { 0x0174, "Wcircumflex" }, + { 0x1e84, "Wdieresis" }, + { 0x1e80, "Wgrave" }, + { 0xf777, "Wsmall" }, + { 0x0058, "X" }, + { 0x039e, "Xi" }, + { 0xf778, "Xsmall" }, + { 0x0059, "Y" }, + { 0x00dd, "Yacute" }, + { 0xf7fd, "Yacutesmall" }, + { 0x0176, "Ycircumflex" }, + { 0x0178, "Ydieresis" }, + { 0xf7ff, "Ydieresissmall" }, + { 0x1ef2, "Ygrave" }, + { 0xf779, "Ysmall" }, + { 0x005a, "Z" }, + { 0x0179, "Zacute" }, + { 0x017d, "Zcaron" }, + { 0xf6ff, "Zcaronsmall" }, + { 0x017b, "Zdotaccent" }, + { 0x0396, "Zeta" }, + { 0xf77a, "Zsmall" }, + { 0x0022, "\"" }, + { 0x005c, "\\" }, + { 0x005d, "]" }, + { 0x005e, "^" }, + { 0x005f, "_" }, + { 0x0060, "`" }, + { 0x0061, "a" }, + { 0x00e1, "aacute" }, + { 0x0103, "abreve" }, + { 0x00e2, "acircumflex" }, + { 0x00b4, "acute" }, + { 0x0301, "acutecomb" }, + { 0x00e4, "adieresis" }, + { 0x00e6, "ae" }, + { 0x01fd, "aeacute" }, + { 0x2015, "afii00208" }, + { 0x0410, "afii10017" }, + { 0x0411, "afii10018" }, + { 0x0412, "afii10019" }, + { 0x0413, "afii10020" }, + { 0x0414, "afii10021" }, + { 0x0415, "afii10022" }, + { 0x0401, "afii10023" }, + { 0x0416, "afii10024" }, + { 0x0417, "afii10025" }, + { 0x0418, "afii10026" }, + { 0x0419, "afii10027" }, + { 0x041a, "afii10028" }, + { 0x041b, "afii10029" }, + { 0x041c, "afii10030" }, + { 0x041d, "afii10031" }, + { 0x041e, "afii10032" }, + { 0x041f, "afii10033" }, + { 0x0420, "afii10034" }, + { 0x0421, "afii10035" }, + { 0x0422, "afii10036" }, + { 0x0423, "afii10037" }, + { 0x0424, "afii10038" }, + { 0x0425, "afii10039" }, + { 0x0426, "afii10040" }, + { 0x0427, "afii10041" }, + { 0x0428, "afii10042" }, + { 0x0429, "afii10043" }, + { 0x042a, "afii10044" }, + { 0x042b, "afii10045" }, + { 0x042c, "afii10046" }, + { 0x042d, "afii10047" }, + { 0x042e, "afii10048" }, + { 0x042f, "afii10049" }, + { 0x0490, "afii10050" }, + { 0x0402, "afii10051" }, + { 0x0403, "afii10052" }, + { 0x0404, "afii10053" }, + { 0x0405, "afii10054" }, + { 0x0406, "afii10055" }, + { 0x0407, "afii10056" }, + { 0x0408, "afii10057" }, + { 0x0409, "afii10058" }, + { 0x040a, "afii10059" }, + { 0x040b, "afii10060" }, + { 0x040c, "afii10061" }, + { 0x040e, "afii10062" }, + { 0xf6c4, "afii10063" }, + { 0xf6c5, "afii10064" }, + { 0x0430, "afii10065" }, + { 0x0431, "afii10066" }, + { 0x0432, "afii10067" }, + { 0x0433, "afii10068" }, + { 0x0434, "afii10069" }, + { 0x0435, "afii10070" }, + { 0x0451, "afii10071" }, + { 0x0436, "afii10072" }, + { 0x0437, "afii10073" }, + { 0x0438, "afii10074" }, + { 0x0439, "afii10075" }, + { 0x043a, "afii10076" }, + { 0x043b, "afii10077" }, + { 0x043c, "afii10078" }, + { 0x043d, "afii10079" }, + { 0x043e, "afii10080" }, + { 0x043f, "afii10081" }, + { 0x0440, "afii10082" }, + { 0x0441, "afii10083" }, + { 0x0442, "afii10084" }, + { 0x0443, "afii10085" }, + { 0x0444, "afii10086" }, + { 0x0445, "afii10087" }, + { 0x0446, "afii10088" }, + { 0x0447, "afii10089" }, + { 0x0448, "afii10090" }, + { 0x0449, "afii10091" }, + { 0x044a, "afii10092" }, + { 0x044b, "afii10093" }, + { 0x044c, "afii10094" }, + { 0x044d, "afii10095" }, + { 0x044e, "afii10096" }, + { 0x044f, "afii10097" }, + { 0x0491, "afii10098" }, + { 0x0452, "afii10099" }, + { 0x0453, "afii10100" }, + { 0x0454, "afii10101" }, + { 0x0455, "afii10102" }, + { 0x0456, "afii10103" }, + { 0x0457, "afii10104" }, + { 0x0458, "afii10105" }, + { 0x0459, "afii10106" }, + { 0x045a, "afii10107" }, + { 0x045b, "afii10108" }, + { 0x045c, "afii10109" }, + { 0x045e, "afii10110" }, + { 0x040f, "afii10145" }, + { 0x0462, "afii10146" }, + { 0x0472, "afii10147" }, + { 0x0474, "afii10148" }, + { 0xf6c6, "afii10192" }, + { 0x045f, "afii10193" }, + { 0x0463, "afii10194" }, + { 0x0473, "afii10195" }, + { 0x0475, "afii10196" }, + { 0xf6c7, "afii10831" }, + { 0xf6c8, "afii10832" }, + { 0x04d9, "afii10846" }, + { 0x200e, "afii299" }, + { 0x200f, "afii300" }, + { 0x200d, "afii301" }, + { 0x066a, "afii57381" }, + { 0x060c, "afii57388" }, + { 0x0660, "afii57392" }, + { 0x0661, "afii57393" }, + { 0x0662, "afii57394" }, + { 0x0663, "afii57395" }, + { 0x0664, "afii57396" }, + { 0x0665, "afii57397" }, + { 0x0666, "afii57398" }, + { 0x0667, "afii57399" }, + { 0x0668, "afii57400" }, + { 0x0669, "afii57401" }, + { 0x061b, "afii57403" }, + { 0x061f, "afii57407" }, + { 0x0621, "afii57409" }, + { 0x0622, "afii57410" }, + { 0x0623, "afii57411" }, + { 0x0624, "afii57412" }, + { 0x0625, "afii57413" }, + { 0x0626, "afii57414" }, + { 0x0627, "afii57415" }, + { 0x0628, "afii57416" }, + { 0x0629, "afii57417" }, + { 0x062a, "afii57418" }, + { 0x062b, "afii57419" }, + { 0x062c, "afii57420" }, + { 0x062d, "afii57421" }, + { 0x062e, "afii57422" }, + { 0x062f, "afii57423" }, + { 0x0630, "afii57424" }, + { 0x0631, "afii57425" }, + { 0x0632, "afii57426" }, + { 0x0633, "afii57427" }, + { 0x0634, "afii57428" }, + { 0x0635, "afii57429" }, + { 0x0636, "afii57430" }, + { 0x0637, "afii57431" }, + { 0x0638, "afii57432" }, + { 0x0639, "afii57433" }, + { 0x063a, "afii57434" }, + { 0x0640, "afii57440" }, + { 0x0641, "afii57441" }, + { 0x0642, "afii57442" }, + { 0x0643, "afii57443" }, + { 0x0644, "afii57444" }, + { 0x0645, "afii57445" }, + { 0x0646, "afii57446" }, + { 0x0648, "afii57448" }, + { 0x0649, "afii57449" }, + { 0x064a, "afii57450" }, + { 0x064b, "afii57451" }, + { 0x064c, "afii57452" }, + { 0x064d, "afii57453" }, + { 0x064e, "afii57454" }, + { 0x064f, "afii57455" }, + { 0x0650, "afii57456" }, + { 0x0651, "afii57457" }, + { 0x0652, "afii57458" }, + { 0x0647, "afii57470" }, + { 0x06a4, "afii57505" }, + { 0x067e, "afii57506" }, + { 0x0686, "afii57507" }, + { 0x0698, "afii57508" }, + { 0x06af, "afii57509" }, + { 0x0679, "afii57511" }, + { 0x0688, "afii57512" }, + { 0x0691, "afii57513" }, + { 0x06ba, "afii57514" }, + { 0x06d2, "afii57519" }, + { 0x06d5, "afii57534" }, + { 0x20aa, "afii57636" }, + { 0x05be, "afii57645" }, + { 0x05c3, "afii57658" }, + { 0x05d0, "afii57664" }, + { 0x05d1, "afii57665" }, + { 0x05d2, "afii57666" }, + { 0x05d3, "afii57667" }, + { 0x05d4, "afii57668" }, + { 0x05d5, "afii57669" }, + { 0x05d6, "afii57670" }, + { 0x05d7, "afii57671" }, + { 0x05d8, "afii57672" }, + { 0x05d9, "afii57673" }, + { 0x05da, "afii57674" }, + { 0x05db, "afii57675" }, + { 0x05dc, "afii57676" }, + { 0x05dd, "afii57677" }, + { 0x05de, "afii57678" }, + { 0x05df, "afii57679" }, + { 0x05e0, "afii57680" }, + { 0x05e1, "afii57681" }, + { 0x05e2, "afii57682" }, + { 0x05e3, "afii57683" }, + { 0x05e4, "afii57684" }, + { 0x05e5, "afii57685" }, + { 0x05e6, "afii57686" }, + { 0x05e7, "afii57687" }, + { 0x05e8, "afii57688" }, + { 0x05e9, "afii57689" }, + { 0x05ea, "afii57690" }, + { 0xfb2a, "afii57694" }, + { 0xfb2b, "afii57695" }, + { 0xfb4b, "afii57700" }, + { 0xfb1f, "afii57705" }, + { 0x05f0, "afii57716" }, + { 0x05f1, "afii57717" }, + { 0x05f2, "afii57718" }, + { 0xfb35, "afii57723" }, + { 0x05b4, "afii57793" }, + { 0x05b5, "afii57794" }, + { 0x05b6, "afii57795" }, + { 0x05bb, "afii57796" }, + { 0x05b8, "afii57797" }, + { 0x05b7, "afii57798" }, + { 0x05b0, "afii57799" }, + { 0x05b2, "afii57800" }, + { 0x05b1, "afii57801" }, + { 0x05b3, "afii57802" }, + { 0x05c2, "afii57803" }, + { 0x05c1, "afii57804" }, + { 0x05b9, "afii57806" }, + { 0x05bc, "afii57807" }, + { 0x05bd, "afii57839" }, + { 0x05bf, "afii57841" }, + { 0x05c0, "afii57842" }, + { 0x02bc, "afii57929" }, + { 0x2105, "afii61248" }, + { 0x2113, "afii61289" }, + { 0x2116, "afii61352" }, + { 0x202c, "afii61573" }, + { 0x202d, "afii61574" }, + { 0x202e, "afii61575" }, + { 0x200c, "afii61664" }, + { 0x066d, "afii63167" }, + { 0x02bd, "afii64937" }, + { 0x00e0, "agrave" }, + { 0x2135, "aleph" }, + { 0x03b1, "alpha" }, + { 0x03ac, "alphatonos" }, + { 0x0101, "amacron" }, + { 0x0026, "ampersand" }, + { 0xf726, "ampersandsmall" }, + { 0x2220, "angle" }, + { 0x2329, "angleleft" }, + { 0x232a, "angleright" }, + { 0x0387, "anoteleia" }, + { 0x0105, "aogonek" }, + { 0x2248, "approxequal" }, + { 0x00e5, "aring" }, + { 0x01fb, "aringacute" }, + { 0x2194, "arrowboth" }, + { 0x21d4, "arrowdblboth" }, + { 0x21d3, "arrowdbldown" }, + { 0x21d0, "arrowdblleft" }, + { 0x21d2, "arrowdblright" }, + { 0x21d1, "arrowdblup" }, + { 0x2193, "arrowdown" }, + { 0xf8e7, "arrowhorizex" }, + { 0x2190, "arrowleft" }, + { 0x2192, "arrowright" }, + { 0x2191, "arrowup" }, + { 0x2195, "arrowupdn" }, + { 0x21a8, "arrowupdnbse" }, + { 0xf8e6, "arrowvertex" }, + { 0x005e, "asciicircum" }, + { 0x007e, "asciitilde" }, + { 0x002a, "asterisk" }, + { 0x2217, "asteriskmath" }, + { 0xf6e9, "asuperior" }, + { 0x0040, "at" }, + { 0x00e3, "atilde" }, + { 0x0062, "b" }, + { 0x005c, "backslash" }, + { 0x007c, "bar" }, + { 0x03b2, "beta" }, + { 0x2588, "block" }, + { 0xf8f4, "braceex" }, + { 0x007b, "braceleft" }, + { 0xf8f3, "braceleftbt" }, + { 0xf8f2, "braceleftmid" }, + { 0xf8f1, "bracelefttp" }, + { 0x007d, "braceright" }, + { 0xf8fe, "bracerightbt" }, + { 0xf8fd, "bracerightmid" }, + { 0xf8fc, "bracerighttp" }, + { 0x005b, "bracketleft" }, + { 0xf8f0, "bracketleftbt" }, + { 0xf8ef, "bracketleftex" }, + { 0xf8ee, "bracketlefttp" }, + { 0x005d, "bracketright" }, + { 0xf8fb, "bracketrightbt" }, + { 0xf8fa, "bracketrightex" }, + { 0xf8f9, "bracketrighttp" }, + { 0x02d8, "breve" }, + { 0x00a6, "brokenbar" }, + { 0xf6ea, "bsuperior" }, + { 0x2022, "bullet" }, + { 0x0063, "c" }, + { 0x0107, "cacute" }, + { 0x02c7, "caron" }, + { 0x21b5, "carriagereturn" }, + { 0x010d, "ccaron" }, + { 0x00e7, "ccedilla" }, + { 0x0109, "ccircumflex" }, + { 0x010b, "cdotaccent" }, + { 0x00b8, "cedilla" }, + { 0x00a2, "cent" }, + { 0xf6df, "centinferior" }, + { 0xf7a2, "centoldstyle" }, + { 0xf6e0, "centsuperior" }, + { 0x03c7, "chi" }, + { 0x25cb, "circle" }, + { 0x2297, "circlemultiply" }, + { 0x2295, "circleplus" }, + { 0x02c6, "circumflex" }, + { 0x2663, "club" }, + { 0x003a, "colon" }, + { 0x20a1, "colonmonetary" }, + { 0x002c, "comma" }, + { 0xf6c3, "commaaccent" }, + { 0xf6e1, "commainferior" }, + { 0xf6e2, "commasuperior" }, + { 0x2245, "congruent" }, + { 0x00a9, "copyright" }, + { 0x00a9, "copyrightsans" }, + { 0x00a9, "copyrightserif" }, + { 0x00a4, "currency" }, + { 0xf6d1, "cyrBreve" }, + { 0xf6d2, "cyrFlex" }, + { 0xf6d4, "cyrbreve" }, + { 0xf6d5, "cyrflex" }, + { 0x0064, "d" }, + { 0x2020, "dagger" }, + { 0x2021, "daggerdbl" }, + { 0xf6d3, "dblGrave" }, + { 0xf6d6, "dblgrave" }, + { 0x010f, "dcaron" }, + { 0x0111, "dcroat" }, + { 0x00b0, "degree" }, + { 0x03b4, "delta" }, + { 0x2666, "diamond" }, + { 0x00a8, "dieresis" }, + { 0xf6d7, "dieresisacute" }, + { 0xf6d8, "dieresisgrave" }, + { 0x0385, "dieresistonos" }, + { 0x00f7, "divide" }, + { 0x2593, "dkshade" }, + { 0x2584, "dnblock" }, + { 0x0024, "dollar" }, + { 0xf6e3, "dollarinferior" }, + { 0xf724, "dollaroldstyle" }, + { 0xf6e4, "dollarsuperior" }, + { 0x20ab, "dong" }, + { 0x02d9, "dotaccent" }, + { 0x0323, "dotbelowcomb" }, + { 0x0131, "dotlessi" }, + { 0xf6be, "dotlessj" }, + { 0x22c5, "dotmath" }, + { 0xf6eb, "dsuperior" }, + { 0x0065, "e" }, + { 0x00e9, "eacute" }, + { 0x0115, "ebreve" }, + { 0x011b, "ecaron" }, + { 0x00ea, "ecircumflex" }, + { 0x00eb, "edieresis" }, + { 0x0117, "edotaccent" }, + { 0x00e8, "egrave" }, + { 0x0038, "eight" }, + { 0x2088, "eightinferior" }, + { 0xf738, "eightoldstyle" }, + { 0x2078, "eightsuperior" }, + { 0x2208, "element" }, + { 0x2026, "ellipsis" }, + { 0x0113, "emacron" }, + { 0x2014, "emdash" }, + { 0x2205, "emptyset" }, + { 0x2013, "endash" }, + { 0x014b, "eng" }, + { 0x0119, "eogonek" }, + { 0x03b5, "epsilon" }, + { 0x03ad, "epsilontonos" }, + { 0x003d, "equal" }, + { 0x2261, "equivalence" }, + { 0x212e, "estimated" }, + { 0xf6ec, "esuperior" }, + { 0x03b7, "eta" }, + { 0x03ae, "etatonos" }, + { 0x00f0, "eth" }, + { 0x0021, "exclam" }, + { 0x203c, "exclamdbl" }, + { 0x00a1, "exclamdown" }, + { 0xf7a1, "exclamdownsmall" }, + { 0x0021, "exclamleft" }, + { 0xf721, "exclamsmall" }, + { 0x2203, "existential" }, + { 0x0066, "f" }, + { 0x2640, "female" }, + { 0xfb00, "ff" }, + { 0xfb03, "ffi" }, + { 0xfb04, "ffl" }, + { 0xfb01, "fi" }, + { 0x2012, "figuredash" }, + { 0x25a0, "filledbox" }, + { 0x25ac, "filledrect" }, + { 0x0035, "five" }, + { 0x215d, "fiveeighths" }, + { 0x2085, "fiveinferior" }, + { 0xf735, "fiveoldstyle" }, + { 0x2075, "fivesuperior" }, + { 0xfb02, "fl" }, + { 0x0192, "florin" }, + { 0x0034, "four" }, + { 0x2084, "fourinferior" }, + { 0xf734, "fouroldstyle" }, + { 0x2074, "foursuperior" }, + { 0x2044, "fraction" }, + { 0x20a3, "franc" }, + { 0x0067, "g" }, + { 0x03b3, "gamma" }, + { 0x011f, "gbreve" }, + { 0x01e7, "gcaron" }, + { 0x011d, "gcircumflex" }, + { 0x0123, "gcommaaccent" }, + { 0x0121, "gdotaccent" }, + { 0x00df, "germandbls" }, + { 0x2207, "gradient" }, + { 0x0060, "grave" }, + { 0x0300, "gravecomb" }, + { 0x003e, "greater" }, + { 0x2265, "greaterequal" }, + { 0x00ab, "guillemotleft" }, + { 0x00bb, "guillemotright" }, + { 0x2039, "guilsinglleft" }, + { 0x203a, "guilsinglright" }, + { 0x0068, "h" }, + { 0x0127, "hbar" }, + { 0x0125, "hcircumflex" }, + { 0x2665, "heart" }, + { 0x0309, "hookabovecomb" }, + { 0x2302, "house" }, + { 0x02dd, "hungarumlaut" }, + { 0x002d, "hyphen" }, + { 0xf6e5, "hypheninferior" }, + { 0xf6e6, "hyphensuperior" }, + { 0x0069, "i" }, + { 0x00ed, "iacute" }, + { 0x012d, "ibreve" }, + { 0x00ee, "icircumflex" }, + { 0x00ef, "idieresis" }, + { 0x00ec, "igrave" }, + { 0x0133, "ij" }, + { 0x012b, "imacron" }, + { 0x221e, "infinity" }, + { 0x222b, "integral" }, + { 0x2321, "integralbt" }, + { 0xf8f5, "integralex" }, + { 0x2320, "integraltp" }, + { 0x2229, "intersection" }, + { 0x25d8, "invbullet" }, + { 0x25d9, "invcircle" }, + { 0x263b, "invsmileface" }, + { 0x012f, "iogonek" }, + { 0x03b9, "iota" }, + { 0x03ca, "iotadieresis" }, + { 0x0390, "iotadieresistonos" }, + { 0x03af, "iotatonos" }, + { 0xf6ed, "isuperior" }, + { 0x0129, "itilde" }, + { 0x006a, "j" }, + { 0x0135, "jcircumflex" }, + { 0x006b, "k" }, + { 0x03ba, "kappa" }, + { 0x0137, "kcommaaccent" }, + { 0x0138, "kgreenlandic" }, + { 0x006c, "l" }, + { 0x013a, "lacute" }, + { 0x03bb, "lambda" }, + { 0x013e, "lcaron" }, + { 0x013c, "lcommaaccent" }, + { 0x0140, "ldot" }, + { 0x003c, "less" }, + { 0x2264, "lessequal" }, + { 0x258c, "lfblock" }, + { 0x20a4, "lira" }, + { 0xf6c0, "ll" }, + { 0x2227, "logicaland" }, + { 0x00ac, "logicalnot" }, + { 0x2228, "logicalor" }, + { 0x017f, "longs" }, + { 0x25ca, "lozenge" }, + { 0x0142, "lslash" }, + { 0xf6ee, "lsuperior" }, + { 0x2591, "ltshade" }, + { 0x006d, "m" }, + { 0x00af, "macron" }, + { 0x2642, "male" }, + { 0x2212, "minus" }, + { 0x2032, "minute" }, + { 0xf6ef, "msuperior" }, + { 0x00b5, "mu" }, + { 0x00d7, "multiply" }, + { 0x266a, "musicalnote" }, + { 0x266b, "musicalnotedbl" }, + { 0x006e, "n" }, + { 0x0144, "nacute" }, + { 0x0149, "napostrophe" }, + { 0x00a0, "nbspace" }, + { 0x0148, "ncaron" }, + { 0x0146, "ncommaaccent" }, + { 0x0039, "nine" }, + { 0x2089, "nineinferior" }, + { 0xf739, "nineoldstyle" }, + { 0x2079, "ninesuperior" }, + { 0x00a0, "nonbreakingspace" }, + { 0x2209, "notelement" }, + { 0x2260, "notequal" }, + { 0x2284, "notsubset" }, + { 0x207f, "nsuperior" }, + { 0x00f1, "ntilde" }, + { 0x03bd, "nu" }, + { 0x0023, "numbersign" }, + { 0x006f, "o" }, + { 0x00f3, "oacute" }, + { 0x014f, "obreve" }, + { 0x00f4, "ocircumflex" }, + { 0x00f6, "odieresis" }, + { 0x0153, "oe" }, + { 0x02db, "ogonek" }, + { 0x00f2, "ograve" }, + { 0x01a1, "ohorn" }, + { 0x0151, "ohungarumlaut" }, + { 0x014d, "omacron" }, + { 0x03c9, "omega" }, + { 0x03d6, "omega1" }, + { 0x03ce, "omegatonos" }, + { 0x03bf, "omicron" }, + { 0x03cc, "omicrontonos" }, + { 0x0031, "one" }, + { 0x2024, "onedotenleader" }, + { 0x215b, "oneeighth" }, + { 0xf6dc, "onefitted" }, + { 0x00bd, "onehalf" }, + { 0x2081, "oneinferior" }, + { 0xf731, "oneoldstyle" }, + { 0x00bc, "onequarter" }, + { 0x00b9, "onesuperior" }, + { 0x2153, "onethird" }, + { 0x25e6, "openbullet" }, + { 0x00aa, "ordfeminine" }, + { 0x00ba, "ordmasculine" }, + { 0x221f, "orthogonal" }, + { 0x00f8, "oslash" }, + { 0x01ff, "oslashacute" }, + { 0xf6f0, "osuperior" }, + { 0x00f5, "otilde" }, + { 0x0070, "p" }, + { 0x00b6, "paragraph" }, + { 0x0028, "parenleft" }, + { 0xf8ed, "parenleftbt" }, + { 0xf8ec, "parenleftex" }, + { 0x208d, "parenleftinferior" }, + { 0x207d, "parenleftsuperior" }, + { 0xf8eb, "parenlefttp" }, + { 0x0029, "parenright" }, + { 0xf8f8, "parenrightbt" }, + { 0xf8f7, "parenrightex" }, + { 0x208e, "parenrightinferior" }, + { 0x207e, "parenrightsuperior" }, + { 0xf8f6, "parenrighttp" }, + { 0x2202, "partialdiff" }, + { 0x0025, "percent" }, + { 0x002e, "period" }, + { 0x00b7, "periodcentered" }, + { 0xf6e7, "periodinferior" }, + { 0xf6e8, "periodsuperior" }, + { 0x22a5, "perpendicular" }, + { 0x2030, "perthousand" }, + { 0x20a7, "peseta" }, + { 0x03c6, "phi" }, + { 0x03d5, "phi1" }, + { 0x03c0, "pi" }, + { 0x002b, "plus" }, + { 0x00b1, "plusminus" }, + { 0x211e, "prescription" }, + { 0x220f, "product" }, + { 0x2282, "propersubset" }, + { 0x2283, "propersuperset" }, + { 0x221d, "proportional" }, + { 0x03c8, "psi" }, + { 0x0071, "q" }, + { 0x003f, "question" }, + { 0x00bf, "questiondown" }, + { 0xf7bf, "questiondownsmall" }, + { 0xf73f, "questionsmall" }, + { 0x0022, "quotedbl" }, + { 0x201e, "quotedblbase" }, + { 0x201c, "quotedblleft" }, + { 0x201d, "quotedblright" }, + { 0x2018, "quoteleft" }, + { 0x201b, "quotereversed" }, + { 0x2019, "quoteright" }, + { 0x201a, "quotesinglbase" }, + { 0x0027, "quotesingle" }, + { 0x0072, "r" }, + { 0x0155, "racute" }, + { 0x221a, "radical" }, + { 0xf8e5, "radicalex" }, + { 0x0159, "rcaron" }, + { 0x0157, "rcommaaccent" }, + { 0x2286, "reflexsubset" }, + { 0x2287, "reflexsuperset" }, + { 0x00ae, "registered" }, + { 0x00ae, "registersans" }, + { 0x00ae, "registerserif" }, + { 0x2310, "revlogicalnot" }, + { 0x03c1, "rho" }, + { 0x02da, "ring" }, + { 0xf6f1, "rsuperior" }, + { 0x2590, "rtblock" }, + { 0xf6dd, "rupiah" }, + { 0x0073, "s" }, + { 0x015b, "sacute" }, + { 0x0161, "scaron" }, + { 0x015f, "scedilla" }, + { 0x015d, "scircumflex" }, + { 0x0219, "scommaaccent" }, + { 0x2033, "second" }, + { 0x00a7, "section" }, + { 0x003b, "semicolon" }, + { 0x0037, "seven" }, + { 0x215e, "seveneighths" }, + { 0x2087, "seveninferior" }, + { 0xf737, "sevenoldstyle" }, + { 0x2077, "sevensuperior" }, + { 0x2592, "shade" }, + { 0x03c3, "sigma" }, + { 0x03c2, "sigma1" }, + { 0x223c, "similar" }, + { 0x0036, "six" }, + { 0x2086, "sixinferior" }, + { 0xf736, "sixoldstyle" }, + { 0x2076, "sixsuperior" }, + { 0x002f, "slash" }, + { 0x263a, "smileface" }, + { 0x0020, "space" }, + { 0x2660, "spade" }, + { 0xf6f2, "ssuperior" }, + { 0x00a3, "sterling" }, + { 0x220b, "suchthat" }, + { 0x2211, "summation" }, + { 0x263c, "sun" }, + { 0x0074, "t" }, + { 0x03c4, "tau" }, + { 0x0167, "tbar" }, + { 0x0165, "tcaron" }, + { 0x0163, "tcommaaccent" }, + { 0x2234, "therefore" }, + { 0x03b8, "theta" }, + { 0x03d1, "theta1" }, + { 0x00fe, "thorn" }, + { 0x0033, "three" }, + { 0x215c, "threeeighths" }, + { 0x2083, "threeinferior" }, + { 0xf733, "threeoldstyle" }, + { 0x00be, "threequarters" }, + { 0xf6de, "threequartersemdash" }, + { 0x00b3, "threesuperior" }, + { 0x02dc, "tilde" }, + { 0x0303, "tildecomb" }, + { 0x0384, "tonos" }, + { 0x2122, "trademark" }, + { 0x2122, "trademarksans" }, + { 0x2122, "trademarkserif" }, + { 0x25bc, "triagdn" }, + { 0x25c4, "triaglf" }, + { 0x25ba, "triagrt" }, + { 0x25b2, "triagup" }, + { 0xf6f3, "tsuperior" }, + { 0x0032, "two" }, + { 0x2025, "twodotenleader" }, + { 0x2082, "twoinferior" }, + { 0xf732, "twooldstyle" }, + { 0x00b2, "twosuperior" }, + { 0x2154, "twothirds" }, + { 0x0075, "u" }, + { 0x00fa, "uacute" }, + { 0x016d, "ubreve" }, + { 0x00fb, "ucircumflex" }, + { 0x00fc, "udieresis" }, + { 0x00f9, "ugrave" }, + { 0x01b0, "uhorn" }, + { 0x0171, "uhungarumlaut" }, + { 0x016b, "umacron" }, + { 0x005f, "underscore" }, + { 0x2017, "underscoredbl" }, + { 0x222a, "union" }, + { 0x2200, "universal" }, + { 0x0173, "uogonek" }, + { 0x2580, "upblock" }, + { 0x03c5, "upsilon" }, + { 0x03cb, "upsilondieresis" }, + { 0x03b0, "upsilondieresistonos" }, + { 0x03cd, "upsilontonos" }, + { 0x016f, "uring" }, + { 0x0169, "utilde" }, + { 0x0076, "v" }, + { 0x0077, "w" }, + { 0x1e83, "wacute" }, + { 0x0175, "wcircumflex" }, + { 0x1e85, "wdieresis" }, + { 0x2118, "weierstrass" }, + { 0x1e81, "wgrave" }, + { 0x0078, "x" }, + { 0x03be, "xi" }, + { 0x0079, "y" }, + { 0x00fd, "yacute" }, + { 0x0177, "ycircumflex" }, + { 0x00ff, "ydieresis" }, + { 0x00a5, "yen" }, + { 0x1ef3, "ygrave" }, + { 0x007a, "z" }, + { 0x017a, "zacute" }, + { 0x017e, "zcaron" }, + { 0x017c, "zdotaccent" }, + { 0x0030, "zero" }, + { 0x2080, "zeroinferior" }, + { 0xf730, "zerooldstyle" }, + { 0x2070, "zerosuperior" }, + { 0x03b6, "zeta" }, + { 0x007b, "{" }, + { 0x007c, "|" }, + { 0x007d, "}" }, + { 0x007e, "~" }, + { 0, NULL } + }; +} + +#endif // _PDF_READER_NAME_TO_UNICODE_TABLE \ No newline at end of file diff --git a/PdfReader/Src/Object.cpp b/PdfReader/Src/Object.cpp new file mode 100644 index 0000000000..5d23ec8c4b --- /dev/null +++ b/PdfReader/Src/Object.cpp @@ -0,0 +1,331 @@ +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Stream.h" +#include "XRef.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Object + //------------------------------------------------------------------------ + + char *c_sObjectsTypeNames[NumObjTypes] = + { + "boolean", + "integer", + "real", + "string", + "name", + "null", + "array", + "dictionary", + "stream", + "ref", + "cmd", + "error", + "eof", + "none" + }; + + Object *Object::InitArray(XRef *pXref) + { + m_eType = objArray; + m_uArray = new Array(pXref); + return this; + } + + Object *Object::InitDict(XRef *pXref) + { + m_eType = objDict; + m_uDict = new Dict(pXref); + return this; + } + + Object *Object::InitDict(Dict *pDict) + { + m_eType = objDict; + m_uDict = pDict; + m_uDict->AddRef(); + return this; + } + + Object *Object::InitStream(Stream *pStream) + { + m_eType = objStream; + m_uStream = pStream; + return this; + } + + Object *Object::Copy(Object *pObject) + { + *pObject = *this; + switch (m_eType) + { + case objString: + pObject->m_uStringExt = m_uStringExt->Copy(); + break; + case objName: + pObject->m_uName = CopyString(m_uName); + break; + case objArray: + m_uArray->AddRef(); + break; + case objDict: + m_uDict->AddRef(); + break; + case objStream: + m_uStream->AddRef(); + break; + case objCommand: + pObject->m_uCommand = CopyString(m_uCommand); + break; + default: + break; + } + return pObject; + } + + Object *Object::Fetch(XRef *pXref, Object *pObject) + { + return (m_eType == objRef && pXref) ? pXref->Fetch(m_uRef.nNum, m_uRef.nGen, pObject) : Copy(pObject); + } + + void Object::Free() + { + switch (m_eType) + { + case objString: + delete m_uStringExt; + break; + case objName: + MemUtilsFree(m_uName); + break; + case objArray: + if (!m_uArray->Release()) + { + delete m_uArray; + } + break; + case objDict: + if (!m_uDict->Release()) + { + delete m_uDict; + } + break; + case objStream: + if (!m_uStream->Release()) + { + delete m_uStream; + } + break; + case objCommand: + MemUtilsFree(m_uCommand); + break; + default: + break; + } + m_eType = objNone; + } + + char *Object::GetTypeName() + { + return c_sObjectsTypeNames[m_eType]; + } + + void Object::Print(FILE *pFile) + { + Object oTemp; + + switch (m_eType) + { + case objBool: + fprintf(pFile, "%s", m_uBool ? "true" : "false"); + break; + case objInt: + fprintf(pFile, "%d", m_uInt); + break; + case objReal: + fprintf(pFile, "%g", m_uReal); + break; + case objString: + fprintf(pFile, "("); + fwrite(m_uStringExt->GetBuffer(), 1, m_uStringExt->GetLength(), pFile); + fprintf(pFile, ")"); + break; + case objName: + fprintf(pFile, "/%s", m_uName); + break; + case objNull: + fprintf(pFile, "null"); + break; + case objArray: + fprintf(pFile, "["); + for (int nIndex = 0; nIndex < ArrayGetLength(); ++nIndex) + { + if (nIndex > 0) + fprintf(pFile, " "); + ArrayGetCopy(nIndex, &oTemp); + oTemp.Print(pFile); + oTemp.Free(); + } + fprintf(pFile, "]"); + break; + case objDict: + fprintf(pFile, "<<"); + for (int nIndex = 0; nIndex < DictGetLength(); ++nIndex) + { + fprintf(pFile, " /%s ", DictGetKey(nIndex)); + DictGetValueCopy(nIndex, &oTemp); + oTemp.Print(pFile); + oTemp.Free(); + } + fprintf(pFile, " >>"); + break; + case objStream: + fprintf(pFile, ""); + break; + case objRef: + fprintf(pFile, "%d %d R", m_uRef.nNum, m_uRef.nGen); + break; + case objCommand: + fprintf(pFile, "%s", m_uCommand); + break; + case objError: + fprintf(pFile, ""); + break; + case objEOF: + fprintf(pFile, ""); + break; + case objNone: + fprintf(pFile, ""); + break; + } + } + + //------------------------------------------------------------------------ + // Array accessors. + //------------------------------------------------------------------------ + int Object::ArrayGetLength() + { + return m_uArray->GetCount(); + } + + void Object::ArrayAdd(Object *pItem) + { + m_uArray->Add(pItem); + } + + Object *Object::ArrayGet(int nIndex, Object *pObject) + { + return m_uArray->Get(nIndex, pObject); + } + + Object *Object::ArrayGetCopy(int nIndex, Object *pObject) + { + return m_uArray->GetCopy(nIndex, pObject); + } + + //------------------------------------------------------------------------ + // Dict accessors. + //------------------------------------------------------------------------ + int Object::DictGetLength() + { + return m_uDict->GetEntryCount(); + } + + void Object::DictAdd(char *sKey, Object *pItem) + { + m_uDict->AddItem(sKey, pItem); + } + + bool Object::DictCheckType(char *sDictType) + { + return m_uDict->CheckType(sDictType); + } + + bool Object::IsDict(char *sDictType) + { + return (m_eType == objDict && DictCheckType(sDictType)); + } + + Object *Object::DictLookup(char *sKey, Object *pObject) + { + return m_uDict->Search(sKey, pObject); + } + + Object *Object::DictLookupAndCopy(char *sKey, Object *pObject) + { + return m_uDict->SearchAndCopy(sKey, pObject); + } + + char *Object::DictGetKey(int nIndex) + { + return m_uDict->GetKey(nIndex); + } + + Object *Object::DictGetValue(int nIndex, Object *pObject) + { + return m_uDict->GetValue(nIndex, pObject); + } + + Object *Object::DictGetValueCopy(int nIndex, Object *pObject) + { + return m_uDict->GetValueCopy(nIndex, pObject); + } + + //------------------------------------------------------------------------ + // Stream accessors. + //------------------------------------------------------------------------ + + bool Object::StreamCheckType(char *sDictType) + { + return m_uStream->GetDict()->CheckType(sDictType); + } + + bool Object::IsStream(char *sDictType) + { + return (m_eType == objStream && StreamCheckType(sDictType)); + } + + void Object::StreamReset() + { + m_uStream->Reset(); + } + + void Object::StreamClose() + { + m_uStream->Close(); + } + + int Object::StreamGetChar() + { + return m_uStream->GetChar(); + } + + int Object::StreamLookChar() + { + return m_uStream->LookChar(); + } + + char *Object::StreamGetLine(char *sBuffer, int nSize) + { + return m_uStream->GetLine(sBuffer, nSize); + } + + unsigned int Object::StreamGetPos() + { + return m_uStream->GetPos(); + } + + void Object::StreamSetPos(unsigned int unPos, int nDirection) + { + m_uStream->SetPos(unPos, nDirection); + } + + Dict *Object::StreamGetDict() + { + return m_uStream->GetDict(); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Object.h b/PdfReader/Src/Object.h new file mode 100644 index 0000000000..5a289fb185 --- /dev/null +++ b/PdfReader/Src/Object.h @@ -0,0 +1,361 @@ +#ifndef _PDF_READER_OBJECT_H +#define _PDF_READER_OBJECT_H + +#include +#include +#include "MemoryUtils.h" +#include "StringExt.h" +#include "Array.h" + +#ifdef GetObject +#undef GetObject +#endif + +namespace PdfReader +{ + class XRef; + class Array; + class Dict; + class Stream; + + //------------------------------------------------------------------------ + // Ref + //------------------------------------------------------------------------ + + struct Ref + { + int nNum; // Номер объекта + int nGen; // Номер версии объекта(generation number) + + public: + + bool operator ==(const Ref& oRight)const + { + if (nNum == oRight.nNum && nGen == oRight.nGen) + return true; + + return false; + } + bool operator <(const Ref& oRight)const + { + return nNum < oRight.nNum; + } + bool operator >(const Ref& oRight)const + { + return nNum > oRight.nNum; + } + bool operator <=(const Ref& oRight)const + { + if (*this == oRight) + return true; + + return nNum < oRight.nNum; + } + bool operator >=(const Ref& oRight)const + { + if (*this == oRight) + return true; + + return nNum > oRight.nNum; + } + }; + + //------------------------------------------------------------------------ + // Типы объектов + //------------------------------------------------------------------------ + + enum ObjType + { + // Простые объекты + objBool, // boolean + objInt, // integer + objReal, // real + objString, // string + objName, // name + objNull, // null + + // составные объекты + objArray, // array + objDict, // dictionary + objStream, // stream + objRef, // indirect reference + + // специальные объекты + objCommand, // command name + objError, // error return from Lexer + objEOF, // end of file return from Lexer + objNone // uninitialized object + }; + +#define NumObjTypes 14 + + //------------------------------------------------------------------------ + // Object + //------------------------------------------------------------------------ + + class Object + { + public: + + Object() : + m_eType(objNone) + { + } + + + Object *InitBool(bool bBool) + { + m_eType = objBool; + m_uBool = bBool; + return this; + } + Object *InitInt(int nInt) + { + m_eType = objInt; + m_uInt = nInt; + return this; + } + Object *InitReal(double dReal) + { + m_eType = objReal; + m_uReal = dReal; + return this; + } + Object *InitString(StringExt *seString) + { + m_eType = objString; + m_uStringExt = seString; + return this; + } + Object *InitName(char *sName) + { + m_eType = objName; + m_uName = CopyString(sName); + return this; + } + Object *InitNull() + { + m_eType = objNull; + return this; + } + Object *InitArray(XRef *pXref); + Object *InitDict(XRef *pXref); + Object *InitDict(Dict *pDict); + Object *InitStream(Stream *pStream); + Object *InitRef(int nNum, int nGen) + { + m_eType = objRef; + m_uRef.nNum = nNum; + m_uRef.nGen = nGen; + return this; + } + Object *InitCommand(char *sCommand) + { + m_eType = objCommand; + m_uCommand = CopyString(sCommand); + return this; + } + Object *InitError() + { + m_eType = objError; + return this; + } + Object *InitEOF() + { + m_eType = objEOF; + return this; + } + + + // Копируем объект. + Object *Copy(Object *pObject); + + // Если объект - сслка, тогда получаес объект по ссылку, в противном случае копируем данный объект. + Object *Fetch(XRef *pXref, Object *pObject); + + // + void Free(); + + // Проверка тип объекта. + ObjType GetType() + { + return m_eType; + } + bool IsBool() + { + return (m_eType == objBool); + } + bool IsInt() + { + return (m_eType == objInt); + } + bool IsReal() + { + return (m_eType == objReal); + } + bool IsNum() + { + return (m_eType == objInt || m_eType == objReal); + } + bool IsString() + { + return (m_eType == objString); + } + bool IsName() + { + return (m_eType == objName); + } + bool IsNull() + { + return (m_eType == objNull); + } + bool IsArray() + { + return (m_eType == objArray); + } + bool IsDict() + { + return (m_eType == objDict); + } + bool IsStream() + { + return (m_eType == objStream); + } + bool IsRef() + { + return (m_eType == objRef); + } + bool IsCommand() + { + return (m_eType == objCommand); + } + bool IsError() + { + return (m_eType == objError); + } + bool IsEOF() + { + return (m_eType == objEOF); + } + bool IsNone() + { + return (m_eType == objNone); + } + + // Сепциальные проверки. + bool IsName(char *sName) + { + return (m_eType == objName && !strcmp(m_uName, sName)); + } + bool IsDict(char *sDictType); + bool IsStream(char *sDictType); + bool IsCommand(char *sCommand) + { + return (m_eType == objCommand && !strcmp(m_uCommand, sCommand)); + } + // В следующих функциях предполагается, что тип объекта корректный. + // Т.е. соответствует типу запрашиваемого значения. + bool GetBool() + { + return m_uBool; + } + int GetInt() + { + return m_uInt; + } + double GetReal() + { + return m_uReal; + } + double GetNum() + { + return (m_eType == objInt) ? (double)m_uInt : m_uReal; + } + StringExt *GetString() + { + return m_uStringExt; + } + char *GetName() + { + return m_uName; + } + Array *GetArray() + { + return m_uArray; + } + Dict *GetDict() + { + return m_uDict; + } + Stream *GetStream() + { + return m_uStream; + } + Ref GetRef() + { + return m_uRef; + } + int GetRefNum() + { + return m_uRef.nNum; + } + int GetRefGen() + { + return m_uRef.nGen; + } + char *GetCommand() + { + return m_uCommand; + } + + + // Array + int ArrayGetLength(); + void ArrayAdd(Object *pItem); + Object *ArrayGet(int nIndex, Object *pObject); + Object *ArrayGetCopy(int nIndex, Object *pObject); + + // Dict + int DictGetLength(); + void DictAdd(char *sKey, Object *pItem); + bool DictCheckType(char *sDictType); + Object *DictLookup(char *sKey, Object *pObject); + Object *DictLookupAndCopy(char *sKey, Object *pObject); + char *DictGetKey(int nIndex); + Object *DictGetValue(int nIndex, Object *pObject); + Object *DictGetValueCopy(int nIndex, Object *pObject); + + // Stream + bool StreamCheckType(char *sDictType); + void StreamReset(); + void StreamClose(); + int StreamGetChar(); + int StreamLookChar(); + char *StreamGetLine(char *sBuffer, int nSize); + unsigned int StreamGetPos(); + void StreamSetPos(unsigned int unPos, int nDirection = 0); + Dict *StreamGetDict(); + + // Для записи + char *GetTypeName(); + void Print(FILE *pFile = stdout); + + private: + + ObjType m_eType; // тип объекта + union + { + bool m_uBool; // boolean + int m_uInt; // integer + double m_uReal; // real + StringExt *m_uStringExt; // StringExt + char *m_uName; // имя + Array *m_uArray; // массив + Dict *m_uDict; // словарь + Stream *m_uStream; // поток + Ref m_uRef; // ссылка + char *m_uCommand; // команда + }; + }; +} +#endif // _PDF_READER_OBJECT_H diff --git a/PdfReader/Src/Outline.cpp b/PdfReader/Src/Outline.cpp new file mode 100644 index 0000000000..b3b9f8ce52 --- /dev/null +++ b/PdfReader/Src/Outline.cpp @@ -0,0 +1,167 @@ +#include "MemoryUtils.h" +#include "StringExt.h" +#include "List.h" +#include "Link.h" +#include "PDFDocEncoding.h" +#include "Outline.h" +#include "Dict.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // Outline + //------------------------------------------------------------------------------------------------------------------------------- + + Outline::Outline(Object *pOutlineObject, XRef *pXref) + { + m_pItems = NULL; + + if (!pOutlineObject->IsDict()) + { + return; + } + + Object oFirst, oLast; + m_pItems = OutlineItem::ReadItemList(pOutlineObject->DictLookupAndCopy("First", &oFirst), pOutlineObject->DictLookupAndCopy("Last", &oLast), pXref); + oFirst.Free(); + oLast.Free(); + } + + Outline::~Outline() + { + if (m_pItems) + { + DeleteCList(m_pItems, OutlineItem); + } + } + + //------------------------------------------------------------------------------------------------------------------------------- + // OutlineItem + //------------------------------------------------------------------------------------------------------------------------------- + + OutlineItem::OutlineItem(Dict *pDict, XRef *pXref) + { + m_pXref = pXref; + m_pTitle = NULL; + m_pAction = NULL; + m_pKids = NULL; + + Object oDictItem; + if (pDict->Search("Title", &oDictItem)->IsString()) + { + StringExt *seTitle = oDictItem.GetString(); + if ((seTitle->GetAt(0) & 0xff) == 0xfe && (seTitle->GetAt(1) & 0xff) == 0xff) + { + m_nTitleLen = (seTitle->GetLength() - 2) / 2; + m_pTitle = (Unicode *)MemUtilsMallocArray(m_nTitleLen, sizeof(Unicode)); + for (int nIndex = 0; nIndex < m_nTitleLen; ++nIndex) + { + m_pTitle[nIndex] = ((seTitle->GetAt(2 + 2 * nIndex) & 0xff) << 8) | (seTitle->GetAt(3 + 2 * nIndex) & 0xff); + } + } + else + { + m_nTitleLen = seTitle->GetLength(); + m_pTitle = (Unicode *)MemUtilsMallocArray(m_nTitleLen, sizeof(Unicode)); + + for (int nIndex = 0; nIndex < m_nTitleLen; ++nIndex) + { + m_pTitle[nIndex] = c_arrPDFDocEncoding[seTitle->GetAt(nIndex) & 0xff]; + } + } + } + else + { + m_nTitleLen = 0; + } + oDictItem.Free(); + + if (!pDict->Search("Dest", &oDictItem)->IsNull()) + { + m_pAction = LinkAction::ParseDestination(&oDictItem); + } + else + { + oDictItem.Free(); + if (!pDict->Search("A", &oDictItem)->IsNull()) + { + m_pAction = LinkAction::ParseAction(&oDictItem); + } + } + oDictItem.Free(); + + pDict->SearchAndCopy("First", &m_oFirstRef); + pDict->SearchAndCopy("Last", &m_oLastRef); + pDict->SearchAndCopy("Next", &m_oNextRef); + + m_bOpen = false; + if (pDict->Search("Count", &oDictItem)->IsInt()) + { + if (oDictItem.GetInt() > 0) + { + m_bOpen = true; + } + } + oDictItem.Free(); + } + + OutlineItem::~OutlineItem() + { + Close(); + + if (m_pTitle) + { + MemUtilsFree(m_pTitle); + } + if (m_pAction) + { + delete m_pAction; + } + m_oFirstRef.Free(); + m_oLastRef.Free(); + m_oNextRef.Free(); + } + + CList *OutlineItem::ReadItemList(Object *pFirstItemRef, Object *pLastItemRef, XRef *pXref) + { + CList *pItems = new CList(); + Object *pCurItem = pFirstItemRef; + + while (pCurItem->IsRef()) + { + Object oTemp; + if (!pCurItem->Fetch(pXref, &oTemp)->IsDict()) + { + oTemp.Free(); + break; + } + OutlineItem *pItem = new OutlineItem(oTemp.GetDict(), pXref); + oTemp.Free(); + + pItems->Append(pItem); + if (pCurItem->GetRef().nNum == pLastItemRef->GetRef().nNum && pCurItem->GetRef().nGen == pLastItemRef->GetRef().nGen) + { + break; + } + pCurItem = &pItem->m_oNextRef; + } + return pItems; + } + + void OutlineItem::Open() + { + if (!m_pKids) + { + m_pKids = ReadItemList(&m_oFirstRef, &m_oLastRef, m_pXref); + } + } + + void OutlineItem::Close() + { + if (m_pKids) + { + DeleteCList(m_pKids, OutlineItem); + m_pKids = NULL; + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/Outline.h b/PdfReader/Src/Outline.h new file mode 100644 index 0000000000..58d9a44e27 --- /dev/null +++ b/PdfReader/Src/Outline.h @@ -0,0 +1,93 @@ +#ifndef _PDF_READER_OUTLINE_H +#define _PDF_READER_OUTLINE_H + +#include "Object.h" +#include "CharTypes.h" + +namespace PdfReader +{ + class StringExt; + class GList; + class XRef; + class LinkAction; + + //------------------------------------------------------------------------------------------------------------------------------- + // Outline + //------------------------------------------------------------------------------------------------------------------------------- + + class Outline + { + public: + + Outline(Object *pOutlineObject, XRef *pXref); + ~Outline(); + + CList *GetItems() + { + return m_pItems; + } + + private: + + CList *m_pItems; // NULL, если у документа нет Outline + // [OutlineItem] + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // OutlineItem + //------------------------------------------------------------------------------------------------------------------------------- + + class OutlineItem + { + public: + + OutlineItem(Dict *pDict, XRef *pXref); + ~OutlineItem(); + + static CList *ReadItemList(Object *pFirstItemRef, Object *pLastItemRef, XRef *pXref); + + void Open(); + void Close(); + + Unicode *GetTitle() + { + return m_pTitle; + } + int GetTitleLength() + { + return m_nTitleLen; + } + LinkAction *GetAction() + { + return m_pAction; + } + bool IsOpen() + { + return m_bOpen; + } + bool HasKids() + { + return m_oFirstRef.IsRef(); + } + CList *GetKids() + { + return m_pKids; + } + + private: + + XRef *m_pXref; // Таблица Xref данного PDF-документа + Unicode *m_pTitle; // Название данной закладки + int m_nTitleLen; // Длина названия + LinkAction *m_pAction; // LinkAction + + Object m_oFirstRef; // Ссылка(Ref) на First + Object m_oLastRef; // Ссылка(Ref) на Last + Object m_oNextRef; // Ссылка(Ref) на Next + + bool m_bOpen; // Будет ли вкладка открытой при открытии документа + CList *m_pKids; // NULL, если данный пункт не открыт [OutlineItem] + }; +} + +#endif // _PDF_READER_OUTLINE_H diff --git a/PdfReader/Src/OutputDevice.cpp b/PdfReader/Src/OutputDevice.cpp new file mode 100644 index 0000000000..498077df3a --- /dev/null +++ b/PdfReader/Src/OutputDevice.cpp @@ -0,0 +1,111 @@ +#include +#include "Object.h" +#include "Stream.h" +#include "GState.h" +#include "OutputDevice.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // OutputDev + //------------------------------------------------------------------------------------------------------------------------------- + + void OutputDev::SetDefaultCTM(double *pCTM) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + m_arrDefaultCTM[nIndex] = pCTM[nIndex]; + } + + double dDet = 1 / (m_arrDefaultCTM[0] * m_arrDefaultCTM[3] - m_arrDefaultCTM[1] * m_arrDefaultCTM[2]); + + m_arrDefaultInvCTM[0] = m_arrDefaultCTM[3] * dDet; + m_arrDefaultInvCTM[1] = -m_arrDefaultCTM[1] * dDet; + m_arrDefaultInvCTM[2] = -m_arrDefaultCTM[2] * dDet; + m_arrDefaultInvCTM[3] = m_arrDefaultCTM[0] * dDet; + m_arrDefaultInvCTM[4] = (m_arrDefaultCTM[2] * m_arrDefaultCTM[5] - m_arrDefaultCTM[3] * m_arrDefaultCTM[4]) * dDet; + m_arrDefaultInvCTM[5] = (m_arrDefaultCTM[1] * m_arrDefaultCTM[4] - m_arrDefaultCTM[0] * m_arrDefaultCTM[5]) * dDet; + } + + void OutputDev::ConvertDeviceToUser(double dDevX, double dDevY, double *pdUserX, double *pdUserY) + { + *pdUserX = m_arrDefaultInvCTM[0] * dDevX + m_arrDefaultInvCTM[2] * dDevY + m_arrDefaultInvCTM[4]; + *pdUserY = m_arrDefaultInvCTM[1] * dDevX + m_arrDefaultInvCTM[3] * dDevY + m_arrDefaultInvCTM[5]; + } + + void OutputDev::ConvertUserToDevice(double dUserX, double dUserY, int *pnDevX, int *pnDevY) + { + *pnDevX = (int)(m_arrDefaultCTM[0] * dUserX + m_arrDefaultCTM[2] * dUserY + m_arrDefaultCTM[4] + 0.5); + *pnDevY = (int)(m_arrDefaultCTM[1] * dUserX + m_arrDefaultCTM[3] * dUserY + m_arrDefaultCTM[5] + 0.5); + } + + void OutputDev::UpdateAll(GrState *pGState) + { + UpdateLineDash(pGState); + UpdateFlatness(pGState); + UpdateLineJoin(pGState); + UpdateLineCap(pGState); + UpdateMiterLimit(pGState); + UpdateLineWidth(pGState); + UpdateStrokeAdjust(pGState); + UpdateFillColorSpace(pGState); + UpdateFillColor(pGState); + UpdateStrokeColorSpace(pGState); + UpdateStrokeColor(pGState); + UpdateBlendMode(pGState); + UpdateFillOpacity(pGState); + UpdateStrokeOpacity(pGState); + UpdateFillOverprint(pGState); + UpdateStrokeOverprint(pGState); + UpdateTransfer(pGState); + UpdateFont(pGState); + } + + bool OutputDev::BeginType3Char(GrState *pGState, double dX, double dY, double dDx, double dDy, CharCode nCode, Unicode *pnUnicode, int nUnLen) + { + return false; + } + + void OutputDev::DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage) + { + if (bInlineImage) + { + pStream->Reset(); + int nSize = nHeight * ((nWidth + 7) / 8); + for (int nIndex = 0; nIndex < nSize; ++nIndex) + pStream->GetChar(); + pStream->Close(); + } + } + + void OutputDev::DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pnMaskColors, bool bInlineImage) + { + if (bInlineImage) + { + pStream->Reset(); + int nSize = nHeight * ((nWidth * pColorMap->GetComponentsCount() * pColorMap->GetBitsPerComponent() + 7) / 8); + for (int nIndex = 0; nIndex < nSize; ++nIndex) + pStream->GetChar(); + pStream->Close(); + } + } + + void OutputDev::DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert) + { + DrawImage(pGState, pRef, pStream, nWidth, nHeight, pColorMap, NULL, false); + } + + void OutputDev::DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap) + { + DrawImage(pGState, pRef, pStream, nWidth, nHeight, pColorMap, NULL, false); + } + +#if OPI_SUPPORT + void OutputDev::OpiBegin(GrState *pGState, Dict *pOpiDict) + { + } + void OutputDev::OpiEnd (GrState *pGState, Dict *pOpiDict) + { + } +#endif +} \ No newline at end of file diff --git a/PdfReader/Src/OutputDevice.h b/PdfReader/Src/OutputDevice.h new file mode 100644 index 0000000000..5d8ea50329 --- /dev/null +++ b/PdfReader/Src/OutputDevice.h @@ -0,0 +1,290 @@ +#ifndef _PDF_READER_OUTPUT_DEVICE_H +#define _PDF_READER_OUTPUT_DEVICE_H + +#include "CharTypes.h" +#include "GlobalParams.h" + +namespace PdfReader +{ + class StringExt; + class GrState; + class GrPath; + struct GrColor; + class GrColorSpace; + class GrImageColorMap; + class GrFunctionShading; + class GrAxialShading; + class GrRadialShading; + class Stream; + class Links; + class Link; + class Catalog; + class Page; + class Function; + + //------------------------------------------------------------------------------------------------------------------------------- + // OutputDev + //------------------------------------------------------------------------------------------------------------------------------- + + class OutputDev + { + public: + + OutputDev() {} + + virtual ~OutputDev() {} + + //------ Информация о выходном устройстве + + // True, если точка с координатой (0,0) находится в левом верхнем углу. + virtual bool UpSideDown() = 0; + + // Вывод текста с помощью функции DrawChar() или DrawString()? + virtual bool UseDrawChar() = 0; + + // Поддерживает ли данное устройство TilingPatternFill? Если нет, тогда + // TilingPatternFill будет рисоваться с помощью комбинации более простых + // графических примитивов. + virtual bool UseTilingPatternFill() + { + return false; + } + + // Поддерживает ли данное устройство SimpleTilingPatternFill? Если нет, тогда + // TilingPatternFill будет рисоваться с помощью комбинации более простых + // графических примитивов. + virtual bool UseSimpleTilingPatternFill() + { + return false; + } + + // Поддерживает ли данное устройство FunctionShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. + virtual bool UseFunctionalShadedFills() + { + return false; + } + // Поддерживает ли данное устройство AxialShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. + virtual bool UseAxialShadedFills() + { + return false; + } + // Поддерживает ли данное устройство RadialShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. + virtual bool UseRadialShadedFills() + { + return false; + } + + // Поддерживается ли DrawForm()? + virtual bool UseDrawForm() + { + return false; + } + + // Используем команду ClipToPath для клипа или команды Clip, EoClip, ClipToPathStroke + virtual bool UseClipTo() + { + return false; + } + + + // Использует ли данное устройство методы BeginType3Char/EndType3Char? + // В противном случае тект в шрифте Type3 будет выводится с помощью + // функций DrawChar/DrawString. + virtual bool InterpretType3Chars() = 0; + + // Поддерживается ли данным устройством что-нибудь кроме текста? + virtual bool NeedNonText() + { + return true; + } + + // Поддерживается ли данным устройствой одновременные обводка и заливка Path + virtual bool UseFillAndStroke() + { + return false; + } + + // В каком виде мы используем группу прозрачных объектов + virtual bool UseSimpleTransparentGroup() + { + return false; + } + + //------ Информация о выходном устройстве + + // Устанавливаем стандартную матрицу преобразований. + virtual void SetDefaultCTM(double *pCTM); + + // Проверяем, должна ли мы показывать данную часть страницы. Если возращаемое + // значение False, показ страницы прерывается. Как правило, OutputDev будет + // использовать дополнительные средства, чтобы показать страницу, прежде чем + // вернет значение False. + virtual bool CheckPageSlice(Page *pPage, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool bPrinting, Catalog *pCatalog, bool(*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL) + { + return true; + } + + // Новая страница. + virtual void StartPage(int nPageNum, GrState *pGState) {} + // Конец страницы. + virtual void EndPage() {} + + // Вывод содержимого страницы. + virtual void Dump() {} + + // Остановка вывода + virtual bool IsStopped() { return false; } + + //----- Системы координат (пользовательские и устройства) + + // Конвертации + virtual void ConvertDeviceToUser(double dDevX, double dDevY, double *pdUserX, double *pdUserY); + virtual void ConvertUserToDevice(double dUserX, double dUserY, int *pnDevX, int *pnDevY); + + double *GetDefaultCTM() + { + return m_arrDefaultCTM; + } + double *GetDefaultInvCTM() + { + return m_arrDefaultInvCTM; + } + + //----- Save/Restore GState + virtual void SaveGState(GrState *pGState) {} + virtual void RestoreGState(GrState *pGState) {} + + //----- Изменение параметров в GState + virtual void UpdateAll(GrState *pGState); + virtual void UpdateCTM(GrState *pGState, double dM11, double dM12, double dM21, double dM22, double dM31, double dM32) {} + virtual void UpdateLineDash(GrState *pGState) {} + virtual void UpdateFlatness(GrState *pGState) {} + virtual void UpdateLineJoin(GrState *pGState) {} + virtual void UpdateLineCap(GrState *pGtate) {} + virtual void UpdateMiterLimit(GrState *pGState) {} + virtual void UpdateLineWidth(GrState *pGState) {} + virtual void UpdateStrokeAdjust(GrState *pGState) {} + virtual void UpdateFillColorSpace(GrState *pGState) {} + virtual void UpdateStrokeColorSpace(GrState *pGState) {} + virtual void UpdateFillColor(GrState *pGState) {} + virtual void UpdateStrokeColor(GrState *pGState) {} + virtual void UpdateBlendMode(GrState *pGState) {} + virtual void UpdateFillOpacity(GrState *pGState) {} + virtual void UpdateStrokeOpacity(GrState *pGState) {} + virtual void UpdateFillOverprint(GrState *pGState) {} + virtual void UpdateStrokeOverprint(GrState *pGState) {} + virtual void UpdateTransfer(GrState *pGState) {} + + //----- Изменение текстовых параметров + virtual void UpdateFont(GrState *pGState) {} + virtual void UpdateTextMatrix(GrState *pGState) {} + virtual void UpdateCharSpace(GrState *pGState) {} + virtual void UpdateRender(GrState *pGState) {} + virtual void UpdateRise(GrState *pGState) {} + virtual void UpdateWordSpace(GrState *pGState) {} + virtual void UpdateHorizScaling(GrState *pGState) {} + virtual void UpdateTextPos(GrState *pGState) {} + virtual void UpdateTextShift(GrState *pGState, double dShift) {} + + //----- Рисование Path + virtual void Stroke(GrState *pGState) {} + virtual void Fill(GrState *pGState) {} + virtual void EoFill(GrState *pGState) {} + virtual void FillStroke(GrState *pGState) {} + virtual void EoFillStroke(GrState *pGState) {} + virtual void TilingPatternFill(GrState *pGState, Object *pStream, int nPaintType, Dict *pResourcesDict, double *pMatrix, double *pBBox, int nX0, int nY0, int nX1, int nY1, double dXStep, double dYStep) {} + virtual void StartTilingFill(GrState *pGState) {} + virtual void EndTilingFill() {} + virtual bool FunctionShadedFill(GrState *pGState, GrFunctionShading *pShading) + { + return false; + } + virtual bool AxialShadedFill(GrState *pGState, GrAxialShading *pShading) + { + return false; + } + virtual bool RadialShadedFill(GrState *pGState, GrRadialShading *pShading) + { + return false; + } + + virtual void StartTilingFillIteration() {} + virtual void EndTilingFillIteration() {} + virtual void StartSimpleTilingFill(GrState *pGState, int nX0, int nY0, int nX1, int nY1, double dStepX, double dStepY, double dXMin, double dYMin, double dXMax, double dYMax, double* pMatrix) {} + virtual void EndSimpleTilingFill() {} + + virtual void StartShadedFill(GrState *pGState) {} + virtual void EndShadedFill() {} + + //----- Path clipping + virtual void Clip(GrState *pGState) {} + virtual void ClipAttack(GrState *pGState) {} + virtual void EoClip(GrState *pGState) {} + virtual void ClipToStrokePath(GrState *pGState) {} + virtual void ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, bool bEO) {} + + //----- Вывод текста + virtual void BeginStringOperator(GrState *pGState) {} + virtual void EndStringOperator(GrState *pGState) {} + virtual void BeginString(GrState *pGState, StringExt *seString) {} + virtual void EndString(GrState *pGState) {} + virtual void DrawChar(GrState *pGState, double dX, double dY, double dDx, double dDy, double dOriginX, double dOriginY, CharCode nCode, int nBytesCount, Unicode *pnUnicode, int nUnLen) {} + virtual void DrawString(GrState *pGState, StringExt *seString) {} + virtual bool BeginType3Char(GrState *pGState, double dX, double dY, double dDx, double dDy, CharCode nCode, Unicode *pnUnicode, int nUnLen); + virtual void EndType3Char(GrState *pGState) {} + virtual void BegintTextObject(GrState *pGState){} + virtual void EndTextObject(GrState *pGState) {} + + //----- Вывод картинок + virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage); + virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pnMaskColors, bool bInlineImage); + virtual void DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert); + virtual void DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap); + +#if OPI_SUPPORT + //----- OPI + virtual void OpiBegin(GrState *pGState, Dict *pOpiDict); + virtual void OpiEnd (GrState *pGState, Dict *pOpiDict); +#endif + + //----- Операторы Type 3 - шрифтов + virtual void Type3D0(GrState *pGState, double dWx, double dWy) {} + virtual void Type3D1(GrState *pGState, double dWx, double dWy, double dLLx, double dLLy, double dURx, double dURy) {} + + //----- Form XObjects + virtual void DrawForm(Ref oID) {} + + //----- PostScript XObjects + virtual void PSXObject(Stream *pPSStream, Stream *pLevel1Stream) {} + + //----- Transparency groups и SMasks + virtual void BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bForSoftMask) {} + virtual void EndTransparencyGroup(GrState *pGState) {} + virtual void PaintTransparencyGroup(GrState *pGState, double *pBBox) {} + virtual void SetSoftMask(GrState *pGState, double *pBBox, bool bAlpha, Function *pTransferFunction, GrColor *pBackdropColor) {} + virtual void ClearSoftMask(GrState *pGState) {} + + //----- Links + virtual void ProcessLink(Link *pLink, Catalog *pCatalog) {} + + virtual bool GetVectorAntialias() + { + return false; + } + virtual void SetVectorAntialias(bool bVectorAntiAlias) {} + + private: + + double m_arrDefaultCTM[6]; // Матрица преобразования по умолчанию + double m_arrDefaultInvCTM[6]; // Обратная матрица + + protected: + + GlobalParams *m_pGlobalParams; + }; +} + +#endif // _PDF_READER_OUTPUT_DEVICE_H diff --git a/PdfReader/Src/PDFDoc.cpp b/PdfReader/Src/PDFDoc.cpp new file mode 100644 index 0000000000..411953403d --- /dev/null +++ b/PdfReader/Src/PDFDoc.cpp @@ -0,0 +1,309 @@ +#include "../../DesktopEditor/common/File.h" + +#include +#include +#include +#include + +#include "StringExt.h" +#include "Constants.h" +#include "GlobalParams.h" +#include "Page.h" +#include "Catalog.h" +#include "Stream.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDevice.h" +#include "ErrorConstants.h" +#include "Lexer.h" +#include "Parser.h" +#include "SecurityHandler.h" +#include "Outline.h" +#include "PDFDoc.h" + +#define HeaderSearchSize 1024 // Максимальное количество байт для считывания с начала файла, в которых мы ищем запись '%PDF' + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // PDFDoc + //------------------------------------------------------------------------------------------------------------------------------- + PDFDoc::PDFDoc(GlobalParams *pGlobalParams, const wchar_t* wsFileName, StringExt *seOwnerPassword, StringExt *seUserPassword) + { + m_pGlobalParams = pGlobalParams; + + m_bValid = false; + m_eErrorCode = errorNone; + + m_pFile = NULL; + m_pFileBuffer = NULL; + + m_pStream = NULL; + m_pXref = NULL; + m_pCatalog = NULL; + m_pOutline = NULL; + + m_wsFileName = wsFileName; + + NSFile::CFileBinary oFile; + oFile.OpenFile(wsFileName); + long lFileSize = oFile.GetFileSize(); + + m_pFileBuffer = new unsigned char[lFileSize]; + + if (!m_pFileBuffer) + { + // Не смогли выделить память под весь файл, тогда работаем непосредственно с самим файлом + m_pFileBuffer = NULL; + m_pFile = oFile.GetFileNative(); + + // Создаем поток + Object oTemp; + oTemp.InitNull(); + m_pStream = new FileStream(m_pFile, 0, false, 0, &oTemp); + } + else + { + DWORD lReadedSize; + DWORD lTotallReadedSize = 0; + DWORD lCounter = 0; + while (lTotallReadedSize != lFileSize) + { + oFile.ReadFile(m_pFileBuffer + lTotallReadedSize, lFileSize - lTotallReadedSize, lReadedSize); + lTotallReadedSize += lReadedSize; + lCounter++; + + if (lCounter > 0x0FFFFFFF) + { + lTotallReadedSize = 0; + break; + } + } + oFile.CloseFile(); + + if (lTotallReadedSize != lFileSize) + { + m_pFileBuffer = NULL; + m_bValid = false; + return; + } + + // Создаем поток + Object oTemp; + oTemp.InitNull(); + m_pStream = new MemoryStream((char*)m_pFileBuffer, 0, lFileSize, &oTemp); + } + + if (!m_pStream) + m_bValid = false; + + m_bValid = Setup(seOwnerPassword, seUserPassword); + } + bool PDFDoc::Setup(StringExt *seOwnerPassword, StringExt *seUserPassword) + { + m_pStream->Reset(); + + // Проверяем заголовок PDF файла + CheckHeader(); + + // Считываем таблицу Xref + m_pXref = new XRef(m_pStream); + if (!m_pXref->CheckValidate()) + { + // TO DO: Error "Couldn't read xref table" + m_eErrorCode = (EError)m_pXref->GetErrorCode(); + return false; + } + + // Проверяем зашифрован ли документ + if (!CheckEncryption(seOwnerPassword, seUserPassword)) + { + m_eErrorCode = errorEncrypted; + return false; + } + + // Считываем объект Catalog + m_pCatalog = new Catalog(m_pGlobalParams, m_pXref); + if (!m_pCatalog->CheckValidation()) + { + // TO DO: Error "Couldn't read page catalog" + m_eErrorCode = errorBadCatalog; + return false; + } + + // Считываем объект Outline + m_pOutline = new Outline(m_pCatalog->GetOutline(), m_pXref); + + return true; + } + PDFDoc::~PDFDoc() + { + if (m_pOutline) + { + delete m_pOutline; + } + if (m_pCatalog) + { + delete m_pCatalog; + } + if (m_pXref) + { + delete m_pXref; + } + if (m_pStream) + { + delete m_pStream; + } + + if (m_pFileBuffer) + { + delete[] m_pFileBuffer; + } + + if (m_pFile) + { + fclose(m_pFile); + } + } + void PDFDoc::CheckHeader() + { + char hdrBuf[HeaderSearchSize + 1]; + char *p; + int nIndex = 0; + + m_dPDFVersion = 0; + + for (nIndex = 0; nIndex < HeaderSearchSize; ++nIndex) + { + hdrBuf[nIndex] = m_pStream->GetChar(); + } + hdrBuf[HeaderSearchSize] = '\0'; + + for (nIndex = 0; nIndex < HeaderSearchSize - 5; ++nIndex) + { + if (!strncmp(&hdrBuf[nIndex], "%PDF-", 5)) + { + break; + } + } + if (nIndex >= HeaderSearchSize - 5) + { + // TO DO: Error "May not be a PDF file" + return; + } + + m_pStream->SetStartPos(nIndex); + + if (!(p = strtok(&hdrBuf[nIndex + 5], " \t\n\r"))) + { + // TO DO: Error "May not be a PDF file" + return; + } + m_dPDFVersion = atof(p); + + if (!(hdrBuf[nIndex + 5] >= '0' && hdrBuf[nIndex + 5] <= '9') || m_dPDFVersion > SupportedPDFVersionNum + 0.0001) + { + // TO DO: Error "Unsupported PDF version" + } + } + bool PDFDoc::CheckEncryption(StringExt *ownerPassword, StringExt *userPassword) + { + bool bEncrypted = false; + bool bResult = true; + + Object oEncypt; + m_pXref->GetTrailerDict()->DictLookup("Encrypt", &oEncypt); + + if ((bEncrypted = oEncypt.IsDict())) + { + SecurityHandler *pSecurityHandler = NULL; + if ((pSecurityHandler = SecurityHandler::Make(this, &oEncypt))) + { + if (pSecurityHandler->CheckEncryption(ownerPassword, userPassword)) + { + // Авторизация пройдена + m_pXref->SetEncryption(pSecurityHandler->GetPermissionFlags(), pSecurityHandler->GetOwnerPasswordValid(), pSecurityHandler->GetFileKey(), pSecurityHandler->GetFileKeyLength(), pSecurityHandler->GetEncodingVersion(), pSecurityHandler->GetEncodingAlgorithm()); + bResult = true; + } + else + { + // Авторизация не пройдена + bResult = false; + } + delete pSecurityHandler; + } + else + { + bResult = false; + } + } + else + { + // Данный PDF файл не зашифрован + bResult = true; + } + oEncypt.Free(); + return bResult; + } + void PDFDoc::DisplayPage(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData), void *pAbortCheckCbkData) + { + m_pCatalog->GetPage(nPageIndex)->Display(pOut, dHorDPI, dVerDPI, nRotate, bUseMediaBox, bCrop, bPrinting, m_pCatalog, pAbortCheckCbk, pAbortCheckCbkData); + } + void PDFDoc::DisplayPages(OutputDev *pOut, int nFirstPageIndex, int nLastPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData), void *pAbortCheckCbkData) + { + for (int nPageIndex = nFirstPageIndex; nPageIndex <= nLastPageIndex; ++nPageIndex) + { + DisplayPage(pOut, nPageIndex, dHorDPI, dVerDPI, nRotate, bUseMediaBox, bCrop, bPrinting, pAbortCheckCbk, pAbortCheckCbkData); + } + } + void PDFDoc::DisplayPageSlice(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool(*pAbortCheckCbk)(void *pData), void *pAbortCheckCbkData) + { + m_pCatalog->GetPage(nPageIndex)->DisplaySlice(pOut, dHorDPI, dVerDPI, nRotate, bUseMediaBox, bCrop, nSliceX, nSliceY, nSliceW, nSliceH, bPrinting, m_pCatalog, pAbortCheckCbk, pAbortCheckCbkData); + } + Links *PDFDoc::GetLinks(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetLinks(m_pCatalog); + } + void PDFDoc::ProcessLinks(OutputDev *pOut, int nPageIndex) + { + m_pCatalog->GetPage(nPageIndex)->ProcessLinks(pOut, m_pCatalog); + } + bool PDFDoc::IsLinearized() + { + bool bLinearized = false; + Object oTemp; + oTemp.InitNull(); + Parser *pParser = new Parser(m_pXref, new Lexer(m_pXref, m_pStream->MakeSubStream(m_pStream->GetStartPos(), false, 0, &oTemp)), true); + if (!pParser) + { + // TO DO: Error "Can't allocate memory" + oTemp.Free(); + return false; + } + oTemp.Free(); + + Object oNum, oGen, oObj, oDict; + pParser->GetObject(&oNum); + pParser->GetObject(&oGen); + pParser->GetObject(&oObj); + pParser->GetObject(&oDict); + + if (oNum.IsInt() && oGen.IsInt() && oObj.IsCommand("obj") && oDict.IsDict()) + { + Object oVersion; + oDict.DictLookup("Linearized", &oVersion); + if (oVersion.IsNum() && oVersion.GetNum() > 0) + { + bLinearized = true; + } + oVersion.Free(); + } + oDict.Free(); + oObj.Free(); + oGen.Free(); + oNum.Free(); + + delete pParser; + return bLinearized; + } +} \ No newline at end of file diff --git a/PdfReader/Src/PDFDoc.h b/PdfReader/Src/PDFDoc.h new file mode 100644 index 0000000000..ae6ba52c17 --- /dev/null +++ b/PdfReader/Src/PDFDoc.h @@ -0,0 +1,211 @@ +#ifndef _PDF_READER_PDF_DOC_H +#define _PDF_READER_PDF_DOC_H + +#include +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "ErrorConstants.h" + +namespace PdfReader +{ + class StringExt; + class BaseStream; + class OutputDev; + class Links; + class LinkAction; + class LinkDest; + class Outline; + //------------------------------------------------------------------------------------------------------------------------------- + // PDFDoc + //------------------------------------------------------------------------------------------------------------------------------- + + class PDFDoc + { + public: + + PDFDoc(GlobalParams *pGlobalParams, const wchar_t* wsFileName, StringExt *seOwnerPassword = NULL, StringExt *seUserPassword = NULL); + ~PDFDoc(); + + // Нормально ли открылся PDF файл? + bool CheckValidation() + { + return m_bValid; + } + + + // Получаем код ошибки, если PDF файл не открылся. + EError GetErrorCode() + { + return m_eErrorCode; + } + + + // Считываем имя файла. + std::wstring GetFileName() + { + return m_wsFileName; + } + + + // Считываем таблицу Xref. + XRef *GetXRef() + { + return m_pXref; + } + + + // Считываем объект Сatalog. + Catalog *GetCatalog() + { + return m_pCatalog; + } + + + // Считываем поток. + BaseStream *GetBaseStream() + { + return m_pStream; + } + + + // Cчитываем параметры страницы. + double GetPageMediaWidth(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetMediaWidth(); + } + double GetPageMediaHeight(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetMediaHeight(); + } + double GetPageCropWidth(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetCropWidth(); + } + double GetPageCropHeight(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetCropHeight(); + } + int GetPageRotate(int nPageIndex) + { + return m_pCatalog->GetPage(nPageIndex)->GetRotate(); + } + + + // Считываем количество страниц. + int GetPagesCount() + { + return m_pCatalog->GetPagesCount(); + } + + + // Возвращаем содержимое потока метаданных объекта Catalog. + StringExt *ReadMetadata() + { + return m_pCatalog->ReadMetadata(); + } + + + // Возвращаем объект StructureTreeRoot. + Object *GetStructTreeRoot() + { + return m_pCatalog->GetStructTreeRoot(); + } + + + // Выводим данную страницу на устройство pOut. + void DisplayPage(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); + // Выводим сразу несколько страниц. + void DisplayPages(OutputDev *pOut, int nFirstPageIndex, int nLastPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); + // Выводим часть страницы. + void DisplayPageSlice(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); + // Ищем страницу по ее объектным номерам. Возвращаем 0, если страница не найдена. + int FindPage(int nNum, int nGen) + { + return m_pCatalog->FindPage(nNum, nGen); + } + + + // Возвращаем Links для текущей страницы. + Links *GetLinks(int nPageIndex); + // Ищем Destination по имени. Возвращаем Link destination или NULL, если не объект Destination. + LinkDestination *FindDest(StringExt *seName) + { + return m_pCatalog->FindDest(seName); + } + + + // Обрабатываем Links для данной страницы. + void ProcessLinks(OutputDev *pOut, int nPageIndex); + // Возвращаем объект Оutline. + Outline *GetOutline() + { + return m_pOutline; + } + // Зашифрован ли файл? + bool IsEncrypted() + { + return m_pXref->CheckEncrypted(); + } + + // Проверяем различные ограничения. + bool CheckPrint(bool bIgnoreOwnerPassword = false) + { + return m_pXref->CheckPrint(bIgnoreOwnerPassword); + } + bool CheckChange(bool bIgnoreOwnerPassword = false) + { + return m_pXref->CheckChange(bIgnoreOwnerPassword); + } + bool CheckCopy(bool bIgnoreOwnerPassword = false) + { + return m_pXref->CheckCopy(bIgnoreOwnerPassword); + } + bool CheckAddNotes(bool bIgnoreOwnerPassword = false) + { + return m_pXref->CheckAddNotes(bIgnoreOwnerPassword); + } + + // Данный PDF файл является линеаризированным (см. Linearized PDF) + bool IsLinearized(); + // Воозвращаем объек Info. + Object *GetDocInfo(Object *pObject) + { + return m_pXref->GetDocInfo(pObject); + } + Object *GetDocInfoCopy(Object *pObject) + { + return m_pXref->GetDocInfoCopy(pObject); + } + + // Возвращаем версию PDF файла. + double GetPDFVersion() + { + return m_dPDFVersion; + } + + private: + + bool Setup(StringExt *seOwnerPassword, StringExt *seUserPassword); + void CheckHeader(); + bool CheckEncryption(StringExt *seOwnerPassword, StringExt *seUserPassword); + + private: + + std::wstring m_wsFileName; // Имя исходного файла. + FILE* m_pFile; // Указатель на файловый поток + unsigned char* m_pFileBuffer; // Буфер для файла + + BaseStream* m_pStream; // Поток, в который считан весь файл + double m_dPDFVersion; // Верисия PDF файла (1.1 - 1.7) + XRef* m_pXref; // Таблица Xref + Catalog* m_pCatalog; // Указатель на объект Catalog + Outline* m_pOutline; // Указатель на Outline (меню) + + bool m_bValid; // Нормально ли открылся PDF файл + EError m_eErrorCode; // Код ошибки + + GlobalParams* m_pGlobalParams; + }; +} +#endif // _PDF_READER_PDF_DOC_H diff --git a/PdfReader/Src/PDFDocEncoding.h b/PdfReader/Src/PDFDocEncoding.h new file mode 100644 index 0000000000..ffee11c10d --- /dev/null +++ b/PdfReader/Src/PDFDocEncoding.h @@ -0,0 +1,29 @@ +#ifndef _PDF_READER_PDF_DOC_ENCODING_H +#define _PDF_READER_PDF_DOC_ENCODING_H + +#include "CharTypes.h" + +namespace PdfReader +{ + static Unicode c_arrPDFDocEncoding[256] = + { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, // 1 + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, // 2 + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, // 3 + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, // 4 + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, // 5 + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, // 6 + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, // 7 + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, // 8 + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, // 9 + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, // A + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, // B + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, // C + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, // D + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, // E + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff // F + }; +} + +#endif // _PDF_READER_PDF_DOC_ENCODING_H diff --git a/PdfReader/Src/PDFReader.cpp b/PdfReader/Src/PDFReader.cpp new file mode 100644 index 0000000000..22da6ea8c3 --- /dev/null +++ b/PdfReader/Src/PDFReader.cpp @@ -0,0 +1,8 @@ +// PDFReader.cpp : Implementation of CPDFReader + +#include "stdafx.h" +#include "PDFReader.h" + + +// CPDFReader + diff --git a/PdfReader/Src/PDFReader.h b/PdfReader/Src/PDFReader.h new file mode 100644 index 0000000000..a0cbd8cd10 --- /dev/null +++ b/PdfReader/Src/PDFReader.h @@ -0,0 +1,512 @@ +// PDFReader.h : Declaration of the CPDFReader + +#pragma once +#include "resource.h" // main symbols + +#include "../../Common/OfficeFileErrorDescription.h" +#include "../../Common/OfficeDefines.h" + +#include "PDFDoc.h" +#include "GlobalParams.h" +#include "ErrorConstants.h" +#include "ExtractImageOutputDev.h" +#include "RendererOutputDev.h" + +#include "ImageOutputDev.h" +#include "SBitmap.h" + +//#define AVSGraphics AVSOfficeEditor +//#define _IAVSDocumentPainterEvents _IAVSOfficeViewerEvents +//#define IAVSDocumentPainter IAVSOfficeViewer +//#define IAVSDocumentRenderer IAVSCommandsRenderer +//#define _IAVSDocumentRendererEvents _IAVSCommandsRendererEvents +//#define CAVSDocumentPainter CAVSOfficeViewer + +#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA) +#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms." +#endif + + +//#define _MEMORY_DEBUG +#ifdef _MEMORY_DEBUG + +#define _CRTDBG_MAP_ALLOC +#include +#include + +#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) + +#define new DEBUG_NEW + +#endif + +// IPDFReader +[ + object, + uuid("908EA939-E01D-47E0-B182-625826C2D7B1"), + dual, helpstring("IPDFReader Interface"), + pointer_default(unique) +] +__interface IPDFReader : IDispatch +{ + + [id(10)] HRESULT LoadPDF([in]BSTR bsSrcPath, [in]BSTR bsOwnerPassword = NULL, [in]BSTR bsUserPassword = NULL, [in]BSTR bsOptions = NULL); + [id(11)] HRESULT Close(); + + [id(100)] HRESULT GetPagesCount([out, retval]int *pnCount); + [id(101)] HRESULT GetPDFVersion([out, retval]double *pdVersion); + [id(102)] HRESULT GetPDFPermissions([out, retval]int *pnPermissions); + [id(103)] HRESULT GetPDFInfo([out, retval]BSTR *pbsInfo); + [id(104)] HRESULT SetTempFolder([in] BSTR bsTempFolder); + [id(105)] HRESULT GetTempFolder([out, retval] BSTR *pbsTempFolder); + + [id(200)] HRESULT ExtractImages([in]BSTR bsDstPath, [in]BSTR bsPrefix); + [id(201)] HRESULT DisplayPage([in]int nPageIndex, [in]BSTR bsPath, [in]BSTR bsXmlOptions, [out]double *pdWidth, [out]double *pdHeight, [in]BOOL *pbBreak); + [id(202)] HRESULT DisplayAllPages([in]BSTR bsPath, [out]BSTR *pbsDstXml, [in]BSTR bsXmlOption, [in]BOOL *pbBreak); + [id(203)] HRESULT DisplayPage2([in]IUnknown *punkRenderer, [in]int nPageIndex, [in]BSTR bsPath, [in]BSTR bsXmlOptions, [out]double *pdWidth, [out]double *pdHeight, [in]BOOL *pbBreak); + + [id(300)] HRESULT GetCommandRenderer([out, retval] IUnknown** ppRenderer); + [id(301)] HRESULT SetCommandRenderer([in] IUnknown* pRenderer); + + [id(10001)] HRESULT SetAdditionalParam([in] BSTR ParamName, [in] VARIANT ParamValue); + [id(10002)] HRESULT GetAdditionalParam([in] BSTR ParamName, [out] VARIANT * ParamValue); +}; + + + +// CPDFReader + +[ + coclass, + default(IPDFReader), + threading(apartment), + vi_progid("AVSOfficePDFReader.PDFReader"), + progid("AVSOfficePDFReader.PDFReader.1"), + version(1.0), + uuid("A329E783-2E52-4C96-A032-ADD2A5DADD0D"), + helpstring("PDFReader Class") +] +class ATL_NO_VTABLE CPDFReader : + public IPDFReader +{ +private: + + PDFDoc *m_pPDFDocument; + GlobalParams *m_pGlobalParams; + AVSGraphics::IASCRenderer *m_piDocumentRenderer; + CStringW m_sTempFolder; + CFontList m_oFontList; + + +public: + CPDFReader(): m_piDocumentRenderer(NULL) + { + } + + + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + HRESULT FinalConstruct() + { +#ifdef _MEMORY_DEBUG + _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); + _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW ); +#endif + + m_sTempFolder = _T(""); + m_pPDFDocument = NULL; + m_oFontList.Clear(); + + m_pGlobalParams = new GlobalParams( "" ); + m_pGlobalParams->SetCMapsDir(); + + return S_OK; + } + + void FinalRelease() + { + m_oFontList.Clear(); + + if ( m_pPDFDocument ) + delete m_pPDFDocument; + + if ( m_pGlobalParams ) + { + delete m_pGlobalParams; + m_pGlobalParams = NULL; + } + + + RELEASEINTERFACE( m_piDocumentRenderer ); + } + +public: + + STDMETHOD(LoadPDF)(BSTR bsSrcPath, BSTR bsOwnerPassword, BSTR bsUserPassword, BSTR bsOptions) + { + USES_CONVERSION; + + if ( m_pPDFDocument ) + delete m_pPDFDocument; + + StringExt *seOwner = NULL, *seUser = NULL; + //char *sSrcPath = W2A(bsSrcPath); + char *sOwnerPassword = W2A(bsOwnerPassword); + char *sUserPassword = W2A(bsUserPassword); + if ( sOwnerPassword ) + seOwner = new StringExt( sOwnerPassword ); + if ( sUserPassword ) + seUser = new StringExt( sUserPassword ); + + CString sOptions( bsOptions ); + + m_pPDFDocument = new PDFDoc( m_pGlobalParams, CString( bsSrcPath ), seOwner, seUser ); + if ( !m_pPDFDocument || !m_pPDFDocument->CheckValidation() ) + { + // Специальная ветка, для случаев, когда файл очень большой (около 1GB) + // и функция MapViewOfFile не срабатывает + if ( m_pPDFDocument ) + delete m_pPDFDocument; + + m_pPDFDocument = new PDFDoc( m_pGlobalParams, bsSrcPath, CString( bsSrcPath ).GetLength(), seOwner, seUser ); + } + + m_oFontList.Clear(); + + if ( sOptions != _T("CheckPassword") ) + { + if ( _T("DontDeleteTempFolder") != sOptions ) + { + m_pGlobalParams->CreateTempFolder( bsSrcPath, m_sTempFolder ); + m_pGlobalParams->SetupBaseFonts( _T("C:\\Windows\\Fonts") ); + } + } + + if ( seUser ) + delete seUser; + if ( seOwner ) + delete seOwner; + + int nErrorCode = 0; + if ( m_pPDFDocument && ( nErrorCode = m_pPDFDocument->GetErrorCode() ) == ErrorNone ) + return S_OK; + else + { + switch( nErrorCode ) + { + case ErrorOpenFile: + return AVS_OFFICEPDFREADER_ERROR_OPEN_PDF; + case ErrorBadCatalog: + return AVS_OFFICEPDFREADER_ERROR_BAD_CATALOG; + case ErrorDamaged: + return AVS_OFFICEPDFREADER_ERROR_DAMAGED_PDF; + case ErrorEncrypted: + return AVS_OFFICEPDFREADER_ERROR_ENCRYPTED_PDF; + default: + return AVS_OFFICEPDFREADER_ERROR_OPEN_PDF; + } + } + } + STDMETHOD(Close)() + { + if ( m_pPDFDocument ) + { + //if ( m_pGlobalParams ) + // m_pGlobalParams->DeleteTempFolder(); + + delete m_pPDFDocument; + m_pPDFDocument = NULL; + } + + return S_OK; + } + STDMETHOD(GetPagesCount)(int *pnCount) + { + if ( !m_pPDFDocument ) + { + *pnCount = 0; + return S_OK; + } + *pnCount = m_pPDFDocument->GetPagesCount(); + return S_OK; + } + STDMETHOD(GetPDFVersion)(double *pdVersion) + { + if ( !m_pPDFDocument ) + { + *pdVersion = 0; + return S_OK; + } + *pdVersion = m_pPDFDocument->GetPDFVersion(); + return S_OK; + } + STDMETHOD(GetPDFPermissions)(int *pnPermissions) + { + if ( !m_pPDFDocument ) + { + *pnPermissions = 0; + return S_FALSE; + } + + *pnPermissions = 0; + + if ( m_pPDFDocument->CheckPrint() ) + *pnPermissions += PERMISSION_PRINT; + if ( m_pPDFDocument->CheckCopy() ) + *pnPermissions += PERMISSION_COPY; + if ( m_pPDFDocument->CheckChange() ) + *pnPermissions += PERMISSION_CHANGE; + + + return S_OK; + } + STDMETHOD(GetPDFInfo)(BSTR *pbsInfo) + { + return S_OK; + } + STDMETHOD(SetTempFolder)(BSTR bsTempFolder) + { + m_sTempFolder = CStringW( bsTempFolder ); + return S_OK; + } + STDMETHOD(GetTempFolder)(BSTR *pbsTempFolder) + { + if ( m_pGlobalParams ) + { + *pbsTempFolder = ::SysAllocString( (OLECHAR*)m_pGlobalParams->GetTempFolder() ); + } + return S_OK; + } + STDMETHOD(ExtractImages)(BSTR bsDstPath, BSTR bsPrefix) + { + CStringA sPath(bsDstPath); + + ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev( m_pGlobalParams, sPath.GetBuffer(), TRUE ); + + if ( !pOutputDev ) + { + return AVS_OFFICEPDFREADER_ERROR_NOT_ENOUGH_MEMORY; + } + + for ( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) + { + m_pPDFDocument->DisplayPage( pOutputDev, nIndex, 72, 72, 0, FALSE, FALSE, FALSE ); + } + + delete pOutputDev; + + return S_OK; + } + + STDMETHOD(DisplayPage)(int nPageIndex, BSTR bsPath, BSTR bsXmlOptions, double *pdWidth, double *pdHeight, BOOL *pbBreak) + { + const double c_dInch = 25.399; // Миллиметров в дюйме + const double c_dXResolution = 154.0; + const double c_dYResolution = 154.0; + + double dKoefX = c_dInch / c_dXResolution; + double dKoefY = c_dInch / c_dYResolution; + + USES_CONVERSION; + if ( !m_pPDFDocument ) + return S_OK; + + int nMode = 0; // 0 - пустое открытие, 1 - открытие с отрисовкой на Renderer + CString sXmlOptions( bsXmlOptions ); + + if ( _T("") == sXmlOptions ) + nMode = 0; + else + nMode = 1; + + if ( 0 == nMode ) + { + *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); + *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); + } + else if ( 1 == nMode ) + { + //#ifdef _DEBUG + if ( m_piDocumentRenderer ) + { + IASCRenderer *pRenderer = NULL; + m_piDocumentRenderer->QueryInterface( __uuidof(AVSGraphics::IASCRenderer), (void**)&pRenderer ); + + RendererOutputDev oRendererOut( m_pGlobalParams, pRenderer, &m_oFontList ); + oRendererOut.NewPDF( m_pPDFDocument->GetXRef() ); + oRendererOut.SetBreak( pbBreak ); + m_pPDFDocument->DisplayPage( &oRendererOut, nPageIndex, 72.0, 72.0, 0 , FALSE, TRUE, FALSE ); + + RELEASEINTERFACE( pRenderer ); + } + //#else + + //SColor pPaperColor; + //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; + //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); + //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); + //char pFile[512]; + //m_pPDFDocument->DisplayPage( pSImage, nPageIndex, c_dXResolution, c_dYResolution, 0, FALSE, TRUE, FALSE ); + + //pSImage->GetBitmap()->WriteJPGFile( _T("C:\\1\\"), m_pGlobalParams->GetTempFolder() ); + + //*pdHeight = (float)pSImage->GetBitmapHeight() * dKoefX; + //*pdWidth = (float)pSImage->GetBitmapWidth() * dKoefY; + + //delete pSImage; + //#endif + } + return S_OK; + } + STDMETHOD(DisplayAllPages)(BSTR bsPath, BSTR *pbsDstXml, BSTR bsXmlOptions, BOOL *pbBreak) + { + //if ( !m_pPDFDocument ) + // return S_OK; + + //SColor pPaperColor; + //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; + //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); + //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); + //wchar_t wsFile[512]; + //for( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) + //{ + // m_pPDFDocument->DisplayPage( pSImage, nIndex, 72, 72, 0, FALSE, TRUE, FALSE ); + // CStringW wsPath( bsPath ); + // _swprintf( wsFile, _T("\\%06d.jpeg"), nIndex ); + // wsPath += wsFile; + // pSImage->GetBitmap()->WriteJPGFile( wsPath.GetBuffer(), m_pGlobalParams->GetTempFolder() ); + //} + //delete pSImage; + return S_OK; + } + STDMETHOD(DisplayPage2)(IUnknown *punkRenderer, int nPageIndex, BSTR bsPath, BSTR bsXmlOptions, double *pdWidth, double *pdHeight, BOOL *pbBreak) + { + const double c_dInch = 25.399; // Миллиметров в дюйме + const double c_dXResolution = 154.0; + const double c_dYResolution = 154.0; + + double dKoefX = c_dInch / c_dXResolution; + double dKoefY = c_dInch / c_dYResolution; + + USES_CONVERSION; + if ( !m_pPDFDocument ) + return S_OK; + + int nMode = 0; // 0 - пустое открытие, 1 - открытие с отрисовкой на Renderer + CString sXmlOptions( bsXmlOptions ); + + if ( _T("") == sXmlOptions ) + nMode = 0; + else + nMode = 1; + + if ( 0 == nMode ) + { + int nRotate = m_pPDFDocument->GetPageRotate( nPageIndex ); + + while ( nRotate >= 360 ) + nRotate -= 360; + + while ( nRotate < 0 ) + nRotate += 360; + + if ( 0 != nRotate && 180 != nRotate ) + { + *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); + *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); + } + else + { + *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); + *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); + } + } + else if ( 1 == nMode ) + { + //#ifdef _DEBUG + if ( punkRenderer ) + { + IASCRenderer *pRenderer = NULL; + punkRenderer->QueryInterface( __uuidof(AVSGraphics::IASCRenderer), (void**)&pRenderer ); + + RendererOutputDev oRendererOut( m_pGlobalParams, pRenderer, &m_oFontList ); + oRendererOut.NewPDF( m_pPDFDocument->GetXRef() ); + oRendererOut.SetBreak( pbBreak ); + m_pPDFDocument->DisplayPage( &oRendererOut, nPageIndex, 72.0, 72.0, 0 , FALSE, TRUE, FALSE ); + + RELEASEINTERFACE( pRenderer ); + } + //#else + + //SColor pPaperColor; + //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; + //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); + //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); + //char pFile[512]; + //m_pPDFDocument->DisplayPage( pSImage, nPageIndex, c_dXResolution, c_dYResolution, 0, FALSE, TRUE, FALSE ); + + //pSImage->GetBitmap()->WriteJPGFile( _T("C:\\1\\out.jpg"), m_pGlobalParams->GetTempFolder() ); + + //*pdHeight = (float)pSImage->GetBitmapHeight() * dKoefX; + //*pdWidth = (float)pSImage->GetBitmapWidth() * dKoefY; + + //delete pSImage; + //#endif + } + return S_OK; + } + STDMETHOD(GetCommandRenderer)(IUnknown** ppRenderer) + { + if( NULL == ppRenderer ) + return S_FALSE; + (*ppRenderer) = NULL; + if( NULL == m_piDocumentRenderer ) + return S_OK; + return m_piDocumentRenderer->QueryInterface(__uuidof(AVSGraphics::IASCRenderer), (void**)&ppRenderer); + } + STDMETHOD(SetCommandRenderer)(IUnknown* pRenderer) + { + RELEASEINTERFACE( m_piDocumentRenderer ); + if( NULL != pRenderer ) + pRenderer->QueryInterface(__uuidof( AVSGraphics::IASCRenderer), (void**)&m_piDocumentRenderer); + return S_OK; + } + + STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue) + { + return S_OK; + } + STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT * ParamValue) + { + if ( NULL == ParamValue ) + return S_FALSE; + + CString sParamName; + sParamName = ParamName; + + if ( _T("ImagesCount") == sParamName ) + { + //ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev( m_pGlobalParams, NULL, TRUE, TRUE ); + + //if ( !pOutputDev ) + //{ + // return AVS_OFFICEPDFREADER_ERROR_NOT_ENOUGH_MEMORY; + //} + + //for ( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) + //{ + // m_pPDFDocument->DisplayPage( pOutputDev, nIndex, 72, 72, 0, FALSE, FALSE, FALSE ); + //} + + //(*ParamValue).vt = VT_I8; + //(*ParamValue).llVal = pOutputDev->GetImagesCount(); + + //delete pOutputDev; + } + + return S_OK; + } + +}; + diff --git a/PdfReader/Src/PSLexer.cpp b/PdfReader/Src/PSLexer.cpp new file mode 100644 index 0000000000..9fb9f319fc --- /dev/null +++ b/PdfReader/Src/PSLexer.cpp @@ -0,0 +1,152 @@ +#include +#include +#include "PSLexer.h" + +namespace PdfReader +{ + // '1' - означает пробел. '1' или '2' означает, что данным символом заканчивается + // имя или команда. + + static char c_sSpecialChars[256] = + { + // 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x ax bx cx dx ex fx + + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx + }; + + //------------------------------------------------------------------------ + + PSLexer::PSLexer(int(*GetCharFunc)(void *), void *pData) + { + GetCharFunction = GetCharFunc; + m_pData = pData; + m_nCharBuffer = -1; + } + + PSLexer::~PSLexer() + { + } + + bool PSLexer::GetToken(char *sBuffer, int nSize, int *pnLength) + { + int nChar = 0; + + // Пропускаем пробелы и комментарии + bool bComment = false; + while (1) + { + if ((nChar = GetChar()) == EOF) + { + sBuffer[0] = '\0'; + *pnLength = 0; + return false; + } + if (bComment) + { + if (nChar == '\x0a' || nChar == '\x0d') + { + bComment = false; + } + } + else if (nChar == '%') + { + bComment = true; + } + else if (c_sSpecialChars[nChar] != 1) + { + break; + } + } + int nLen = 0; + sBuffer[nLen++] = nChar; + if (nChar == '(') + { + bool bBackslash = false; + while ((nChar = LookChar()) != EOF) + { + if (nLen < nSize - 1) + { + sBuffer[nLen++] = nChar; + } + GetChar(); + if (nChar == '\\') + { + bBackslash = true; + } + else if (!bBackslash && nChar == ')') + { + break; + } + else + { + bBackslash = false; + } + } + } + else if (nChar == '<') + { + while ((nChar = LookChar()) != EOF) + { + GetChar(); + if (nLen < nSize - 1 && c_sSpecialChars[nChar] != 1) + { + sBuffer[nLen++] = nChar; + } + if (nChar == '>') + { + break; + } + } + } + else if (nChar != '[' && nChar != ']') + { + while ((nChar = LookChar()) != EOF && !c_sSpecialChars[nChar]) + { + GetChar(); + if (nLen < nSize - 1) + { + sBuffer[nLen++] = nChar; + } + } + } + sBuffer[nLen] = '\0'; + *pnLength = nLen; + + return true; + } + + int PSLexer::LookChar() + { + if (m_nCharBuffer < 0) + { + m_nCharBuffer = (*GetCharFunction)(m_pData); + } + return m_nCharBuffer; + } + + int PSLexer::GetChar() + { + if (m_nCharBuffer < 0) + { + m_nCharBuffer = (*GetCharFunction)(m_pData); + } + int nChar = m_nCharBuffer; + m_nCharBuffer = -1; + return nChar; + } +} \ No newline at end of file diff --git a/PdfReader/Src/PSLexer.h b/PdfReader/Src/PSLexer.h new file mode 100644 index 0000000000..6f309afc36 --- /dev/null +++ b/PdfReader/Src/PSLexer.h @@ -0,0 +1,31 @@ +#ifndef _PDF_READER_PS_LEXER_H +#define _PDF_READER_PS_LEXER_H + +namespace PdfReader +{ + class PSLexer + { + public: + + PSLexer(int(*GetCharFunc)(void *), void *pData); + ~PSLexer(); + + // Некоторый аналог функции Lexer::GetObject. Но для чтения PS вставок в PDF файле. + // Здесь читаются данные заключенные между скобок "<>", "()" или какая-нибудь команда. + // Данные в квадратных скобках "[]" не читаются. + bool GetToken(char *sBuffer, int nSize, int *pnLength); + + private: + + int LookChar(); + int GetChar(); + + private: + + int(*GetCharFunction)(void *); // Указатель на функцию для считывания символа + void *m_pData; + int m_nCharBuffer; + }; +} + +#endif // _PDF_READER_PS_LEXER_H diff --git a/PdfReader/Src/Page.cpp b/PdfReader/Src/Page.cpp new file mode 100644 index 0000000000..8f8376ed96 --- /dev/null +++ b/PdfReader/Src/Page.cpp @@ -0,0 +1,533 @@ +#include +#include "GlobalParams.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Link.h" +#include "RendererOutputDev.h" +#include "OutputDevice.h" +#include "Graphics.h" +#include "GState.h" +#include "Annot.h" +#include "Catalog.h" +#include "Page.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // PDFRectangle + //------------------------------------------------------------------------ + + void PDFRectangle::ClipTo(PDFRectangle *pRect) + { + if (m_dLeft < pRect->m_dLeft) + { + m_dLeft = pRect->m_dLeft; + } + else if (m_dLeft > pRect->m_dRight) + { + m_dLeft = pRect->m_dRight; + } + if (m_dRight < pRect->m_dLeft) + { + m_dRight = pRect->m_dLeft; + } + else if (m_dRight > pRect->m_dRight) + { + m_dRight = pRect->m_dRight; + } + if (m_dBottom < pRect->m_dBottom) + { + m_dBottom = pRect->m_dBottom; + } + else if (m_dBottom > pRect->m_dTop) + { + m_dBottom = pRect->m_dTop; + } + if (m_dTop < pRect->m_dBottom) + { + m_dTop = pRect->m_dBottom; + } + else if (m_dTop > pRect->m_dTop) + { + m_dTop = pRect->m_dTop; + } + } + + //------------------------------------------------------------------------ + // PageAttrs + //------------------------------------------------------------------------ + + PageAttrs::PageAttrs(PageAttrs *pAttrs, Dict *pDict) + { + Object obj1; + + if (pAttrs) // Предыдущие настройки + { + m_oMediaBox = pAttrs->m_oMediaBox; + m_pCropBox = pAttrs->m_pCropBox; + m_bHaveCropBox = pAttrs->m_bHaveCropBox; + m_nRotate = pAttrs->m_nRotate; + pAttrs->m_oResources.Copy(&m_oResources); + } + else // Настройки по умолчанию + { + m_oMediaBox.m_dLeft = 0; + m_oMediaBox.m_dBottom = 0; + m_oMediaBox.m_dRight = 612; + m_oMediaBox.m_dTop = 792; + + m_pCropBox.m_dLeft = m_pCropBox.m_dBottom = m_pCropBox.m_dRight = m_pCropBox.m_dTop = 0; + m_bHaveCropBox = false; + m_nRotate = 0; + m_oResources.InitNull(); + } + + // MediaBox + ReadBox(pDict, "MediaBox", &m_oMediaBox); + + // CropBox + if (ReadBox(pDict, "CropBox", &m_pCropBox)) + { + m_bHaveCropBox = true; + } + if (!m_bHaveCropBox) + { + m_pCropBox = m_oMediaBox; + } + + // Остальные + m_oBleedBox = m_pCropBox; + ReadBox(pDict, "BleedBox", &m_oBleedBox); + + m_oTrimBox = m_pCropBox; + ReadBox(pDict, "TrimBox", &m_oTrimBox); + + m_oArtBox = m_pCropBox; + ReadBox(pDict, "ArtBox", &m_oArtBox); + + // Подгоняем размеры под m_oMediaBox + m_pCropBox.ClipTo(&m_oMediaBox); + m_oBleedBox.ClipTo(&m_oMediaBox); + m_oTrimBox.ClipTo(&m_oMediaBox); + m_oArtBox.ClipTo(&m_oMediaBox); + + // Поворот + Object oTemp; + pDict->Search("Rotate", &oTemp); + if (oTemp.IsInt()) + { + m_nRotate = oTemp.GetInt(); + } + oTemp.Free(); + while (m_nRotate < 0) + { + m_nRotate += 360; + } + while (m_nRotate >= 360) + { + m_nRotate -= 360; + } + + pDict->Search("LastModified", &m_oLastModified); + pDict->Search("BoxColorInfo", &m_oBoxColorInfo); + pDict->Search("Group", &m_oGroup); + pDict->Search("Metadata", &m_oMetadata); + pDict->Search("PieceInfo", &m_oPieceInfo); + pDict->Search("SeparationInfo", &m_oSeparationInfo); + + // Resources + pDict->Search("Resources", &oTemp); + if (oTemp.IsDict()) + { + m_oResources.Free(); + oTemp.Copy(&m_oResources); + } + oTemp.Free(); + } + + PageAttrs::~PageAttrs() + { + m_oLastModified.Free(); + m_oBoxColorInfo.Free(); + m_oGroup.Free(); + m_oMetadata.Free(); + m_oPieceInfo.Free(); + m_oSeparationInfo.Free(); + m_oResources.Free(); + } + + bool PageAttrs::ReadBox(Dict *pDict, char *sKey, PDFRectangle *pBox) + { + PDFRectangle oTempBox; + bool bSuccess = false; + + Object oBox; + pDict->Search(sKey, &oBox); + if (oBox.IsArray() && oBox.ArrayGetLength() == 4) + { + bSuccess = true; + Object oTemp; + oBox.ArrayGet(0, &oTemp); + if (oTemp.IsNum()) + { + oTempBox.m_dLeft = oTemp.GetNum(); + } + else + { + bSuccess = false; + } + oTemp.Free(); + oBox.ArrayGet(1, &oTemp); + if (oTemp.IsNum()) + { + oTempBox.m_dBottom = oTemp.GetNum(); + } + else + { + bSuccess = false; + } + oTemp.Free(); + oBox.ArrayGet(2, &oTemp); + if (oTemp.IsNum()) + { + oTempBox.m_dRight = oTemp.GetNum(); + } + else + { + bSuccess = false; + } + oTemp.Free(); + oBox.ArrayGet(3, &oTemp); + if (oTemp.IsNum()) + { + oTempBox.m_dTop = oTemp.GetNum(); + } + else + { + bSuccess = false; + } + oTemp.Free(); + if (bSuccess) + { + if (oTempBox.m_dLeft > oTempBox.m_dRight) + { + double dTempValue = oTempBox.m_dLeft; + oTempBox.m_dLeft = oTempBox.m_dRight; + oTempBox.m_dRight = dTempValue; + } + if (oTempBox.m_dBottom > oTempBox.m_dTop) + { + double dTempValue = oTempBox.m_dBottom; + oTempBox.m_dBottom = oTempBox.m_dTop; + oTempBox.m_dTop = dTempValue; + } + *pBox = oTempBox; + } + } + else + { + bSuccess = false; + } + oBox.Free(); + return bSuccess; + } + + //------------------------------------------------------------------------ + // Page + //------------------------------------------------------------------------ + + Page::Page(GlobalParams *pGlobalParams, XRef *pXref, int nNum, Dict *pPageDict, PageAttrs *pAttrs) + { + m_pGlobalParams = pGlobalParams; + + m_bValid = true; + m_pXref = pXref; + m_nNumber = nNum; + + // Attributes + m_pAttrs = pAttrs; + + // Annotations + pPageDict->SearchAndCopy("Annots", &m_oAnnots); + if (!(m_oAnnots.IsRef() || m_oAnnots.IsArray() || m_oAnnots.IsNull())) + { + // TO DO: Error "Page annotations object is wrong type" + m_oAnnots.Free(); + m_oAnnots.InitNull(); + m_oContents.InitNull(); + m_bValid = false; + } + + // Contents + pPageDict->SearchAndCopy("Contents", &m_oContents); + if (!(m_oContents.IsRef() || m_oContents.IsArray() || m_oContents.IsNull())) + { + // TO DO: Error "Page contents object is wrong type" + m_oContents.Free(); + m_oContents.InitNull(); + m_bValid = false; + } + + ////---------------------------------------------------------------- + // + // Object oContent; + // m_oContents.Fetch( m_pXref, &oContent ); + // if ( oContent.IsArray() ) + // { + // int m_nStreamsCount = oContent.ArrayGetLength(); + // for ( int nIndex = 0; nIndex < oContent.ArrayGetLength(); ++nIndex ) + // { + // Object oTemp; + // oContent.ArrayGet( nIndex, &oTemp ); + // if ( oTemp.IsStream() ) + // { + // Stream *pStream = oTemp.GetStream(); + // pStream->Reset(); + // while ( EOF != pStream->GetChar() ); + // } + // oTemp.Free(); + // } + // } + // else if ( oContent.IsStream() ) + // { + // Stream *pStream = oContent.GetStream(); + // pStream->Reset(); + // + // int nSize = 128, nPos = 0; + // char *sBuffer = (char *)MemUtilsMalloc( nSize ); + // int nChar = 0; + // while ( EOF != ( nChar = pStream->GetChar() ) ) + // { + // if ( nPos + 1 >= nSize ) + // { + // nSize *= 2; + // sBuffer = (char *)MemUtilsRealloc( (void *)sBuffer, nSize ); + // } + // sBuffer[nPos] = nChar; + // nPos++; + // } + // sBuffer[nPos] = '\0'; + // + // Object oTemp; + // Stream *pNewStream = new MemoryStream( sBuffer, 0, nPos, &oTemp ); + // + // //int m_nStreamsCount = 1; + // //m_ppStreams = (Stream**)MemUtilsMalloc( sizeof(Stream*) ); + // //m_ppStreams[0] = oContent.GetStream(); + // //m_ppStreams[0]->Reset(); + // + // //while ( EOF != m_ppStreams[0]->GetChar() ); + // + // m_oContents2.InitStream( pNewStream ); + // } + // + // oContent.Free(); + //// + //////---------------------------------------------------------------- + return; + } + + Page::~Page() + { + delete m_pAttrs; + m_oAnnots.Free(); + m_oContents.Free(); + } + + Links *Page::GetLinks(Catalog *pCatalog) + { + Object oTemp; + + Links *pLinks = new Links(GetAnnots(&oTemp), pCatalog->GetBaseURI()); + oTemp.Free(); + return pLinks; + } + + void Page::Display(OutputDev *pOut, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, Catalog *pCatalog, bool(*abortCheckCbk)(void *pData), void *abortCheckCbkData) + { + DisplaySlice(pOut, dHorizDPI, dVertDPI, nRotate, bUseMediaBox, bCrop, -1, -1, -1, -1, bPrinting, pCatalog, abortCheckCbk, abortCheckCbkData); + } + + void Page::DisplaySlice(OutputDev *pOut, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bCrop, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool bPrinting, Catalog *pCatalog, bool(*abortCheckCbk)(void *pData), void *abortCheckCbkData) + { + if (!pOut->CheckPageSlice(this, dHorizDPI, dVertDPI, nRotate, bUseMediaBox, bCrop, nSliceX, nSliceY, nSliceW, nSliceH, bPrinting, pCatalog, abortCheckCbk, abortCheckCbkData)) + { + return; + } + + nRotate += GetRotate(); + if (nRotate >= 360) + { + nRotate -= 360; + } + else if (nRotate < 0) + { + nRotate += 360; + } + + PDFRectangle oBox; + MakeBox(dHorizDPI, dVertDPI, nRotate, bUseMediaBox, pOut->UpSideDown(), nSliceX, nSliceY, nSliceW, nSliceH, &oBox, &bCrop); + PDFRectangle *pCropBox = GetCropBox(); + + Graphics *pGraphics = new Graphics(m_pGlobalParams, m_pXref, pOut, m_nNumber, m_pAttrs->GetResourceDict(), dHorizDPI, dVertDPI, &oBox, bCrop ? pCropBox : (PDFRectangle *)NULL, nRotate, abortCheckCbk, abortCheckCbkData); + if (pGraphics) + { + Object oTemp; + m_oContents.Fetch(m_pXref, &oTemp); + if (!oTemp.IsNull()) + { + pGraphics->SaveGState(); + pGraphics->Display(&oTemp); + pGraphics->RestoreGState(); + } + oTemp.Free(); + + Annots *pAnnotList = new Annots(m_pGlobalParams, m_pXref, pCatalog, GetAnnots(&oTemp)); + oTemp.Free(); + if (pAnnotList) + { + Dict *pAcroForm = pCatalog->GetAcroForm()->IsDict() ? pCatalog->GetAcroForm()->GetDict() : NULL; + if (pAcroForm) + { + if (pAcroForm->Search("NeedAppearances", &oTemp)) + { + if (oTemp.IsBool() && oTemp.GetBool()) + { + pAnnotList->GenerateAppearances(pAcroForm); + } + } + oTemp.Free(); + } + if (pAnnotList->GetAnnotsCount() > 0) + { + for (int nIndex = 0; nIndex < pAnnotList->GetAnnotsCount(); ++nIndex) + { + pAnnotList->GetAnnot(nIndex)->Draw(pGraphics, bPrinting); + } + pOut->Dump(); + } + delete pAnnotList; + } + delete pGraphics; + } + } + + void Page::MakeBox(double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bUpSideDown, double dSliceX, double dSliceY, double dSliceW, double dSliceH, PDFRectangle *pBox, bool *pbCrop) + { + PDFRectangle *pMediaBox = GetMediaBox(); + PDFRectangle *pCropBox = GetCropBox(); + + if (dSliceW >= 0 && dSliceH >= 0) + { + PDFRectangle *pBaseBox = bUseMediaBox ? pMediaBox : pCropBox; + double dKoefX = 72.0 / dHorizDPI; + double dKoefY = 72.0 / dVertDPI; + if (nRotate == 90) + { + if (bUpSideDown) + { + pBox->m_dLeft = pBaseBox->m_dLeft + dKoefY * dSliceY; + pBox->m_dRight = pBaseBox->m_dLeft + dKoefY * (dSliceY + dSliceH); + } + else + { + pBox->m_dLeft = pBaseBox->m_dRight - dKoefY * (dSliceY + dSliceH); + pBox->m_dRight = pBaseBox->m_dRight - dKoefY * dSliceY; + } + pBox->m_dBottom = pBaseBox->m_dBottom + dKoefX * dSliceX; + pBox->m_dTop = pBaseBox->m_dBottom + dKoefX * (dSliceX + dSliceW); + } + else if (nRotate == 180) + { + pBox->m_dLeft = pBaseBox->m_dRight - dKoefX * (dSliceX + dSliceW); + pBox->m_dRight = pBaseBox->m_dRight - dKoefX * dSliceX; + if (bUpSideDown) + { + pBox->m_dBottom = pBaseBox->m_dBottom + dKoefY * dSliceY; + pBox->m_dTop = pBaseBox->m_dBottom + dKoefY * (dSliceY + dSliceH); + } + else + { + pBox->m_dBottom = pBaseBox->m_dTop - dKoefY * (dSliceY + dSliceH); + pBox->m_dTop = pBaseBox->m_dTop - dKoefY * dSliceY; + } + } + else if (nRotate == 270) + { + if (bUpSideDown) + { + pBox->m_dLeft = pBaseBox->m_dRight - dKoefY * (dSliceY + dSliceH); + pBox->m_dRight = pBaseBox->m_dRight - dKoefY * dSliceY; + } + else + { + pBox->m_dLeft = pBaseBox->m_dLeft + dKoefY * dSliceY; + pBox->m_dRight = pBaseBox->m_dLeft + dKoefY * (dSliceY + dSliceH); + } + pBox->m_dBottom = pBaseBox->m_dTop - dKoefX * (dSliceX + dSliceW); + pBox->m_dTop = pBaseBox->m_dTop - dKoefX * dSliceX; + } + else + { + pBox->m_dLeft = pBaseBox->m_dLeft + dKoefX * dSliceX; + pBox->m_dRight = pBaseBox->m_dLeft + dKoefX * (dSliceX + dSliceW); + if (bUpSideDown) + { + pBox->m_dBottom = pBaseBox->m_dTop - dKoefY * (dSliceY + dSliceH); + pBox->m_dTop = pBaseBox->m_dTop - dKoefY * dSliceY; + } + else + { + pBox->m_dBottom = pBaseBox->m_dBottom + dKoefY * dSliceY; + pBox->m_dTop = pBaseBox->m_dBottom + dKoefY * (dSliceY + dSliceH); + } + } + } + else if (bUseMediaBox) + { + *pBox = *pMediaBox; + } + else + { + *pBox = *pCropBox; + *pbCrop = false; + } + } + + void Page::ProcessLinks(OutputDev *pOut, Catalog *pCatalog) + { + Links *pLinks = GetLinks(pCatalog); + if (pLinks) + { + for (int nIndex = 0; nIndex < pLinks->GetLinksCount(); ++nIndex) + { + pOut->ProcessLink(pLinks->GetLink(nIndex), pCatalog); + } + delete pLinks; + } + } + + void Page::GetDefaultCTM(double *pCTM, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bUpSideDown) + { + nRotate += GetRotate(); + if (nRotate >= 360) + { + nRotate -= 360; + } + else if (nRotate < 0) + { + nRotate += 360; + } + GrState *pGState = new GrState(dHorizDPI, dVertDPI, bUseMediaBox ? GetMediaBox() : GetCropBox(), nRotate, bUpSideDown); + if (pGState) + { + for (int nIndex = 0; nIndex < 6; ++nIndex) + { + pCTM[nIndex] = pGState->GetCTM()[nIndex]; + } + delete pGState; + } + } +} \ No newline at end of file diff --git a/PdfReader/Src/Page.h b/PdfReader/Src/Page.h new file mode 100644 index 0000000000..c08591fd26 --- /dev/null +++ b/PdfReader/Src/Page.h @@ -0,0 +1,278 @@ +#ifndef _PDF_READER_PAGE_H +#define _PDF_READER_PAGE_H + +#include "Object.h" +#include "GlobalParams.h" + +namespace PdfReader +{ + class Dict; + class XRef; + class OutputDev; + class Links; + class Catalog; + + //------------------------------------------------------------------------ + + class PDFRectangle + { + public: + + PDFRectangle() + { + m_dLeft = m_dBottom = m_dRight = m_dTop = 0; + } + PDFRectangle(double dLeft, double dBottom, double dRight, double dTop) + { + m_dLeft = dLeft; + m_dBottom = dBottom; + m_dRight = dRight; + m_dTop = dTop; + } + bool IsValid() + { + return m_dLeft != 0 || m_dBottom != 0 || m_dRight != 0 || m_dTop != 0; + } + void ClipTo(PDFRectangle *pRect); + + public: + + double m_dLeft; + double m_dBottom; + double m_dRight; + double m_dTop; + }; + + //------------------------------------------------------------------------ + // PageAttrs + //------------------------------------------------------------------------ + + class PageAttrs + { + public: + + // Строим новый объект PageAttrs либо с начальными настройками из + // pAttrs, либо со стандартными начальными настройками(если pAttrs = + // NULL). + PageAttrs(PageAttrs *pAttrs, Dict *pDict); + + ~PageAttrs(); + + PDFRectangle *GetMediaBox() + { + return &m_oMediaBox; + } + PDFRectangle *GetCropBox() + { + return &m_pCropBox; + } + bool IsCropped() + { + return m_bHaveCropBox; + } + PDFRectangle *GetBleedBox() + { + return &m_oBleedBox; + } + PDFRectangle *GetTrimBox() + { + return &m_oTrimBox; + } + PDFRectangle *GetArtBox() + { + return &m_oArtBox; + } + int GetRotate() + { + return m_nRotate; + } + StringExt *GetLastModified() + { + return (m_oLastModified.IsString() ? m_oLastModified.GetString() : (StringExt *)NULL); + } + Dict *GetBoxColorInfo() + { + return (m_oBoxColorInfo.IsDict() ? m_oBoxColorInfo.GetDict() : (Dict *)NULL); + } + Dict *GetGroup() + { + return (m_oGroup.IsDict() ? m_oGroup.GetDict() : (Dict *)NULL); + } + Stream *GetMetadata() + { + return (m_oMetadata.IsStream() ? m_oMetadata.GetStream() : (Stream *)NULL); + } + Dict *GetPieceInfo() + { + return (m_oPieceInfo.IsDict() ? m_oPieceInfo.GetDict() : (Dict *)NULL); + } + Dict *GetSeparationInfo() + { + return (m_oSeparationInfo.IsDict() ? m_oSeparationInfo.GetDict() : (Dict *)NULL); + } + Dict *GetResourceDict() + { + return (m_oResources.IsDict() ? m_oResources.GetDict() : (Dict *)NULL); + } + + private: + + bool ReadBox(Dict *pDict, char *sKey, PDFRectangle *pBox); + + private: + + PDFRectangle m_oMediaBox; + PDFRectangle m_pCropBox; + bool m_bHaveCropBox; + PDFRectangle m_oBleedBox; + PDFRectangle m_oTrimBox; + PDFRectangle m_oArtBox; + + int m_nRotate; + + Object m_oLastModified; + Object m_oBoxColorInfo; + Object m_oGroup; + Object m_oMetadata; + Object m_oPieceInfo; + Object m_oSeparationInfo; + Object m_oResources; + }; + + //------------------------------------------------------------------------ + // Page + //------------------------------------------------------------------------ + + class Page + { + public: + + Page(GlobalParams *pGlobalParams, XRef *pXref, int nNum, Dict *pPageDict, PageAttrs *pAttrs); + + ~Page(); + + bool IsValid() + { + return m_bValid; + } + + int GetNum() + { + return m_nNumber; + } + PDFRectangle *GetMediaBox() + { + return m_pAttrs->GetMediaBox(); + } + PDFRectangle *GetCropBox() + { + return m_pAttrs->GetCropBox(); + } + bool IsCropped() + { + return m_pAttrs->IsCropped(); + } + double GetMediaWidth() + { + return m_pAttrs->GetMediaBox()->m_dRight - m_pAttrs->GetMediaBox()->m_dLeft; + } + double GetMediaHeight() + { + return m_pAttrs->GetMediaBox()->m_dTop - m_pAttrs->GetMediaBox()->m_dBottom; + } + double GetCropWidth() + { + return m_pAttrs->GetCropBox()->m_dRight - m_pAttrs->GetCropBox()->m_dLeft; + } + double GetCropHeight() + { + return m_pAttrs->GetCropBox()->m_dTop - m_pAttrs->GetCropBox()->m_dBottom; + } + PDFRectangle *GetBleedBox() + { + return m_pAttrs->GetBleedBox(); + } + PDFRectangle *GetTrimBox() + { + return m_pAttrs->GetTrimBox(); + } + PDFRectangle *GetArtBox() + { + return m_pAttrs->GetArtBox(); + } + int GetRotate() + { + return m_pAttrs->GetRotate(); + } + StringExt *GetLastModified() + { + return m_pAttrs->GetLastModified(); + } + Dict *GetBoxColorInfo() + { + return m_pAttrs->GetBoxColorInfo(); + } + Dict *GetGroup() + { + return m_pAttrs->GetGroup(); + } + Stream *GetMetadata() + { + return m_pAttrs->GetMetadata(); + } + Dict *GetPieceInfo() + { + return m_pAttrs->GetPieceInfo(); + } + Dict *GetSeparationInfo() + { + return m_pAttrs->GetSeparationInfo(); + } + + // Resource + Dict *GetResourceDict() + { + return m_pAttrs->GetResourceDict(); + } + + // Annotations + Object *GetAnnots(Object *pObject) + { + return m_oAnnots.Fetch(m_pXref, pObject); + } + + // Links + Links *GetLinks(Catalog *catalog); + + // Contents + Object *GetContents(Object *pObject) + { + return m_oContents.Fetch(m_pXref, pObject); + } + + // + void Display(OutputDev *pOut, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, Catalog *pCatalog, bool(*abortCheckCbk)(void *pData) = NULL, void *abortCheckCbkData = NULL); + + void DisplaySlice(OutputDev *pOut, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bCrop, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool bPrinting, Catalog *pCatalog, bool(*abortCheckCbk)(void *pData) = NULL, void *abortCheckCbkData = NULL); + + void MakeBox(double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bUpSideDown, double dSliceX, double dSliceY, double dSliceW, double dSliceH, PDFRectangle *pBox, bool *pbCrop); + + void ProcessLinks(OutputDev *pOut, Catalog *pCatalog); + + void GetDefaultCTM(double *pCTM, double dHorizDPI, double dVertDPI, int nRotate, bool bUseMediaBox, bool bUpSideDown); + + private: + + XRef *m_pXref; // Таблица xref для данного PDF документа + int m_nNumber; // Номер страницы + PageAttrs *m_pAttrs; // Page attributes + Object m_oAnnots; // Annotations + Object m_oContents; // Содержимое страницы + Object m_oContents2; + bool m_bValid; // + + GlobalParams *m_pGlobalParams; + }; +} + +#endif // _PDF_READER_PAGE_H diff --git a/PdfReader/Src/Parser.cpp b/PdfReader/Src/Parser.cpp new file mode 100644 index 0000000000..e23c49df63 --- /dev/null +++ b/PdfReader/Src/Parser.cpp @@ -0,0 +1,250 @@ +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Decrypt.h" +#include "Parser.h" +#include "XRef.h" + +namespace PdfReader +{ + Parser::Parser(XRef *pXref, Lexer *pLexer, bool bAllowStreams) + { + m_pXref = pXref; + m_pLexer = pLexer; + m_nInlineImage = 0; + m_bAllowStreams = bAllowStreams; + m_pLexer->GetObject(&m_oBuffer1); + m_pLexer->GetObject(&m_oBuffer2); + } + + Parser::~Parser() + { + m_oBuffer1.Free(); + m_oBuffer2.Free(); + delete m_pLexer; + } + + Object *Parser::GetObject(Object *pObject, unsigned char *sDecryptKey, CryptAlgorithm eEncryptAlgorithm, int nKeyLength, int nObjectNum, int nObjectGen) + { + Stream *pStream = NULL; + Object oTemp; + int nNum = 0; + + // Обновляем буффер после Inline image data + if (m_nInlineImage == 2) + { + m_oBuffer1.Free(); + m_oBuffer2.Free(); + m_pLexer->GetObject(&m_oBuffer1); + m_pLexer->GetObject(&m_oBuffer2); + m_nInlineImage = 0; + } + + // Массив + if (m_oBuffer1.IsCommand("[")) + { + Shift(); + pObject->InitArray(m_pXref); + while (!m_oBuffer1.IsCommand("]") && !m_oBuffer1.IsEOF()) + pObject->ArrayAdd(GetObject(&oTemp, sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen)); + if (m_oBuffer1.IsEOF()) + { + // TO DO: Error "End of file inside array" + } + Shift(); + } + else if (m_oBuffer1.IsCommand("<<")) // Dictionary или Stream + { + Shift(); + pObject->InitDict(m_pXref); + while (!m_oBuffer1.IsCommand(">>") && !m_oBuffer1.IsEOF()) + { + if (!m_oBuffer1.IsName()) + { + // TO DO: Error "Dictionary key must be a name object" + Shift(); + } + else + { + char *sKey = CopyString(m_oBuffer1.GetName()); + Shift(); + if (m_oBuffer1.IsEOF() || m_oBuffer1.IsError()) + { + MemUtilsFree(sKey); + break; + } + pObject->DictAdd(sKey, GetObject(&oTemp, sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen)); + } + } + if (m_oBuffer1.IsEOF()) + { + // TO DO: Error "End of file inside dictionary" + } + // Объекты Stream Objects не допустимы внутри потока или объекта типа Stream Objects + if (m_bAllowStreams && m_oBuffer2.IsCommand("stream")) + { + if ((pStream = CreateStream(pObject, sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen))) + { + pObject->InitStream(pStream); + } + else + { + pObject->Free(); + pObject->InitError(); + } + } + else + { + Shift(); + } + } + else if (m_oBuffer1.IsInt()) // Либо ссылка, либо число + { + nNum = m_oBuffer1.GetInt(); + Shift(); + if (m_oBuffer1.IsInt() && m_oBuffer2.IsCommand("R")) + { + pObject->InitRef(nNum, m_oBuffer1.GetInt()); + Shift(); + Shift(); + } + else + { + pObject->InitInt(nNum); + } + } + else if (m_oBuffer1.IsString() && sDecryptKey) // строка + { + StringExt *seTemp = m_oBuffer1.GetString(); + StringExt *seRes = new StringExt(); + oTemp.InitNull(); + DecryptStream *pDecrypt = new DecryptStream(new MemoryStream(seTemp->GetBuffer(), 0, seTemp->GetLength(), &oTemp), sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen); + pDecrypt->Reset(); + int nChar = 0; + while ((nChar = pDecrypt->GetChar()) != EOF) + { + seRes->Append((char)nChar); + } + delete pDecrypt; + pObject->InitString(seRes); + Shift(); + } + else // простой объект + { + m_oBuffer1.Copy(pObject); + Shift(); + } + + return pObject; + } + + Stream *Parser::CreateStream(Object *pDict, unsigned char *sDecryptKey, CryptAlgorithm eEncryptAlgorithm, int nKeyLength, int nObjectNum, int nObjectGen) + { + Object oTemp; + unsigned int nLength, unEndPos; + + m_pLexer->SkipToNextLine(); + unsigned int unPos = m_pLexer->GetPos(); + + // Считываем длину + pDict->DictLookup("Length", &oTemp); + if (oTemp.IsInt()) + { + nLength = (unsigned int)oTemp.GetInt(); + oTemp.Free(); + } + else + { + oTemp.Free(); + unsigned int unEndPos = unPos; + + while (!m_oBuffer2.IsCommand("endstream") && !m_oBuffer2.IsEOF()) + { + unEndPos = m_pLexer->GetPos(); + Shift(); + } + + nLength = unEndPos - unPos; + m_pLexer->SetPos(unPos); + + // Оставим на всякий случай заглушку + if (nLength <= 0) + nLength = 5000; + } + + // Меняем длину, если файл поврежден + if (m_pXref && m_pXref->GetStreamEnd(unPos, &unEndPos)) + { + nLength = unEndPos - unPos; + } + + // В сильно повержденных файлах PDF, выставляем конец потока сразу + // после его начала + if (!m_pLexer->GetStream()) + { + return NULL; + } + + BaseStream *pBaseStream = m_pLexer->GetStream()->GetBaseStream(); + + // Пропускаем данный потока + m_pLexer->SetPos(unPos + nLength); + + // Проверяем 'endstream' + Shift(); // '>>' + Shift(); // 'endstream' + if (m_oBuffer1.IsCommand("endstream")) + { + Shift(); + } + else + { + // TO DO : Error "Missing 'endstream'" + + // Заплатка для поврежденных файлов: + nLength += 5000; + } + + Stream *pStream = pBaseStream->MakeSubStream(unPos, true, nLength, pDict); + + // Decryption + if (sDecryptKey) + { + pStream = new DecryptStream(pStream, sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen); + } + + // Filters + pStream = pStream->AddFilters(pDict); + + return pStream; + } + + void Parser::Shift() + { + if (m_nInlineImage > 0) + { + if (m_nInlineImage < 2) + { + ++m_nInlineImage; + } + else + { + // В поврежденном потоке, если 'ID' появляется в середине потока, + // нужно сбросить параметры + m_nInlineImage = 0; + } + } + else if (m_oBuffer2.IsCommand("ID")) + { + m_pLexer->SkipChar(); // пропускаем символ после команды 'ID' + m_nInlineImage = 1; + } + m_oBuffer1.Free(); + m_oBuffer1 = m_oBuffer2; + if (m_nInlineImage > 0) // не буфферизируем данные Inline Image + m_oBuffer2.InitNull(); + else + m_pLexer->GetObject(&m_oBuffer2); + } +} \ No newline at end of file diff --git a/PdfReader/Src/Parser.h b/PdfReader/Src/Parser.h new file mode 100644 index 0000000000..740bc1dd27 --- /dev/null +++ b/PdfReader/Src/Parser.h @@ -0,0 +1,50 @@ +#ifndef _PDF_READER_PARSER_H +#define _PDF_READER_PARSER_H + +#include "Lexer.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------ + // Parser + //------------------------------------------------------------------------ + + class Parser + { + public: + + Parser(XRef *pXref, Lexer *pLexer, bool bAllowStreams); + + ~Parser(); + + // Считываем следующий объект из потока. + Object *GetObject(Object *pObject, unsigned char *sDecryptKey = NULL, CryptAlgorithm eEncryptAlgorithm = cryptRC4, int nKeyLength = 0, int nObjectNum = 0, int nObjectGen = 0); + + Stream *GetStream() + { + return m_pLexer->GetStream(); + } + + int GetPos() + { + return m_pLexer->GetPos(); + } + + private: + + Stream *CreateStream(Object *pDict, unsigned char *sDecryptKey, CryptAlgorithm eEncryptAlgorithm, int nKeyLength, int nObjectNum, int nObjectGen); + void Shift(); + + private: + + XRef *m_pXref; // Таблица Xref для даннthe xref table for this PDF file + Lexer *m_pLexer; // Входящий поток + bool m_bAllowStreams; // Будем ли парсить Stream Objects? + Object m_oBuffer1; // Два следующих объекта + Object m_oBuffer2; // + int m_nInlineImage; // Устанавливаем, когда сталкиваемся с Inline Image + }; +} + +#endif // _PDF_READER_PARSER_H + diff --git a/PdfReader/Src/ReadMe.txt b/PdfReader/Src/ReadMe.txt new file mode 100644 index 0000000000..9613509777 --- /dev/null +++ b/PdfReader/Src/ReadMe.txt @@ -0,0 +1,68 @@ +======================================================================== + ACTIVE TEMPLATE LIBRARY : AVSOfficePDFReader Project Overview +======================================================================== + +AppWizard has created this AVSOfficePDFReader project for you to use as the starting point for +writing your Dynamic Link Library (DLL). + +This project is implemented with Visual C++ attributes. + +This file contains a summary of what you will find in each of the files that +make up your project. + +AVSOfficePDFReader.vcproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +_AVSOfficePDFReader.idl + This file will be generated by the compiler when the project is built. It will contain the IDL + definitions of the type library, the interfaces and co-classes defined in your project. + This file will be processed by the MIDL compiler to generate: + C++ interface definitions and GUID declarations (_AVSOfficePDFReader.h) + GUID definitions (_AVSOfficePDFReader_i.c) + A type library (_AVSOfficePDFReader.tlb) + Marshaling code (_AVSOfficePDFReader_p.c and dlldata.c) + +AVSOfficePDFReader.cpp + This file contains the object map and the implementation of your DLL's exports. + +AVSOfficePDFReader.rc + This is a listing of all of the Microsoft Windows resources that the + program uses. + +AVSOfficePDFReader.def + This module-definition file provides the linker with information about the exports + required by your DLL. It contains exports for: + DllGetClassObject + DllCanUnloadNow + GetProxyDllInfo + DllRegisterServer + DllUnregisterServer + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named AVSOfficePDFReader.pch and a precompiled types file named StdAfx.obj. + +Resource.h + This is the standard header file that defines resource IDs. + +///////////////////////////////////////////////////////////////////////////// +Proxy/stub DLL project and module definition file: + +AVSOfficePDFReaderps.vcproj + This file is the project file for building a proxy/stub DLL if necessary. + The IDL file in the main project must contain at least one interface and you must + first compile the IDL file before building the proxy/stub DLL. This process generates + dlldata.c, AVSOfficePDFReader_i.c and AVSOfficePDFReader_p.c which are required + to build the proxy/stub DLL. + +AVSOfficePDFReaderps.def + This module definition file provides the linker with information about the exports + required by the proxy/stub. + +///////////////////////////////////////////////////////////////////////////// diff --git a/PdfReader/Src/RendererOutputDev.cpp b/PdfReader/Src/RendererOutputDev.cpp new file mode 100644 index 0000000000..92462512e5 --- /dev/null +++ b/PdfReader/Src/RendererOutputDev.cpp @@ -0,0 +1,3640 @@ +#include "GState.h" +#include "GFont.h" +#include "File.h" +#include "CMap.h" +#include "Dict.h" +#include "Stream.h" +#include "FontFileTrueType.h" +#include "FontFileType1C.h" +#include "CharCodeToUnicode.h" +#include "RendererOutputDev.h" +#include "XmlUtils.h" + +#include "../../DesktopEditor/graphics/Image.h" +#include "../../DesktopEditor/fontengine/ApplicationFonts.h" +#include "../../DesktopEditor/common/File.h" +#include "../../DesktopEditor/common/Array.h" + +// TODO: 1. Перезапись в PDF не будет работать из-за того, что в рендерере убраны нужные функции +// 2. Градиентные заливки +// 3. FontManager->GetFontType +// 4. FontManager->GetNameIndex +// 5. m_pRenderer->SetAdditionalParam(L"TilingHtmlPattern", oWriter.GetXmlString()); +// 6. Подбор шрифтов необходимо перенести в GlobalParams->FindFontFile +// 7. Добавить обработку стандартных 14 шрифтов +// 8. В идентефикацию шрифта к путю добавить номер шрифта в файле +// 9. Реализовать линейный и радиальный градиенты + +namespace PdfReader +{ + //-------------------------------------------------------------------------------------- + // CFontList + //-------------------------------------------------------------------------------------- + CFontList::CFontList() + { + m_oCS.InitializeCriticalSection(); + m_oFontMap.clear(); + } + CFontList::~CFontList() + { + m_oCS.DeleteCriticalSection(); + Clear(); + } + void CFontList::LoadFromFile(std::wstring wsDirPath) + { + return; + //Clear(); + + //CStringW wsFilePath = wsDirPath + CStringW( _T("/FontList.rsc") ); + //XmlUtils::CXmlNode oMainNode; + + //if ( !oMainNode.FromXmlFile( wsFilePath ) ) + // return; + + //if ( _T("PDFFontList") == oMainNode.GetName() ) + //{ + // XmlUtils::CXmlNodes oFonts; + // oMainNode.GetNodes( _T("Font"), oFonts ); + // for ( int nIndex = 0; nIndex < oFonts.GetCount(); nIndex++ ) + // { + // XmlUtils::CXmlNode oFont; + // Ref oRef; + // CStringW sFilePath; + // int nLength = 0; + // unsigned short *pCodeToGid = NULL, *pCodeToUnicode = NULL; + + // if ( oFonts.GetAt( nIndex, oFont ) ) + // { + // XmlUtils::CXmlNode oNode; + // CStringW sValue; + + // if ( oFont.GetNode( _T("ID"), oNode ) ) + // { + // sValue = oNode.GetAttribute( _T("num") ); + // oRef.nNum = XmlUtils::GetInteger( sValue ); + // sValue = oNode.GetAttribute( _T("gen") ); + // oRef.nGen = XmlUtils::GetInteger( sValue ); + // } + + // if ( oFont.GetNode( _T("FilePath"), oNode ) ) + // { + // sFilePath = oNode.GetAttribute( _T("value") ); + // } + // if ( oFont.GetNode( _T("CodeToGid"), oNode ) ) + // { + // sValue = oNode.GetAttribute( _T("length") ); + // nLength = XmlUtils::GetInteger( sValue ); + // pCodeToGid = (unsigned short *)MemUtilsMalloc( sizeof(unsigned short) * nLength ); + // if ( !pCodeToGid ) + // return; + + // XmlUtils::CXmlNodes oArray; + // oNode.GetNodes( _T("Entry"), oArray ); + // for ( int nCurIndex = 0; nCurIndex < oArray.GetCount() && nCurIndex < nLength; nCurIndex++ ) + // { + // XmlUtils::CXmlNode oArrayItem; + // if ( oArray.GetAt( nCurIndex, oArrayItem ) ) + // { + // sValue = oArrayItem.GetAttribute( _T("value") ); + // pCodeToGid[nCurIndex] = XmlUtils::GetInteger( sValue ); + // } + // else + // pCodeToGid[nCurIndex] = 0; + // } + // } + // if ( oFont.GetNode( _T("CodeToUnicode"), oNode ) ) + // { + // sValue = oNode.GetAttribute( _T("length") ); + // nLength = XmlUtils::GetInteger( sValue ); + // pCodeToUnicode = (unsigned short *)MemUtilsMalloc( sizeof(unsigned short) * nLength ); + // if ( !pCodeToUnicode ) + // return; + + // XmlUtils::CXmlNodes oArray; + // oNode.GetNodes( _T("Entry"), oArray ); + // for ( int nCurIndex = 0; nCurIndex < oArray.GetCount() && nCurIndex < nLength; nCurIndex++ ) + // { + // XmlUtils::CXmlNode oArrayItem; + // if ( oArray.GetAt( nCurIndex, oArrayItem ) ) + // { + // sValue = oArrayItem.GetAttribute( _T("value") ); + // pCodeToUnicode[nCurIndex] = XmlUtils::GetInteger( sValue ); + // } + // else + // pCodeToUnicode[nCurIndex] = 0; + // } + // } + + // } + + // Add( oRef, sFilePath, pCodeToGid, pCodeToUnicode, nLength ); + // } + //} + } + void CFontList::SaveToFile(std::wstring wsDirPath) + { + return; + //CStringW wsFilePath = wsDirPath + CStringW( _T("/FontList.rsc") ); + //XmlUtils::CXmlWriter oWriter; + + //oWriter.WriteNodeBegin( _T("PDFFontList") ); + + //for ( int nIndex = 0; nIndex < (int)m_arrList.GetCount(); nIndex++ ) + //{ + // TFontEntry oEntry = m_arrList.GetAt( nIndex ); + // oWriter.WriteNodeBegin( _T("Font") ); + + + // oWriter.WriteNodeBegin( _T("ID"), true ); + // oWriter.WriteAttribute( _T("num"), oEntry.oRef.nNum ); + // oWriter.WriteAttribute( _T("gen"), oEntry.oRef.nGen ); + // oWriter.WriteNodeEnd( _T("ID"), true, true ); + + // oWriter.WriteNodeBegin( _T("FilePath"), true ); + // oWriter.WriteAttribute( _T("value"), oEntry.wsFilePath ); + // oWriter.WriteNodeEnd( _T("FilePath"), true, true ); + + // if ( NULL != oEntry.pCodeToGID ) + // { + // oWriter.WriteNodeBegin( _T("CodeToGid"), true ); + // oWriter.WriteAttribute( _T("length"), oEntry.nLen ); + // oWriter.WriteNodeEnd( _T("CodeToGid"), true, false ); + // for ( int nCurIndex = 0; nCurIndex < oEntry.nLen; nCurIndex++ ) + // { + // oWriter.WriteNodeBegin( _T("Entry"), true ); + // oWriter.WriteAttribute( _T("value"), oEntry.pCodeToGID[nCurIndex] ); + // oWriter.WriteNodeEnd( _T("Entry"), true, true ); + // } + // oWriter.WriteNodeEnd( _T("CodeToGid") ); + // } + + // if ( NULL != oEntry.pCodeToUnicode ) + // { + // oWriter.WriteNodeBegin( _T("CodeToUnicode"), true ); + // oWriter.WriteAttribute( _T("length"), oEntry.nLen ); + // oWriter.WriteNodeEnd( _T("CodeToUnicode"), true, false ); + // for ( int nCurIndex = 0; nCurIndex < oEntry.nLen; nCurIndex++ ) + // { + // oWriter.WriteNodeBegin( _T("Entry"), true ); + // oWriter.WriteAttribute( _T("value"), oEntry.pCodeToUnicode[nCurIndex] ); + // oWriter.WriteNodeEnd( _T("Entry"), true, true ); + // } + // oWriter.WriteNodeEnd( _T("CodeToUnicode") ); + // } + + // oWriter.WriteNodeEnd( _T("Font") ); + //} + //oWriter.WriteNodeEnd( _T("PDFFontList") ); + + //oWriter.SaveToFile( wsFilePath ); + } + bool CFontList::Find(Ref oRef, TFontEntry *pEntry) + { + CTemporaryCS* pCS = new CTemporaryCS(&m_oCS); + + bool bResult = (NULL != (pEntry = Lookup(oRef))); + + if (bResult) + { + // Шрифт нашелся, но пока им пользоваться нельзя, потому что он загружается в параллельном потоке + while (!pEntry->bAvailable) + Sleep(10); + } + + RELEASEOBJECT(pCS); + + return bResult; + } + bool CFontList::Find2(Ref oRef, TFontEntry **ppEntry) + { + CTemporaryCS* pCS = new CTemporaryCS(&m_oCS); + + bool bResult = (NULL != ((*ppEntry) = Lookup(oRef))); + + if (bResult) + { + // Шрифт нашелся, но пока им пользоваться нельзя, потому что он загружается в параллельном потоке + while (!(*ppEntry)->bAvailable) + Sleep(10); + } + + if (!bResult) + { + (*ppEntry) = Add(oRef, L"", NULL, NULL, 0, 0); + (*ppEntry)->bAvailable = false; + } + + RELEASEOBJECT(pCS); + + return bResult; + } + TFontEntry* CFontList::Add(Ref oRef, std::wstring wsFileName, unsigned short *pCodeToGID, unsigned short *pCodeToUnicode, unsigned int unLenGID, unsigned int unLenUnicode) + { + // Данная функция приходит только из Find2, поэтому проверять есть ли данный шрифт уже не надо + CTemporaryCS* pCS = new CTemporaryCS(&m_oCS); + + TFontEntry *pNewEntry = new TFontEntry; + pNewEntry->oRef.nGen = oRef.nGen; + pNewEntry->oRef.nNum = oRef.nNum; + pNewEntry->wsFilePath = wsFileName; + pNewEntry->pCodeToGID = pCodeToGID; + pNewEntry->pCodeToUnicode = pCodeToUnicode; + pNewEntry->unLenGID = unLenGID; + pNewEntry->unLenUnicode = unLenUnicode; + + Add(oRef, pNewEntry); + + RELEASEOBJECT(pCS); + + return pNewEntry; + } + void CFontList::Clear() + { + for (auto const &oIt : m_oFontMap) + { + TFontEntry *pEntry = oIt.second; + if (NULL != pEntry) + { + MemUtilsFree(pEntry->pCodeToGID); + MemUtilsFree(pEntry->pCodeToUnicode); + } + delete pEntry; + } + m_oFontMap.clear(); + } + bool CFontList::GetFont(Ref *pRef, TFontEntry *pEntry) + { + TFontEntry* pFindEntry = Lookup(*pRef); + if (NULL == pFindEntry) + return false; + + *pEntry = *pFindEntry; + return true; + } + //-------------------------------------------------------------------------------------- + // RendererOutputDev + //-------------------------------------------------------------------------------------- + RendererOutputDev::RendererOutputDev(GlobalParams *pGlobalParams, IRenderer *pRenderer, CFontManager* pFontManager, CFontList *pFontList) + { + m_pFontManager = pFontManager; + m_pGlobalParams = pGlobalParams; + m_pFontList = pFontList; + + m_bTiling = false; + + m_pBufferTextClip = NULL; + m_pClip = NULL; + + m_lRendererType = c_nUnknownRenderer; + m_pRenderer = pRenderer; + + m_bUseAxialShaded = false; + m_bUseRadialShaded = false; + + if (NULL != m_pRenderer) + { + m_pRenderer->put_PenColor(0); + m_pRenderer->put_PenAlpha(255); + m_pRenderer->put_PenSize(1); + + m_pRenderer->put_FontName(L"Arial"); + m_pRenderer->put_FontStyle(0); + m_pRenderer->put_FontSize(10.0); + + m_pRenderer->get_Type(&m_lRendererType); + //if (c_nSWFRenderer == m_lRendererType) + //{ + // m_bUseAxialShaded = true; + // m_bUseRadialShaded = true; + //} + } + + m_pbBreak = NULL; + m_bTransparentGroup = false; + m_bTransparentGroupSoftMask = false; + m_pTransparentGroupSoftMask = NULL; + + //m_oFontList.LoadFromFile( m_pGlobalParams->GetTempFolder() ); + //// Тестовый пример + //m_pRenderer->NewPage(); + //m_pRenderer->BeginCommand( c_nPageType ); + + //m_pRenderer->SetWidth( 100.0f ); + //m_pRenderer->SetHeight( 100.0f ); + + //m_oFont.SetFontSize( 1.0 ); + //m_oPen.SetSize( 0.3 ); + //m_oPen.SetAlpha( 128 ); + //m_pRenderer->SetFont( m_oFont.ToXmlString().AllocSysString() ); + //m_pRenderer->SetShadow( m_oShadow.ToXmlString().AllocSysString() ); + //m_pRenderer->SetPen( m_oPen.ToXmlString().AllocSysString() ); + + //m_pRenderer->PathCommandMoveTo( 0, 50 ); + //m_pRenderer->PathCommandLineTo( 100, 50 ); + //m_pRenderer->DrawPath( c_nStroke ); + + //m_pRenderer->PathCommandMoveTo( 50, 0 ); + //m_pRenderer->PathCommandLineTo( 50, 100 ); + //m_pRenderer->DrawPath( c_nStroke ); + // + //m_oPen.SetSize( 0.3 ); + //m_oPen.SetAlpha( 255 ); + //m_pRenderer->SetPen( m_oPen.ToXmlString().AllocSysString() ); + + //IAVSOfficeRendererTemplate2 *pRenderer2 = NULL; + //m_pRenderer->QueryInterface( __uuidof(AVSOfficeEditor::IAVSOfficeRendererTemplate2), (void**)&pRenderer2 ); + + //double pNewTm[6], arrMatrix[6]; + //double dAscent = 0.905; + //double dDescent = -0.211; + //double dKoef = ( dAscent - fabs( dDescent ) ) * 1; + + //double pCTM[6] = { 10, 0, 0, 10, 50, 50}; + //pNewTm[0] = 1;//pTm[0]; + //pNewTm[1] = 0;//pTm[1]; + //pNewTm[2] = -0;//pTm[2]; + //pNewTm[3] = -1;//pTm[3]; + //pNewTm[4] = 0 + 0 * dKoef; + //pNewTm[5] = 0 + 1 * dKoef; + + //arrMatrix[0] = pNewTm[0] * pCTM[0] + pNewTm[1] * pCTM[2]; + //arrMatrix[1] = -(pNewTm[0] * pCTM[1] + pNewTm[1] * pCTM[3]); + //arrMatrix[2] = pNewTm[2] * pCTM[0] + pNewTm[3] * pCTM[2]; + //arrMatrix[3] = -(pNewTm[2] * pCTM[1] + pNewTm[3] * pCTM[3]); + //arrMatrix[4] = pNewTm[4] * pCTM[0] + pNewTm[5] * pCTM[2] + pCTM[4]; + //arrMatrix[5] = -(pNewTm[4] * pCTM[1] + pNewTm[5] * pCTM[3] + pCTM[5]) + 100; + + //double dAcsentFactor = ( ( fabs(-0.324) + fabs(1.005) ) - ( dAscent + fabs( dDescent ) ) ) / 2 + dAscent; + //double dAscentShiftX = -arrMatrix[2] * dAcsentFactor; + //double dAscentShiftY = -arrMatrix[3] * dAcsentFactor; + + ////arrMatrix[4] += dAscentShiftX; + ////arrMatrix[5] += dAscentShiftY; + + + //pRenderer2->SetTransform( arrMatrix[0], arrMatrix[1], arrMatrix[2], arrMatrix[3], arrMatrix[4], arrMatrix[5] ); + + //m_pRenderer->PathCommandMoveTo( -0.664, -0.324 ); + //m_pRenderer->PathCommandLineTo( 2.000, -0.324 ); + //m_pRenderer->PathCommandLineTo( 2.000, 1.005 ); + //m_pRenderer->PathCommandLineTo( -0.664, 1.005 ); + //m_pRenderer->PathCommandClose(); + //m_pRenderer->DrawPath( c_nStroke ); + + + //m_pRenderer->CommandDrawText( _T("A"), 0, 0, 0, 0, 0 ); + + //double dAlpha = 0*(3.14 / 180.f) * 160; + //pRenderer2->SetTransform( cos( dAlpha ), -sin( dAlpha ), -sin( dAlpha ), -cos( dAlpha ), 50, 50 ); + //m_pRenderer->PathCommandMoveTo( 0, 0 ); + //m_pRenderer->PathCommandLineTo( 10, 0 ); + //m_pRenderer->PathCommandLineTo( 10, 10 ); + //m_pRenderer->PathCommandLineTo( 0, 10 ); + //m_pRenderer->PathCommandClose(); + //m_pRenderer->DrawPath( c_nStroke ); + + //m_pRenderer->EndCommand( c_nPageType ); + //RELEASEINTERFACE( pRenderer2 ); + } + RendererOutputDev::~RendererOutputDev() + { + m_pRenderer = NULL; + + if (m_pClip) + delete m_pClip; + + if (m_pBufferTextClip) + delete m_pBufferTextClip; + + if (m_pTransparentGroupSoftMask) + delete[]m_pTransparentGroupSoftMask; + } + void RendererOutputDev::StartPage(int nPageIndex, GrState *pGState) + { + m_pRenderer->NewPage(); + m_pRenderer->BeginCommand(c_nPageType); + + // Переводим пункты в миллиметры + double dPageHeight = PDFCoordsToMM(pGState->GetPageHeight()); + double dPageWidth = PDFCoordsToMM(pGState->GetPageWidth()); + + m_arrMatrix[0] = 1; m_arrMatrix[1] = 0; + m_arrMatrix[2] = 0; m_arrMatrix[3] = 1; + m_arrMatrix[4] = 0; m_arrMatrix[5] = 0; + + m_pRenderer->put_Width(dPageWidth); + m_pRenderer->put_Height(dPageHeight); + + m_bTransparentGroup = false; + m_bTransparentGroupSoftMask = false; + + if (m_pTransparentGroupSoftMask) + delete[]m_pTransparentGroupSoftMask; + m_pTransparentGroupSoftMask = NULL; + } + void RendererOutputDev::EndPage() + { + m_pRenderer->EndCommand(c_nPageType); + } + void RendererOutputDev::SaveGState(GrState *pGState) + { + UpdateAll(pGState); + } + void RendererOutputDev::RestoreGState(GrState *pGState) + { + UpdateAll(pGState); + } + void RendererOutputDev::UpdateCTM(GrState *pGState, double dMatrix11, double dMatrix12, double dMatrix21, double dMatrix22, double dMatrix31, double dMatrix32) + { + } + void RendererOutputDev::UpdateLineDash(GrState *pGState) + { + double *pDash = NULL; + int nSize = 0; + double dStart = 0; + pGState->GetLineDash(&pDash, &nSize, &dStart); + + if (0 == nSize) // Solid + { + m_pRenderer->put_PenDashStyle(Aggplus::DashStyleSolid); + m_pRenderer->put_PenDashOffset(0); + } + else + { + m_pRenderer->PenDashPattern(pDash, (long)nSize); + m_pRenderer->put_PenDashStyle(Aggplus::DashStyleCustom); + m_pRenderer->put_PenDashOffset(dStart); + } + } + void RendererOutputDev::UpdateFlatness(GrState *pGState) + { + } + void RendererOutputDev::UpdateLineJoin(GrState *pGState) + { + int nJoinStyle = pGState->GetLineJoin(); + if (1 == nJoinStyle) + nJoinStyle = 2; + else if (2 == nJoinStyle) + nJoinStyle = 1; + + m_pRenderer->put_PenLineJoin(nJoinStyle); + } + void RendererOutputDev::UpdateLineCap(GrState *pGState) + { + int nCapStyle = pGState->GetLineCap(); + if (1 == nCapStyle) + nCapStyle = 2; + else if (2 == nCapStyle) + nCapStyle = 1; + + m_pRenderer->put_PenLineStartCap(nCapStyle); + m_pRenderer->put_PenLineEndCap(nCapStyle); + } + void RendererOutputDev::UpdateMiterLimit(GrState *pGState) + { + } + void RendererOutputDev::UpdateLineWidth(GrState *pGState) + { + m_pRenderer->put_PenSize(PDFCoordsToMM(pGState->GetLineWidth())); + } + void RendererOutputDev::UpdateStrokeAdjust(GrState *pGState) + { + } + void RendererOutputDev::UpdateFillColor(GrState *pGState) + { + GrColor *pColor = pGState->GetFillColor(); + GrColorSpace *pColorSpace = pGState->GetFillColorSpace(); + + DWORD dwColor = pColorSpace->GetDwordColor(pColor); + + m_pRenderer->put_BrushColor1(dwColor); + m_pRenderer->put_BrushColor2(dwColor); + } + void RendererOutputDev::UpdateStrokeColor(GrState *pGState) + { + GrColor *pColor = pGState->GetStrokeColor(); + GrColorSpace *pColorSpace = pGState->GetStrokeColorSpace(); + + DWORD dwColor = pColorSpace->GetDwordColor(pColor); + + m_pRenderer->put_PenColor(dwColor); + } + void RendererOutputDev::UpdateBlendMode(GrState *pGState) + { + } + void RendererOutputDev::UpdateFillOpacity(GrState *pGState) + { + m_pRenderer->put_BrushAlpha1(min(255, max(0, int(pGState->GetFillOpacity() * 255)))); + m_pRenderer->put_BrushAlpha2(min(255, max(0, int(pGState->GetFillOpacity() * 255)))); + } + void RendererOutputDev::UpdateStrokeOpacity(GrState *pGState) + { + m_pRenderer->put_PenAlpha(min(255, max(0, int(pGState->GetStrokeOpacity() * 255)))); + } + void RendererOutputDev::UpdateAll(GrState *pGState) + { + UpdateCTM(pGState, pGState->GetCTM()[0], pGState->GetCTM()[1], pGState->GetCTM()[2], pGState->GetCTM()[3], pGState->GetCTM()[4], pGState->GetCTM()[5]); + UpdateLineDash(pGState); + UpdateFlatness(pGState); + UpdateLineJoin(pGState); + UpdateLineCap(pGState); + UpdateMiterLimit(pGState); + UpdateLineWidth(pGState); + UpdateStrokeAdjust(pGState); + UpdateFillColorSpace(pGState); + UpdateFillColor(pGState); + UpdateStrokeColorSpace(pGState); + UpdateStrokeColor(pGState); + UpdateBlendMode(pGState); + UpdateFillOpacity(pGState); + UpdateStrokeOpacity(pGState); + UpdateFont(pGState); + UpdateClip(pGState); + } + void RendererOutputDev::UpdateRender(GrState *pGState) + { + + } + void RendererOutputDev::UpdateFont(GrState *pGState) + { + // Проверяем наличие списка со шрифтами + if (NULL == m_pFontList) + return; + + GrFont *pFont = pGState->GetFont(); + if (NULL == pFont) + return; + + m_pRenderer->put_FontSize(pGState->GetFontSize()); + //m_oFont.Size = pGState->GetFontSize(); + + std::wstring wsFileName = L""; + std::wstring wsFontName = L""; + TFontEntry *pEntry = NULL; + if (!m_pFontList->Find2((*pFont->GetID()), &pEntry)) + { + GrFontType eFontType = pFont->GetType(); + if (fontType3 == eFontType) // FontType3 обрабатывается отдельной командой + { + pEntry->bAvailable = true; + return; + } + + std::wstring wsTempFileName = L""; + Ref oEmbRef; + // 1. Если шрифт внедренный, тогда скидываем его в темповый файл. + // 2. Если шрифт лежит вне пдф, а в самом пдф есть ссылка на него, тогда используем эту ссылку. + // 3. В противном случае подбираем шрифт. + if (pFont->GetEmbeddedFontFileRef(&oEmbRef)) + { + std::wstring wsExt; + switch (pFont->GetType()) + { + case fontType1: wsExt = L".pfb_t1"; break; + case fontType1C: wsExt = L".pfb_t1c"; break; + case fontType1COT: wsExt = L".pfb_t1cot"; break; + case fontTrueType: wsExt = L".ttf"; break; + case fontTrueTypeOT: wsExt = L".otf"; break; + case fontCIDType0: wsExt = L".cid_0"; break; + case fontCIDType0C: wsExt = L".cid_0c"; break; + case fontCIDType0COT: wsExt = L".cid_0cot"; break; + case fontCIDType2: wsExt = L".cid_2"; break; + case fontCIDType2OT: wsExt = L".cid_2ot"; break; + } + + FILE* pTempFile = NULL; + if (!NSFile::CFileBinary::OpenTempFile(&wsTempFileName, &pTempFile, L"wb", (wchar_t*)wsExt.c_str(), (wchar_t*)m_pGlobalParams->GetTempFolder().c_str(), NULL)) + { + if (L"" != wsTempFileName) + NSFile::CFileBinary::Remove(wsTempFileName); + + pEntry->bAvailable = true; + return; + } + + Object oReferenceObject, oStreamObject; + oReferenceObject.InitRef(oEmbRef.nNum, oEmbRef.nGen); + oReferenceObject.Fetch(m_pXref, &oStreamObject); + oReferenceObject.Free(); + if (!oStreamObject.IsStream()) + { + // Внедренный шрифт неправильно записан + oStreamObject.Free(); + fclose(pTempFile); + + if (L"" != wsTempFileName) + NSFile::CFileBinary::Remove(wsTempFileName); + + pEntry->bAvailable = true; + return; + } + oStreamObject.StreamReset(); + int nChar; + while ((nChar = oStreamObject.StreamGetChar()) != EOF) + { + fputc(nChar, pTempFile); + } + oStreamObject.StreamClose(); + oStreamObject.Free(); + fclose(pTempFile); + wsFileName = wsTempFileName; + + // Для шрифтов типа Type1 нужно дописать Afm файл с метриками + if (fontType1 == pFont->GetType() || fontType1C == pFont->GetType() || fontType1COT == pFont->GetType()) + { + std::wstring wsSplitFileName, wsSplitFileExt; + SpitPathExt(wsFileName, &wsSplitFileName, &wsSplitFileExt); + std::wstring wsAfmPath = wsSplitFileName + L".afm"; + + NSFile::CFileBinary oFile; + oFile.CreateFileW(wsAfmPath); + FILE* pFile = oFile.GetFileNative(); + if (pFile) + { + Ref *pRef = pFont->GetID(); + Object oRefObject, oFontObject; + oRefObject.InitRef(pRef->nNum, pRef->nGen); + oRefObject.Fetch(m_pXref, &oFontObject); + oRefObject.Free(); + + if (oFontObject.IsDict()) + { + char *sFontName = NULL, *sFontFamily = NULL, *sFontStretch = NULL; + int nFontWeight = 0, nItalicAngle = 0, nAscent = 0, nDescent = 0, nLeading = 0; + int nCapHeight = 0, nXHeight = 0, nStemV = 0, nStemH = 0, nAvgWidth = 0, nMaxWidth = 0, nMissingWidth = 0; + Array *pBBox = NULL; + int arrBBox[4] ={ 0, 0, 0, 0 }; + + Dict *pFontDict = oFontObject.GetDict(); + Object oFontDescriptor; + if (pFontDict->Search("FontDescriptor", &oFontDescriptor)->IsDict()) + { + Object oDictItem; + // FontName + oFontDescriptor.DictLookup("FontName", &oDictItem); + if (oDictItem.IsName()) sFontName = oDictItem.GetName(); + oDictItem.Free(); + + // FontFamily + oFontDescriptor.DictLookup("FontFamily", &oDictItem); + if (oDictItem.IsName()) sFontFamily = oDictItem.GetName(); + oDictItem.Free(); + + // FontStretch + oFontDescriptor.DictLookup("FontStretch", &oDictItem); + if (oDictItem.IsName()) sFontStretch = oDictItem.GetName(); + oDictItem.Free(); + + // FontWeight + oFontDescriptor.DictLookup("FontWeight", &oDictItem); + if (oDictItem.IsInt()) nFontWeight = oDictItem.GetInt(); + oDictItem.Free(); + + // FontBBox + oFontDescriptor.DictLookup("FontBBox", &oDictItem); + if (oDictItem.IsArray()) pBBox = oDictItem.GetArray(); + if (4 == pBBox->GetCount()) + { + for (int nIndex = 0; nIndex < 4; nIndex++) + { + Object oArrayItem; + pBBox->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + arrBBox[nIndex] = oArrayItem.GetInt(); + + oArrayItem.Free(); + } + } + oDictItem.Free(); + + // ItalicAngle + oFontDescriptor.DictLookup("ItalicAngle", &oDictItem); + if (oDictItem.IsInt()) nItalicAngle = oDictItem.GetInt(); + oDictItem.Free(); + + // Ascent + oFontDescriptor.DictLookup("Ascent", &oDictItem); + if (oDictItem.IsInt()) nAscent = oDictItem.GetInt(); + oDictItem.Free(); + + // Leading + oFontDescriptor.DictLookup("Leading", &oDictItem); + if (oDictItem.IsInt()) nLeading = oDictItem.GetInt(); + oDictItem.Free(); + + // CapHeight + oFontDescriptor.DictLookup("CapHeight", &oDictItem); + if (oDictItem.IsInt()) nCapHeight = oDictItem.GetInt(); + oDictItem.Free(); + + // XHeight + oFontDescriptor.DictLookup("XHeight", &oDictItem); + if (oDictItem.IsInt()) nXHeight = oDictItem.GetInt(); + oDictItem.Free(); + + // StemV + oFontDescriptor.DictLookup("StemV", &oDictItem); + if (oDictItem.IsInt()) nStemV = oDictItem.GetInt(); + oDictItem.Free(); + + // StemH + oFontDescriptor.DictLookup("StemH", &oDictItem); + if (oDictItem.IsInt()) nStemH = oDictItem.GetInt(); + oDictItem.Free(); + + // Descent + oFontDescriptor.DictLookup("Descent", &oDictItem); + if (oDictItem.IsInt()) nDescent = oDictItem.GetInt(); + oDictItem.Free(); + + // AvgWidth + oFontDescriptor.DictLookup("AvgWidth", &oDictItem); + if (oDictItem.IsInt()) nAvgWidth = oDictItem.GetInt(); + oDictItem.Free(); + + // MaxWidth + oFontDescriptor.DictLookup("MaxWidth", &oDictItem); + if (oDictItem.IsInt()) nMaxWidth = oDictItem.GetInt(); + oDictItem.Free(); + + // MissingWidth + oFontDescriptor.DictLookup("MissingWidth", &oDictItem); + if (oDictItem.IsInt()) nMissingWidth = oDictItem.GetInt(); + oDictItem.Free(); + + } + oFontDescriptor.Free(); + + fprintf(pFile, "StartFontMetrics 3.0\n"); + if (NULL != sFontName) fprintf(pFile, "FontName %s\n", sFontName); + if (NULL != sFontFamily) fprintf(pFile, "FamilyName %s\n", sFontFamily); + if (nFontWeight >= 550) fprintf(pFile, "Weight Bold\n"); + + fprintf(pFile, "ItalicAngle %d\n", nItalicAngle); + + fprintf(pFile, "FontBBox %d %d %d %d\n", arrBBox[0], arrBBox[1], arrBBox[2], arrBBox[3]); + + fprintf(pFile, "CapHeight %d\n", nCapHeight); + fprintf(pFile, "XHeight %d\n", nXHeight); + fprintf(pFile, "Ascender %d\n", nAscent); + fprintf(pFile, "Descender %d\n", nDescent); + fprintf(pFile, "StdHW %d\n", nStemH); + fprintf(pFile, "StdHV %d\n", nStemV); + + int nFirstChar = 0; + Object oDictItem; + pFontDict->Search("FirstChar", &oDictItem); + if (oDictItem.IsInt()) nFirstChar = oDictItem.GetInt(); + oDictItem.Free(); + + int nLastChar = nFirstChar; + pFontDict->Search("LastChar", &oDictItem); + if (oDictItem.IsInt()) nLastChar = oDictItem.GetInt(); + oDictItem.Free(); + + Array *pWidths = NULL; + pFontDict->Search("Widths", &oDictItem); + if (oDictItem.IsArray()) pWidths = oDictItem.GetArray(); + + int nCount = nLastChar - nFirstChar + 1; + Gr8BitFont *pT1Font = (Gr8BitFont *)pFont; + + if (NULL != pWidths) + { + int nWidthsCount = pWidths->GetCount(); + fprintf(pFile, "StartCharMetrics %d\n", nWidthsCount); + for (int nIndex = 0; nIndex < nWidthsCount; nIndex++) + { + int nWidth = nMissingWidth; + Object oArrayItem; + pWidths->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) nWidth = oArrayItem.GetInt(); + oArrayItem.Free(); + + char **ppEncoding = pT1Font->GetEncoding(); + + + if (NULL != ppEncoding && NULL != ppEncoding[nIndex]) + fprintf(pFile, "C %d ; WX %d ; N %s ;\n", nIndex + nFirstChar, nWidth, ppEncoding[nIndex]); + else + fprintf(pFile, "C %d ; WX %d ;\n", nIndex + nFirstChar, nWidth); + } + fprintf(pFile, "EndCharMetrics\n"); + } + oDictItem.Free(); + } + + fclose(pFile); + } + } + + // Загрузим сам файл со шрифтом, чтобы точно определить его тип + if (!m_pFontManager->LoadFontFromFile(wsFileName, 0, 10, 72, 72)) + { + pEntry->bAvailable = true; + return; + } + + // TODO: Реализовать m_pFontManager->GetFontType + std::wstring wsFontType = L""; + //m_pFontManager->GetFontType(&wsFontType); + + if (L"TrueType" == wsFontType) + { + if (eFontType != fontType1COT && eFontType != fontTrueType + && eFontType != fontTrueTypeOT && eFontType != fontCIDType0COT + && eFontType != fontCIDType2 && eFontType != fontCIDType2OT) + { + if (eFontType == fontType1 || eFontType == fontType1C) + eFontType = fontType1COT; + else if (eFontType == fontCIDType0 || eFontType == fontCIDType0C) + eFontType = fontCIDType0COT; + } + } + else if (L"Type 1" == wsFontType) + { + if (eFontType != fontType1 && eFontType != fontType1C) + { + eFontType = fontType1; + } + } + else if (L"CID Type 1" == wsFontType) + { + if (eFontType != fontCIDType0 && eFontType != fontCIDType0C + && eFontType != fontCIDType2OT && eFontType != fontCIDType0COT) + { + eFontType = fontCIDType0; + } + } + else if (L"CFF" == wsFontType) + { + if (eFontType != fontType1C && eFontType != fontType1COT + && eFontType != fontTrueTypeOT && eFontType != fontCIDType0C + && eFontType != fontCIDType0COT && eFontType != fontCIDType2OT) + { + if (eFontType == fontType1 || eFontType == fontTrueType) + eFontType = fontType1C; + else if (eFontType == fontCIDType0 || eFontType == fontCIDType2) + eFontType = fontCIDType0C; + } + } + } + else if (L"" == (wsFileName = pFont->GetExternalFontFilePath())) + { + // TODO: Сначала тут мы должны проверить, если ищется один из 14 стандартных шрифтов, + // тогда мы должны вернуть путь к стандартному шрифту. + + CFontInfo* pFontInfo = NULL; + if (m_pFontManager) + { + Ref *pRef = pFont->GetID(); + Object oRefObject, oFontObject; + oRefObject.InitRef(pRef->nNum, pRef->nGen); + oRefObject.Fetch(m_pXref, &oFontObject); + oRefObject.Free(); + + CFontSelectFormat oFontSelect; + std::wstring wsFontBaseName = pFont->GetBaseName()->GetWString(); + if (oFontObject.IsDict()) + { + Dict *pFontDict = oFontObject.GetDict(); + Object oFontDescriptor; + if (pFontDict->Search("FontDescriptor", &oFontDescriptor)->IsDict()) + { + Object oDictItem; + // FontName + oFontDescriptor.DictLookup("FontName", &oDictItem); + if (oDictItem.IsName()) + oFontSelect.wsName = AStringToPWString(oDictItem.GetName()); + else + oFontSelect.wsName = new std::wstring(wsFontBaseName); + oDictItem.Free(); + + // FontFamily + oFontDescriptor.DictLookup("FontFamily", &oDictItem); + oDictItem.Free(); + + // FontStretch + oFontDescriptor.DictLookup("FontStretch", &oDictItem); + oDictItem.Free(); + + // FontWeight + oFontDescriptor.DictLookup("FontWeight", &oDictItem); + oDictItem.Free(); + + // FontBBox + oFontDescriptor.DictLookup("FontBBox", &oDictItem); + oDictItem.Free(); + + // ItalicAngle + oFontDescriptor.DictLookup("ItalicAngle", &oDictItem); + if (oDictItem.IsInt() && 0 != oDictItem.GetInt()) oFontSelect.bItalic = new INT(1); + oDictItem.Free(); + + // Ascent + oFontDescriptor.DictLookup("Ascent", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shAscent = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // Leading + oFontDescriptor.DictLookup("Leading", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shLineGap = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // CapHeight + oFontDescriptor.DictLookup("CapHeight", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shCapHeight = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // XHeight + oFontDescriptor.DictLookup("XHeight", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shXHeight = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // StemV + oFontDescriptor.DictLookup("StemV", &oDictItem); + oDictItem.Free(); + + // StemH + oFontDescriptor.DictLookup("StemH", &oDictItem); + oDictItem.Free(); + + // Descent + oFontDescriptor.DictLookup("Descent", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shDescent = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // AvgWidth + oFontDescriptor.DictLookup("AvgWidth", &oDictItem); + if (oDictItem.IsInt()) oFontSelect.shAvgCharWidth = new SHORT(oDictItem.GetInt()); + oDictItem.Free(); + + // MaxWidth + oFontDescriptor.DictLookup("MaxWidth", &oDictItem); + oDictItem.Free(); + + // MissingWidth + oFontDescriptor.DictLookup("MissingWidth", &oDictItem); + oDictItem.Free(); + + } + else + oFontSelect.wsName = new std::wstring(wsFontBaseName); + oFontDescriptor.Free(); + } + else + oFontSelect.wsName = new std::wstring(wsFontBaseName); + + pFontInfo = m_pFontManager->GetFontInfoByParams(oFontSelect); + } + + if (pFontInfo && L"" != pFontInfo->m_wsFontPath) + { + wsFileName = pFontInfo->m_wsFontPath; + eFontType = pFont->IsCIDFont() ? fontCIDType2 : fontTrueType; + } + else // В крайнем случае, в данном шрифте просто не пишем ничего + { + pEntry->bAvailable = true; + return; + } + + // Записываем файл с кодировкой. (Специально для перезаписи в PDF) + if (c_nPDFWriter == m_lRendererType) + { + std::wstring wsExt; + if (!pFont->IsCIDFont()) + { + wsExt = L".non"; + } + else if (pFont->IsCIDFont()) + { + wsExt = L".cid_non"; + } + + FILE* pTempFile = NULL; + if (!NSFile::CFileBinary::OpenTempFile(&wsTempFileName, &pTempFile, L"wb", (wchar_t*)wsExt.c_str(), (wchar_t*)m_pGlobalParams->GetTempFolder().c_str(), NULL)) + { + if (L"" != wsTempFileName) + NSFile::CFileBinary::Remove(wsTempFileName); + + pEntry->bAvailable = true; + return; + } + fclose(pTempFile); + + // Копируем файл, для создания уникального имени, чтобы связать с файлом с кодировкой + if (NSFile::CFileBinary::Copy(wsFileName, wsTempFileName)) + { + wsFileName = wsTempFileName; + } + else + { + NSFile::CFileBinary::Remove(wsTempFileName); + wsTempFileName = L""; + } + + if (L"" != wsTempFileName) + { + std::wstring wsSplitFileName, wsSplitFileExt; + SpitPathExt(wsFileName, &wsSplitFileName, &wsSplitFileExt); + std::wstring wsEncodingPath = wsSplitFileName + L".enc"; + + CXmlWriter oXmlWriter; + + Ref *pRef = pFont->GetID(); + Object oRefObject, oFontObject; + oRefObject.InitRef(pRef->nNum, pRef->nGen); + oRefObject.Fetch(m_pXref, &oFontObject); + oRefObject.Free(); + + if (oFontObject.IsDict()) + { + Dict *pFontDict = oFontObject.GetDict(); + + int nEncodingType = -1; // Объекта Encoding нет + int nBaseEncoding = -1; + + Object oDictItem; + pFontDict->Search("Encoding", &oDictItem); + if (oDictItem.IsDict()) + { + nEncodingType = 1; // Encoding - идет отдельным объектом + + Object oTemp; + oDictItem.DictLookup("BaseEncoding", &oTemp); + + if (oTemp.IsName("MacRomanEncoding")) + nBaseEncoding = 0; + else if (oTemp.IsName("MacExpertEncoding")) + nBaseEncoding = 1; + else if (oTemp.IsName("WinAnsiEncoding")) + nBaseEncoding = 2; + + oTemp.Free(); + } + else if (oDictItem.IsName("MacRomanEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 0; + } + else if (oDictItem.IsName("MacExpertEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 1; + } + else if (oDictItem.IsName("WinAnsiEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 2; + } + else + { + nEncodingType = -1; + } + + oXmlWriter.WriteNodeBegin(L"Encoding", true); + oXmlWriter.WriteAttribute(L"type", nEncodingType); + oXmlWriter.WriteAttribute(L"base", nBaseEncoding); + oXmlWriter.WriteNodeEnd(L"Encoding", true, false); + + // Differences + if (oDictItem.IsDict()) + { + Object oDifferences; + oDictItem.DictLookup("Differences", &oDifferences); + if (oDifferences.IsArray()) + { + int nArrayLen = oDifferences.ArrayGetLength(); + oXmlWriter.WriteNodeBegin(L"Differences", true); + oXmlWriter.WriteAttribute(L"count", nArrayLen); + oXmlWriter.WriteNodeEnd(L"Differences", true, false); + + for (int nIndex = 0; nIndex < nArrayLen; ++nIndex) + { + Object oTemp; + oDifferences.ArrayGet(nIndex, &oTemp); + if (oTemp.IsInt()) + { + int nCode = oTemp.GetInt(); + oXmlWriter.WriteNodeBegin(L"Code", true); + oXmlWriter.WriteAttribute(L"value", nCode); + oXmlWriter.WriteNodeEnd(L"Code", true, true); + } + else if (oTemp.IsName()) + { + char *sName = oTemp.GetName(); + oXmlWriter.WriteNodeBegin(L"Name", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(sName)); + oXmlWriter.WriteNodeEnd(L"Name", true, true); + } + else + { + // TODO: Неправильный тип записи + } + oTemp.Free(); + } + + oXmlWriter.WriteNodeEnd(L"Differences"); + } + oDifferences.Free(); + } + oDictItem.Free(); + oXmlWriter.WriteNodeEnd(L"Encoding"); + } + oFontObject.Free(); + oXmlWriter.SaveToFile(wsEncodingPath); + } + } + } + + // Здесь мы грузим кодировки + unsigned short *pCodeToGID = NULL, *pCodeToUnicode = NULL; + int nLen = 0; + CFontFileTrueType *pTTFontFile = NULL; + CFontFileType1C *pT1CFontFile = NULL; + switch (eFontType) + { + case fontType1: + case fontType1C: + case fontType1COT: + { + if (L"" != wsFileName) + { + char **ppEncoding = ((Gr8BitFont *)pFont)->GetEncoding(); + if (!ppEncoding) + break; + + if (!m_pFontManager) + break; + + m_pFontManager->LoadFontFromFile(wsFileName, 0, 1, 72, 72); + pCodeToGID = (unsigned short *)MemUtilsMallocArray(256, sizeof(unsigned short)); + if (!pCodeToGID) + break; + + nLen = 256; + for (int nIndex = 0; nIndex < 256; ++nIndex) + { + pCodeToGID[nIndex] = 0; + char* sName = NULL; + if ((sName = ppEncoding[nIndex])) + { + unsigned short ushGID = 0; + // TODO: pFontManager->GetNameIndex + //m_pFontManager->GetNameIndex(AStringToWString(sName), &ushGID); + pCodeToGID[nIndex] = ushGID; + } + } + } + break; + } + case fontTrueType: + case fontTrueTypeOT: + { + if ((pTTFontFile = CFontFileTrueType::LoadFromFile((wchar_t*)wsFileName.c_str()))) + { + pCodeToGID = ((Gr8BitFont *)pFont)->GetCodeToGIDMap(pTTFontFile); + nLen = 256; + + delete pTTFontFile; + pTTFontFile = NULL; + } + else + { + pCodeToGID = NULL; + nLen = 0; + } + break; + } + case fontCIDType0: + case fontCIDType0C: + { + // TODO: Проверить, почему получение данной кодировки было отключено + //if ((pT1CFontFile = CFontFileType1C::LoadFromFile((wchar_t*)wsFileName.c_str()))) + //{ + // pCodeToGID = pT1CFontFile->GetCIDToGIDMap(&nLen); + // delete pT1CFontFile; + //} + //else + //{ + pCodeToGID = NULL; + nLen = 0; + //} + break; + } + case fontCIDType0COT: + { + if ((pTTFontFile = CFontFileTrueType::LoadFromFile((wchar_t*)wsFileName.c_str()))) + { + if (pTTFontFile->IsOpenTypeCFF()) + { + pCodeToGID = pTTFontFile->GetCIDToGIDMap(&nLen); + } + else + { + pCodeToGID = NULL; + nLen = 0; + } + delete pTTFontFile; + pTTFontFile = NULL; + } + else + { + pCodeToGID = NULL; + nLen = 0; + } + break; + } + case fontCIDType2: + case fontCIDType2OT: + { + pCodeToGID = NULL; + nLen = 0; + if (L"" != wsFileName) + { + // Создаем карту CID-to-GID + CharCodeToUnicode *pCodeToUnicode = NULL; + if ((pCodeToUnicode = ((GrCIDFont *)pFont)->GetToUnicode())) + { + if ((pTTFontFile = CFontFileTrueType::LoadFromFile((wchar_t*)wsFileName.c_str()))) + { + // Ищем Unicode Cmap + CArray arrCMapIndex; + for (int nCMapIndex = 0; nCMapIndex < pTTFontFile->GetCmapsCount(); ++nCMapIndex) + { + if ((pTTFontFile->GetCmapPlatform(nCMapIndex) == 3 && pTTFontFile->GetCmapEncoding(nCMapIndex) == 1) || pTTFontFile->GetCmapPlatform(nCMapIndex) == 0) + { + arrCMapIndex.Add(nCMapIndex); + } + } + if (arrCMapIndex.GetSize() > 0) + { + // CID -> Unicode -> GID + nLen = pCodeToUnicode->GetLength(); + pCodeToGID = (unsigned short *)MemUtilsMallocArray(nLen, sizeof(unsigned short)); + for (int nCode = 0; nCode < nLen; ++nCode) + { + Unicode arrUnicodeBuffer[8]; + if (pCodeToUnicode->MapToUnicode(nCode, arrUnicodeBuffer, 8) > 0) + { + pCodeToGID[nCode] = pTTFontFile->MapCodeToGID(arrCMapIndex[0], arrUnicodeBuffer[0]); + for (int nIndex = 1; nIndex < arrCMapIndex.GetSize(); nIndex++) + { + if (0 == pCodeToGID[nCode]) + pCodeToGID[nCode] = pTTFontFile->MapCodeToGID(arrCMapIndex[nIndex], arrUnicodeBuffer[0]); + else + break; + } + } + else + { + pCodeToGID[nCode] = nCode; + } + } + } + delete pTTFontFile; + pTTFontFile = NULL; + } + pCodeToUnicode->Release(); + } + else + { + if (((GrCIDFont *)pFont)->GetCIDToGID()) + { + nLen = ((GrCIDFont *)pFont)->GetCIDToGIDLen(); + pCodeToGID = (unsigned short *)MemUtilsMallocArray(nLen, sizeof(unsigned short)); + if (!pCodeToGID) + break; + + memcpy(pCodeToGID, ((GrCIDFont *)pFont)->GetCIDToGID(), nLen * sizeof(unsigned short)); + } + } + } + else + { + if (((GrCIDFont *)pFont)->GetCIDToGID()) + { + nLen = ((GrCIDFont *)pFont)->GetCIDToGIDLen(); + pCodeToGID = (unsigned short *)MemUtilsMallocArray(nLen, sizeof(unsigned short)); + if (!pCodeToGID) + break; + + memcpy(pCodeToGID, ((GrCIDFont *)pFont)->GetCIDToGID(), nLen * sizeof(unsigned short)); + } + } + + break; + } + default: + { + // Такого не должно произойти + if (L"" != wsTempFileName) + NSFile::CFileBinary::Remove(wsTempFileName); + + break; + } + } + + // Составляем таблицу Code -> Unicode + int nToUnicodeLen = 0; + if (pFont->IsCIDFont()) + { + GrCIDFont *pCIDFont = (GrCIDFont *)pFont; + CharCodeToUnicode *pToUnicode = pCIDFont->GetToUnicode(); + if (NULL != pToUnicode) + { + nToUnicodeLen = pToUnicode->GetLength(); + pCodeToUnicode = (unsigned short *)MemUtilsMallocArray(nToUnicodeLen, sizeof(unsigned short)); + + if (pCodeToUnicode) + { + for (int nIndex = 0; nIndex < nToUnicodeLen; ++nIndex) + { + Unicode aUnicode[2]; + if (pToUnicode->MapToUnicode(nIndex, aUnicode, 2)) + pCodeToUnicode[nIndex] = (unsigned short)aUnicode[0]; + else + pCodeToUnicode[nIndex] = 0; + } + } + + pToUnicode->Release(); + } + } + else + { + CharCodeToUnicode *pToUnicode = ((Gr8BitFont *)pFont)->GetToUnicode(); + if (NULL != pToUnicode) + { + nToUnicodeLen = pToUnicode->GetLength(); + pCodeToUnicode = (unsigned short *)MemUtilsMallocArray(nToUnicodeLen, sizeof(unsigned short)); + + if (pCodeToUnicode) + { + for (int nIndex = 0; nIndex < nToUnicodeLen; ++nIndex) + { + Unicode nUnicode = 0; + if (pToUnicode->MapToUnicode(nIndex, &nUnicode, 1)) + pCodeToUnicode[nIndex] = (unsigned short)nUnicode; + else + pCodeToUnicode[nIndex] = nIndex; + } + } + pToUnicode->Release(); + } + } + + // Записываем файл с настройками шрифта (Специально для перезаписи в PDF) + if (L"" != wsFileName && c_nPDFWriter == m_lRendererType) + { + std::wstring wsSplitFileName, wsSplitFileExt; + SpitPathExt(wsFileName, &wsSplitFileName, &wsSplitFileExt); + std::wstring wsEncodingPath = wsSplitFileName + L".enc"; + + GrFontType eFontType = pFont->GetType(); + if (fontType1 == eFontType || fontType1C == eFontType || fontType1COT == eFontType || fontTrueType == eFontType || fontTrueTypeOT == eFontType) + { + // Запись информации для простых шрифтов + CXmlWriter oXmlWriter; + + Ref *pRef = pFont->GetID(); + Object oRefObject, oFontObject; + oRefObject.InitRef(pRef->nNum, pRef->nGen); + oRefObject.Fetch(m_pXref, &oFontObject); + oRefObject.Free(); + + if (oFontObject.IsDict()) + { + Dict *pFontDict = oFontObject.GetDict(); + + int nEncodingType = -1; // Объекта Encoding нет + int nBaseEncoding = -1; + + Object oDictItem; + pFontDict->Search("Encoding", &oDictItem); + if (oDictItem.IsDict()) + { + nEncodingType = 1; // Encoding - идет отдельным объектом + + Object oTemp; + oDictItem.DictLookup("BaseEncoding", &oTemp); + + if (oTemp.IsName("MacRomanEncoding")) + nBaseEncoding = 0; + else if (oTemp.IsName("MacExpertEncoding")) + nBaseEncoding = 1; + else if (oTemp.IsName("WinAnsiEncoding")) + nBaseEncoding = 2; + + oTemp.Free(); + } + else if (oDictItem.IsName("MacRomanEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 0; + } + else if (oDictItem.IsName("MacExpertEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 1; + } + else if (oDictItem.IsName("WinAnsiEncoding")) + { + nEncodingType = 0; + nBaseEncoding = 2; + } + else + { + nEncodingType = -1; + } + + oXmlWriter.WriteNodeBegin(L"PDF-resources"); + oXmlWriter.WriteNodeBegin(L"Encoding", true); + oXmlWriter.WriteAttribute(L"type", nEncodingType); + oXmlWriter.WriteAttribute(L"base", nBaseEncoding); + oXmlWriter.WriteNodeEnd(L"Encoding", true, false); + + // Differences + if (oDictItem.IsDict()) + { + Object oDifferences; + oDictItem.DictLookup("Differences", &oDifferences); + if (oDifferences.IsArray()) + { + int nArrayLen = oDifferences.ArrayGetLength(); + oXmlWriter.WriteNodeBegin(L"Differences", true); + oXmlWriter.WriteAttribute(L"count", nArrayLen); + oXmlWriter.WriteNodeEnd(L"Differences", true, false); + + for (int nIndex = 0; nIndex < nArrayLen; ++nIndex) + { + Object oTemp; + oDifferences.ArrayGet(nIndex, &oTemp); + if (oTemp.IsInt()) + { + int nCode = oTemp.GetInt(); + oXmlWriter.WriteNodeBegin(L"Code", true); + oXmlWriter.WriteAttribute(L"value", nCode); + oXmlWriter.WriteNodeEnd(L"Code", true, true); + } + else if (oTemp.IsName()) + { + char* sName = oTemp.GetName(); + oXmlWriter.WriteNodeBegin(L"Name", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(sName)); + oXmlWriter.WriteNodeEnd(L"Name", true, true); + } + else + { + // TO DO: Error "Wrong type in font encoding resource differences" + } + oTemp.Free(); + } + + oXmlWriter.WriteNodeEnd(L"Differences"); + } + oDifferences.Free(); + } + oDictItem.Free(); + oXmlWriter.WriteNodeEnd(L"Encoding"); + + pFontDict->Search("BaseFont", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontBase", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"FontBase", true, true); + } + oDictItem.Free(); + + pFontDict->Search("ToUnicode", &oDictItem); + if (oDictItem.IsStream()) + { + oXmlWriter.WriteNodeBegin(L"ToUnicode"); + + StringExt *seBuffer = new StringExt(); + if (NULL != seBuffer) + { + oDictItem.StreamReset(); + int nChar = 0; + while ((nChar = oDictItem.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oDictItem.StreamClose(); + + CBase64 oBase64; + oBase64.Encode((unsigned char *)seBuffer->GetBuffer(), seBuffer->GetLength()); + oXmlWriter.WriteString(AStringToWString(oBase64.GetCString())); + + delete seBuffer; + } + + oXmlWriter.WriteNodeEnd(L"ToUnicode"); + } + oDictItem.Free(); + + + oXmlWriter.WriteNodeBegin(L"FontDescriptor"); + + Object oFontDescriptor; + if (pFontDict->Search("FontDescriptor", &oFontDescriptor)->IsDict()) + { + // FontName + oFontDescriptor.DictLookup("FontName", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontName", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"FontName", true); + } + oDictItem.Free(); + + // FontFamily + oFontDescriptor.DictLookup("FontFamily", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontFamily", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"FontFamily", true); + } + oDictItem.Free(); + + // FontStretch + oFontDescriptor.DictLookup("FontStretch", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontStretch", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"FontStretch", true); + } + oDictItem.Free(); + + // FontWeight + oFontDescriptor.DictLookup("FontWeight", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"FontWeight", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"FontWeight", true); + } + oDictItem.Free(); + + // FontWeight + oFontDescriptor.DictLookup("Flags", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Flags", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Flags", true); + } + oDictItem.Free(); + + // FontBBox + oFontDescriptor.DictLookup("FontBBox", &oDictItem); + if (oDictItem.IsArray()) + { + Array *pBBox = oDictItem.GetArray(); + if (NULL != pBBox && 4 == pBBox->GetCount()) + { + oXmlWriter.WriteNodeBegin(L"FontBBox", true); + for (int nIndex = 0; nIndex < 4; nIndex++) + { + Object oArrayItem; + pBBox->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + { + std::wstring wsValue = L"value" + std::to_wstring(nIndex); + oXmlWriter.WriteAttribute(wsValue, oArrayItem.GetInt()); + } + + oArrayItem.Free(); + } + oXmlWriter.WriteNodeEnd(L"FontBBox", true); + } + } + oDictItem.Free(); + + // ItalicAngle + oFontDescriptor.DictLookup("ItalicAngle", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"ItalicAngle", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"ItalicAngle", true); + } + oDictItem.Free(); + + // Ascent + oFontDescriptor.DictLookup("Ascent", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Ascent", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Ascent", true); + } + oDictItem.Free(); + + // Leading + oFontDescriptor.DictLookup("Leading", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Leading", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Leading", true); + } + oDictItem.Free(); + + // CapHeight + oFontDescriptor.DictLookup("CapHeight", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"CapHeight", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"CapHeight", true); + } + oDictItem.Free(); + + // XHeight + oFontDescriptor.DictLookup("XHeight", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"XHeight", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"XHeight", true); + } + oDictItem.Free(); + + // StemV + oFontDescriptor.DictLookup("StemV", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"StemV", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"StemV", true); + } + oDictItem.Free(); + + // StemH + oFontDescriptor.DictLookup("StemH", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"StemH", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"StemH", true); + } + oDictItem.Free(); + + // Descent + oFontDescriptor.DictLookup("Descent", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Descent", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Descent", true); + } + oDictItem.Free(); + + // AvgWidth + oFontDescriptor.DictLookup("AvgWidth", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"AvgWidth", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"AvgWidth", true); + } + oDictItem.Free(); + + // MaxWidth + oFontDescriptor.DictLookup("MaxWidth", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"MaxWidth", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"MaxWidth", true); + } + oDictItem.Free(); + + // MissingWidth + oFontDescriptor.DictLookup("MissingWidth", &oDictItem); + if (oDictItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"MissingWidth", true); + oXmlWriter.WriteAttribute(L"value", oDictItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"MissingWidth", true); + } + oDictItem.Free(); + + } + oFontDescriptor.Free(); + oXmlWriter.WriteNodeEnd(L"FontDescriptor"); + + int nFirstChar = 0; + pFontDict->Search("FirstChar", &oDictItem); + if (oDictItem.IsInt()) nFirstChar = oDictItem.GetInt(); + oDictItem.Free(); + + int nLastChar = 0; + pFontDict->Search("LastChar", &oDictItem); + if (oDictItem.IsInt()) nLastChar = oDictItem.GetInt(); + oDictItem.Free(); + + Array *pWidths = NULL; + pFontDict->Search("Widths", &oDictItem); + if (oDictItem.IsArray()) + { + oXmlWriter.WriteNodeBegin(L"Widths", true); + oXmlWriter.WriteAttribute(L"FirstChar", nFirstChar); + oXmlWriter.WriteAttribute(L"LastChar", nLastChar); + oXmlWriter.WriteNodeEnd(L"Widths", true, false); + + Array *pWidths = oDictItem.GetArray(); + int nWidthsCount = pWidths->GetCount(); + for (int nIndex = 0; nIndex < nWidthsCount; nIndex++) + { + Object oArrayItem; + pWidths->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Width", true); + oXmlWriter.WriteAttribute(L"value", oArrayItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Width", true); + } + oArrayItem.Free(); + } + oXmlWriter.WriteNodeEnd(L"Widths"); + } + oDictItem.Free(); + oXmlWriter.WriteNodeEnd(L"PDF-resources"); + } + oFontObject.Free(); + oXmlWriter.SaveToFile(wsEncodingPath); + } + else if (fontCIDType0 == eFontType || fontCIDType0C == eFontType || fontCIDType0COT == eFontType || fontCIDType2 == eFontType || fontCIDType2OT == eFontType) + { + // Пишем файл с кодировкой CMap + std::wstring wsCMapPath = wsSplitFileName + L".cmap"; + if (pFont->IsCIDFont()) + { + GrCIDFont *pCIDFont = (GrCIDFont *)pFont; + if (NULL != pCIDFont->GetCMap()) + pCIDFont->GetCMap()->ToXml(wsCMapPath); + } + + CXmlWriter oXmlWriter; + Ref *pRef = pFont->GetID(); + Object oRefObject, oFontObject; + oRefObject.InitRef(pRef->nNum, pRef->nGen); + oRefObject.Fetch(m_pXref, &oFontObject); + oRefObject.Free(); + if (oFontObject.IsDict()) + { + Dict *pFontDict = oFontObject.GetDict(); + oXmlWriter.WriteNodeBegin(L"PDF-resources"); + Object oDictItem; + pFontDict->Search("BaseFont", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"Type0", true); + oXmlWriter.WriteAttribute(L"value", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"Type0", true, false); + } + else + { + oXmlWriter.WriteNodeBegin(L"Type0"); + } + oDictItem.Free(); + + pFontDict->Search("ToUnicode", &oDictItem); + if (oDictItem.IsStream()) + { + oXmlWriter.WriteNodeBegin(L"ToUnicode"); + + StringExt *seBuffer = new StringExt(); + oDictItem.StreamReset(); + int nChar = 0; + while ((nChar = oDictItem.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oDictItem.StreamClose(); + + CBase64 oBase64; + oBase64.Encode((unsigned char *)seBuffer->GetBuffer(), seBuffer->GetLength()); + oXmlWriter.WriteString(AStringToWString(oBase64.GetCString())); + oXmlWriter.WriteNodeEnd(L"ToUnicode"); + } + oDictItem.Free(); + + pFontDict->Search("Encoding", &oDictItem); + if (oDictItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"Encoding", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oDictItem.GetName())); + oXmlWriter.WriteNodeEnd(L"Encoding", true, true); + } + else if (oDictItem.IsStream()) + { + oXmlWriter.WriteNodeBegin(L"Encoding"); + + Dict *pEncodingDict = oDictItem.StreamGetDict(); + if (NULL != pEncodingDict) + { + Object oEncItem; + pEncodingDict->Search("CMapName", &oEncItem); + if (oEncItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"CMapName", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oEncItem.GetName())); + oXmlWriter.WriteNodeEnd(L"CMapName", true, true); + } + oEncItem.Free(); + + pEncodingDict->Search("CIDSystemInfo", &oEncItem); + if (oEncItem.IsDict()) + { + Dict *pCIDInfo = oEncItem.GetDict(); + + if (NULL != pCIDInfo) + { + oXmlWriter.WriteNodeBegin(L"CIDSystemInfo"); + + Object oCIDInfoItem; + pCIDInfo->Search("Registry", &oCIDInfoItem); + if (oCIDInfoItem.IsString()) + { + oXmlWriter.WriteNodeBegin(L"Registry", true); + oXmlWriter.WriteAttribute(L"string", AStringToWString(oCIDInfoItem.GetString()->GetBuffer())); + oXmlWriter.WriteNodeEnd(L"Registry", true, true); + } + oCIDInfoItem.Free(); + + pCIDInfo->Search("Ordering", &oCIDInfoItem); + if (oCIDInfoItem.IsString()) + { + oXmlWriter.WriteNodeBegin(L"Ordering", true); + oXmlWriter.WriteAttribute(L"string", AStringToWString(oCIDInfoItem.GetString()->GetBuffer())); + oXmlWriter.WriteNodeEnd(L"Ordering", true, true); + } + oCIDInfoItem.Free(); + + pCIDInfo->Search("Supplement", &oCIDInfoItem); + if (oCIDInfoItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Supplement", true); + oXmlWriter.WriteAttribute(L"integer", oCIDInfoItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Supplement", true, true); + } + oCIDInfoItem.Free(); + + oXmlWriter.WriteNodeEnd(L"CIDSystemInfo"); + } + } + oEncItem.Free(); + + pEncodingDict->Search("WMode", &oEncItem); + if (oEncItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"WMode", true); + oXmlWriter.WriteAttribute(L"integer", oEncItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"WMode", true, true); + } + oEncItem.Free(); + + pEncodingDict->Search("UseCMap", &oEncItem); + if (oEncItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"UseCMap", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oEncItem.GetName())); + oXmlWriter.WriteNodeEnd(L"UseCMap", true, true); + } + else if (oEncItem.IsStream()) + { + oXmlWriter.WriteNodeBegin(L"UseCMap"); + + StringExt *seBuffer = new StringExt(); + oEncItem.StreamReset(); + int nChar = 0; + while ((nChar = oEncItem.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oEncItem.StreamClose(); + + CBase64 oBase64; + oBase64.Encode((unsigned char *)seBuffer->GetBuffer(), seBuffer->GetLength()); + oXmlWriter.WriteString(AStringToWString(oBase64.GetCString())); + + oXmlWriter.WriteNodeEnd(L"UseCMap"); + } + oEncItem.Free(); + } + + oXmlWriter.WriteNodeBegin(L"Stream"); + StringExt *seBuffer = new StringExt(); + oDictItem.StreamReset(); + int nChar = 0; + while ((nChar = oDictItem.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oDictItem.StreamClose(); + CBase64 oBase64; + oBase64.Encode((unsigned char *)seBuffer->GetBuffer(), seBuffer->GetLength()); + oXmlWriter.WriteString(AStringToWString(oBase64.GetCString())); + oXmlWriter.WriteNodeEnd(L"Stream"); + oXmlWriter.WriteNodeEnd(L"Encoding"); + } + oDictItem.Free(); + + pFontDict->Search("DescendantFonts", &oDictItem); + if (oDictItem.IsArray()) + { + Array *pArray = oDictItem.GetArray(); + if (1 == pArray->GetCount()) + { + Object oDescFont; + pArray->Get(0, &oDescFont); + + if (oDescFont.IsDict()) + { + Dict *pDescFont = oDescFont.GetDict(); + if (NULL != pDescFont) + { + oXmlWriter.WriteNodeBegin(L"DescendantFonts"); + + Object oFontItem; + pDescFont->Search("Subtype", &oFontItem); + if (oFontItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"Subtype", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oFontItem.GetName())); + oXmlWriter.WriteNodeEnd(L"Subtype", true, true); + } + oFontItem.Free(); + + pDescFont->Search("BaseFont", &oFontItem); + if (oFontItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"BaseFont", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oFontItem.GetName())); + oXmlWriter.WriteNodeEnd(L"BaseFont", true, true); + } + oFontItem.Free(); + + pDescFont->Search("CIDSystemInfo", &oFontItem); + if (oFontItem.IsDict()) + { + Dict *pCIDInfo = oFontItem.GetDict(); + if (NULL != pCIDInfo) + { + oXmlWriter.WriteNodeBegin(L"CIDSystemInfo"); + + Object oCIDInfoItem; + pCIDInfo->Search("Registry", &oCIDInfoItem); + if (oCIDInfoItem.IsString()) + { + oXmlWriter.WriteNodeBegin(L"Registry", true); + oXmlWriter.WriteAttribute(L"string", AStringToWString(oCIDInfoItem.GetString()->GetBuffer())); + oXmlWriter.WriteNodeEnd(L"Registry", true, true); + } + oCIDInfoItem.Free(); + + pCIDInfo->Search("Ordering", &oCIDInfoItem); + if (oCIDInfoItem.IsString()) + { + oXmlWriter.WriteNodeBegin(L"Ordering", true); + oXmlWriter.WriteAttribute(L"string", AStringToWString(oCIDInfoItem.GetString()->GetBuffer())); + oXmlWriter.WriteNodeEnd(L"Ordering", true, true); + } + oCIDInfoItem.Free(); + + pCIDInfo->Search("Supplement", &oCIDInfoItem); + if (oCIDInfoItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Supplement", true); + oXmlWriter.WriteAttribute(L"integer", oCIDInfoItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Supplement", true, true); + } + oCIDInfoItem.Free(); + + oXmlWriter.WriteNodeEnd(L"CIDSystemInfo"); + } + } + oFontItem.Free(); + + pDescFont->Search("FontDescriptor", &oFontItem); + if (oFontItem.IsDict()) + { + Dict *pFontDescriptor = oFontItem.GetDict(); + if (NULL != pFontDescriptor) + { + oXmlWriter.WriteNodeBegin(L"FontDescriptor"); + Object oItemFD; + + pFontDescriptor->Search("FontName", &oItemFD); + if (oItemFD.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontName", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oItemFD.GetName())); + oXmlWriter.WriteNodeEnd(L"FontName", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("FontStretch", &oItemFD); + if (oItemFD.IsName()) + { + oXmlWriter.WriteNodeBegin(L"FontStretch", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oItemFD.GetName())); + oXmlWriter.WriteNodeEnd(L"FontStretch", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("FontWeight", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"FontWeight", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"FontWeight", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("Flags", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Flags", true); + oXmlWriter.WriteAttribute(L"integer", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"Flags", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("FontBBox", &oItemFD); + if (oItemFD.IsArray()) + { + Array *pBBox = oItemFD.GetArray(); + if (NULL != pBBox && 4 == pBBox->GetCount()) + { + oXmlWriter.WriteNodeBegin(L"FontBBox", true); + for (int nIndex = 0; nIndex < 4; nIndex++) + { + Object oArrayItem; + pBBox->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + { + std::wstring wsValue = L"value" + std::to_wstring(nIndex); + oXmlWriter.WriteAttribute(wsValue, oArrayItem.GetInt()); + } + + oArrayItem.Free(); + } + oXmlWriter.WriteNodeEnd(L"FontBBox", true); + } + } + oItemFD.Free(); + + pFontDescriptor->Search("ItalicAngle", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"ItalicAngle", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"ItalicAngle", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("Ascent", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Ascent", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"Ascent", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("Descent", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Descent", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"Descent", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("Leading", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Leading", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"Leading", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("CapHeight", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"CapHeight", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"CapHeight", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("XHeight", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"XHeight", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"XHeight", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("StemV", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"StemV", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"StemV", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("StemH", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"StemH", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"StemH", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("AvgWidth", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"AvgWidth", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"AvgWidth", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("MaxWidth", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"MaxWidth", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"MaxWidth", true, true); + } + oItemFD.Free(); + + pFontDescriptor->Search("MissingWidth", &oItemFD); + if (oItemFD.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"MissingWidth", true); + oXmlWriter.WriteAttribute(L"number", oItemFD.GetInt()); + oXmlWriter.WriteNodeEnd(L"MissingWidth", true, true); + } + oItemFD.Free(); + + // TODO: Тут надо реализовать чтени полей /Style, /Lang, /FD, /CIDSet + + oXmlWriter.WriteNodeEnd(L"FontDescriptor"); + } + } + oFontItem.Free(); + + pDescFont->Search("DW", &oFontItem); + if (oFontItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"DW", true); + oXmlWriter.WriteAttribute(L"integer", oFontItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"DW", true, true); + } + oFontItem.Free(); + + pDescFont->Search("W", &oFontItem); + if (oFontItem.IsArray()) + { + Array *pArray = oFontItem.GetArray(); + if (NULL != pArray) + { + oXmlWriter.WriteNodeBegin(L"W"); + + for (int nIndex = 0; nIndex < pArray->GetCount(); nIndex++) + { + Object oArrayItem; + pArray->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Int", true); + oXmlWriter.WriteAttribute(L"value", oArrayItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Int", true, true); + } + else if (oArrayItem.IsArray()) + { + Array *pWArray = oArrayItem.GetArray(); + if (NULL != pWArray) + { + oXmlWriter.WriteNodeBegin(L"Array"); + for (int nWIndex = 0; nWIndex < pWArray->GetCount(); nWIndex++) + { + Object oWArrayItem; + pWArray->Get(nWIndex, &oWArrayItem); + if (oWArrayItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Int", true); + oXmlWriter.WriteAttribute(L"value", oWArrayItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Int", true, true); + } + oWArrayItem.Free(); + } + oXmlWriter.WriteNodeEnd(L"Array"); + } + } + oArrayItem.Free(); + } + + oXmlWriter.WriteNodeEnd(L"W"); + } + } + oFontItem.Free(); + + pDescFont->Search("DW2", &oFontItem); + if (oFontItem.IsArray()) + { + Array *pArray = oFontItem.GetArray(); + if (NULL != pArray && 2 == pArray->GetCount()) + { + oXmlWriter.WriteNodeBegin(L"DW2", true); + + Object oArrayItem; + pArray->Get(0, &oArrayItem); + if (oArrayItem.IsInt()) + { + oXmlWriter.WriteAttribute(L"value0", oArrayItem.GetInt()); + } + oArrayItem.Free(); + + pArray->Get(1, &oArrayItem); + if (oArrayItem.IsInt()) + { + oXmlWriter.WriteAttribute(L"value1", oArrayItem.GetInt()); + } + oArrayItem.Free(); + + oXmlWriter.WriteNodeEnd(L"DW2", true, true); + } + } + oFontItem.Free(); + + pDescFont->Search("W2", &oFontItem); + if (oFontItem.IsArray()) + { + Array *pArray = oFontItem.GetArray(); + if (NULL != pArray) + { + oXmlWriter.WriteNodeBegin(L"W2"); + + for (int nIndex = 0; nIndex < pArray->GetCount(); nIndex++) + { + Object oArrayItem; + pArray->Get(nIndex, &oArrayItem); + if (oArrayItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Int", true); + oXmlWriter.WriteAttribute(L"value", oArrayItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Int", true, true); + } + else if (oArrayItem.IsArray()) + { + Array *pWArray = oArrayItem.GetArray(); + if (NULL != pWArray) + { + oXmlWriter.WriteNodeBegin(L"Array"); + for (int nWIndex = 0; nWIndex < pWArray->GetCount(); nWIndex++) + { + Object oWArrayItem; + pWArray->Get(nWIndex, &oWArrayItem); + if (oWArrayItem.IsInt()) + { + oXmlWriter.WriteNodeBegin(L"Int", true); + oXmlWriter.WriteAttribute(L"value", oWArrayItem.GetInt()); + oXmlWriter.WriteNodeEnd(L"Int", true, true); + } + oWArrayItem.Free(); + } + oXmlWriter.WriteNodeEnd(L"Array"); + } + } + oArrayItem.Free(); + } + + oXmlWriter.WriteNodeEnd(L"W2"); + } + } + oFontItem.Free(); + + pDescFont->Search("CIDToGIDMap", &oFontItem); + if (oFontItem.IsName()) + { + oXmlWriter.WriteNodeBegin(L"CIDToGIDMap", true); + oXmlWriter.WriteAttribute(L"name", AStringToWString(oFontItem.GetName())); + oXmlWriter.WriteNodeEnd(L"CIDToGIDMap", true, true); + } + else if (oFontItem.IsStream()) + { + oXmlWriter.WriteNodeBegin(L"CIDToGIDMap"); + + StringExt *seBuffer = new StringExt(); + oFontItem.StreamReset(); + int nChar = 0; + while ((nChar = oFontItem.StreamGetChar()) != EOF) + { + seBuffer->Append(nChar); + } + oFontItem.StreamClose(); + + CBase64 oBase64; + oBase64.Encode((unsigned char *)seBuffer->GetBuffer(), seBuffer->GetLength()); + oXmlWriter.WriteString(AStringToWString(oBase64.GetCString())); + + oXmlWriter.WriteNodeEnd(L"CIDToGIDMap"); + } + oFontItem.Free(); + + + oXmlWriter.WriteNodeEnd(L"DescendantFonts"); + } + } + oDescFont.Free(); + } + } + oDictItem.Free(); + + oXmlWriter.WriteNodeEnd(L"Type0"); + oXmlWriter.WriteNodeEnd(L"PDF-resources"); + } + oFontObject.Free(); + + oXmlWriter.SaveToFile(wsEncodingPath); + } + } + + // Обрежем индекс у FontName, если он есть + if (wsFontName.length() > 7) + { + bool bIsIndex = true; + if ('+' != wsFontName.at(6)) + bIsIndex = false; + + if (bIsIndex) + { + for (int nIndex = 0; nIndex < 6; nIndex++) + { + int nChar = wsFontName.at(nIndex); + if (nChar < 'A' || nChar > 'Z') + { + bIsIndex = false; + break; + } + } + } + + if (bIsIndex) + { + wsFontName.erase(0, 7); + } + } + + pEntry->wsFilePath = wsFileName; + pEntry->wsFontName = wsFontName; + pEntry->pCodeToGID = pCodeToGID; + pEntry->pCodeToUnicode = pCodeToUnicode; + pEntry->unLenGID = (unsigned int)nLen; + pEntry->unLenUnicode = (unsigned int)nToUnicodeLen; + pEntry->bAvailable = true; + } + else if (NULL != pEntry) + { + wsFileName = pEntry->wsFilePath; + wsFontName = pEntry->wsFontName; + } + + if (L"" != wsFileName) + { + m_pRenderer->put_FontPath(wsFileName); + m_pRenderer->put_FontName(wsFontName); + } + } + void RendererOutputDev::Stroke(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + DoPath(pGState, pGState->GetPath(), pGState->GetPageHeight(), pGState->GetCTM()); + m_pRenderer->DrawPath(c_nStroke); + + m_pRenderer->EndCommand(c_nPathType); + } + void RendererOutputDev::Fill(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + DoPath(pGState, pGState->GetPath(), pGState->GetPageHeight(), pGState->GetCTM()); + m_pRenderer->DrawPath(c_nWindingFillMode); + + m_pRenderer->EndCommand(c_nPathType); + } + void RendererOutputDev::EoFill(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + DoPath(pGState, pGState->GetPath(), pGState->GetPageHeight(), pGState->GetCTM()); + m_pRenderer->DrawPath(c_nEvenOddFillMode); + + m_pRenderer->EndCommand(c_nPathType); + } + void RendererOutputDev::FillStroke(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + DoPath(pGState, pGState->GetPath(), pGState->GetPageHeight(), pGState->GetCTM()); + m_pRenderer->DrawPath(c_nStroke | c_nWindingFillMode); + + m_pRenderer->EndCommand(c_nPathType); + } + void RendererOutputDev::EoFillStroke(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + DoPath(pGState, pGState->GetPath(), pGState->GetPageHeight(), pGState->GetCTM()); + m_pRenderer->DrawPath(c_nStroke | c_nEvenOddFillMode); + + m_pRenderer->EndCommand(c_nPathType); + } + void RendererOutputDev::TilingPatternFill(GrState *pGState, Object *pStream, int nPaintType, Dict *pResourcesDict, double *pMatrix, double *pBBox, int nX0, int nY0, int nX1, int nY1, double dXStep, double dYStep) + { + + } + void RendererOutputDev::StartTilingFill(GrState *pGState) + { + m_pRenderer->BeginCommand(c_nComplexFigureType); + m_bTiling = true; + } + void RendererOutputDev::EndTilingFill() + { + m_pRenderer->EndCommand(c_nComplexFigureType); + m_bTiling = false; + } + bool RendererOutputDev::FunctionShadedFill(GrState *pGState, GrFunctionShading *pShading) + { + return false; + } + bool RendererOutputDev::AxialShadedFill(GrState *pGState, GrAxialShading *pShading) + { + // TODO: Реализовать линейный градиент + return false; + //m_pRenderer->BeginCommand(c_nPDFGradientType); + + //double arrMatrix[6]; + //double *pCTM = pGState->GetCTM(); + //arrMatrix[0] = pCTM[0]; + //arrMatrix[1] = -pCTM[1]; + //arrMatrix[2] = pCTM[2]; + //arrMatrix[3] = -pCTM[3]; + //arrMatrix[4] = pCTM[4]; + //arrMatrix[5] = -pCTM[5] + pGState->GetPageHeight(); + + //double dShiftX = 0, dShiftY = 0; + //DoTransform(arrMatrix, &dShiftX, &dShiftY); + + //double dFirstX, dFirstY, dSecondX, dSecondY; + //pShading->GetCoords(&dFirstX, &dFirstY, &dSecondX, &dSecondY); + + //bool bExtendFirst = pShading->GetExtendStart(); + //bool bExtendSecond = pShading->GetExtendEnd(); + + //GrColorSpace *pColorSpace = pGState->GetFillColorSpace(); + + //LONG lOldType; + //m_pRenderer->get_BrushType(&lOldType); + + ////m_pRenderer->put_B + //NSStructures::CBrush oBrush; + //oBrush.Rect.X = PDFCoordsToMM(dFirstX + dShiftX); + //oBrush.Rect.Y = PDFCoordsToMM(dFirstY + dShiftY); + //oBrush.Rect.Width = PDFCoordsToMM(dSecondX - dFirstX); + //oBrush.Rect.Height = PDFCoordsToMM(dSecondY - dFirstY); + //oBrush.Type = 2; + //oBrush.TextureMode = bExtendFirst ? 1 : 0 + bExtendSecond ? 2 : 0; + + //BSTR bsXml = oBrush.ToXmlString().AllocSysString(); + //m_pRenderer->SetBrush(bsXml); + //::SysFreeString(bsXml); + + //double dXMin, dYMin, dXMax, dYMax; + //pGState->GetUserClipBBox(&dXMin, &dYMin, &dXMax, &dYMax); + + //oBrush.Type = 2; + //oBrush.TextureMode = 5; + + //m_pRenderer->BrushBounds(PDFCoordsToMM(dXMin + dShiftX), PDFCoordsToMM(dYMin + dShiftY), PDFCoordsToMM(dXMax - dXMin), PDFCoordsToMM(dYMax - dYMin)); + //Aggplus::BrushType:: + //m_pRenderer->put_BrushType(2); + //m_pRenderer->put_BrushTextureMode(Aggplus::); + + //bsXml = oBrush.ToXmlString().AllocSysString(); + //m_pRenderer->SetBrush(bsXml); + //::SysFreeString(bsXml); + + //// Присылаем 16 цветов + //double dT0 = pShading->GetDomain0(); + //double dT1 = pShading->GetDomain1(); + //GrColor oColor; + //for (int nIndex = 0; nIndex < 16; nIndex++) + //{ + // double dT = dT0 + nIndex * (dT1 - dT0) / 15; + // pShading->GetColor(dT, &oColor); + + // oBrush.Color1 = pColorSpace->GetDwordColor(&oColor); + // oBrush.Type = 2; + // oBrush.TextureMode = 10; + + // bsXml = oBrush.ToXmlString().AllocSysString(); + // m_pRenderer->SetBrush(bsXml); + // ::SysFreeString(bsXml); + //} + + //m_pRenderer->EndCommand(c_nPDFGradientType); + + //UpdateFillColor(pGState); + //UpdateFillOpacity(pGState); + + //m_pRenderer->put_BrushType(lOldType); + + //return true; + } + bool RendererOutputDev::RadialShadedFill(GrState *pGState, GrRadialShading *pShading) + { + // TODO: Реализовать радиальный градиент + return false; + + //m_pRenderer->BeginCommand(c_nPDFGradientType); + + //double arrMatrix[6]; + //double *pCTM = pGState->GetCTM(); + //arrMatrix[0] = pCTM[0]; + //arrMatrix[1] = -pCTM[1]; + //arrMatrix[2] = pCTM[2]; + //arrMatrix[3] = -pCTM[3]; + //arrMatrix[4] = pCTM[4]; + //arrMatrix[5] = -pCTM[5] + pGState->GetPageHeight(); + + //double dShiftX = 0, dShiftY = 0; + //DoTransform(arrMatrix, &dShiftX, &dShiftY); + + //double dFirstX, dFirstY, dFirstRad, dSecondX, dSecondY, dSecondRad; + //pShading->GetCoords(&dFirstX, &dFirstY, &dFirstRad, &dSecondX, &dSecondY, &dSecondRad); + + //bool bExtendFirst = pShading->GetExtendFirst(); + //bool bExtendSecond = pShading->GetExtendSecond(); + + //LONG lOldType; + //m_pRenderer->get_BrushType(&lOldType); + + //NSStructures::CBrush oBrush; + //oBrush.Rect.X = PDFCoordsToMM(dFirstX + dShiftX); + //oBrush.Rect.Y = PDFCoordsToMM(dFirstY + dShiftY); + //oBrush.Rect.Width = PDFCoordsToMM(dFirstRad); + //oBrush.Rect.Height = PDFCoordsToMM(dFirstRad); + //oBrush.Type = 1; + //oBrush.TextureMode = bExtendFirst ? 1 : 0; + + //BSTR bsXml = oBrush.ToXmlString().AllocSysString(); + //m_pRenderer->SetBrush(bsXml); + //::SysFreeString(bsXml); + + //oBrush.Rect.X = PDFCoordsToMM(dSecondX + dShiftX); + //oBrush.Rect.Y = PDFCoordsToMM(dSecondY + dShiftY); + //oBrush.Rect.Width = PDFCoordsToMM(dSecondRad); + //oBrush.Rect.Height = PDFCoordsToMM(dSecondRad); + //oBrush.Type = 1; + //oBrush.TextureMode = bExtendSecond ? 1 : 0; + + //bsXml = oBrush.ToXmlString().AllocSysString(); + //m_pRenderer->SetBrush(bsXml); + //::SysFreeString(bsXml); + + //double dXMin, dYMin, dXMax, dYMax; + //pGState->GetUserClipBBox(&dXMin, &dYMin, &dXMax, &dYMax); + + //oBrush.Rect.X = PDFCoordsToMM(dXMin + dShiftX); + //oBrush.Rect.Y = PDFCoordsToMM(dYMin + dShiftY); + //oBrush.Rect.Width = PDFCoordsToMM(dXMax - dXMin); + //oBrush.Rect.Height = PDFCoordsToMM(dYMax - dYMin); + //oBrush.Type = 1; + //oBrush.TextureMode = 5; + + //bsXml = oBrush.ToXmlString().AllocSysString(); + //m_pRenderer->SetBrush(bsXml); + //::SysFreeString(bsXml); + + //// Присылаем 15 цветов + //double dT0 = pShading->GetDomain0(); + //double dT1 = pShading->GetDomain1(); + //GrColor oColor; + //GrColorSpace *pColorSpace = pGState->GetFillColorSpace(); + //for (int nIndex = 0; nIndex < 15; nIndex++) + //{ + // double dT = dT0 + nIndex * (dT1 - dT0) / 14; + // pShading->GetColor(dT, &oColor); + + // oBrush.Color1 = pColorSpace->GetDwordColor(&oColor); + // oBrush.Type = 1; + // oBrush.TextureMode = 10; + + // bsXml = oBrush.ToXmlString().AllocSysString(); + // m_pRenderer->SetBrush(bsXml); + // ::SysFreeString(bsXml); + //} + + //m_pRenderer->EndCommand(c_nPDFGradientType); + + //UpdateFillColor(pGState); + //UpdateFillOpacity(pGState); + + //m_pRenderer->put_BrushType(lOldType); + + //return true; + } + void RendererOutputDev::StartShadedFill(GrState *pGState) + { + m_pRenderer->BeginCommand(c_nComplexFigureType); + } + void RendererOutputDev::EndShadedFill() + { + m_pRenderer->EndCommand(c_nComplexFigureType); + } + void RendererOutputDev::StartTilingFillIteration() + { + m_pRenderer->BeginCommand(c_nPDFTilingFillIteration); + } + void RendererOutputDev::EndTilingFillIteration() + { + m_pRenderer->EndCommand(c_nPDFTilingFillIteration); + } + void RendererOutputDev::StartSimpleTilingFill(GrState *pGState, int nX0, int nY0, int nX1, int nY1, double dStepX, double dStepY, double dXMin, double dYMin, double dXMax, double dYMax, double* pMatrix) + { + this->ClipAttack(pGState); + + m_pRenderer->BeginCommand(c_nPDFTilingFill); + + CXmlWriter oWriter; + oWriter.WriteNodeBegin(L"htmltiling", true); + oWriter.WriteAttribute(L"x", nX0); + oWriter.WriteAttribute(L"y", nY0); + oWriter.WriteAttribute(L"countx", nX1 - nX0); + oWriter.WriteAttribute(L"county", nY1 - nY0); + oWriter.WriteAttribute(L"stepx", dStepX); + oWriter.WriteAttribute(L"stepy", dStepY); + oWriter.WriteNodeEnd(L"htmltiling", true, false); + + oWriter.WriteNodeBegin(L"bbox", true); + oWriter.WriteAttribute(L"x", dXMin); + oWriter.WriteAttribute(L"y", dYMin); + oWriter.WriteAttribute(L"r", dXMax); + oWriter.WriteAttribute(L"b", dYMax); + oWriter.WriteNodeEnd(L"bbox", true, true); + + oWriter.WriteNodeBegin(L"transform", true); + oWriter.WriteAttribute(L"m1", pMatrix[0]); + oWriter.WriteAttribute(L"m2", pMatrix[1]); + oWriter.WriteAttribute(L"m3", pMatrix[2]); + oWriter.WriteAttribute(L"m4", pMatrix[3]); + oWriter.WriteAttribute(L"m5", pMatrix[4]); + oWriter.WriteAttribute(L"m6", pMatrix[5]); + oWriter.WriteNodeEnd(L"transform", true, true); + + oWriter.WriteNodeEnd(L"htmltiling", false); + // TODO: m_pRenderer->SetAdditionalParam(L"TilingHtmlPattern", oWriter.GetXmlString()); + } + void RendererOutputDev::EndSimpleTilingFill() + { + m_pRenderer->EndCommand(c_nPDFTilingFill); + } + void RendererOutputDev::Clip(GrState *pGState) + { + UpdateClip(pGState); + } + void RendererOutputDev::EoClip(GrState *pGState) + { + UpdateClip(pGState); + } + void RendererOutputDev::ClipToStrokePath(GrState *pGState) + { + UpdateClip(pGState); + } + void RendererOutputDev::ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, bool bEO) + { + if (m_bTransparentGroup) + return; + + int nClipFlag = bEO ? c_nClipRegionTypeEvenOdd : c_nClipRegionTypeWinding; + nClipFlag |= c_nClipRegionIntersect; + + m_pRenderer->BeginCommand(c_nClipType); + m_pRenderer->put_ClipMode(nClipFlag); + DoPath(pGState, pPath, pGState->GetPageHeight(), pMatrix); + m_pRenderer->EndCommand(c_nPathType); + m_pRenderer->EndCommand(c_nClipType); + } + void RendererOutputDev::ClipToText(std::wstring& wsFontName, std::wstring& wsFontPath, double dFontSize, int nFontStyle, double *pMatrix, std::wstring& wsText, double dX, double dY, double dWidth, double dHeight, double dBaseLineOffset) + { + if (m_bTransparentGroup) + return; + + m_pRenderer->put_FontName(wsFontName); + m_pRenderer->put_FontPath(wsFontPath); + m_pRenderer->put_FontSize(dFontSize); + m_pRenderer->put_FontStyle((long)nFontStyle); + + double dShiftX = 0, dShiftY = 0; + DoTransform(pMatrix, &dShiftX, &dShiftY, true); + + m_pRenderer->BeginCommand(c_nClipType); + m_pRenderer->put_ClipMode(c_nClipRegionTypeWinding | c_nClipRegionUnion); + m_pRenderer->PathCommandEnd(); + m_pRenderer->put_FontStringGID(true); + m_pRenderer->PathCommandTextEx(wsText, L"", PDFCoordsToMM(dX), PDFCoordsToMM(dY), PDFCoordsToMM(dWidth), PDFCoordsToMM(dHeight), PDFCoordsToMM(dBaseLineOffset), 0); + m_pRenderer->EndCommand(c_nClipType); + } + void RendererOutputDev::BeginStringOperator(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + m_pRenderer->BeginCommand(c_nTextType); + + int nRenderMode = pGState->GetRenderMode(); + + // Обработка Clip + if (nRenderMode >= 4) + { + if (m_pBufferTextClip) + delete m_pBufferTextClip; + + m_pBufferTextClip = new GrTextClip(); + } + + // Обработка Stroke + if (1 == nRenderMode || 2 == nRenderMode || 5 == nRenderMode || 6 == nRenderMode) + { + //Painter::CPen oPen; + + //m_pRenderer->put_PenSize( PDFCoordsToMM( pGState->GetFontSize() ) * 0.05 ); + //m_pRenderer->put_PenAlpha( 255 ); + //oPen.SetColor( m_oPen.GetColor() ); + + //BSTR bsPen = oPen.ToXmlString().AllocSysString(); + //m_pRenderer->SetPen( bsPen ); + //::SysFreeString( bsPen ); + } + } + void RendererOutputDev::EndStringOperator(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + int nRenderMode = pGState->GetRenderMode(); + + // Добавляем в Clipping Path текст + if (nRenderMode >= 4) + { + if (m_pBufferTextClip) + pGState->GetClip()->AppendTextClip(m_pBufferTextClip); + + for (int nIndex = 0; nIndex < m_pBufferTextClip->GetTextsCount(); nIndex++) + { + WString wsFontName, wsFontPath; + int nFontStyle; + double dFontSize = 10, dX = 0, dY = 0, dWidth = 0, dHeight = 0, dBaseLineOffset = 0; + WString wsText = m_pBufferTextClip->GetText(nIndex, &dX, &dY, &dWidth, &dHeight, &dBaseLineOffset, &wsFontName, &wsFontPath, &dFontSize, &nFontStyle); + double *pMatrix = m_pBufferTextClip->GetMatrix(nIndex); + + ClipToText(std::wstring(wsFontName), std::wstring(wsFontPath), dFontSize, nFontStyle, pMatrix, std::wstring(wsText), dX, dY, dWidth, dHeight, dBaseLineOffset); + } + + UpdateFont(pGState); + } + + // Возвращаем параметры для Stroke + if (1 == nRenderMode || 2 == nRenderMode || 5 == nRenderMode || 6 == nRenderMode) + { + //BSTR bsPen = m_oPen.ToXmlString().AllocSysString(); + //m_pRenderer->SetPen( bsPen ); + //::SysFreeString( bsPen ); + } + + m_pRenderer->EndCommand(c_nTextType); + } + void RendererOutputDev::DrawString(GrState *pGState, StringExt *seString) + { + if (m_bTransparentGroup) + return; + + // Проверяем наличие списка со шрифтами + if (NULL == m_pFontList) + return; + + // Проверяем наличие текущего шрифта + TFontEntry oEntry; + if (!m_pFontList->GetFont(pGState->GetFont()->GetID(), &oEntry)) + return; + + int nRendererMode = pGState->GetRenderMode(); + + if (3 == nRendererMode) // Невидимый текс + return; + + double *pCTM = pGState->GetCTM(); + double *pTm = pGState->GetTextMatrix(); + GrFont *pFont = pGState->GetFont(); + + std::wstring wsUnicodeText, wsGidText; + for (int nIndex = 0; nIndex < seString->GetLength(); nIndex++) + { + char nChar = seString->GetAt(nIndex); + + if (NULL != oEntry.pCodeToUnicode) + { + unsigned short unUnicode = oEntry.pCodeToUnicode[nChar]; + wsUnicodeText += (wchar_t(unUnicode)); + } + + if (NULL != oEntry.pCodeToGID) + { + unsigned short unGID; + if (0 != (unGID = oEntry.pCodeToGID[nChar])) + wsGidText += (wchar_t(unGID)); + } + else + { + int nCurCode = (0 == nChar ? 65534 : nChar); + wsGidText += (wchar_t(nCurCode)); + } + + } + + m_pRenderer->CommandDrawTextEx(wsUnicodeText, wsGidText, PDFCoordsToMM(100), PDFCoordsToMM(100), 0, PDFCoordsToMM(0), PDFCoordsToMM(0), 0); + } + void RendererOutputDev::DrawChar(GrState *pGState, double dX, double dY, double dDx, double dDy, double dOriginX, double dOriginY, CharCode nCode, int nBytesCount, Unicode *pUnicode, int nUnicodeLen) + { + if (m_bTransparentGroup) + return; + + // Проверяем наличие списка со шрифтами + if (NULL == m_pFontList) + return; + + // Проверяем наличие текущего шрифта + TFontEntry oEntry; + if (!m_pFontList->GetFont(pGState->GetFont()->GetID(), &oEntry)) + return; + + int nRenderMode = pGState->GetRenderMode(); + + if (3 == nRenderMode) // Невидимый текст + { + return; + } + + double *pCTM = pGState->GetCTM(); + double *pTm = pGState->GetTextMatrix(); + GrFont *pFont = pGState->GetFont(); + //double dTfs = pGState->GetFontSize(); + //double dTh = pGState->GetHorizScaling(); + //double dTrise = pGState->GetRise(); + //double *pFontBBox = pGState->GetFont()->GetFontBBox(); + + //double dAcsentFactor = ( ( fabs(pFontBBox[1]) + fabs(pFontBBox[3]) ) - ( pFont->GetAscent() + fabs( pFont->GetDescent() ) ) ) / 2 + pFont->GetAscent(); + double pNewTm[6], arrMatrix[6]; + //double dKoef = 0;//( pFont->GetAscent() - fabs( pFont->GetDescent() ) ) * dTfs; + + double dTextScale = min(sqrt(pTm[2] * pTm[2] + pTm[3] * pTm[3]), sqrt(pTm[0] * pTm[0] + pTm[1] * pTm[1])); + double dITextScale = 1 / dTextScale; + + //pTm[0] *= dITextScale; + //pTm[1] *= dITextScale; + //pTm[2] *= dITextScale; + //pTm[3] *= dITextScale; + + //double dOldSize = m_oFont.Size; + //m_oFont.Size *= dTextScale; + double dOldSize = 10.0; + m_pRenderer->get_FontSize(&dOldSize); + m_pRenderer->put_FontSize(dOldSize * dTextScale); + + pNewTm[0] = pTm[0] * dITextScale; + pNewTm[1] = pTm[1] * dITextScale; + pNewTm[2] = -pTm[2] * dITextScale; + pNewTm[3] = -pTm[3] * dITextScale; + //pNewTm[0] = pTm[0]; + //pNewTm[1] = pTm[1]; + //pNewTm[2] = -pTm[2]; + //pNewTm[3] = -pTm[3]; + pNewTm[4] = dX;//+ pTm[2] * dKoef; + pNewTm[5] = dY;//+ pTm[3] * dKoef; + + arrMatrix[0] = pNewTm[0] * pCTM[0] + pNewTm[1] * pCTM[2]; + arrMatrix[1] = -(pNewTm[0] * pCTM[1] + pNewTm[1] * pCTM[3]); + arrMatrix[2] = pNewTm[2] * pCTM[0] + pNewTm[3] * pCTM[2]; + arrMatrix[3] = -(pNewTm[2] * pCTM[1] + pNewTm[3] * pCTM[3]); + arrMatrix[4] = pNewTm[4] * pCTM[0] + pNewTm[5] * pCTM[2] + pCTM[4]; + arrMatrix[5] = -(pNewTm[4] * pCTM[1] + pNewTm[5] * pCTM[3] + pCTM[5]) + pGState->GetPageHeight(); + + //double dAscentShiftX = arrMatrix[2] * pFont->GetDescent(); + //double dAscentShiftY = arrMatrix[3] * pFont->GetDescent(); + + //arrMatrix[4] += dAscentShiftX; + //arrMatrix[5] += dAscentShiftY; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY, true); + + // Здесь мы посылаем координаты текста в пунктах + + double dPageHeight = pGState->GetPageHeight(); + + std::wstring wsUnicodeText; + if (NULL != oEntry.pCodeToUnicode && nCode < oEntry.unLenUnicode) + { + unsigned short unUnicode = oEntry.pCodeToUnicode[nCode]; + wsUnicodeText = (wchar_t(unUnicode)); + } + else + { + if (pGState->GetFont()->IsCIDFont()) + { + // Значит кодировка была Identity-H или Identity-V, что означает, что иходные коды и есть юникодные значения + wsUnicodeText = (wchar_t(nCode)); + } + else + { + // Договорились, что если нельзя точно составить юникодные значения, тогда отдаем NULL + wsUnicodeText = L""; + } + } + + std::wstring wsGidText = L""; + if (NULL != oEntry.pCodeToGID && nCode < oEntry.unLenGID) + { + unsigned short unGID; + if (0 == (unGID = oEntry.pCodeToGID[nCode])) + wsGidText = L""; + else + wsGidText = wchar_t(unGID); + } + else + { + int nCurCode = (0 == nCode ? 65534 : nCode); + wsGidText = wchar_t(nCurCode); + } + + std::wstring wsSrcCodeText; + if (c_nPDFWriter == m_lRendererType) + { + int nCurCode = (0 == nCode ? 65534 : nCode); + if (pGState->GetFont()->IsCIDFont()) + { + // Мы посылаем и сам CID и внутренний Code с его длинной + CXmlWriter oWriter; + oWriter.WriteNodeBegin(L"PDF-Text", true); + oWriter.WriteAttribute(L"cid", nCurCode); + oWriter.WriteAttribute(L"code", (unsigned short)(pUnicode[0])); + oWriter.WriteAttribute(L"len", nUnicodeLen); + oWriter.WriteNodeEnd(L"PDF-Text", true, true); + wsSrcCodeText = oWriter.GetXmlString(); + } + else + { + // Мы посылаем и сам CID и внутренний Code с его длинной + CXmlWriter oWriter; + oWriter.WriteNodeBegin(L"PDF-Text", true); + oWriter.WriteAttribute(L"code", nCurCode); + oWriter.WriteNodeEnd(L"PDF-Text", true, true); + wsSrcCodeText = oWriter.GetXmlString(); + } + } + else + { + wsSrcCodeText = L""; + } + + // TODO: В текщем варианте рендерера убран wsSrcCodeText, он нужен для перезаписи PDF, как будет добавлена функция изменить здесь. + float fAscent = pGState->GetFontSize(); + if (nRenderMode == 0 || nRenderMode == 2 || nRenderMode == 4 || nRenderMode == 6) + { + m_pRenderer->CommandDrawTextEx(wsUnicodeText, wsGidText, PDFCoordsToMM(0 + dShiftX), PDFCoordsToMM(dShiftY), PDFCoordsToMM(dDx), PDFCoordsToMM(dDy), PDFCoordsToMM(0), 0); + } + + if (nRenderMode == 1 || nRenderMode == 2 || nRenderMode == 5 || nRenderMode == 6) + { + m_pRenderer->BeginCommand(c_nStrokeTextType); + + m_pRenderer->PathCommandEnd(); + //m_pRenderer->PathCommandText( bsText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ) ); + + + // Временно + //m_pRenderer->PathCommandTextEx( bsText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), 0, bsStringGID ); + //m_pRenderer->PathCommandTextEx( bsUnicodeText, bsGIDText, bsSrcCodeText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/0 + dShiftY ), PDFCoordsToMM( dDx ), PDFCoordsToMM( dDy ), PDFCoordsToMM( 0 ), 0 ); + //----------- + + + //m_pRenderer->PathCommandText( bsUnicodeText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY ), PDFCoordsToMM( dDx ), PDFCoordsToMM( dDy ), PDFCoordsToMM( 0 ) ); + //m_pRenderer->DrawPath( c_nStroke ); + + m_pRenderer->EndCommand(c_nStrokeTextType); + } + + if (4 <= nRenderMode) + { + std::wstring wsTempFontName, wsTempFontPath; + double dTempFontSize; + long lTempFontStyle; + m_pRenderer->get_FontName(&wsTempFontName); + m_pRenderer->get_FontPath(&wsTempFontPath); + m_pRenderer->get_FontSize(&dTempFontSize); + m_pRenderer->get_FontStyle(&lTempFontStyle); + m_pBufferTextClip->ClipToText(wsTempFontName, wsTempFontPath, dTempFontSize, (int)lTempFontStyle, arrMatrix, wsGidText, 0 + dShiftX, /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY, 0, 0, 0); + } + + m_pRenderer->put_FontSize(dOldSize); + } + bool RendererOutputDev::BeginType3Char(GrState *pGState, double dX, double dY, double dDx, double dDy, CharCode nCode, Unicode *pUnicode, int nUnicodeLen) + { + return false; + } + void RendererOutputDev::EndType3Char(GrState *pGState) + { + return; + } + void RendererOutputDev::Type3D0(GrState *pGState, double dWx, double dWy) + { + return; + } + void RendererOutputDev::Type3D1(GrState *pGState, double dWx, double dWy, double dBLx, double dBLy, double dTRx, double dTRy) + { + return; + } + void RendererOutputDev::DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage) + { + if (pGState->GetFillColorSpace()->IsNonMarking()) + { + return; + } + + double dPageHeight = pGState->GetPageHeight(); + + int nBufferSize = 4 * nWidth * nHeight; + if (nBufferSize < 1) + return; + + unsigned char *pBufferPtr = new unsigned char[nBufferSize]; + if (!pBufferPtr) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferPtr, nWidth, nHeight, 4 * nWidth); + + // Пишем данные в pBufferPtr + ImageStream *pImageStream = new ImageStream(pStream, nWidth, 1, 1); + + pImageStream->Reset(); + + unsigned char unAlpha = m_bTransparentGroup ? 255.0 * pGState->GetFillOpacity() : 255; + unsigned char unPixel = 0; + int nInvert = (bInvert ? 1 : 0); + for (int nY = nHeight - 1; nY >= 0; nY--) + { + unsigned char *pMask = NULL; + int nX = 0; + for (nX = 0, pMask = pImageStream->GetNextLine(); nX < nWidth; nX++) + { + int nIndex = 4 * (nX + nY * nWidth); + unsigned char unPixel = *pMask++ ^ nInvert; + pBufferPtr[nIndex + 0] = unPixel ? 255 : 0; + pBufferPtr[nIndex + 1] = unPixel ? 255 : 0; + pBufferPtr[nIndex + 2] = unPixel ? 255 : 0; + pBufferPtr[nIndex + 3] = unPixel ? 0 : unAlpha; + } + } + + delete pImageStream; + + double arrMatrix[6]; + double *pCTM = pGState->GetCTM(); + + // Исходное предобразование + // |1 0 0| |pCTM[0] pCTM[1] 0| + // arrMattrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| + // |0 1 1| |pCTM[4] pCTM[5] 1| + + arrMatrix[0] = pCTM[0]; + arrMatrix[1] = -pCTM[1]; + arrMatrix[2] = -pCTM[2]; + arrMatrix[3] = -(-pCTM[3]); + arrMatrix[4] = pCTM[2] + pCTM[4]; + arrMatrix[5] = -(pCTM[3] + pCTM[5]) + dPageHeight; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY, true); + m_pRenderer->DrawImage(&oImage, 0 + dShiftX, 0 + dShiftY, PDFCoordsToMM(1), PDFCoordsToMM(1)); + } + void RendererOutputDev::DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pMaskColors, bool bInlineImg) + { + double dPageHeight = pGState->GetPageHeight(); + + int nBufferSize = 4 * nWidth * nHeight; + if (nBufferSize < 1) + return; + + unsigned char *pBufferPtr = new unsigned char[nBufferSize]; + if (!pBufferPtr) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferPtr, nWidth, nHeight, 4 * nWidth); + + // Пишем данные в pBufferPtr + ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); + + pImageStream->Reset(); + + unsigned char unAlpha = m_bTransparentGroup ? 255.0 * pGState->GetFillOpacity() : 255; + + unsigned char unPixel[32] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nX + nY * nWidth); + pImageStream->GetPixel(unPixel); + GrRGB oRGB; + pColorMap->GetRGB(unPixel, &oRGB); + pBufferPtr[nIndex + 0] = ColorToByte(oRGB.b); + pBufferPtr[nIndex + 1] = ColorToByte(oRGB.g); + pBufferPtr[nIndex + 2] = ColorToByte(oRGB.r); + pBufferPtr[nIndex + 3] = unAlpha; + } + } + + delete pImageStream; + + double arrMatrix[6]; + double *pCTM = pGState->GetCTM(); + // Исходное предобразование + // |1 0 0| |pCTM[0] pCTM[1] 0| + // arrMatrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| + // |0 1 1| |pCTM[4] pCTM[5] 1| + arrMatrix[0] = pCTM[0]; + arrMatrix[1] = -pCTM[1]; + arrMatrix[2] = -pCTM[2]; + arrMatrix[3] = -(-pCTM[3]); + arrMatrix[4] = pCTM[2] + pCTM[4]; + arrMatrix[5] = -(pCTM[3] + pCTM[5]) + dPageHeight; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY, true); + m_pRenderer->DrawImage(&oImage, 0 + dShiftX, 0 + dShiftY, PDFCoordsToMM(1), PDFCoordsToMM(1)); + } + void RendererOutputDev::DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert) + { + // Вообще, размеры маски и самой картинки могут не совпадать (в этом случае мы должны срезайзить до размеров картинки) + // TO DO: Сделать, когда появится файл + if (nWidth != nMaskWidth || nHeight != nMaskHeight) + DrawImage(pGState, pRef, pStream, nWidth, nHeight, pColorMap, NULL, false); + + double dPageHeight = pGState->GetPageHeight(); + + int nBufferSize = 4 * nWidth * nHeight; + if (nBufferSize < 1) + return; + + unsigned char *pBufferPtr = new unsigned char[nBufferSize]; + if (!pBufferPtr) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferPtr, nWidth, nHeight, 4 * nWidth); + + // Пишем данные в pBufferPtr + ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); + ImageStream *pMask = new ImageStream(pMaskStream, nMaskWidth, 1, 1); + + pMask->Reset(); + pImageStream->Reset(); + + unsigned char unPixel[4] ={ 0, 0, 0, 0 }; + unsigned char unMask = 0; + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nX + nY * nWidth); + pImageStream->GetPixel(unPixel); + pMask->GetPixel(&unMask); + GrRGB oRGB; + pColorMap->GetRGB(unPixel, &oRGB); + pBufferPtr[nIndex + 0] = ColorToByte(oRGB.b); + pBufferPtr[nIndex + 1] = ColorToByte(oRGB.g); + pBufferPtr[nIndex + 2] = ColorToByte(oRGB.r); + + if (unMask && !bMaskInvert) + pBufferPtr[nIndex + 3] = 0; + else + pBufferPtr[nIndex + 3] = 255; + } + } + + delete pMask; + delete pImageStream; + + double arrMatrix[6]; + double *pCTM = pGState->GetCTM(); + // Исходное предобразование + // |1 0 0| |pCTM[0] pCTM[1] 0| + // arrMatrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| + // |0 1 1| |pCTM[4] pCTM[5] 1| + arrMatrix[0] = pCTM[0]; + arrMatrix[1] = -pCTM[1]; + arrMatrix[2] = -pCTM[2]; + arrMatrix[3] = -(-pCTM[3]); + arrMatrix[4] = pCTM[2] + pCTM[4]; + arrMatrix[5] = -(pCTM[3] + pCTM[5]) + dPageHeight; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY, true); + m_pRenderer->DrawImage(&oImage, 0 + dShiftX, 0 + dShiftY, PDFCoordsToMM(1), PDFCoordsToMM(1)); + } + void RendererOutputDev::DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap) + { + double dPageHeight = pGState->GetPageHeight(); + + int nBufferSize = 4 * nWidth * nHeight; + if (nBufferSize < 1) + return; + + unsigned char *pBufferPtr = new unsigned char[nBufferSize]; + if (!pBufferPtr) + return; + + Aggplus::CImage oImage; + oImage.Create(pBufferPtr, nWidth, nHeight, 4 * nWidth); + + // Пишем данные в pBufferPtr + ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); + pImageStream->Reset(); + + double dAlphaKoef = m_bTransparentGroup ? pGState->GetFillOpacity() : 1; + unsigned char unPixel[4] ={ 0, 0, 0, 0 }; + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nX + nY * nWidth); + pImageStream->GetPixel(unPixel); + GrRGB oRGB; + pColorMap->GetRGB(unPixel, &oRGB); + pBufferPtr[nIndex + 0] = ColorToByte(oRGB.b); + pBufferPtr[nIndex + 1] = ColorToByte(oRGB.g); + pBufferPtr[nIndex + 2] = ColorToByte(oRGB.r); + pBufferPtr[nIndex + 3] = 255; + } + } + delete pImageStream; + + if (nWidth != nMaskWidth || nHeight != nMaskHeight) + { + // TO DO: Здесь сделан элементарный вариант масштабирования маски. + // Надо улучшить алгоритм. + + bool bResize = true; + + if (0 != nWidth && 0 != nMaskHeight && 0 != nHeight && 0 != nMaskWidth) + { + ImageStream *pSMaskStream = new ImageStream(pMaskStream, nMaskWidth, pMaskColorMap->GetComponentsCount(), pMaskColorMap->GetBitsPerComponent()); + unsigned char *pAlpha = new unsigned char[nMaskWidth * nMaskHeight]; + + if (pMaskStream && pAlpha) + { + pSMaskStream->Reset(); + + unsigned char unAlpha = 0; + for (int nY = 0; nY < nMaskHeight; nY++) + { + for (int nX = 0; nX < nMaskWidth; nX++) + { + int nIndex = (nX + nY * nMaskWidth); + pSMaskStream->GetPixel(&unAlpha); + GrGray oGray; + pMaskColorMap->GetGray(&unAlpha, &oGray); + pAlpha[nIndex] = ColorToByte(oGray); + } + } + delete pSMaskStream; + + double dScaleWidth = (double)nMaskWidth / (double)nWidth; + double dScaleHeight = (double)nMaskHeight / (double)nHeight; + + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nY * nWidth + nX); + + int nNearestMatch = (((int)((nHeight - 1 - nY) * dScaleHeight) * nMaskWidth) + ((int)(nX * dScaleWidth))); + + pBufferPtr[nIndex + 3] = (unsigned char)(pAlpha[nNearestMatch] * dAlphaKoef); + } + } + + delete pAlpha; + } + else + { + if (pAlpha) + delete pAlpha; + + if (pMaskStream) + delete pMaskStream; + + bResize = false; + } + } + else + bResize = false; + + if (!bResize) + { + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nY * nWidth + nX); + pBufferPtr[nIndex + 3] = (unsigned char)(255.0 * dAlphaKoef); + } + } + } + } + else + { + ImageStream *pSMaskStream = new ImageStream(pMaskStream, nMaskWidth, pMaskColorMap->GetComponentsCount(), pMaskColorMap->GetBitsPerComponent()); + pSMaskStream->Reset(); + + unsigned char unAlpha = 0; + for (int nY = nHeight - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nX + nY * nWidth); + pSMaskStream->GetPixel(&unAlpha); + GrGray oGray; + pMaskColorMap->GetGray(&unAlpha, &oGray); + pBufferPtr[nIndex + 3] = ColorToByte(oGray) * dAlphaKoef; + } + } + delete pSMaskStream; + } + + double arrMatrix[6]; + double *pCTM = pGState->GetCTM(); + // Исходное предобразование + // |1 0 0| |pCTM[0] pCTM[1] 0| + // arrMattrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| + // |0 1 1| |pCTM[4] pCTM[5] 1| + arrMatrix[0] = pCTM[0]; + arrMatrix[1] = -pCTM[1]; + arrMatrix[2] = -pCTM[2]; + arrMatrix[3] = -(-pCTM[3]); + arrMatrix[4] = pCTM[2] + pCTM[4]; + arrMatrix[5] = -(pCTM[3] + pCTM[5]) + dPageHeight; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY, true); + m_pRenderer->DrawImage(&oImage, 0 + dShiftX, 0 + dShiftY, PDFCoordsToMM(1), PDFCoordsToMM(1)); + } + void RendererOutputDev::BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bForSoftMask) + { + m_bTransparentGroup = true; + m_bTransparentGroupSoftMask = bForSoftMask; + } + void RendererOutputDev::EndTransparencyGroup(GrState *pGState) + { + m_bTransparentGroup = false; + m_bTransparentGroupSoftMask = false; + + if (m_pTransparentGroupSoftMask) + delete[]m_pTransparentGroupSoftMask; + + m_pTransparentGroupSoftMask = NULL; + } + void RendererOutputDev::PaintTransparencyGroup(GrState *pGState, double *pBBox) + { + } + void RendererOutputDev::SetSoftMask(GrState *pGState, double *pBBox, bool bAlpha, Function *pTransferFunc, GrColor *pBackdropColor) + { + } + void RendererOutputDev::ClearSoftMask(GrState *pGState) + { + } + void RendererOutputDev::NewPDF(XRef *pXref) + { + m_pXref = pXref; + } + void RendererOutputDev::Transform(double *pMatrix, double dUserX, double dUserY, double *pdDeviceX, double *pdDeviceY) + { + *pdDeviceX = dUserX * pMatrix[0] + dUserY * pMatrix[2] + pMatrix[4]; + *pdDeviceY = dUserX * pMatrix[1] + dUserY * pMatrix[3] + pMatrix[5]; + } + void RendererOutputDev::DoPath(GrState *pGState, GrPath *pPath, double dPageHeight, double *pCTM) + { + if (m_bTransparentGroup) + return; + + double arrMatrix[6]; + //double *pCTM = pGState->GetCTM(); + arrMatrix[0] = pCTM[0]; + arrMatrix[1] = -pCTM[1]; + arrMatrix[2] = pCTM[2]; + arrMatrix[3] = -pCTM[3]; + arrMatrix[4] = pCTM[4]; + arrMatrix[5] = -pCTM[5] + dPageHeight; + + double dShiftX = 0, dShiftY = 0; + DoTransform(arrMatrix, &dShiftX, &dShiftY); + + m_pRenderer->BeginCommand(c_nPathType); + m_pRenderer->PathCommandEnd(); + + int nSubPathCount = pPath->GetSubpathsCount(); + + for (int nSubPathIndex = 0; nSubPathIndex < nSubPathCount; ++nSubPathIndex) + { + GrSubpath *pSubpath = pPath->GetSubpath(nSubPathIndex); + int nPointsCount = pSubpath->GetPointsCount(); + + m_pRenderer->PathCommandMoveTo(PDFCoordsToMM(pSubpath->GetX(0) + dShiftX), PDFCoordsToMM(pSubpath->GetY(0) + dShiftY)); + + int nCurPointIndex = 1; + while (nCurPointIndex < nPointsCount) + { + if (pSubpath->GetCurve(nCurPointIndex)) + { + m_pRenderer->PathCommandCurveTo(PDFCoordsToMM(pSubpath->GetX(nCurPointIndex) + dShiftX), PDFCoordsToMM(pSubpath->GetY(nCurPointIndex) + dShiftY), PDFCoordsToMM(pSubpath->GetX(nCurPointIndex + 1) + dShiftX), PDFCoordsToMM(pSubpath->GetY(nCurPointIndex + 1) + dShiftY), PDFCoordsToMM(pSubpath->GetX(nCurPointIndex + 2) + dShiftX), PDFCoordsToMM(pSubpath->GetY(nCurPointIndex + 2) + dShiftY)); + nCurPointIndex += 3; + } + else + { + m_pRenderer->PathCommandLineTo(PDFCoordsToMM(pSubpath->GetX(nCurPointIndex) + dShiftX), PDFCoordsToMM(pSubpath->GetY(nCurPointIndex) + dShiftY)); + ++nCurPointIndex; + } + } + if (pSubpath->IsClosed()) + { + m_pRenderer->PathCommandClose(); + } + } + } + void RendererOutputDev::UpdateClip(GrState *pGState) + { + if (m_bTransparentGroup) + return; + + if (m_bTiling) + return; + + UpdateClipAttack(pGState); + } + void RendererOutputDev::UpdateClipAttack(GrState *pGState) + { + GrClip *pClip = pGState->GetClip(); + + int nPathIndex = -1; + //if ( m_pClip && m_pClip->IsEqual( pClip, nPathIndex ) ) + //{ + // return; + //} + + if (-1 == nPathIndex) + { + m_pRenderer->BeginCommand(c_nResetClipType); + m_pRenderer->EndCommand(c_nResetClipType); + + for (int nIndex = 0; nIndex < pClip->GetPathsCount(); nIndex++) + { + GrPath *pPath = pClip->GetPath(nIndex); + int nFlag = pClip->GetFlag(nIndex); + double *pMatrix = pClip->GetMatrix(nIndex); + + int nClipFlag = GrClipEOFlag == nFlag ? c_nClipRegionTypeEvenOdd : c_nClipRegionTypeWinding; + nClipFlag |= c_nClipRegionIntersect; + + m_pRenderer->BeginCommand(c_nClipType); + m_pRenderer->put_ClipMode(nClipFlag); + DoPath(pGState, pPath, pGState->GetPageHeight(), pMatrix); + m_pRenderer->EndCommand(c_nPathType); + m_pRenderer->EndCommand(c_nClipType); + } + + for (int nIndex = 0; nIndex < pClip->GetTextsCount(); nIndex++) + { + WString wsFontName, wsFontPath; + int lFontStyle; + double dFontSize = 10, dX = 0, dY = 0, dWidth = 0, dHeight = 0, dBaseLineOffset = 0; + WString wsText = pClip->GetText(nIndex, &dX, &dY, &dWidth, &dHeight, &dBaseLineOffset, &wsFontName, &wsFontPath, &dFontSize, &lFontStyle); + int nFlag = pClip->GetFlag(nIndex); + + m_pRenderer->put_FontName(wsFontName); + m_pRenderer->put_FontPath(wsFontPath); + m_pRenderer->put_FontSize(dFontSize); + m_pRenderer->put_FontStyle(lFontStyle); + + double dShiftX = 0, dShiftY = 0; + DoTransform(pClip->GetTextMatrix(nIndex), &dShiftX, &dShiftY, true); + + int nFlags = 0; + m_pRenderer->BeginCommand(c_nClipType); + m_pRenderer->put_ClipMode(c_nClipRegionTypeWinding | c_nClipRegionUnion); + m_pRenderer->PathCommandEnd(); + m_pRenderer->put_FontStringGID(true); + m_pRenderer->PathCommandTextEx(wsText, L"", PDFCoordsToMM(dX), PDFCoordsToMM(dY), PDFCoordsToMM(dWidth), PDFCoordsToMM(dHeight), PDFCoordsToMM(dBaseLineOffset), 0); + m_pRenderer->EndCommand(c_nClipType); + } + } + else + { + for (int nIndex = nPathIndex; nIndex < pClip->GetPathsCount(); nIndex++) + { + GrPath *pPath = pClip->GetPath(nIndex); + int nFlag = pClip->GetFlag(nIndex); + double *pMatrix = pClip->GetMatrix(nIndex); + + int nClipFlag = GrClipEOFlag == nFlag ? c_nClipRegionTypeEvenOdd : c_nClipRegionTypeWinding; + nClipFlag |= c_nClipRegionIntersect; + + m_pRenderer->BeginCommand(c_nClipType); + m_pRenderer->put_ClipMode(nClipFlag); + DoPath(pGState, pPath, pGState->GetPageHeight(), pMatrix); + m_pRenderer->EndCommand(c_nPathType); + m_pRenderer->EndCommand(c_nClipType); + + } + } + + if (m_pClip) + delete m_pClip; + + m_pClip = pClip->Copy(); + + UpdateFont(pGState); + } + void RendererOutputDev::DoTransform(double *pMatrix, double *pdShiftX, double *pdShiftY, bool bText) + { + if (1 == pMatrix[0] && 0 == pMatrix[1] && 0 == pMatrix[2] && 1 == pMatrix[3] && !bText) + { + if (0 == pMatrix[4] && 0 == pMatrix[5]) + { + m_pRenderer->ResetTransform(); + m_arrMatrix[0] = 1; m_arrMatrix[1] = 0; + m_arrMatrix[2] = 0; m_arrMatrix[3] = 1; + m_arrMatrix[4] = 0; m_arrMatrix[5] = 0; + } + else + { + *pdShiftX = pMatrix[4]; + *pdShiftY = pMatrix[5]; + m_pRenderer->ResetTransform(); + m_arrMatrix[0] = 1; m_arrMatrix[1] = 0; + m_arrMatrix[2] = 0; m_arrMatrix[3] = 1; + m_arrMatrix[4] = 0; m_arrMatrix[5] = 0; + } + } + else if (m_arrMatrix[0] == pMatrix[0] && m_arrMatrix[1] == pMatrix[1] && m_arrMatrix[2] == pMatrix[2] && m_arrMatrix[3] == pMatrix[3] && !bText) + { + double dNewX = pMatrix[4], dNewY = pMatrix[5]; + double dIDet = 1 / (pMatrix[0] * pMatrix[3] - pMatrix[1] * pMatrix[2]); + + *pdShiftX = ((dNewX - m_arrMatrix[4]) * m_arrMatrix[3] - (dNewY - m_arrMatrix[5]) * m_arrMatrix[1]) * dIDet; + *pdShiftY = ((dNewY - m_arrMatrix[5]) * m_arrMatrix[0] - (dNewX - m_arrMatrix[4]) * m_arrMatrix[2]) * dIDet; + } + else + { + m_pRenderer->SetTransform(pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], PDFCoordsToMM(pMatrix[4]), PDFCoordsToMM(pMatrix[5])); + m_arrMatrix[0] = pMatrix[0]; m_arrMatrix[1] = pMatrix[1]; + m_arrMatrix[2] = pMatrix[2]; m_arrMatrix[3] = pMatrix[3]; + m_arrMatrix[4] = pMatrix[4]; m_arrMatrix[5] = pMatrix[5]; + } + return; + } +} \ No newline at end of file diff --git a/PdfReader/Src/RendererOutputDev.h b/PdfReader/Src/RendererOutputDev.h new file mode 100644 index 0000000000..7ad8f7eeb8 --- /dev/null +++ b/PdfReader/Src/RendererOutputDev.h @@ -0,0 +1,259 @@ +#ifndef _PDF_READER_RENDERER_OUTPUTDEV_H +#define _PDF_READER_RENDERER_OUTPUTDEV_H + +#include "../../DesktopEditor/graphics/IRenderer.h" +#include "../../DesktopEditor/fontengine/FontManager.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" + +#include "OutputDevice.h" +#include "XmlUtils.h" + +namespace PdfReader +{ + class Gr8BitFont; + class OutputDev; + class GrPath; + class GrTextClip; + class GrState; + class GrClip; + struct Ref; + + //------------------------------------------------------------------------------------------------------------------------------- + struct TFontEntry + { + Ref oRef; // Ссылка на объект-шрифт + std::wstring wsFilePath; // Путь к шрифту на диске + std::wstring wsFontName; // Имя шрифта, которое записано в PDF(ветка для случаев, когда имя шрифта в самом шрифте не указано) + unsigned short *pCodeToGID; // Таблица код - номер глифа в шрифте + unsigned short *pCodeToUnicode; // Таблица код - юникодное значение + unsigned int unLenGID; // Количество элементов в таблицах + unsigned int unLenUnicode; // + bool bAvailable; // Доступен ли шрифт. Сделано для многопотоковости + + }; + + class CFontList + { + public: + + CFontList(); + ~CFontList(); + void LoadFromFile(std::wstring wsDirPath); + void SaveToFile(std::wstring wsDirPath); + bool Find(Ref oRef, TFontEntry *pEntry); + bool Find2(Ref oRef, TFontEntry **ppEntry); + TFontEntry *Add(Ref oRef, std::wstring wsFileName, unsigned short *pCodeToGID, unsigned short *pCodeToUnicode, unsigned int nLenGID, unsigned int nLenUnicode); + void Clear(); + bool GetFont(Ref *pRef, TFontEntry *pEntry); + private: + + TFontEntry* Lookup(Ref& oRef) + { + CRefFontMap::const_iterator oPos = m_oFontMap.find(oRef); + if (m_oFontMap.end() != oPos) + return oPos->second; + + return NULL; + } + void Add(Ref& oRef, TFontEntry* pFontEntry) + { + // До вызова данной функции надо проверять есть ли элемент с данным ключом + m_oFontMap.insert(std::pair(oRef, pFontEntry)); + } + + private: + + typedef std::map CRefFontMap; + CRefFontMap m_oFontMap; + NSCriticalSection::CRITICAL_SECTION m_oCS; // Критическая секция + }; + //------------------------------------------------------------------------------------------------------------------------------- + template + inline static double PDFCoordsToMM(T tX) + { + return ((double)tX / 72.0) * 25.4; + } + + //------------------------------------------------------------------------------------------------------------------------------- + static void FileWrite(void *pStream, char *sData, int nLen) + { + ::fwrite(sData, 1, nLen, (FILE *)pStream); + } + //------------------------------------------------------------------------------------------------------------------------------- + // RendererOutputDev + //------------------------------------------------------------------------------------------------------------------------------- + + class RendererOutputDev : public OutputDev + { + public: + + RendererOutputDev(GlobalParams *pGlobalParams, IRenderer *pRenderer, CFontManager* pFontManager, CFontList *pFontList = NULL); + virtual ~RendererOutputDev(); + virtual bool UpSideDown() + { + return false; + } + virtual bool UseDrawChar() + { + return true; + } + virtual bool UseTilingPatternFill() + { + return false; + } + virtual bool UseFunctionalShadedFills() + { + return false; + } + virtual bool UseAxialShadedFills() + { + return m_bUseAxialShaded; + } + virtual bool UseRadialShadedFills() + { + return m_bUseRadialShaded; + } + virtual bool UseClipTo() + { + return false;//true; + } + virtual bool InterpretType3Chars() + { + return true; + } + virtual bool UseFillAndStroke() + { + return true; + } + virtual bool UseSimpleTransparentGroup() + { + return true; + } + virtual bool UseSimpleTilingPatternFill() + { + if (NULL == m_pRenderer) + return false; + + // TODO: m_pRenderer->GetAdditionalParam(L"TilingHtmlPattern"); + + return false; + } + virtual bool IsStopped() + { + if (NULL != m_pbBreak) + return *m_pbBreak; + else + return false; + } + //--------------------------------------------------------------------------------------------------------------------------- + virtual void StartPage(int nPageIndex, GrState *pGState); + virtual void EndPage(); + //----- Save/Restore GState + virtual void SaveGState(GrState *pGState); + virtual void RestoreGState(GrState *pGState); + //----- Изменение параметров в GState + virtual void UpdateCTM(GrState *pGState, double dMatrix11, double dMatrix12, double dMatrix21, double dMatrix22, double dMatrix31, double dMatrix32); + virtual void UpdateLineDash(GrState *pGState); + virtual void UpdateFlatness(GrState *pGState); + virtual void UpdateLineJoin(GrState *pGState); + virtual void UpdateLineCap(GrState *pGState); + virtual void UpdateMiterLimit(GrState *pGState); + virtual void UpdateLineWidth(GrState *pGState); + virtual void UpdateStrokeAdjust(GrState *pGState); + virtual void UpdateFillColor(GrState *pGState); + virtual void UpdateStrokeColor(GrState *pGState); + virtual void UpdateBlendMode(GrState *pGState); + virtual void UpdateFillOpacity(GrState *pGState); + virtual void UpdateStrokeOpacity(GrState *pGState); + virtual void UpdateAll(GrState *pGState); + virtual void UpdateRender(GrState *pGState); + //----- Изменение текстовых параметров + virtual void UpdateFont(GrState *pGState); + //----- Рисование Path + virtual void Stroke(GrState *pGState); + virtual void Fill(GrState *pGState); + virtual void EoFill(GrState *pGState); + virtual void FillStroke(GrState *pGState); + virtual void EoFillStroke(GrState *pGState); + virtual void TilingPatternFill(GrState *pGState, Object *pStream, int nPaintType, Dict *pResourcesDict, double *pMatrix, double *pBBox, int nX0, int nY0, int nX1, int nY1, double dXStep, double dYStep); + virtual void StartTilingFill(GrState *pGState); + virtual void EndTilingFill(); + virtual bool FunctionShadedFill(GrState *pGState, GrFunctionShading *pShading); + virtual bool AxialShadedFill(GrState *pGState, GrAxialShading *pShading); + virtual bool RadialShadedFill(GrState *pGState, GrRadialShading *pShading); + virtual void StartShadedFill(GrState *pGState); + virtual void EndShadedFill(); + virtual void StartTilingFillIteration(); + virtual void EndTilingFillIteration(); + virtual void StartSimpleTilingFill(GrState *pGState, int nX0, int nY0, int nX1, int nY1, double dStepX, double dStepY, double dXMin, double dYMin, double dXMax, double dYMax, double* pMatrix); + virtual void EndSimpleTilingFill(); + //----- Path clipping + virtual void Clip(GrState *pGState); + virtual void ClipAttack(GrState *pGState) + { + UpdateClipAttack(pGState); + } + virtual void EoClip(GrState *pGState); + virtual void ClipToStrokePath(GrState *pGState); + virtual void ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, bool bEO); + //----- Вывод текста + virtual void BeginStringOperator(GrState *pGState); + virtual void EndStringOperator(GrState *pGState); + virtual void DrawString(GrState *pGState, StringExt *seString); + virtual void DrawChar(GrState *pGState, double dX, double dY, double dDx, double dDy, double dOriginX, double dOriginY, CharCode nCode, int nBytesCount, Unicode *pUnicode, int nUnicodeLen); + bool BeginType3Char(GrState *pGState, double dX, double dY, double dDx, double dDy, CharCode nCode, Unicode *pUnicode, int nUnicodeLen); + void EndType3Char(GrState *pGState); + void Type3D0(GrState *pGState, double dWx, double dWy); + void Type3D1(GrState *pGState, double dWx, double dWy, double dBLx, double dBLy, double dTRx, double dTRy); + //----- Вывод картинок + virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage); + virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pMaskColors, bool bInlineImg); + virtual void DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert); + virtual void DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap); + //----- Transparency groups и SMasks + virtual void BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bForSoftMask); + virtual void EndTransparencyGroup(GrState *pGState); + virtual void PaintTransparencyGroup(GrState *pGState, double *pBBox); + virtual void SetSoftMask(GrState *pGState, double *pBBox, bool bAlpha, Function *pTransferFunc, GrColor *pBackdropColor); + virtual void ClearSoftMask(GrState *pGState); + //----- Дополнительные функции для данного устройства + void NewPDF(XRef *pXref); + void SetBreak(bool* pbBreak) + { + m_pbBreak = pbBreak; + } + private: + + void Transform(double *pMatrix, double dUserX, double dUserY, double *pdDeviceX, double *pdDeviceY); + void DoPath(GrState *pGState, GrPath *pPath, double dPageHeight, double *pCTM); + void ClipToText(std::wstring& wsFontName, std::wstring& wsFontPath, double dFontSize, int nFontStyle, double* pMatrix, std::wstring& wsText, double dX, double dY, double dWidth = 0, double dHeight = 0, double dBaseLineOffset = 0); + void UpdateClip(GrState *pGState); + void UpdateClipAttack(GrState *pGState); + void DoTransform(double *pMatrix, double *pdShiftX, double *pdShiftY, bool bText = false); + private: + + IRenderer* m_pRenderer; + long m_lRendererType; + double m_arrMatrix[6]; + CFontManager* m_pFontManager; + + GrTextClip *m_pBufferTextClip; + + XRef *m_pXref; // Таблица Xref для данного PDF-документа + CFontList *m_pFontList; + + bool *m_pbBreak; // Внешняя остановка рендерера + + bool m_bUseAxialShaded; + bool m_bUseRadialShaded; + + GrClip *m_pClip; + bool m_bTiling; + bool m_bTransparentGroup; + + bool m_bTransparentGroupSoftMask; + unsigned char* m_pTransparentGroupSoftMask; + }; +} + +#endif // _PDF_READER_RENDERER_OUTPUTDEV_H diff --git a/PdfReader/Src/Resource.h b/PdfReader/Src/Resource.h new file mode 100644 index 0000000000..8aa4c317fa --- /dev/null +++ b/PdfReader/Src/Resource.h @@ -0,0 +1,31 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by AVSOfficePDFReader.rc +// +#define IDS_PROJNAME 100 +#define IDR_ASCOFFICEPDFREADER 101 +#define IDR_Symbol 204 +#define IDR_ZapfDingbats 205 +#define IDR_Helvetica 206 +#define IDR_HelveticaBold 207 +#define IDR_HelveticaOblique 208 +#define IDR_HelveticaBoldOblique 209 +#define IDR_TimesRoman 210 +#define IDR_TimesBold 211 +#define IDR_TimesItalic 212 +#define IDR_TimesBoldItalic 213 +#define IDR_Courier 214 +#define IDR_CourierBold 215 +#define IDR_CourierOblique 216 +#define IDR_CourierBoldOblique 217 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 218 +#define _APS_NEXT_COMMAND_VALUE 32769 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 102 +#endif +#endif diff --git a/PdfReader/Src/SecurityHandler.cpp b/PdfReader/Src/SecurityHandler.cpp new file mode 100644 index 0000000000..89034c789d --- /dev/null +++ b/PdfReader/Src/SecurityHandler.cpp @@ -0,0 +1,306 @@ +#include "StringExt.h" +#include "PDFDoc.h" +#include "Decrypt.h" +#include "GlobalParams.h" +#include "SecurityHandler.h" + +namespace PdfReader +{ + //------------------------------------------------------------------------------------------------------------------------------- + // SecurityHandler + //------------------------------------------------------------------------------------------------------------------------------- + + SecurityHandler *SecurityHandler::Make(PDFDoc *pDocument, Object *pEncryptDict) + { + SecurityHandler *pSecurityHandler = NULL; + Object oFilter; + pEncryptDict->DictLookup("Filter", &oFilter); + if (oFilter.IsName("Standard")) + { + pSecurityHandler = new StandardSecurityHandler(pDocument, pEncryptDict); + } + else if (oFilter.IsName()) + { + // TO DO: Error "Couldn't find the security handler" + pSecurityHandler = NULL; + } + else + { + // TO DO: Error "Missing or invalid 'Filter' entry in encryption dictionary" + pSecurityHandler = NULL; + } + oFilter.Free(); + return pSecurityHandler; + } + + SecurityHandler::SecurityHandler(PDFDoc *pDocument) + { + m_pDocument = pDocument; + } + + SecurityHandler::~SecurityHandler() + { + } + + bool SecurityHandler::CheckEncryption(StringExt *seOwnerPassword, StringExt *seUserPassword) + { + void *pAuthData = NULL; + + if (seOwnerPassword || seUserPassword) + { + pAuthData = MakeAuthData(seOwnerPassword, seUserPassword); + } + else + { + pAuthData = NULL; + } + bool bResult = Authorize(pAuthData); + if (pAuthData) + { + FreeAuthData(pAuthData); + } + + for (int nIndex = 0; !bResult && nIndex < 3; ++nIndex) + { + if (!(pAuthData = GetAuthData())) + { + break; + } + bResult = Authorize(pAuthData); + if (pAuthData) + { + FreeAuthData(pAuthData); + } + } + if (!bResult) + { + // TO DO: Error "Incorrect password" + } + return bResult; + } + + //------------------------------------------------------------------------------------------------------------------------------- + // StandardSecurityHandler + //------------------------------------------------------------------------------------------------------------------------------- + + class StandardAuthData + { + public: + + StandardAuthData(StringExt *seOwnerPassword, StringExt *seUserPassword) + { + m_seOwnerPassword = seOwnerPassword; + m_seUserPassword = seUserPassword; + } + + ~StandardAuthData() + { + if (m_seOwnerPassword) + { + delete m_seOwnerPassword; + } + if (m_seUserPassword) + { + delete m_seUserPassword; + } + } + + public: + + StringExt *m_seOwnerPassword; + StringExt *m_seUserPassword; + }; + + StandardSecurityHandler::StandardSecurityHandler(PDFDoc *pDocument, Object *pEncryptDict) : + SecurityHandler(pDocument) + { + m_bValid = false; + m_seFileID = NULL; + m_seOwnerKey = NULL; + m_seUserKey = NULL; + + Object oVersion, oRevision, oLength, oOwnerKey, oUserKey, oPermission; + pEncryptDict->DictLookup("V", &oVersion); + pEncryptDict->DictLookup("R", &oRevision); + pEncryptDict->DictLookup("Length", &oLength); + pEncryptDict->DictLookup("O", &oOwnerKey); + pEncryptDict->DictLookup("U", &oUserKey); + pEncryptDict->DictLookup("P", &oPermission); + + Object oFileID; + m_pDocument->GetXRef()->GetTrailerDict()->DictLookup("ID", &oFileID); + + if (oVersion.IsInt() && oRevision.IsInt() && oOwnerKey.IsString() && oOwnerKey.GetString()->GetLength() == 32 && oUserKey.IsString() && oUserKey.GetString()->GetLength() == 32 && oPermission.IsInt()) + { + m_nEncryptVersion = oVersion.GetInt(); + m_nEncryptRevision = oRevision.GetInt(); + m_eCryptType = cryptRC4; + + // В случае Revision = 2, ключ должен быть 40-бит - некоторые PDF-генераторы неправильно пишут значение Length + if (m_nEncryptRevision == 2 || !oLength.IsInt()) + { + m_nFileKeyLength = 5; // 5 байт = 40-бит + } + else + { + m_nFileKeyLength = oLength.GetInt() / 8; + } + m_bEncryptMetadata = true; + + if (m_nEncryptVersion == 4 && m_nEncryptRevision == 4) + { + Object oCryptFilters, oStreamFilter, oStringFilter; + pEncryptDict->DictLookup("CF", &oCryptFilters); + pEncryptDict->DictLookup("StmF", &oStreamFilter); + pEncryptDict->DictLookup("StrF", &oStringFilter); + + if (oCryptFilters.IsDict() && oStreamFilter.IsName() && oStringFilter.IsName() && !strcmp(oStreamFilter.GetName(), oStringFilter.GetName())) + { + Object oCryptCurFilter; + if (oCryptFilters.DictLookup(oStreamFilter.GetName(), &oCryptCurFilter)->IsDict()) + { + Object oCFM; + oCryptCurFilter.DictLookup("CFM", &oCFM); + if (oCFM.IsName("V2")) + { + m_nEncryptVersion = 2; + m_nEncryptRevision = 3; + Object oCFLength; + if (oCryptCurFilter.DictLookup("Length", &oCFLength)->IsInt()) + { + // Согласно спецификации, должно быть oCFLength / 8 + m_nFileKeyLength = oCFLength.GetInt(); + } + oCFLength.Free(); + } + else if (oCFM.IsName("AESV2")) + { + m_nEncryptVersion = 2; + m_nEncryptRevision = 3; + m_eCryptType = cryptAES; + Object oCFLength; + if (oCryptCurFilter.DictLookup("Length", &oCFLength)->IsInt()) + { + // Согласно спецификации, должно быть oCFLength / 8 + m_nFileKeyLength = oCFLength.GetInt(); + } + oCFLength.Free(); + } + oCFM.Free(); + } + oCryptCurFilter.Free(); + } + oStringFilter.Free(); + oStreamFilter.Free(); + oCryptFilters.Free(); + Object oEncryptMetadata; + if (pEncryptDict->DictLookup("EncryptMetadata", &oEncryptMetadata)->IsBool()) + { + m_bEncryptMetadata = oEncryptMetadata.GetBool(); + } + oEncryptMetadata.Free(); + } + m_nPermissionFlags = oPermission.GetInt(); + m_seOwnerKey = oOwnerKey.GetString()->Copy(); + m_seUserKey = oUserKey.GetString()->Copy(); + if (m_nEncryptVersion >= 1 && m_nEncryptVersion <= 2 && m_nEncryptRevision >= 2 && m_nEncryptRevision <= 3) + { + if (oFileID.IsArray()) + { + Object oFileIDString; + if (oFileID.ArrayGet(0, &oFileIDString)->IsString()) + { + m_seFileID = oFileIDString.GetString()->Copy(); + } + else + { + m_seFileID = new StringExt(); + } + oFileIDString.Free(); + } + else + { + m_seFileID = new StringExt(); + } + m_bValid = true; + } + else + { + // TO DO: Error "Unsupported version/revision of Standard security handler" + } + } + else + { + // TO DO: Error "Weird encryption info" + } + if (m_nFileKeyLength > 16) + { + m_nFileKeyLength = 16; + } + + oFileID.Free(); + oPermission.Free(); + oUserKey.Free(); + oOwnerKey.Free(); + oLength.Free(); + oRevision.Free(); + oVersion.Free(); + } + + StandardSecurityHandler::~StandardSecurityHandler() + { + if (m_seFileID) + { + delete m_seFileID; + } + if (m_seOwnerKey) + { + delete m_seOwnerKey; + } + if (m_seUserKey) + { + delete m_seUserKey; + } + } + + void *StandardSecurityHandler::MakeAuthData(StringExt *seOwnerPassword, StringExt *seUserPassword) + { + return new StandardAuthData(seOwnerPassword ? seOwnerPassword->Copy() : (StringExt *)NULL, seUserPassword ? seUserPassword->Copy() : (StringExt *)NULL); + } + + void *StandardSecurityHandler::GetAuthData() + { + return NULL; + } + + void StandardSecurityHandler::FreeAuthData(void *pAuthData) + { + if (pAuthData) + delete (StandardAuthData *)pAuthData; + } + + bool StandardSecurityHandler::Authorize(void *pAuthData) + { + StringExt *seOwnerPassword, *seUserPassword; + + if (!m_bValid) + { + return false; + } + if (pAuthData) + { + seOwnerPassword = ((StandardAuthData *)pAuthData)->m_seOwnerPassword; + seUserPassword = ((StandardAuthData *)pAuthData)->m_seUserPassword; + } + else + { + seOwnerPassword = NULL; + seUserPassword = NULL; + } + if (!Decrypt::MakeFileKey(m_nEncryptVersion, m_nEncryptRevision, m_nFileKeyLength, m_seOwnerKey, m_seUserKey, m_nPermissionFlags, m_seFileID, seOwnerPassword, seUserPassword, m_sFileKey, m_bEncryptMetadata, &m_bOwnerPasswordValid)) + { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/PdfReader/Src/SecurityHandler.h b/PdfReader/Src/SecurityHandler.h new file mode 100644 index 0000000000..d563f1fcdf --- /dev/null +++ b/PdfReader/Src/SecurityHandler.h @@ -0,0 +1,115 @@ +#ifndef _PDF_READER_SECURITY_HANDLER_H +#define _PDF_READER_SECURITY_HANDLER_H + +#include "Object.h" + +namespace PdfReader +{ + class StringExt; + class PDFDoc; + + //------------------------------------------------------------------------------------------------------------------------------- + // SecurityHandler + //------------------------------------------------------------------------------------------------------------------------------- + + class SecurityHandler + { + public: + + static SecurityHandler *Make(PDFDoc *pDocument, Object *pEncryptDict); + + SecurityHandler(PDFDoc *pDocument); + virtual ~SecurityHandler(); + + // Проверяем шифрованный ли документ. Если документ шифрованный, тогда сначала продуем использовать и + // . Если оба пароля не подходят, тогда запрашиваем пароль у пользователя (не более 3-х раз). + // Возвращаемые значения: + // True, если документ может быть открыт( либо он вообще не зашифрован, либо пароль верный) + // False, в противном случае ( документ зашрифован, а пароль неверный). + bool CheckEncryption(StringExt *seOwnerPassword, StringExt *seUserPassword); + + // Для "Batch mode", т.е. когда пароли заданы и проверяются без пользователя. + virtual void *MakeAuthData(StringExt *ownerPassword, StringExt *userPassword) = 0; + + // Для запроса пароля от пользователя. + virtual void *GetAuthData() = 0; + + // Освобождаем память выделенную функциями MakeAuthData или GetAuthData. + virtual void FreeAuthData(void *pAuthData) = 0; + + // Пытаемся авторизоваться. + virtual bool Authorize(void *pAuthData) = 0; + + // Считываем различные параметры. + virtual int GetPermissionFlags() = 0; + virtual bool GetOwnerPasswordValid()= 0; + virtual unsigned char *GetFileKey() = 0; + virtual int GetFileKeyLength() = 0; + virtual int GetEncodingVersion() = 0; + virtual CryptAlgorithm GetEncodingAlgorithm() = 0; + + protected: + + PDFDoc *m_pDocument; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // StandardSecurityHandler + //------------------------------------------------------------------------------------------------------------------------------- + + class StandardSecurityHandler : public SecurityHandler + { + public: + + StandardSecurityHandler(PDFDoc *pDocument, Object *pEncryptDict); + virtual ~StandardSecurityHandler(); + + virtual void *MakeAuthData(StringExt *seOwnerPassword, StringExt *seUserPassword); + virtual void *GetAuthData(); + virtual void FreeAuthData(void *pAuthData); + virtual bool Authorize(void *pAuthData); + virtual int GetPermissionFlags() + { + return m_nPermissionFlags; + } + virtual bool GetOwnerPasswordValid() + { + return m_bOwnerPasswordValid; + } + virtual unsigned char *GetFileKey() + { + return m_sFileKey; + } + virtual int GetFileKeyLength() + { + return m_nFileKeyLength; + } + virtual int GetEncodingVersion() + { + return m_nEncryptVersion; + } + virtual CryptAlgorithm GetEncodingAlgorithm() + { + return m_eCryptType; + } + + private: + + int m_nPermissionFlags; + bool m_bOwnerPasswordValid; + unsigned char m_sFileKey[16]; + int m_nFileKeyLength; + int m_nEncryptVersion; + int m_nEncryptRevision; + CryptAlgorithm m_eCryptType; + bool m_bEncryptMetadata; + + StringExt *m_seOwnerKey; + StringExt *m_seUserKey; + StringExt *m_seFileID; + + bool m_bValid; + }; +} + +#endif // _PDF_READER_SECURITY_HANDLER_H diff --git a/PdfReader/Src/Stream.cpp b/PdfReader/Src/Stream.cpp new file mode 100644 index 0000000000..0923d5d5cc --- /dev/null +++ b/PdfReader/Src/Stream.cpp @@ -0,0 +1,5467 @@ +#include +#include +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "File.h" +#include "Constants.h" +#include "Object.h" +#include "Lexer.h" +#include "GState.h" +#include "Stream.h" +#include "CCITT-Tables.h" +#include "JPXStream.h" +#include "JBIG2Stream.h" + +//#define USE_ZLIB // Для декодирования потоков в Flate используем Zlib или внутренний декодер + +namespace PdfReader +{ + //--------------------------------------------------------------------------------------------------------------- + // Stream (основной класс) + //--------------------------------------------------------------------------------------------------------------- + + Stream::Stream() + { + m_nRef = 1; + } + + Stream::~Stream() + { + } + + void Stream::Close() + { + } + + int Stream::GetRawChar() + { + // TO DO : Error "Internal: called GetRawChar() on non-predictor stream" + return EOF; + } + + char *Stream::GetLine(char *sBuffer, int nSize) + { + int nIndex; + + if (LookChar() == EOF) + return NULL; + for (nIndex = 0; nIndex < nSize - 1; ++nIndex) + { + int nChar = GetChar(); + if (nChar == EOF || nChar == '\n') + break; + if (nChar == '\r') + { + if ((nChar = LookChar()) == '\n') + GetChar(); + break; + } + sBuffer[nIndex] = nChar; + } + sBuffer[nIndex] = '\0'; + return sBuffer; + } + + StringExt *Stream::GetPSFilter(int nPSLevel, char *sIndent) + { + return new StringExt(); + } + + Stream *Stream::AddFilters(Object *pDict) + { + Object oTemp; + Object oParms, params2; + + Stream *pStream = this; + pDict->DictLookup("Filter", &oTemp); + if (oTemp.IsNull()) + { + oTemp.Free(); + pDict->DictLookup("F", &oTemp); + } + pDict->DictLookup("DecodeParms", &oParms); + if (oParms.IsNull()) + { + oParms.Free(); + pDict->DictLookup("DP", &oParms); + } + if (oTemp.IsName()) + { + pStream = ApplyFilter(oTemp.GetName(), pStream, &oParms); + } + else if (oTemp.IsArray()) + { + for (int nIndex = 0; nIndex < oTemp.ArrayGetLength(); ++nIndex) + { + Object oItem, oItemParams; + oTemp.ArrayGet(nIndex, &oItem); + if (oParms.IsArray()) + oParms.ArrayGet(nIndex, &oItemParams); + else + oItemParams.InitNull(); + if (oItem.IsName()) + { + pStream = ApplyFilter(oItem.GetName(), pStream, &oItemParams); + } + else + { + // TO DO: Error "Bad filter name" + pStream = new EOFStream(pStream); + } + oItem.Free(); + oItemParams.Free(); + } + } + else if (!oTemp.IsNull()) + { + // TO DO: Error "Bad 'Filter' attribute in stream" + } + oTemp.Free(); + oParms.Free(); + + return pStream; + } + + Stream *Stream::ApplyFilter(char *sName, Stream *pStream, Object *pParams) + { + if (!strcmp(sName, "ASCIIHexDecode") || !strcmp(sName, "AHx")) + { + pStream = new ASCIIHexStream(pStream); + } + else if (!strcmp(sName, "ASCII85Decode") || !strcmp(sName, "A85")) + { + pStream = new ASCII85Stream(pStream); + } + else if (!strcmp(sName, "LZWDecode") || !strcmp(sName, "LZW")) + { + int nPredictor = 1; + int nColumns = 1; + int nColors = 1; + int nBitsPerComponent = 8; + int nEarlyChange = 1; + + if (pParams->IsDict()) + { + Object oTemp; + + pParams->DictLookup("Predictor", &oTemp); + if (oTemp.IsInt()) + nPredictor = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("Columns", &oTemp); + if (oTemp.IsInt()) + nColumns = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("Colors", &oTemp); + if (oTemp.IsInt()) + nColors = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("BitsPerComponent", &oTemp); + if (oTemp.IsInt()) + nBitsPerComponent = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("EarlyChange", &oTemp); + if (oTemp.IsInt()) + nEarlyChange = oTemp.GetInt(); + oTemp.Free(); + } + pStream = new LZWStream(pStream, nPredictor, nColumns, nColors, nBitsPerComponent, nEarlyChange); + } + else if (!strcmp(sName, "RunLengthDecode") || !strcmp(sName, "RL")) + { + pStream = new RunLengthStream(pStream); + } + else if (!strcmp(sName, "CCITTFaxDecode") || !strcmp(sName, "CCF")) + { + int nK = 0; + + bool bEndOfLine = false; + bool bByteAlign = false; + int nColumns = 1728; + int nRows = 0; + bool bEndOfBlock = true; + bool bBlackIs1 = false; + + if (pParams->IsDict()) + { + Object oTemp; + + pParams->DictLookup("K", &oTemp); + if (oTemp.IsInt()) + nK = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("EndOfLine", &oTemp); + if (oTemp.IsBool()) + bEndOfLine = oTemp.GetBool(); + oTemp.Free(); + + pParams->DictLookup("EncodedByteAlign", &oTemp); + if (oTemp.IsBool()) + bByteAlign = oTemp.GetBool(); + oTemp.Free(); + + pParams->DictLookup("Columns", &oTemp); + if (oTemp.IsInt()) + nColumns = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("Rows", &oTemp); + if (oTemp.IsInt()) + nRows = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("EndOfBlock", &oTemp); + if (oTemp.IsBool()) + bEndOfBlock = oTemp.GetBool(); + oTemp.Free(); + + pParams->DictLookup("BlackIs1", &oTemp); + if (oTemp.IsBool()) + bBlackIs1 = oTemp.GetBool(); + oTemp.Free(); + + // TO DO: Добавить чтение поля "DamagedRowsBeforeError" + } + pStream = new CCITTFaxStream(pStream, nK, bEndOfLine, bByteAlign, nColumns, nRows, bEndOfBlock, bBlackIs1); + } + else if (!strcmp(sName, "DCTDecode") || !strcmp(sName, "DCT")) + { + int nColorTransform = -1; + + if (pParams->IsDict()) + { + Object oTemp; + if (pParams->DictLookup("ColorTransform", &oTemp)->IsInt()) + nColorTransform = oTemp.GetInt(); + oTemp.Free(); + } + pStream = new DCTStream(pStream, nColorTransform); + } + else if (!strcmp(sName, "FlateDecode") || !strcmp(sName, "Fl")) + { + int nPredictor = 1; + int nColors = 1; + int nBitsPerComponent = 8; + int nColumns = 1; + + if (pParams->IsDict()) + { + Object oTemp; + + pParams->DictLookup("Predictor", &oTemp); + if (oTemp.IsInt()) + nPredictor = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("Colors", &oTemp); + if (oTemp.IsInt()) + nColors = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("BitsPerComponent", &oTemp); + if (oTemp.IsInt()) + nBitsPerComponent = oTemp.GetInt(); + oTemp.Free(); + + pParams->DictLookup("Columns", &oTemp); + if (oTemp.IsInt()) + nColumns = oTemp.GetInt(); + oTemp.Free(); + } +#ifdef USE_ZLIB + pStream = new FlateZlibStream( pStream, nPredictor, nColumns, nColors, nBitsPerComponent ); +#else + pStream = new FlateStream(pStream, nPredictor, nColumns, nColors, nBitsPerComponent); +#endif + } + else if (!strcmp(sName, "JBIG2Decode")) + { + Object oJBIG2Globals; + if (pParams->IsDict()) + { + pParams->DictLookup("JBIG2Globals", &oJBIG2Globals); + } + // TO DO: Сделать данный фильтр + pStream = new JBIG2Stream(pStream, &oJBIG2Globals); + oJBIG2Globals.Free(); + } + else if (!strcmp(sName, "JPXDecode")) + { + pStream = new JPXStream(pStream); + } + else + { + // TO DO: Error "Unknown filter" + pStream = new EOFStream(pStream); + } + return pStream; + } + + //--------------------------------------------------------------------------------------------------------------- + // BaseStream + //--------------------------------------------------------------------------------------------------------------- + + BaseStream::BaseStream(Object *pDict) + { + m_pDict = *pDict; + } + + BaseStream::~BaseStream() + { + m_pDict.Free(); + } + + //--------------------------------------------------------------------------------------------------------------- + // FilterStream + //--------------------------------------------------------------------------------------------------------------- + + FilterStream::FilterStream(Stream *pStream) + { + m_pStream = pStream; + } + + FilterStream::~FilterStream() + { + } + + void FilterStream::Close() + { + m_pStream->Close(); + } + + void FilterStream::SetPos(unsigned int unPos, int nDirection) + { + // TO DO: Error "Internal: called SetPos() on FilterStream" + } + + //--------------------------------------------------------------------------------------------------------------- + // ImageStream + //--------------------------------------------------------------------------------------------------------------- + + ImageStream::ImageStream(Stream *pStream, int nWidth, int nComponents, int nBitsPerComponent) + { + int nLineSize = 0; + + m_pStream = pStream; + m_nWidth = nWidth; + m_nComponentsPerPixel = nComponents; + m_nBitsPerComponent = nBitsPerComponent; + + m_nComponentsPerLine = m_nWidth * m_nComponentsPerPixel; + + if (1 == m_nBitsPerComponent) + { + nLineSize = (m_nComponentsPerLine + 7) & ~7; + } + else + { + nLineSize = m_nComponentsPerLine; + } + m_pLineBuffer = (unsigned char *)MemUtilsMallocArray(nLineSize, sizeof(unsigned char)); + m_nLinePos = m_nComponentsPerLine; + } + + ImageStream::~ImageStream() + { + MemUtilsFree(m_pLineBuffer); + } + + void ImageStream::Reset() + { + m_pStream->Reset(); + } + + bool ImageStream::GetPixel(unsigned char *pPixel) + { + if (m_nLinePos >= m_nComponentsPerLine) + { + GetNextLine(); + m_nLinePos = 0; + } + for (int nIndex = 0; nIndex < m_nComponentsPerPixel; ++nIndex) + { + pPixel[nIndex] = m_pLineBuffer[m_nLinePos++]; + } + return true; + } + + unsigned char *ImageStream::GetNextLine() + { + if (m_nBitsPerComponent == 1) + { + for (int nIndex = 0; nIndex < m_nComponentsPerLine; nIndex += 8) + { + int nChar = m_pStream->GetChar(); + m_pLineBuffer[nIndex + 0] = (unsigned char)((nChar >> 7) & 1); + m_pLineBuffer[nIndex + 1] = (unsigned char)((nChar >> 6) & 1); + m_pLineBuffer[nIndex + 2] = (unsigned char)((nChar >> 5) & 1); + m_pLineBuffer[nIndex + 3] = (unsigned char)((nChar >> 4) & 1); + m_pLineBuffer[nIndex + 4] = (unsigned char)((nChar >> 3) & 1); + m_pLineBuffer[nIndex + 5] = (unsigned char)((nChar >> 2) & 1); + m_pLineBuffer[nIndex + 6] = (unsigned char)((nChar >> 1) & 1); + m_pLineBuffer[nIndex + 7] = (unsigned char)(nChar & 1); + } + } + else if (m_nBitsPerComponent == 8) + { + for (int nIndex = 0; nIndex < m_nComponentsPerLine; ++nIndex) + { + m_pLineBuffer[nIndex] = m_pStream->GetChar(); + } + } + else + { + unsigned long nBitMask = (1 << m_nBitsPerComponent) - 1; + unsigned long nTemp = 0; + int nBits = 0; + for (int nIndex = 0; nIndex < m_nComponentsPerLine; ++nIndex) + { + if (nBits < m_nBitsPerComponent) + { + nTemp = (nTemp << 8) | (m_pStream->GetChar() & 0xff); + nBits += 8; + } + m_pLineBuffer[nIndex] = (unsigned char)((nTemp >> (nBits - m_nBitsPerComponent)) & nBitMask); + nBits -= m_nBitsPerComponent; + } + } + return m_pLineBuffer; + } + + void ImageStream::SkipLine() + { + int nCount = (m_nComponentsPerLine * m_nBitsPerComponent + 7) >> 3; + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + m_pStream->GetChar(); + } + } + + //--------------------------------------------------------------------------------------------------------------- + // StreamPredictor + //--------------------------------------------------------------------------------------------------------------- + + StreamPredictor::StreamPredictor(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent) + { + m_pStream = pStream; + m_nPredictor = nPredictor; + m_nWidth = nWidth; + m_nComponentsPerPixel = nComponents; + m_nBitsPerComponent = nBitsPerComponent; + m_pLineBuffer = NULL; + m_bSuccess = false; + + m_nComponentsPerLine = m_nWidth * m_nComponentsPerPixel; + + // Patch1 + m_nBytesPerPixel = (m_nComponentsPerPixel * m_nBitsPerComponent + 7) >> 3; + m_nBytesPerLine = ((m_nComponentsPerLine * m_nBitsPerComponent + 7) >> 3) + m_nBytesPerPixel; + + if (m_nWidth <= 0 || m_nComponentsPerPixel <= 0 || m_nBitsPerComponent <= 0 || m_nComponentsPerPixel >= GrColorMaxComps || m_nBitsPerComponent > 16 || m_nWidth >= INT_MAX / m_nComponentsPerPixel || m_nComponentsPerLine >= (INT_MAX - 7) / m_nBitsPerComponent) + return; // m_bSuccess = false; + + // End Patch1 + + if (m_nBytesPerLine <= 0) + return; // m_bSuccess = false; + + m_pLineBuffer = (unsigned char *)MemUtilsMalloc(m_nBytesPerLine); + + memset(m_pLineBuffer, 0, m_nBytesPerLine); + m_nLinePos = m_nBytesPerLine; + + m_bSuccess = true; + } + + StreamPredictor::~StreamPredictor() + { + MemUtilsFree(m_pLineBuffer); + } + + int StreamPredictor::LookChar() + { + if (m_nLinePos >= m_nBytesPerLine) + { + if (!GetNextLine()) + { + return EOF; + } + } + return m_pLineBuffer[m_nLinePos]; + } + + int StreamPredictor::GetChar() + { + if (m_nLinePos >= m_nBytesPerLine) + { + if (!GetNextLine()) + { + return EOF; + } + } + return m_pLineBuffer[m_nLinePos++]; + } + + bool StreamPredictor::GetNextLine() + { + int nCurPredictor = 1; + int nLeft, nTop, nTopLeft, nCur, nLeftDiff, nTopDiff, nTopLeftDiff; + int nChar; + + // PNG prediction + if (m_nPredictor >= 10) + { + if ((nCurPredictor = m_pStream->GetRawChar()) == EOF) + { + return false; + } + nCurPredictor += 10; + } + else + { + nCurPredictor = m_nPredictor; + } + + // Читаем по строке, применяя PNG (byte) фильтрацию(prediction) + unsigned char arrTopLeftBuf[GrColorMaxComps * 2 + 1]; + memset(arrTopLeftBuf, 0, m_nBytesPerPixel + 1); + + for (int nIndex = m_nBytesPerPixel; nIndex < m_nBytesPerLine; ++nIndex) + { + for (int nJ = m_nBytesPerPixel; nJ > 0; --nJ) + { + arrTopLeftBuf[nJ] = arrTopLeftBuf[nJ - 1]; + } + arrTopLeftBuf[0] = m_pLineBuffer[nIndex]; + if ((nChar = m_pStream->GetRawChar()) == EOF) + { + if (nIndex > m_nBytesPerPixel) + { + // this ought to return false, but some (broken) PDF files + // contain truncated image data, and Adobe apparently reads the + // last partial line + break; + } + return false; + } + switch (nCurPredictor) + { + case 11: // PNG Sub + m_pLineBuffer[nIndex] = m_pLineBuffer[nIndex - m_nBytesPerPixel] + (unsigned char)nChar; + break; + case 12: // PNG Up + m_pLineBuffer[nIndex] = m_pLineBuffer[nIndex] + (unsigned char)nChar; + break; + case 13: // PNG Average + m_pLineBuffer[nIndex] = ((m_pLineBuffer[nIndex - m_nBytesPerPixel] + m_pLineBuffer[nIndex]) >> 1) + (unsigned char)nChar; + break; + case 14: // PNG Paeth + nLeft = m_pLineBuffer[nIndex - m_nBytesPerPixel]; + nTop = m_pLineBuffer[nIndex]; + nTopLeft = arrTopLeftBuf[m_nBytesPerPixel]; + nCur = nLeft + nTop - nTopLeft; + if ((nLeftDiff = nCur - nLeft) < 0) + nLeftDiff = -nLeftDiff; + if ((nTopDiff = nCur - nTop) < 0) + nTopDiff = -nTopDiff; + if ((nTopLeftDiff = nCur - nTopLeft) < 0) + nTopLeftDiff = -nTopLeftDiff; + if (nLeftDiff <= nTopDiff && nLeftDiff <= nTopLeftDiff) + m_pLineBuffer[nIndex] = nLeft + (unsigned char)nChar; + else if (nTopDiff <= nTopLeftDiff) + m_pLineBuffer[nIndex] = nTop + (unsigned char)nChar; + else + m_pLineBuffer[nIndex] = nTopLeft + (unsigned char)nChar; + break; + case 10: // PNG none + default: // No predictor или TIFF predictor + m_pLineBuffer[nIndex] = (unsigned char)nChar; + break; + } + } + + // Применяем TIFF фильтрацию (predictor) + unsigned long nInTemp, nOutTemp; + if (m_nPredictor == 2) + { + if (m_nBitsPerComponent == 1) + { + nInTemp = m_pLineBuffer[m_nBytesPerPixel - 1]; + for (int nIndex = m_nBytesPerPixel; nIndex < m_nBytesPerLine; nIndex += 8) + { + // 1-bit add is just xor + nInTemp = (nInTemp << 8) | m_pLineBuffer[nIndex]; + m_pLineBuffer[nIndex] ^= nInTemp >> m_nComponentsPerPixel; + } + } + else if (m_nBitsPerComponent == 8) + { + for (int nIndex = m_nBytesPerPixel; nIndex < m_nBytesPerLine; ++nIndex) + { + m_pLineBuffer[nIndex] += m_pLineBuffer[nIndex - m_nComponentsPerPixel]; + } + } + else + { + memset(arrTopLeftBuf, 0, m_nComponentsPerPixel + 1); + int nBitMask = (1 << m_nBitsPerComponent) - 1; + nInTemp = 0, nOutTemp = 0; + int nInBits = 0, nOutBits = 0; + int nJ = m_nBytesPerPixel, nK = m_nBytesPerPixel; + for (int nIndex = 0; nIndex < m_nWidth; ++nIndex) + { + for (int nKK = 0; nKK < m_nComponentsPerPixel; ++nKK) + { + if (nInBits < m_nBitsPerComponent) + { + nInTemp = (nInTemp << 8) | (m_pLineBuffer[nJ++] & 0xff); + nInBits += 8; + } + arrTopLeftBuf[nKK] = (unsigned char)((arrTopLeftBuf[nKK] + (nInTemp >> (nInBits - m_nBitsPerComponent))) & nBitMask); + nInBits -= m_nBitsPerComponent; + nOutTemp = (nOutTemp << m_nBitsPerComponent) | arrTopLeftBuf[nKK]; + nOutBits += m_nBitsPerComponent; + if (nOutBits >= 8) + { + m_pLineBuffer[nK++] = (unsigned char)(nOutTemp >> (nOutBits - 8)); + nOutBits -= 8; + } + } + } + if (nOutBits > 0) + { + m_pLineBuffer[nK++] = (unsigned char)((nOutTemp << (8 - nOutBits)) + (nInTemp & ((1 << (8 - nOutBits)) - 1))); + } + } + } + + m_nLinePos = m_nBytesPerPixel; + + return true; + } + + //--------------------------------------------------------------------------------------------------------------- + // FileStream + //--------------------------------------------------------------------------------------------------------------- + + FileStream::FileStream(FILE *pFile, unsigned int unStart, bool bLimited, unsigned int nLength, Object *pDict) : + BaseStream(pDict) + { + m_pFile = pFile; + + m_unStart = unStart; + m_bLimited = bLimited; + m_unLength = nLength; + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_unBufferPos = m_unStart; + m_nSavePos = 0; + m_bSaved = false; + } + + FileStream::~FileStream() + { + Close(); + } + + Stream *FileStream::MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict) + { + return new FileStream(m_pFile, unStart, bLimited, unLength, pDict); + } + + void FileStream::Reset() + { + m_nSavePos = (unsigned int)ftell(m_pFile); + fseek(m_pFile, m_unStart, SEEK_SET); + + m_bSaved = true; + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_unBufferPos = m_unStart; + } + + void FileStream::Close() + { + if (m_bSaved) + { + fseek(m_pFile, m_nSavePos, SEEK_SET); + m_bSaved = false; + } + } + + bool FileStream::FillBuffer() + { + int nCurBufLen = 0; + + m_unBufferPos += m_pBufferEnd - m_sBuffer; + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + if (m_bLimited && m_unBufferPos >= m_unStart + m_unLength) + return false; + + if (m_bLimited && m_unBufferPos + FileStreamBufferSize > m_unStart + m_unLength) + nCurBufLen = m_unStart + m_unLength - m_unBufferPos; + else + nCurBufLen = FileStreamBufferSize; + + nCurBufLen = fread(m_sBuffer, 1, nCurBufLen, m_pFile); + m_pBufferEnd = m_sBuffer + nCurBufLen; + + if (m_pBufferPointer >= m_pBufferEnd) + return false; + + return true; + } + + void FileStream::SetPos(unsigned int unPos, int nDirection) + { + if (nDirection >= 0) + { + fseek(m_pFile, unPos, SEEK_SET); + m_unBufferPos = unPos; + } + else + { + fseek(m_pFile, 0, SEEK_END); + unsigned int unSize = (unsigned int)ftell(m_pFile); + if (unPos > unSize) + unPos = (unsigned int)unSize; + fseek(m_pFile, -(int)unPos, SEEK_END); + m_unBufferPos = (unsigned int)ftell(m_pFile); + } + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + } + + void FileStream::SetStartPos(int nDelta) + { + m_unStart += nDelta; + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_unBufferPos = m_unStart; + } + + //--------------------------------------------------------------------------------------------------------------- + // MemoryStream + //--------------------------------------------------------------------------------------------------------------- + + MemoryStream::MemoryStream(char *sBuffer, unsigned int unStart, unsigned int unLength, Object *pDict) : + BaseStream(pDict) + { + m_sBuffer = sBuffer; + m_unStart = unStart; + m_unLength = unLength; + m_pBufferEnd = m_sBuffer + m_unStart + m_unLength; + m_pBufferPointer = m_sBuffer + m_unStart; + m_bNeedFree = false; + } + + MemoryStream::~MemoryStream() + { + if (m_bNeedFree) + MemUtilsFree(m_sBuffer); + } + + Stream *MemoryStream::MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict) + { + unsigned int unNewLength = 0; + + if (!bLimited || unStart + unLength > m_unStart + m_unLength) + { + unNewLength = m_unStart + m_unLength - unStart; + } + else + { + unNewLength = unLength; + } + MemoryStream *pSubStream = new MemoryStream(m_sBuffer, unStart, unNewLength, pDict); + return pSubStream; + } + + void MemoryStream::Reset() + { + m_pBufferPointer = m_sBuffer + m_unStart; + } + + void MemoryStream::Close() + { + } + + void MemoryStream::SetPos(unsigned int unPos, int nDirection) + { + unsigned int unCurPos = 0; + + if (nDirection >= 0) + { + unCurPos = unPos; + } + else + { + unCurPos = m_unStart + m_unLength - unPos; + } + + if (unCurPos < m_unStart) + { + unCurPos = m_unStart; + } + else if (unCurPos > m_unStart + m_unLength) + { + unCurPos = m_unStart + m_unLength; + } + m_pBufferPointer = m_sBuffer + unCurPos; + } + + void MemoryStream::SetStartPos(int nDelta) + { + m_unStart += nDelta; + m_unLength -= nDelta; + m_pBufferPointer = m_sBuffer + m_unStart; + } + + //--------------------------------------------------------------------------------------------------------------- + // EmbedStream + //--------------------------------------------------------------------------------------------------------------- + + EmbedStream::EmbedStream(Stream *pStream, Object *pDict, bool bLimited, unsigned int unLength) : + BaseStream(pDict) + { + m_pStream = pStream; + m_bLimited = bLimited; + m_unLength = unLength; + } + + EmbedStream::~EmbedStream() + { + } + + Stream *EmbedStream::MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict) + { + // TO DO: Error "Internal: called MakeSubStream() on EmbedStream" + return NULL; + } + + int EmbedStream::GetChar() + { + if (m_bLimited && !m_unLength) + { + return EOF; + } + --m_unLength; + return m_pStream->GetChar(); + } + + int EmbedStream::LookChar() + { + if (m_bLimited && !m_unLength) + { + return EOF; + } + return m_pStream->LookChar(); + } + + void EmbedStream::SetPos(unsigned int unPos, int nDirection) + { + // TO DO: Error "Internal: called SetPos() on EmbedStream" + } + + unsigned int EmbedStream::GetStartPos() + { + // TO DO: Error "Internal: called GetStartPos() on EmbedStream" + return 0; + } + + void EmbedStream::SetStartPos(int nDelta) + { + // TO DO: Error "Internal: called SetStartPos() on EmbedStream" + } + + //--------------------------------------------------------------------------------------------------------------- + // ASCIIHexStream + //--------------------------------------------------------------------------------------------------------------- + + ASCIIHexStream::ASCIIHexStream(Stream *pStream) : + FilterStream(pStream) + { + m_nBuffer = EOF; + m_bEOF = false; + } + + ASCIIHexStream::~ASCIIHexStream() + { + delete m_pStream; + } + + void ASCIIHexStream::Reset() + { + m_pStream->Reset(); + m_nBuffer = EOF; + m_bEOF = false; + } + + int ASCIIHexStream::LookChar() + { + int nFirstChar = 0, nSecondChar = 0, nHexValue = 0; + + if (m_nBuffer != EOF) + return m_nBuffer; + if (m_bEOF) + { + m_nBuffer = EOF; + return EOF; + } + do { + nFirstChar = m_pStream->GetChar(); + } while (isspace(nFirstChar)); + + if (nFirstChar == '>') + { + m_bEOF = true; + m_nBuffer = EOF; + return m_nBuffer; + } + do { + nSecondChar = m_pStream->GetChar(); + } while (isspace(nSecondChar)); + + if (nSecondChar == '>') + { + m_bEOF = true; + nSecondChar = '0'; + } + + if (nFirstChar >= '0' && nFirstChar <= '9') + { + nHexValue = (nFirstChar - '0') << 4; + } + else if (nFirstChar >= 'A' && nFirstChar <= 'F') + { + nHexValue = (nFirstChar - 'A' + 10) << 4; + } + else if (nFirstChar >= 'a' && nFirstChar <= 'f') + { + nHexValue = (nFirstChar - 'a' + 10) << 4; + } + else if (nFirstChar == EOF) + { + m_bEOF = true; + nHexValue = 0; + } + else + { + // TO DO: Error "Illegal character in ASCIIHex stream" + nHexValue = 0; + } + + if (nSecondChar >= '0' && nSecondChar <= '9') + { + nHexValue += nSecondChar - '0'; + } + else if (nSecondChar >= 'A' && nSecondChar <= 'F') + { + nHexValue += nSecondChar - 'A' + 10; + } + else if (nSecondChar >= 'a' && nSecondChar <= 'f') + { + nHexValue += nSecondChar - 'a' + 10; + } + else if (nSecondChar == EOF) + { + m_bEOF = true; + nHexValue = 0; + } + else + { + // TO DO: Error "Illegal character in ASCIIHex stream" + } + m_nBuffer = nHexValue & 0xff; + return m_nBuffer; + } + + StringExt *ASCIIHexStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 2) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("/ASCIIHexDecode filter\n"); + return seResult; + } + + bool ASCIIHexStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(false); + } + + //--------------------------------------------------------------------------------------------------------------- + // ASCII85Stream + //--------------------------------------------------------------------------------------------------------------- + + ASCII85Stream::ASCII85Stream(Stream *pStream) : + FilterStream(pStream) + { + m_nIndex = m_nCount = 0; + m_bEOF = false; + } + + ASCII85Stream::~ASCII85Stream() + { + delete m_pStream; + } + + void ASCII85Stream::Reset() + { + m_pStream->Reset(); + m_nIndex = m_nCount = 0; + m_bEOF = false; + } + + int ASCII85Stream::LookChar() + { + int nK = 0; + + if (m_nIndex >= m_nCount) + { + if (m_bEOF) + return EOF; + m_nIndex = 0; + do { + m_arrC[0] = m_pStream->GetChar(); + } while (Lexer::IsSpace(m_arrC[0])); + + if (m_arrC[0] == '~' || m_arrC[0] == EOF) + { + m_bEOF = true; + m_nCount = 0; + return EOF; + } + else if (m_arrC[0] == 'z') + { + m_arrB[0] = m_arrB[1] = m_arrB[2] = m_arrB[3] = 0; + m_nCount = 4; + } + else + { + for (nK = 1; nK < 5; ++nK) + { + do { + m_arrC[nK] = m_pStream->GetChar(); + } while (Lexer::IsSpace(m_arrC[nK])); + + if (m_arrC[nK] == '~' || m_arrC[nK] == EOF) + break; + } + m_nCount = nK - 1; + if (nK < 5 && (m_arrC[nK] == '~' || m_arrC[nK] == EOF)) + { + for (++nK; nK < 5; ++nK) + m_arrC[nK] = 0x21 + 84; + m_bEOF = true; + } + unsigned long unT = 0; + for (nK = 0; nK < 5; ++nK) + unT = unT * 85 + (m_arrC[nK] - 0x21); + for (nK = 3; nK >= 0; --nK) + { + m_arrB[nK] = (int)(unT & 0xff); + unT >>= 8; + } + } + } + return m_arrB[m_nIndex]; + } + + StringExt *ASCII85Stream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 2) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("/ASCII85Decode filter\n"); + return seResult; + } + + bool ASCII85Stream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(false); + } + + //--------------------------------------------------------------------------------------------------------------- + // LZWStream + //--------------------------------------------------------------------------------------------------------------- + + LZWStream::LZWStream(Stream *pStream, int nPredictor, int nColumns, int nColors, int nBitsPerPixel, int nEarlyChange) : + FilterStream(pStream) + { + if (1 != nPredictor) + { + m_pPredictor = new StreamPredictor(this, nPredictor, nColumns, nColors, nBitsPerPixel); + if (!m_pPredictor->CheckValidate()) + { + delete m_pPredictor; + m_pPredictor = NULL; + } + } + else + { + m_pPredictor = NULL; + } + + m_nEarlyChange = nEarlyChange; + m_bEOF = false; + m_nInputBits = 0; + ClearTable(); + } + + LZWStream::~LZWStream() + { + if (m_pPredictor) + { + delete m_pPredictor; + } + delete m_pStream; + } + + int LZWStream::GetChar() + { + if (m_pPredictor) + { + return m_pPredictor->GetChar(); + } + if (m_bEOF) + { + return EOF; + } + if (m_nCurPos >= m_nCurLength) + { + if (!ProcessNextCode()) + { + return EOF; + } + } + return m_arrCurBuffer[m_nCurPos++]; + } + + int LZWStream::LookChar() + { + if (m_pPredictor) + { + return m_pPredictor->LookChar(); + } + if (m_bEOF) + { + return EOF; + } + if (m_nCurPos >= m_nCurLength) + { + if (!ProcessNextCode()) + { + return EOF; + } + } + return m_arrCurBuffer[m_nCurPos]; + } + + int LZWStream::GetRawChar() + { + // Отличие от GetChar в том, что тут мы неиспользуем фильтр, указанный в m_pPredictor + if (m_bEOF) + { + return EOF; + } + if (m_nCurPos >= m_nCurLength) + { + if (!ProcessNextCode()) + { + return EOF; + } + } + return m_arrCurBuffer[m_nCurPos++]; + } + + void LZWStream::Reset() + { + m_pStream->Reset(); + m_bEOF = false; + m_nInputBits = 0; + ClearTable(); + } + + bool LZWStream::ProcessNextCode() + { + if (m_bEOF) + { + return false; + } + + // Проверяем конец кода(eod) и очищаем таблицу кодов + start: + int nCode = GetCode(); + + if (nCode == EOF || nCode == 257) + { + m_bEOF = true; + return false; + } + if (nCode == 256) + { + ClearTable(); + goto start; + } + if (m_nNextCode >= 4097) + { + // TO DO: Error "Bad LZW stream - expected clear-table code" + ClearTable(); + } + + // Process the next code + + int nNextLength = m_nCurLength + 1; + if (nCode < 256) + { + m_arrCurBuffer[0] = nCode; + m_nCurLength = 1; + } + else if (nCode < m_nNextCode) + { + m_nCurLength = m_pTable[nCode].nLength; + int nI = 0, nJ = 0; + for (nI = m_nCurLength - 1, nJ = nCode; nI > 0; --nI) + { + m_arrCurBuffer[nI] = m_pTable[nJ].unTail; + nJ = m_pTable[nJ].nHead; + } + m_arrCurBuffer[0] = nJ; + } + else if (nCode == m_nNextCode) + { + m_arrCurBuffer[m_nCurLength] = m_nNewChar; + ++m_nCurLength; + } + else + { + // TO DO : Error "Bad LZW stream - unexpected code" + m_bEOF = true; + return false; + } + + m_nNewChar = m_arrCurBuffer[0]; + if (m_bFirst) + { + m_bFirst = false; + } + else + { + m_pTable[m_nNextCode].nLength = nNextLength; + m_pTable[m_nNextCode].nHead = m_nPrevCode; + m_pTable[m_nNextCode].unTail = m_nNewChar; + ++m_nNextCode; + if (m_nNextCode + m_nEarlyChange == 512) + m_nNextBits = 10; + else if (m_nNextCode + m_nEarlyChange == 1024) + m_nNextBits = 11; + else if (m_nNextCode + m_nEarlyChange == 2048) + m_nNextBits = 12; + } + m_nPrevCode = nCode; + + m_nCurPos = 0; + + return true; + } + + void LZWStream::ClearTable() + { + m_nNextCode = 258; + m_nNextBits = 9; + m_nCurPos = m_nCurLength = 0; + m_bFirst = true; + } + + int LZWStream::GetCode() + { + int nChar = 0; + + while (m_nInputBits < m_nNextBits) + { + if ((nChar = m_pStream->GetChar()) == EOF) + return EOF; + m_nInputBuffer = (m_nInputBuffer << 8) | (nChar & 0xff); + m_nInputBits += 8; + } + int nCode = (m_nInputBuffer >> (m_nInputBits - m_nNextBits)) & ((1 << m_nNextBits) - 1); + m_nInputBits -= m_nNextBits; + return nCode; + } + + StringExt *LZWStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 2 || m_pPredictor) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("<< "); + if (!m_nEarlyChange) + { + seResult->Append("/EarlyChange 0 "); + } + seResult->Append(">> /LZWDecode filter\n"); + return seResult; + } + + bool LZWStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + //--------------------------------------------------------------------------------------------------------------- + // RunLengthStream + //--------------------------------------------------------------------------------------------------------------- + + RunLengthStream::RunLengthStream(Stream *pStream) : + FilterStream(pStream) + { + m_pBufferPointer = m_pEndOfBuffer = m_sBuffer; + m_bEOF = false; + } + + RunLengthStream::~RunLengthStream() + { + delete m_pStream; + } + + void RunLengthStream::Reset() + { + m_pStream->Reset(); + m_pBufferPointer = m_pEndOfBuffer = m_sBuffer; + m_bEOF = false; + } + + StringExt *RunLengthStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 2) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("/RunLengthDecode filter\n"); + return seResult; + } + + bool RunLengthStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + bool RunLengthStream::FillBuffer() + { + int nLen = 0; + + if (m_bEOF) + return false; + + int nChar = m_pStream->GetChar(); + if (nChar == 0x80 || nChar == EOF) + { + m_bEOF = true; + return false; + } + if (nChar < 0x80) + { + nLen = nChar + 1; + for (int nIndex = 0; nIndex < nLen; ++nIndex) + m_sBuffer[nIndex] = (char)m_pStream->GetChar(); + } + else + { + nLen = 0x101 - nChar; + nChar = m_pStream->GetChar(); + for (int nIndex = 0; nIndex < nLen; ++nIndex) + m_sBuffer[nIndex] = (char)nChar; + } + m_pBufferPointer = m_sBuffer; + m_pEndOfBuffer = m_sBuffer + nLen; + return true; + } + + //--------------------------------------------------------------------------------------------------------------- + // CCITTFaxStream + //--------------------------------------------------------------------------------------------------------------- + + CCITTFaxStream::CCITTFaxStream(Stream *pStream, int nK, bool bEndOfLine, bool bByteAlign, int nColumns, int nRows, bool bEndOfBlock, bool bBlackIs1) : + FilterStream(pStream) + { + m_nK = nK; + m_bEndOfLine = bEndOfLine; + m_bByteAlign = bByteAlign; + + m_nColumns = nColumns; + if (m_nColumns < 1) + m_nColumns = 1; + if (m_nColumns + 4 <= 0) + m_nColumns = INT_MAX - 4; + + m_nRows = nRows; + m_bEndOfBlock = bEndOfBlock; + m_bBlackIs1 = bBlackIs1; + + m_pRefLine = (short *)MemUtilsMallocArray(m_nColumns + 3, sizeof(short)); + m_pCodingLine = (short *)MemUtilsMallocArray(m_nColumns + 2, sizeof(short)); + + m_bEOF = false; + m_mCurRow = 0; + m_bNextLine2D = (m_nK < 0); + m_nInputBits = 0; + m_pCodingLine[0] = 0; + m_pCodingLine[1] = m_pRefLine[2] = m_nColumns; + m_nCurPosCL = 1; + + m_nCharBuffer = EOF; + } + + CCITTFaxStream::~CCITTFaxStream() + { + delete m_pStream; + MemUtilsFree(m_pRefLine); + MemUtilsFree(m_pCodingLine); + } + + void CCITTFaxStream::Reset() + { + short nCode1; + + m_pStream->Reset(); + m_bEOF = false; + m_mCurRow = 0; + m_bNextLine2D = (m_nK < 0); + m_nInputBits = 0; + m_pCodingLine[0] = 0; + m_pCodingLine[1] = m_nColumns; + m_nCurPosCL = 1; + m_nCharBuffer = EOF; + + // Пропускам начальные нулевые биты и символы окончания строки, и считываем тэг 2D кодировки + while ((nCode1 = LookBits(12)) == 0) + { + SkipBits(1); + } + if (nCode1 == 0x001) + { + SkipBits(12); + } + if (m_nK > 0) + { + m_bNextLine2D = !LookBits(1); + SkipBits(1); + } + } + + int CCITTFaxStream::LookChar() + { + short nCode1, nCode2, nCode3; + int nIndex = 0; + + if (m_bEOF && m_pCodingLine[m_nCurPosCL] >= m_nColumns) + { + return EOF; + } + + // Считываем строку + bool bError = false; + if (m_pCodingLine[m_nCurPosCL] >= m_nColumns) + { + + // 2D кодировка + if (m_bNextLine2D) + { + // Начальное состояние: + // nNewCLPos = Текущая позиция в кодированной строке (0 <= nNewCLPos <= m_nColumns) + // m_pCodingLine[m_nCurPosCL] = Последнее изменение в кодированной строке + // (black-to-white, если m_nCurPosCL четно, + // white-to-black, если m_nCurPosCL нечетно) + // m_pRefLine[m_nCurPosRL] = Следующее изменение в ссылочной строке, противоположного + // цвета, цвету m_nCurPosCL + // В любой момент должно быть верно: + // 0 <= m_pCodingLine[m_nCurPosCL] <= nNewCLPos <= m_pRefLine[m_nCurPosRL] <= m_pRefLine[m_nCurPosRL + 1] <= m_nColumns + // 0 <= m_nCurPosCL <= m_nColumns + 1 + // m_pRefLine[0] = 0 + // m_pRefLine[n] = m_pRefLine[n + 1] = columns -- для некоторого 1 <= n <= m_nColumns + 1 + // Условие окончания алгоритма: + // 0 = m_pCodingLine[0] <= m_pCodingLine[1] < m_pCodingLine[2] < ... < m_pCodingLine[n-1] < m_pCodingLine[n] = m_nColumns, + // где <= n <= m_nColumns + 1 + + int nNewCLPos = 0; + for (nIndex = 0; m_pCodingLine[nIndex] < m_nColumns; ++nIndex) + { + m_pRefLine[nIndex] = m_pCodingLine[nIndex]; + } + m_pRefLine[nIndex] = m_pRefLine[nIndex + 1] = m_nColumns; + m_nCurPosRL = 1; + nNewCLPos = m_pCodingLine[m_nCurPosCL = 0] = 0; + do { + nCode1 = Get2DCode(); + switch (nCode1) + { + case Pass_2D: + if (m_pRefLine[m_nCurPosRL] < m_nColumns) + { + nNewCLPos = m_pRefLine[m_nCurPosRL + 1]; + m_nCurPosRL += 2; + } + break; + case Horiz_2D: + if ((m_nCurPosCL & 1) == 0) + { + nCode1 = nCode2 = 0; + do { + nCode1 += nCode3 = GetWhiteCode(); + } while (nCode3 >= 64); + do { + nCode2 += nCode3 = GetBlackCode(); + } while (nCode3 >= 64); + } + else + { + nCode1 = nCode2 = 0; + do { + nCode1 += nCode3 = GetBlackCode(); + } while (nCode3 >= 64); + do { + nCode2 += nCode3 = GetWhiteCode(); + } while (nCode3 >= 64); + } + if (nCode1 > 0 || nCode2 > 0) + { + if (nNewCLPos + nCode1 <= m_nColumns) + { + m_pCodingLine[m_nCurPosCL + 1] = nNewCLPos + nCode1; + } + else + { + m_pCodingLine[m_nCurPosCL + 1] = m_nColumns; + } + ++m_nCurPosCL; + if (m_pCodingLine[m_nCurPosCL] + nCode2 <= m_nColumns) + { + m_pCodingLine[m_nCurPosCL + 1] = m_pCodingLine[m_nCurPosCL] + nCode2; + } + else + { + m_pCodingLine[m_nCurPosCL + 1] = m_nColumns; + } + ++m_nCurPosCL; + nNewCLPos = m_pCodingLine[m_nCurPosCL]; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + break; + case Vert0_2D: + if (m_pRefLine[m_nCurPosRL] < m_nColumns) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL]; + ++m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + else + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_nColumns; + } + break; + case VertR1_2D: + if (m_pRefLine[m_nCurPosRL] + 1 < m_nColumns) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] + 1; + ++m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + else + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_nColumns; + } + break; + case VertL1_2D: + if (m_pRefLine[m_nCurPosRL] - 1 > nNewCLPos || (m_nCurPosCL == 0 && m_pRefLine[m_nCurPosRL] == 1)) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] - 1; + --m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + break; + case VertR2_2D: + if (m_pRefLine[m_nCurPosRL] + 2 < m_nColumns) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] + 2; + ++m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + else + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_nColumns; + } + break; + case VertL2_2D: + if (m_pRefLine[m_nCurPosRL] - 2 > nNewCLPos || (m_nCurPosCL == 0 && m_pRefLine[m_nCurPosRL] == 2)) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] - 2; + --m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + break; + case VertR3_2D: + if (m_pRefLine[m_nCurPosRL] + 3 < m_nColumns) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] + 3; + ++m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + else + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_nColumns; + } + break; + case VertL3_2D: + if (m_pRefLine[m_nCurPosRL] - 3 > nNewCLPos || (m_nCurPosCL == 0 && m_pRefLine[m_nCurPosRL] == 3)) + { + nNewCLPos = m_pCodingLine[++m_nCurPosCL] = m_pRefLine[m_nCurPosRL] - 3; + --m_nCurPosRL; + while (m_pRefLine[m_nCurPosRL] <= nNewCLPos && m_pRefLine[m_nCurPosRL] < m_nColumns) + { + m_nCurPosRL += 2; + } + } + break; + case EOF: + m_bEOF = true; + m_pCodingLine[m_nCurPosCL = 0] = m_nColumns; + return EOF; + default: + // TO DO: Error "Bad 2D code in CCITTFax stream" + bError = true; + break; + } + } while (m_pCodingLine[m_nCurPosCL] < m_nColumns); + } + else // 1-D encoding + { + m_pCodingLine[m_nCurPosCL = 0] = 0; + while (1) + { + nCode1 = 0; + do { + nCode1 += nCode3 = GetWhiteCode(); + } while (nCode3 >= 64); + m_pCodingLine[m_nCurPosCL + 1] = m_pCodingLine[m_nCurPosCL] + nCode1; + ++m_nCurPosCL; + if (m_pCodingLine[m_nCurPosCL] >= m_nColumns) + { + break; + } + nCode2 = 0; + do { + nCode2 += nCode3 = GetBlackCode(); + } while (nCode3 >= 64); + m_pCodingLine[m_nCurPosCL + 1] = m_pCodingLine[m_nCurPosCL] + nCode2; + ++m_nCurPosCL; + if (m_pCodingLine[m_nCurPosCL] >= m_nColumns) + { + break; + } + } + } + + if (m_pCodingLine[m_nCurPosCL] != m_nColumns) + { + // TO DO: Error "CCITTFax row is wrong length " + + // Выставляем корректную длину + while (m_pCodingLine[m_nCurPosCL] > m_nColumns) + { + --m_nCurPosCL; + } + m_pCodingLine[++m_nCurPosCL] = m_nColumns; + bError = true; + } + + if (m_bByteAlign) + { + m_nInputBits &= ~7; + } + + // Проверяем символ конца строки, пропуска нулевые биты + bool bEOL = false; + if (!m_bEndOfBlock && m_mCurRow == m_nRows - 1) + { + m_bEOF = true; + } + else + { + nCode1 = LookBits(12); + while (nCode1 == 0) + { + SkipBits(1); + nCode1 = LookBits(12); + } + if (nCode1 == 0x001) + { + SkipBits(12); + bEOL = true; + } + else if (nCode1 == EOF) + { + m_bEOF = true; + } + } + + // Считываем тэг 2D кодировки + if (!m_bEOF && m_nK > 0) + { + m_bNextLine2D = !LookBits(1); + SkipBits(1); + } + + // Проверяем символ конца блока(end-of-block marker) + if (m_bEndOfBlock && bEOL) + { + nCode1 = LookBits(12); + if (nCode1 == 0x001) + { + SkipBits(12); + if (m_nK > 0) + { + LookBits(1); + SkipBits(1); + } + if (m_nK >= 0) + { + for (nIndex = 0; nIndex < 4; ++nIndex) + { + nCode1 = LookBits(12); + if (nCode1 != 0x001) + { + // TO DO: Error "Bad RTC code in CCITTFax stream" + } + SkipBits(12); + if (m_nK > 0) + { + LookBits(1); + SkipBits(1); + } + } + } + m_bEOF = true; + } + } + else if (bError && m_bEndOfLine) + { + do { + if (nCode1 == EOF) + { + m_bEOF = true; + return EOF; + } + SkipBits(1); + nCode1 = LookBits(13); + } while ((nCode1 >> 1) != 0x001); + SkipBits(12); + if (m_nK > 0) + { + SkipBits(1); + m_bNextLine2D = !(nCode1 & 1); + } + } + + m_nCurPosCL = 0; + m_nOutputBits = m_pCodingLine[1] - m_pCodingLine[0]; + if (m_nOutputBits == 0) + { + m_nCurPosCL = 1; + m_nOutputBits = m_pCodingLine[2] - m_pCodingLine[1]; + } + ++m_mCurRow; + } + + // Считываем один байт + int nRet = 0; + if (m_nOutputBits >= 8) + { + nRet = ((m_nCurPosCL & 1) == 0) ? 0xff : 0x00; + if ((m_nOutputBits -= 8) == 0) + { + ++m_nCurPosCL; + if (m_pCodingLine[m_nCurPosCL] < m_nColumns) + { + m_nOutputBits = m_pCodingLine[m_nCurPosCL + 1] - m_pCodingLine[m_nCurPosCL]; + } + } + } + else + { + int nBits = 8; + nRet = 0; + do { + if (m_nOutputBits > nBits) + { + nIndex = nBits; + nBits = 0; + if ((m_nCurPosCL & 1) == 0) + { + nRet |= 0xff >> (8 - nIndex); + } + m_nOutputBits -= nIndex; + } + else + { + nIndex = m_nOutputBits; + nBits -= m_nOutputBits; + if ((m_nCurPosCL & 1) == 0) + { + nRet |= (0xff >> (8 - nIndex)) << nBits; + } + m_nOutputBits = 0; + ++m_nCurPosCL; + if (m_pCodingLine[m_nCurPosCL] < m_nColumns) + { + m_nOutputBits = m_pCodingLine[m_nCurPosCL + 1] - m_pCodingLine[m_nCurPosCL]; + } + } + } while (nBits > 0 && m_pCodingLine[m_nCurPosCL] < m_nColumns); + } + m_nCharBuffer = m_bBlackIs1 ? (nRet ^ 0xff) : nRet; + return m_nCharBuffer; + } + + short CCITTFaxStream::Get2DCode() + { + CCITTCode *pCCITTCode; + + short nCode = 0; + if (m_bEndOfBlock) + { + nCode = LookBits(7); + pCCITTCode = &c_arrTable2D[nCode]; + if (pCCITTCode->nBitsCount > 0) + { + SkipBits(pCCITTCode->nBitsCount); + return pCCITTCode->nCode; + } + } + else + { + for (int nCount = 1; nCount <= 7; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 7) + { + nCode <<= 7 - nCount; + } + pCCITTCode = &c_arrTable2D[nCode]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + } + // TO DO: Error "Bad 2D code in CCITTFax stream" + return EOF; + } + + short CCITTFaxStream::GetWhiteCode() + { + CCITTCode *pCCITTCode; + + short nCode = 0; + if (m_bEndOfBlock) + { + nCode = LookBits(12); + if ((nCode >> 5) == 0) + { + pCCITTCode = &c_arrWhiteTable1[nCode]; + } + else + { + pCCITTCode = &c_arrWhiteTable2[nCode >> 3]; + } + if (pCCITTCode->nBitsCount > 0) + { + SkipBits(pCCITTCode->nBitsCount); + return pCCITTCode->nCode; + } + } + else + { + for (int nCount = 1; nCount <= 9; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 9) + { + nCode <<= 9 - nCount; + } + pCCITTCode = &c_arrWhiteTable2[nCode]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + for (int nCount = 11; nCount <= 12; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 12) + { + nCode <<= 12 - nCount; + } + pCCITTCode = &c_arrWhiteTable1[nCode]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + } + // TO DO: Error "Bad white code in CCITTFax stream" + + SkipBits(1); + return 1; + } + + short CCITTFaxStream::GetBlackCode() + { + CCITTCode *pCCITTCode; + + short nCode = 0; + if (m_bEndOfBlock) + { + nCode = LookBits(13); + if ((nCode >> 7) == 0) + { + pCCITTCode = &c_arrBlackTable1[nCode]; + } + else if ((nCode >> 9) == 0) + { + pCCITTCode = &c_arrBlackTable2[(nCode >> 1) - 64]; + } + else + { + pCCITTCode = &c_arrBlackTable3[nCode >> 7]; + } + if (pCCITTCode->nBitsCount > 0) + { + SkipBits(pCCITTCode->nBitsCount); + return pCCITTCode->nCode; + } + } + else + { + for (int nCount = 2; nCount <= 6; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 6) + { + nCode <<= 6 - nCount; + } + pCCITTCode = &c_arrBlackTable3[nCode]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + for (int nCount = 7; nCount <= 12; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 12) + { + nCode <<= 12 - nCount; + } + if (nCode >= 64) + { + pCCITTCode = &c_arrBlackTable2[nCode - 64]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + } + for (int nCount = 10; nCount <= 13; ++nCount) + { + nCode = LookBits(nCount); + if (nCount < 13) + { + nCode <<= 13 - nCount; + } + pCCITTCode = &c_arrBlackTable1[nCode]; + if (pCCITTCode->nBitsCount == nCount) + { + SkipBits(nCount); + return pCCITTCode->nCode; + } + } + } + // TO DO: Error "Bad black code in CCITTFax stream" + + SkipBits(1); + return 1; + } + + short CCITTFaxStream::LookBits(int nCount) + { + while (m_nInputBits < nCount) + { + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + if (m_nInputBits == 0) + { + return EOF; + } + // Вблизи конца потока может оказаться, что запрашивается больше бит, чем + // их осталось в потоке. Нужно возратить корректное значение в данном случае. + return (m_nInputBuffer << (nCount - m_nInputBits)) & (0xffff >> (16 - nCount)); + } + m_nInputBuffer = (m_nInputBuffer << 8) + nChar; + m_nInputBits += 8; + } + return (m_nInputBuffer >> (m_nInputBits - nCount)) & (0xffff >> (16 - nCount)); + } + + StringExt *CCITTFaxStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + char sTemp[50]; + + if (nPSLevel < 2) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + + seResult->Append(sIndent)->Append("<< "); + if (m_nK != 0) + { + sprintf(sTemp, "/K %d ", m_nK); + seResult->Append(sTemp); + } + if (m_bEndOfLine) + { + seResult->Append("/EndOfLine true "); + } + if (m_bByteAlign) + { + seResult->Append("/EncodedByteAlign true "); + } + sprintf(sTemp, "/Columns %d ", m_nColumns); + seResult->Append(sTemp); + if (m_nRows != 0) + { + sprintf(sTemp, "/Rows %d ", m_nRows); + seResult->Append(sTemp); + } + if (!m_bEndOfBlock) + { + seResult->Append("/EndOfBlock false "); + } + if (m_bBlackIs1) + { + seResult->Append("/BlackIs1 true "); + } + seResult->Append(">> /CCITTFaxDecode filter\n"); + return seResult; + } + + bool CCITTFaxStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + //--------------------------------------------------------------------------------------------------------------- + // DCTStream + //--------------------------------------------------------------------------------------------------------------- + + // Константы для косинусного преобразования (20.12 fixed point format) +#define DCT_Cos_1_16 4017 // cos(pi/16) +#define DCT_Sin_1_16 799 // sin(pi/16) +#define DCT_Cos_3_16 3406 // cos(3*pi/16) +#define DCT_Sin_3_16 2276 // sin(3*pi/16) +#define DCT_Cos_6_16 1567 // cos(6*pi/16) +#define DCT_Sin_6_16 3784 // sin(6*pi/16) + +#define DCT_Sqrt_2 5793 // sqrt(2) +#define DCT_Sqrt_2__2 2896 // sqrt(2) / 2 + + // Константы для преобразования цветов (16.16 fixed point format) +#define DCT_CrToR 91881 // 1.4020 +#define DCT_CbToG -22553 // -0.3441363 +#define DCT_CrToG -46802 // -0.71413636 +#define DCT_CbToB 116130 // 1.772 + + // clip [-256,511] --> [0,255] +#define DCTClipOffset 256 + static unsigned char arrDCTClip[768]; + static int nDCTClipInit = 0; + + // zig zag + static int arrDCTZigZag[64] = + { + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 + }; + + DCTStream::DCTStream(Stream *pStream, int nColorTransform) : + FilterStream(pStream) + { + m_nColorTransform = nColorTransform; + m_bProgressive = m_bInterleaved = false; + m_nWidth = m_nHeight = 0; + m_nMCUWidth = m_nMCUHeight = 0; + m_nComponentsCount = 0; + m_nCurComponent = 0; + m_nX = m_nY = m_nDY = 0; + + for (int nComp = 0; nComp < 4; ++nComp) + { + for (int nIndex = 0; nIndex < 32; ++nIndex) + { + m_pppRowBuffer[nComp][nIndex] = NULL; + } + m_ppFrameBuffer[nComp] = NULL; + } + + if (!nDCTClipInit) + { + for (int nIndex = -256; nIndex < 0; ++nIndex) + arrDCTClip[DCTClipOffset + nIndex] = 0; + for (int nIndex = 0; nIndex < 256; ++nIndex) + arrDCTClip[DCTClipOffset + nIndex] = nIndex; + for (int nIndex = 256; nIndex < 512; ++nIndex) + arrDCTClip[DCTClipOffset + nIndex] = 255; + nDCTClipInit = 1; + } + } + + DCTStream::~DCTStream() + { + Close(); + delete m_pStream; + } + + void DCTStream::Reset() + { + m_pStream->Reset(); + + m_bProgressive = m_bInterleaved = false; + m_nWidth = m_nHeight = 0; + m_nComponentsCount = 0; + m_nQuantTablesCount = 0; + m_nDCHuffTablesCount = 0; + m_nACHuffTablesCount = 0; + m_bJFIFMarker = false; + m_bAdobeMarker = false; + m_nRestartInterval = 0; + + if (!ReadHeader()) + { + m_nY = m_nHeight; + return; + } + + // Вычислим размеры MCU + if (m_nComponentsCount == 1) + { + m_arrCompInfo[0].nXResolution = m_arrCompInfo[0].nYResolution = 1; + } + + m_nMCUWidth = m_arrCompInfo[0].nXResolution; + m_nMCUHeight = m_arrCompInfo[0].nYResolution; + + for (int nIndex = 1; nIndex < m_nComponentsCount; ++nIndex) + { + if (m_arrCompInfo[nIndex].nXResolution > m_nMCUWidth) + { + m_nMCUWidth = m_arrCompInfo[nIndex].nXResolution; + } + if (m_arrCompInfo[nIndex].nYResolution > m_nMCUHeight) + { + m_nMCUHeight = m_arrCompInfo[nIndex].nYResolution; + } + } + m_nMCUWidth *= 8; + m_nMCUHeight *= 8; + + if (m_nColorTransform == -1) + { + if (m_nComponentsCount == 3) + { + if (m_bJFIFMarker) + { + m_nColorTransform = 1; + } + else if (m_arrCompInfo[0].nID == 82 && m_arrCompInfo[1].nID == 71 && m_arrCompInfo[2].nID == 66) // ASCII "RGB" + { + m_nColorTransform = 0; + } + else + { + m_nColorTransform = 1; + } + } + else + { + m_nColorTransform = 0; + } + } + + if (m_bProgressive || !m_bInterleaved) + { + + // Выделяем память для всей картинки + m_nBufferWidth = ((m_nWidth + m_nMCUWidth - 1) / m_nMCUWidth) * m_nMCUWidth; + m_nBufferHeight = ((m_nHeight + m_nMCUHeight - 1) / m_nMCUHeight) * m_nMCUHeight; + + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + m_ppFrameBuffer[nIndex] = (int *)MemUtilsMallocArray(m_nBufferWidth * m_nBufferHeight, sizeof(int)); + memset(m_ppFrameBuffer[nIndex], 0, m_nBufferWidth * m_nBufferHeight * sizeof(int)); + } + + // Считываем данные картинки + do { + m_nRestartMarker = 0xd0; + Restart(); + ReadScan(); + } while (ReadHeader()); + + // Декодируем + DecodeImage(); + + // Обнуляем счетчики + m_nCurComponent = 0; + m_nX = 0; + m_nY = 0; + + } + else + { + // Выделяем память под одну строку для MCU + m_nBufferWidth = ((m_nWidth + m_nMCUWidth - 1) / m_nMCUWidth) * m_nMCUWidth; + for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + for (int nY = 0; nY < m_nMCUHeight; ++nY) + { + m_pppRowBuffer[nComp][nY] = (unsigned char *)MemUtilsMallocArray(m_nBufferWidth, sizeof(unsigned char)); + } + } + + // Обнуляем счетчики + m_nCurComponent = 0; + m_nX = 0; + m_nY = 0; + m_nDY = m_nMCUHeight; + + m_nRestartMarker = 0xd0; + Restart(); + } + } + + void DCTStream::Close() + { + for (int nComp = 0; nComp < 4; ++nComp) + { + for (int nY = 0; nY < 32; ++nY) + { + MemUtilsFree(m_pppRowBuffer[nComp][nY]); + m_pppRowBuffer[nComp][nY] = NULL; + } + MemUtilsFree(m_ppFrameBuffer[nComp]); + m_ppFrameBuffer[nComp] = NULL; + } + FilterStream::Close(); + } + + int DCTStream::GetChar() + { + int nChar = 0; + if (m_nY >= m_nHeight) + { + return EOF; + } + if (m_bProgressive || !m_bInterleaved) + { + nChar = m_ppFrameBuffer[m_nCurComponent][m_nY * m_nBufferWidth + m_nX]; + if (++m_nCurComponent == m_nComponentsCount) + { + m_nCurComponent = 0; + if (++m_nX == m_nWidth) + { + m_nX = 0; + ++m_nY; + } + } + } + else + { + if (m_nDY >= m_nMCUHeight) + { + if (!ReadMCURow()) + { + m_nY = m_nHeight; + return EOF; + } + m_nCurComponent = 0; + m_nX = 0; + m_nDY = 0; + } + nChar = m_pppRowBuffer[m_nCurComponent][m_nDY][m_nX]; + if (++m_nCurComponent == m_nComponentsCount) + { + m_nCurComponent = 0; + if (++m_nX == m_nWidth) + { + m_nX = 0; + ++m_nY; + ++m_nDY; + if (m_nY == m_nHeight) + { + ReadTrailer(); + } + } + } + } + return nChar; + } + + int DCTStream::LookChar() + { + if (m_nY >= m_nHeight) + { + return EOF; + } + if (m_bProgressive || !m_bInterleaved) + { + return m_ppFrameBuffer[m_nCurComponent][m_nY * m_nBufferWidth + m_nX]; + } + else + { + if (m_nDY >= m_nMCUHeight) + { + if (!ReadMCURow()) + { + m_nY = m_nHeight; + return EOF; + } + m_nCurComponent = 0; + m_nX = 0; + m_nDY = 0; + } + return m_pppRowBuffer[m_nCurComponent][m_nDY][m_nX]; + } + } + + void DCTStream::Restart() + { + m_nInputBits = 0; + m_nRestartCtr = m_nRestartInterval; + + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + m_arrCompInfo[nIndex].nPrevDC = 0; + + m_nEOBRun = 0; + } + + // Считываем одну строку из MCUs из соответствующего потока JPEG. + bool DCTStream::ReadMCURow() + { + int arrRawData[64]; + unsigned char arrTransformData[64]; + unsigned char *p1, *p2; + int x1, x2, y2, x3, y3, x4, y4, x5, y5, i; + + for (x1 = 0; x1 < m_nWidth; x1 += m_nMCUWidth) + { + // Обрабатываем restart marker + if (m_nRestartInterval > 0 && m_nRestartCtr == 0) + { + int nChar = ReadMarker(); + if (nChar != m_nRestartMarker) + { + // TO DO: Error "Bad DCT data: incorrect restart marker" + return false; + } + if (++m_nRestartMarker == 0xd8) + m_nRestartMarker = 0xd0; + Restart(); + } + + // Считываем один MCU + for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + int nXRes = m_arrCompInfo[nComp].nXResolution; + int nYRes = m_arrCompInfo[nComp].nYResolution; + int nHoriz = m_nMCUWidth / nXRes; + int nVert = m_nMCUHeight / nYRes; + int nHorizSub = nHoriz / 8; + int nVertSub = nVert / 8; + for (y2 = 0; y2 < m_nMCUHeight; y2 += nVert) + { + for (x2 = 0; x2 < m_nMCUWidth; x2 += nHoriz) + { + if (!ReadDataUnit(&m_arrDCHuffTables[m_oCurScanInfo.arrDCHuffTable[nComp]], &m_arrACHuffTables[m_oCurScanInfo.arrACHuffTable[nComp]], &m_arrCompInfo[nComp].nPrevDC, arrRawData)) + return false; + + TransformDataUnit(m_arrQuantTables[m_arrCompInfo[nComp].nQuantTableNum], arrRawData, arrTransformData); + if (nHorizSub == 1 && nVertSub == 1) + { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) + { + p1 = &m_pppRowBuffer[nComp][y2 + y3][x1 + x2]; + p1[0] = arrTransformData[i + 0]; + p1[1] = arrTransformData[i + 1]; + p1[2] = arrTransformData[i + 2]; + p1[3] = arrTransformData[i + 3]; + p1[4] = arrTransformData[i + 4]; + p1[5] = arrTransformData[i + 5]; + p1[6] = arrTransformData[i + 6]; + p1[7] = arrTransformData[i + 7]; + } + } + else if (nHorizSub == 2 && nVertSub == 2) + { + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) + { + p1 = &m_pppRowBuffer[nComp][y2 + y3][x1 + x2]; + p2 = &m_pppRowBuffer[nComp][y2 + y3 + 1][x1 + x2]; + p1[0] = p1[1] = p2[0] = p2[1] = arrTransformData[i + 0]; + p1[2] = p1[3] = p2[2] = p2[3] = arrTransformData[i + 1]; + p1[4] = p1[5] = p2[4] = p2[5] = arrTransformData[i + 2]; + p1[6] = p1[7] = p2[6] = p2[7] = arrTransformData[i + 3]; + p1[8] = p1[9] = p2[8] = p2[9] = arrTransformData[i + 4]; + p1[10] = p1[11] = p2[10] = p2[11] = arrTransformData[i + 5]; + p1[12] = p1[13] = p2[12] = p2[13] = arrTransformData[i + 6]; + p1[14] = p1[15] = p2[14] = p2[15] = arrTransformData[i + 7]; + } + } + else + { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += nVertSub) + { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += nHorizSub) + { + for (y5 = 0; y5 < nVertSub; ++y5) + for (x5 = 0; x5 < nHorizSub; ++x5) + m_pppRowBuffer[nComp][y2 + y4 + y5][x1 + x2 + x4 + x5] = arrTransformData[i]; + ++i; + } + } + } + } + } + } + --m_nRestartCtr; + + // Преобазуем пространство цветов + if (m_nColorTransform) + { + // YCbCr -> RGB + if (m_nComponentsCount == 3) + { + for (y2 = 0; y2 < m_nMCUHeight; ++y2) + { + for (x2 = 0; x2 < m_nMCUWidth; ++x2) + { + int nY = m_pppRowBuffer[0][y2][x1 + x2]; + int nCb = m_pppRowBuffer[1][y2][x1 + x2] - 128; + int nCr = m_pppRowBuffer[2][y2][x1 + x2] - 128; + int nR = ((nY << 16) + DCT_CrToR * nCr + 32768) >> 16; + m_pppRowBuffer[0][y2][x1 + x2] = arrDCTClip[DCTClipOffset + nR]; + int nG = ((nY << 16) + DCT_CbToG * nCb + DCT_CrToG * nCr + 32768) >> 16; + m_pppRowBuffer[1][y2][x1 + x2] = arrDCTClip[DCTClipOffset + nG]; + int nB = ((nY << 16) + DCT_CbToB * nCb + 32768) >> 16; + m_pppRowBuffer[2][y2][x1 + x2] = arrDCTClip[DCTClipOffset + nB]; + } + } + } + else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K оставляем неизменненным) + { + for (y2 = 0; y2 < m_nMCUHeight; ++y2) + { + for (x2 = 0; x2 < m_nMCUWidth; ++x2) + { + int nY = m_pppRowBuffer[0][y2][x1 + x2]; + int nCb = m_pppRowBuffer[1][y2][x1 + x2] - 128; + int nCr = m_pppRowBuffer[2][y2][x1 + x2] - 128; + int nR = ((nY << 16) + DCT_CrToR * nCr + 32768) >> 16; + m_pppRowBuffer[0][y2][x1 + x2] = 255 - arrDCTClip[DCTClipOffset + nR]; + int nG = ((nY << 16) + DCT_CbToG * nCb + DCT_CrToG * nCr + 32768) >> 16; + m_pppRowBuffer[1][y2][x1 + x2] = 255 - arrDCTClip[DCTClipOffset + nG]; + int nB = ((nY << 16) + DCT_CbToB * nCb + 32768) >> 16; + m_pppRowBuffer[2][y2][x1 + x2] = 255 - arrDCTClip[DCTClipOffset + nB]; + } + } + } + } + } + return true; + } + + // Только для progressive или не interleaved JPEG. + void DCTStream::ReadScan() + { + int arrData[64]; + int x1, y1, dx1, dy1, x2, y2, y3, nComponent = 0, i; + int *pBuffer; + + if (m_oCurScanInfo.nComponentsCount == 1) + { + for (nComponent = 0; nComponent < m_nComponentsCount; ++nComponent) + { + if (m_oCurScanInfo.arrbComponent[nComponent]) + { + break; + } + } + dx1 = m_nMCUWidth / m_arrCompInfo[nComponent].nXResolution; + dy1 = m_nMCUHeight / m_arrCompInfo[nComponent].nYResolution; + } + else + { + dx1 = m_nMCUWidth; + dy1 = m_nMCUHeight; + } + + for (y1 = 0; y1 < m_nHeight; y1 += dy1) + { + for (x1 = 0; x1 < m_nWidth; x1 += dx1) + { + + // Обрабатываем restart marker + if (m_nRestartInterval > 0 && m_nRestartCtr == 0) + { + int nChar = ReadMarker(); + if (nChar != m_nRestartMarker) + { + // TO DO: Error "Bad DCT data: incorrect restart marker" + return; + } + if (++m_nRestartMarker == 0xd8) + { + m_nRestartMarker = 0xd0; + } + Restart(); + } + + // Считываем один MCU + for (nComponent = 0; nComponent < m_nComponentsCount; ++nComponent) + { + if (!m_oCurScanInfo.arrbComponent[nComponent]) + { + continue; + } + + int nXRes = m_arrCompInfo[nComponent].nXResolution; + int nYRes = m_arrCompInfo[nComponent].nYResolution; + int nHoriz = m_nMCUWidth / nXRes; + int nVert = m_nMCUHeight / nYRes; + int nVertSub = nVert / 8; + for (y2 = 0; y2 < dy1; y2 += nVert) + { + for (x2 = 0; x2 < dx1; x2 += nHoriz) + { + pBuffer = &m_ppFrameBuffer[nComponent][(y1 + y2) * m_nBufferWidth + (x1 + x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) + { + arrData[i + 0] = pBuffer[0]; + arrData[i + 1] = pBuffer[1]; + arrData[i + 2] = pBuffer[2]; + arrData[i + 3] = pBuffer[3]; + arrData[i + 4] = pBuffer[4]; + arrData[i + 5] = pBuffer[5]; + arrData[i + 6] = pBuffer[6]; + arrData[i + 7] = pBuffer[7]; + pBuffer += m_nBufferWidth * nVertSub; + } + + if (m_bProgressive) + { + if (!ReadProgressiveDataUnit(&m_arrDCHuffTables[m_oCurScanInfo.arrDCHuffTable[nComponent]], &m_arrACHuffTables[m_oCurScanInfo.arrACHuffTable[nComponent]], &m_arrCompInfo[nComponent].nPrevDC, arrData)) + { + return; + } + } + else + { + if (!ReadDataUnit(&m_arrDCHuffTables[m_oCurScanInfo.arrDCHuffTable[nComponent]], &m_arrACHuffTables[m_oCurScanInfo.arrACHuffTable[nComponent]], &m_arrCompInfo[nComponent].nPrevDC, arrData)) + { + return; + } + } + + pBuffer = &m_ppFrameBuffer[nComponent][(y1 + y2) * m_nBufferWidth + (x1 + x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) + { + pBuffer[0] = arrData[i + 0]; + pBuffer[1] = arrData[i + 1]; + pBuffer[2] = arrData[i + 2]; + pBuffer[3] = arrData[i + 3]; + pBuffer[4] = arrData[i + 4]; + pBuffer[5] = arrData[i + 5]; + pBuffer[6] = arrData[i + 6]; + pBuffer[7] = arrData[i + 7]; + pBuffer += m_nBufferWidth * nVertSub; + } + } + } + } + --m_nRestartCtr; + } + } + } + + bool DCTStream::ReadDataUnit(DCTHuffTable *pDCHuffTable, DCTHuffTable *pACHuffTable, int *pnPrevDC, int arrData[64]) + { + int nSize = 0, nAmp = 0; + + if ((nSize = ReadHuffSymbol(pDCHuffTable)) == 9999) + { + return false; + } + if (nSize > 0) + { + if ((nAmp = ReadAmp(nSize)) == 9999) + { + return false; + } + } + else + { + nAmp = 0; + } + arrData[0] = *pnPrevDC += nAmp; + for (int nI = 1; nI < 64; ++nI) + { + arrData[nI] = 0; + } + int nIndex = 1; + while (nIndex < 64) + { + int nRun = 0; + int nSymbol = 0; + while ((nSymbol = ReadHuffSymbol(pACHuffTable)) == 0xf0 && nRun < 0x30) + { + nRun += 0x10; + } + if (nSymbol == 9999) + { + return false; + } + if (nSymbol == 0x00) + { + break; + } + else + { + nRun += (nSymbol >> 4) & 0x0f; + nSize = nSymbol & 0x0f; + nAmp = ReadAmp(nSize); + if (nAmp == 9999) + { + return false; + } + nIndex += nRun; + if (nIndex < 64) + { + int nNewIndex = arrDCTZigZag[nIndex++]; + arrData[nNewIndex] = nAmp; + } + } + } + return true; + } + + bool DCTStream::ReadProgressiveDataUnit(DCTHuffTable *pDCHuffTable, DCTHuffTable *pACHuffTable, int *pnPrevDC, int arrData[64]) + { + int nRun = 0, nSize = 0, nAmp = 0, nBit = 0; + + // DC кoэффициенты + int nKoef = m_oCurScanInfo.nFirstKoef; + if (nKoef == 0) + { + if (m_oCurScanInfo.nApproxH == 0) + { + if ((nSize = ReadHuffSymbol(pDCHuffTable)) == 9999) + { + return false; + } + if (nSize > 0) + { + if ((nAmp = ReadAmp(nSize)) == 9999) + { + return false; + } + } + else + { + nAmp = 0; + } + arrData[0] += (*pnPrevDC += nAmp) << m_oCurScanInfo.nApproxL; + } + else + { + if ((nBit = ReadBit()) == 9999) + { + return false; + } + arrData[0] += nBit << m_oCurScanInfo.nApproxL; + } + ++nKoef; + } + if (m_oCurScanInfo.nLastKoef == 0) + { + return true; + } + + // Проверяем группу EOB + if (m_nEOBRun > 0) + { + while (nKoef <= m_oCurScanInfo.nLastKoef) + { + int nNewIndex = arrDCTZigZag[nKoef++]; + if (arrData[nNewIndex] != 0) + { + if ((nBit = ReadBit()) == EOF) + { + return false; + } + if (nBit) + { + arrData[nNewIndex] += 1 << m_oCurScanInfo.nApproxL; + } + } + } + --m_nEOBRun; + return true; + } + + int nK = 0; + // считываем коэффициенты AC + while (nKoef <= m_oCurScanInfo.nLastKoef) + { + int nSymbol = 0; + if ((nSymbol = ReadHuffSymbol(pACHuffTable)) == 9999) + { + return false; + } + + // ZRL + if (nSymbol == 0xf0) + { + nK = 0; + while (nK < 16) + { + int nNewIndex = arrDCTZigZag[nKoef++]; + if (arrData[nNewIndex] == 0) + { + ++nK; + } + else + { + if ((nBit = ReadBit()) == EOF) + { + return false; + } + if (nBit) + { + arrData[nNewIndex] += 1 << m_oCurScanInfo.nApproxL; + } + } + } + } + else if ((nSymbol & 0x0f) == 0x00) // EOB run + { + int nTemp = nSymbol >> 4; + m_nEOBRun = 0; + for (nK = 0; nK < nTemp; ++nK) + { + if ((nBit = ReadBit()) == EOF) + { + return false; + } + m_nEOBRun = (m_nEOBRun << 1) | nBit; + } + m_nEOBRun += 1 << nTemp; + while (nKoef <= m_oCurScanInfo.nLastKoef) + { + int nNewIndex = arrDCTZigZag[nKoef++]; + if (arrData[nNewIndex] != 0) + { + if ((nBit = ReadBit()) == EOF) + { + return false; + } + if (nBit) + { + arrData[nNewIndex] += 1 << m_oCurScanInfo.nApproxL; + } + } + } + --m_nEOBRun; + break; + } + else + { + nRun = (nSymbol >> 4) & 0x0f; + nSize = nSymbol & 0x0f; + if ((nAmp = ReadAmp(nSize)) == 9999) + { + return false; + } + nK = 0; + int nNewIndex = 0; + do { + nNewIndex = arrDCTZigZag[nKoef++]; + while (arrData[nNewIndex] != 0) + { + if ((nBit = ReadBit()) == EOF) + { + return false; + } + if (nBit) + { + arrData[nNewIndex] += 1 << m_oCurScanInfo.nApproxL; + } + nNewIndex = arrDCTZigZag[nKoef++]; + } + ++nK; + } while (nK <= nRun); + arrData[nNewIndex] = nAmp << m_oCurScanInfo.nApproxL; + } + } + + return true; + } + + void DCTStream::DecodeImage() + { + int arrDataIn[64]; + unsigned char arrDataOut[64]; + unsigned short *pQuantTable; + int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, i; + + int *p0, *p1, *p2; + + for (y1 = 0; y1 < m_nBufferHeight; y1 += m_nMCUHeight) + { + for (x1 = 0; x1 < m_nBufferWidth; x1 += m_nMCUWidth) + { + for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + pQuantTable = m_arrQuantTables[m_arrCompInfo[nComp].nQuantTableNum]; + int nXRes = m_arrCompInfo[nComp].nXResolution; + int nYRes = m_arrCompInfo[nComp].nYResolution; + int nHoriz = m_nMCUWidth / nXRes; + int nVert = m_nMCUHeight / nYRes; + int nHorizSub = nHoriz / 8; + int nVertSub = nVert / 8; + for (y2 = 0; y2 < m_nMCUHeight; y2 += nVert) + { + for (x2 = 0; x2 < m_nMCUWidth; x2 += nHoriz) + { + p1 = &m_ppFrameBuffer[nComp][(y1 + y2) * m_nBufferWidth + (x1 + x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) + { + arrDataIn[i + 0] = p1[0]; + arrDataIn[i + 1] = p1[1]; + arrDataIn[i + 2] = p1[2]; + arrDataIn[i + 3] = p1[3]; + arrDataIn[i + 4] = p1[4]; + arrDataIn[i + 5] = p1[5]; + arrDataIn[i + 6] = p1[6]; + arrDataIn[i + 7] = p1[7]; + p1 += m_nBufferWidth * nVertSub; + } + + TransformDataUnit(pQuantTable, arrDataIn, arrDataOut); + + p1 = &m_ppFrameBuffer[nComp][(y1 + y2) * m_nBufferWidth + (x1 + x2)]; + if (nHorizSub == 1 && nVertSub == 1) + { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) + { + p1[0] = arrDataOut[i + 0] & 0xff; + p1[1] = arrDataOut[i + 1] & 0xff; + p1[2] = arrDataOut[i + 2] & 0xff; + p1[3] = arrDataOut[i + 3] & 0xff; + p1[4] = arrDataOut[i + 4] & 0xff; + p1[5] = arrDataOut[i + 5] & 0xff; + p1[6] = arrDataOut[i + 6] & 0xff; + p1[7] = arrDataOut[i + 7] & 0xff; + p1 += m_nBufferWidth; + } + } + else if (nHorizSub == 2 && nVertSub == 2) + { + p2 = p1 + m_nBufferWidth; + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) + { + p1[0] = p1[1] = p2[0] = p2[1] = arrDataOut[i + 0] & 0xff; + p1[2] = p1[3] = p2[2] = p2[3] = arrDataOut[i + 1] & 0xff; + p1[4] = p1[5] = p2[4] = p2[5] = arrDataOut[i + 2] & 0xff; + p1[6] = p1[7] = p2[6] = p2[7] = arrDataOut[i + 3] & 0xff; + p1[8] = p1[9] = p2[8] = p2[9] = arrDataOut[i + 4] & 0xff; + p1[10] = p1[11] = p2[10] = p2[11] = arrDataOut[i + 5] & 0xff; + p1[12] = p1[13] = p2[12] = p2[13] = arrDataOut[i + 6] & 0xff; + p1[14] = p1[15] = p2[14] = p2[15] = arrDataOut[i + 7] & 0xff; + p1 += m_nBufferWidth * 2; + p2 += m_nBufferWidth * 2; + } + } + else + { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += nVertSub) + { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += nHorizSub) + { + p2 = p1 + x4; + for (y5 = 0; y5 < nVertSub; ++y5) + { + for (x5 = 0; x5 < nHorizSub; ++x5) + { + p2[x5] = arrDataOut[i] & 0xff; + } + p2 += m_nBufferWidth; + } + ++i; + } + p1 += m_nBufferWidth * nVertSub; + } + } + } + } + } + + // Преобразование пространства цветов + if (m_nColorTransform) + { + // YCbCr -> RGB + if (m_nComponentsCount == 3) + { + for (y2 = 0; y2 < m_nMCUHeight; ++y2) + { + p0 = &m_ppFrameBuffer[0][(y1 + y2) * m_nBufferWidth + x1]; + p1 = &m_ppFrameBuffer[1][(y1 + y2) * m_nBufferWidth + x1]; + p2 = &m_ppFrameBuffer[2][(y1 + y2) * m_nBufferWidth + x1]; + for (x2 = 0; x2 < m_nMCUWidth; ++x2) + { + int nY = *p0; + int nCb = *p1 - 128; + int nCr = *p2 - 128; + int nR = ((nY << 16) + DCT_CrToR * nCr + 32768) >> 16; + *p0++ = arrDCTClip[DCTClipOffset + nR]; + int nG = ((nY << 16) + DCT_CbToG * nCb + DCT_CrToG * nCr + 32768) >> 16; + *p1++ = arrDCTClip[DCTClipOffset + nG]; + int nB = ((nY << 16) + DCT_CbToB * nCb + 32768) >> 16; + *p2++ = arrDCTClip[DCTClipOffset + nB]; + } + } + } + else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K оставляем неизмененным) + { + for (y2 = 0; y2 < m_nMCUHeight; ++y2) + { + p0 = &m_ppFrameBuffer[0][(y1 + y2) * m_nBufferWidth + x1]; + p1 = &m_ppFrameBuffer[1][(y1 + y2) * m_nBufferWidth + x1]; + p2 = &m_ppFrameBuffer[2][(y1 + y2) * m_nBufferWidth + x1]; + for (x2 = 0; x2 < m_nMCUWidth; ++x2) + { + int nY = *p0; + int nCb = *p1 - 128; + int nCr = *p2 - 128; + int nR = ((nY << 16) + DCT_CrToR * nCr + 32768) >> 16; + *p0++ = 255 - arrDCTClip[DCTClipOffset + nR]; + int nG = ((nY << 16) + DCT_CbToG * nCb + DCT_CrToG * nCr + 32768) >> 16; + *p1++ = 255 - arrDCTClip[DCTClipOffset + nG]; + int nB = ((nY << 16) + DCT_CbToB * nCb + 32768) >> 16; + *p2++ = 255 - arrDCTClip[DCTClipOffset + nB]; + } + } + } + } + } + } + } + + void DCTStream::TransformDataUnit(unsigned short *pQuantTable, int arrDataIn[64], unsigned char arrDataOut[64]) + { + int arrBuffer[8] ={ 0, 0, 0, 0, 0, 0, 0, 0 }; + int nTemp = 0; + int *pCurLine = NULL; + + // Деквантизация + for (int nIndex = 0; nIndex < 64; ++nIndex) + { + arrDataIn[nIndex] *= pQuantTable[nIndex]; + } + + // Обратное синусно-косинусное преобразования (по строкам) + for (int nIndex = 0; nIndex < 64; nIndex += 8) + { + pCurLine = arrDataIn + nIndex; + + // Проверяем случай, когда все коэффициенты равны 0 + if (pCurLine[1] == 0 && pCurLine[2] == 0 && pCurLine[3] == 0 && pCurLine[4] == 0 && pCurLine[5] == 0 && pCurLine[6] == 0 && pCurLine[7] == 0) + { + nTemp = (DCT_Sqrt_2 * pCurLine[0] + 512) >> 10; + pCurLine[0] = nTemp; + pCurLine[1] = nTemp; + pCurLine[2] = nTemp; + pCurLine[3] = nTemp; + pCurLine[4] = nTemp; + pCurLine[5] = nTemp; + pCurLine[6] = nTemp; + pCurLine[7] = nTemp; + continue; + } + + // Шаг 4 (Сдвиг на 128) + arrBuffer[0] = (DCT_Sqrt_2 * pCurLine[0] + 128) >> 8; + arrBuffer[1] = (DCT_Sqrt_2 * pCurLine[4] + 128) >> 8; + arrBuffer[2] = pCurLine[2]; + arrBuffer[3] = pCurLine[6]; + arrBuffer[4] = (DCT_Sqrt_2__2 * (pCurLine[1] - pCurLine[7]) + 128) >> 8; + arrBuffer[7] = (DCT_Sqrt_2__2 * (pCurLine[1] + pCurLine[7]) + 128) >> 8; + arrBuffer[5] = pCurLine[3] << 4; + arrBuffer[6] = pCurLine[5] << 4; + + // Шаг 3 + nTemp = (arrBuffer[0] - arrBuffer[1] + 1) >> 1; + arrBuffer[0] = (arrBuffer[0] + arrBuffer[1] + 1) >> 1; + arrBuffer[1] = nTemp; + nTemp = (arrBuffer[2] * DCT_Sin_6_16 + arrBuffer[3] * DCT_Cos_6_16 + 128) >> 8; + arrBuffer[2] = (arrBuffer[2] * DCT_Cos_6_16 - arrBuffer[3] * DCT_Sin_6_16 + 128) >> 8; + arrBuffer[3] = nTemp; + nTemp = (arrBuffer[4] - arrBuffer[6] + 1) >> 1; + arrBuffer[4] = (arrBuffer[4] + arrBuffer[6] + 1) >> 1; + arrBuffer[6] = nTemp; + nTemp = (arrBuffer[7] + arrBuffer[5] + 1) >> 1; + arrBuffer[5] = (arrBuffer[7] - arrBuffer[5] + 1) >> 1; + arrBuffer[7] = nTemp; + + // Шаг 2 + nTemp = (arrBuffer[0] - arrBuffer[3] + 1) >> 1; + arrBuffer[0] = (arrBuffer[0] + arrBuffer[3] + 1) >> 1; + arrBuffer[3] = nTemp; + nTemp = (arrBuffer[1] - arrBuffer[2] + 1) >> 1; + arrBuffer[1] = (arrBuffer[1] + arrBuffer[2] + 1) >> 1; + arrBuffer[2] = nTemp; + nTemp = (arrBuffer[4] * DCT_Sin_3_16 + arrBuffer[7] * DCT_Cos_3_16 + 2048) >> 12; + arrBuffer[4] = (arrBuffer[4] * DCT_Cos_3_16 - arrBuffer[7] * DCT_Sin_3_16 + 2048) >> 12; + arrBuffer[7] = nTemp; + nTemp = (arrBuffer[5] * DCT_Sin_1_16 + arrBuffer[6] * DCT_Cos_1_16 + 2048) >> 12; + arrBuffer[5] = (arrBuffer[5] * DCT_Cos_1_16 - arrBuffer[6] * DCT_Sin_1_16 + 2048) >> 12; + arrBuffer[6] = nTemp; + + // Шаг 1 + pCurLine[0] = arrBuffer[0] + arrBuffer[7]; + pCurLine[7] = arrBuffer[0] - arrBuffer[7]; + pCurLine[1] = arrBuffer[1] + arrBuffer[6]; + pCurLine[6] = arrBuffer[1] - arrBuffer[6]; + pCurLine[2] = arrBuffer[2] + arrBuffer[5]; + pCurLine[5] = arrBuffer[2] - arrBuffer[5]; + pCurLine[3] = arrBuffer[3] + arrBuffer[4]; + pCurLine[4] = arrBuffer[3] - arrBuffer[4]; + } + + // Обратное синусно-косинусное преобразования (по столбцам) + for (int nIndex = 0; nIndex < 8; ++nIndex) + { + pCurLine = arrDataIn + nIndex; + + // проверяем все ли коэффициенты нулевые + if (pCurLine[1 * 8] == 0 && pCurLine[2 * 8] == 0 && pCurLine[3 * 8] == 0 && pCurLine[4 * 8] == 0 && pCurLine[5 * 8] == 0 && pCurLine[6 * 8] == 0 && pCurLine[7 * 8] == 0) + { + nTemp = (DCT_Sqrt_2 * arrDataIn[nIndex + 0] + 8192) >> 14; + pCurLine[0 * 8] = nTemp; + pCurLine[1 * 8] = nTemp; + pCurLine[2 * 8] = nTemp; + pCurLine[3 * 8] = nTemp; + pCurLine[4 * 8] = nTemp; + pCurLine[5 * 8] = nTemp; + pCurLine[6 * 8] = nTemp; + pCurLine[7 * 8] = nTemp; + continue; + } + + // Шаг 4 + arrBuffer[0] = (DCT_Sqrt_2 * pCurLine[0 * 8] + 2048) >> 12; + arrBuffer[1] = (DCT_Sqrt_2 * pCurLine[4 * 8] + 2048) >> 12; + arrBuffer[2] = pCurLine[2 * 8]; + arrBuffer[3] = pCurLine[6 * 8]; + arrBuffer[4] = (DCT_Sqrt_2__2 * (pCurLine[1 * 8] - pCurLine[7 * 8]) + 2048) >> 12; + arrBuffer[7] = (DCT_Sqrt_2__2 * (pCurLine[1 * 8] + pCurLine[7 * 8]) + 2048) >> 12; + arrBuffer[5] = pCurLine[3 * 8]; + arrBuffer[6] = pCurLine[5 * 8]; + + // Шаг 3 + nTemp = (arrBuffer[0] - arrBuffer[1] + 1) >> 1; + arrBuffer[0] = (arrBuffer[0] + arrBuffer[1] + 1) >> 1; + arrBuffer[1] = nTemp; + nTemp = (arrBuffer[2] * DCT_Sin_6_16 + arrBuffer[3] * DCT_Cos_6_16 + 2048) >> 12; + arrBuffer[2] = (arrBuffer[2] * DCT_Cos_6_16 - arrBuffer[3] * DCT_Sin_6_16 + 2048) >> 12; + arrBuffer[3] = nTemp; + nTemp = (arrBuffer[4] - arrBuffer[6] + 1) >> 1; + arrBuffer[4] = (arrBuffer[4] + arrBuffer[6] + 1) >> 1; + arrBuffer[6] = nTemp; + nTemp = (arrBuffer[7] + arrBuffer[5] + 1) >> 1; + arrBuffer[5] = (arrBuffer[7] - arrBuffer[5] + 1) >> 1; + arrBuffer[7] = nTemp; + + // Шаг 2 + nTemp = (arrBuffer[0] - arrBuffer[3] + 1) >> 1; + arrBuffer[0] = (arrBuffer[0] + arrBuffer[3] + 1) >> 1; + arrBuffer[3] = nTemp; + nTemp = (arrBuffer[1] - arrBuffer[2] + 1) >> 1; + arrBuffer[1] = (arrBuffer[1] + arrBuffer[2] + 1) >> 1; + arrBuffer[2] = nTemp; + nTemp = (arrBuffer[4] * DCT_Sin_3_16 + arrBuffer[7] * DCT_Cos_3_16 + 2048) >> 12; + arrBuffer[4] = (arrBuffer[4] * DCT_Cos_3_16 - arrBuffer[7] * DCT_Sin_3_16 + 2048) >> 12; + arrBuffer[7] = nTemp; + nTemp = (arrBuffer[5] * DCT_Sin_1_16 + arrBuffer[6] * DCT_Cos_1_16 + 2048) >> 12; + arrBuffer[5] = (arrBuffer[5] * DCT_Cos_1_16 - arrBuffer[6] * DCT_Sin_1_16 + 2048) >> 12; + arrBuffer[6] = nTemp; + + // Шаг 1 + pCurLine[0 * 8] = arrBuffer[0] + arrBuffer[7]; + pCurLine[7 * 8] = arrBuffer[0] - arrBuffer[7]; + pCurLine[1 * 8] = arrBuffer[1] + arrBuffer[6]; + pCurLine[6 * 8] = arrBuffer[1] - arrBuffer[6]; + pCurLine[2 * 8] = arrBuffer[2] + arrBuffer[5]; + pCurLine[5 * 8] = arrBuffer[2] - arrBuffer[5]; + pCurLine[3 * 8] = arrBuffer[3] + arrBuffer[4]; + pCurLine[4 * 8] = arrBuffer[3] - arrBuffer[4]; + } + + // convert to 8-bit integers + for (int nIndex = 0; nIndex < 64; ++nIndex) + { + arrDataOut[nIndex] = arrDCTClip[DCTClipOffset + 128 + ((arrDataIn[nIndex] + 8) >> 4)]; + } + } + + int DCTStream::ReadHuffSymbol(DCTHuffTable *pTable) + { + unsigned short nCode = 0; + int nCodeBitsCount = 0; + do { + int nBit = 0; + if ((nBit = ReadBit()) == EOF) + return 9999; + nCode = (nCode << 1) + nBit; + ++nCodeBitsCount; + + if (nCode - pTable->arrunFirstCode[nCodeBitsCount] < pTable->arrunCodesCount[nCodeBitsCount]) + { + nCode -= pTable->arrunFirstCode[nCodeBitsCount]; + return pTable->arrunSymbols[pTable->arrunFirstSymbol[nCodeBitsCount] + nCode]; + } + } while (nCodeBitsCount < 16); + + // TO DO: Error "Bad Huffman code in DCT stream" + return 9999; + } + + int DCTStream::ReadAmp(int nSize) + { + int nAmp = 0; + for (int nBitsCount = 0; nBitsCount < nSize; ++nBitsCount) + { + int nBit = 0; + if ((nBit = ReadBit()) == EOF) + return 9999; + nAmp = (nAmp << 1) + nBit; + } + if (nAmp < (1 << (nSize - 1))) + nAmp -= (1 << nSize) - 1; + return nAmp; + } + + int DCTStream::ReadBit() + { + if (m_nInputBits == 0) + { + int nFirstChar = 0; + if ((nFirstChar = m_pStream->GetChar()) == EOF) + return EOF; + if (nFirstChar == 0xff) + { + int nSecondChar = 0; + do { + nSecondChar = m_pStream->GetChar(); + } while (nSecondChar == 0xff); + if (nSecondChar != 0x00) + { + // TO DO: Error "Bad DCT data: missing 00 after ff" + return EOF; + } + } + m_nInputBuffer = nFirstChar; + m_nInputBits = 8; + } + int nBit = (m_nInputBuffer >> (m_nInputBits - 1)) & 1; + --m_nInputBits; + return nBit; + } + + bool DCTStream::ReadHeader() + { + // Читаем заголовок + bool bDoScan = false; + while (!bDoScan) + { + int nChar = ReadMarker(); + switch (nChar) + { + case 0xc0: // SOF0 (sequential) + case 0xc1: // SOF1 (extended sequential) + if (!ReadBaselineSOF()) + { + return false; + } + break; + case 0xc2: // SOF2 (progressive) + if (!ReadProgressiveSOF()) + { + return false; + } + break; + case 0xc4: // DHT + if (!ReadHuffmanTables()) + { + return false; + } + break; + case 0xd8: // SOI + break; + case 0xd9: // EOI + return false; + case 0xda: // SOS + if (!ReadScanInfo()) + { + return false; + } + bDoScan = true; + break; + case 0xdb: // DQT + if (!ReadQuantTables()) + { + return false; + } + break; + case 0xdd: // DRI + if (!ReadRestartInterval()) + { + return false; + } + break; + case 0xe0: // APP0 + if (!ReadJFIFMarker()) + { + return false; + } + break; + case 0xee: // APP14 + if (!ReadAdobeMarker()) + { + return false; + } + break; + case EOF: + // TO DO : Error "Bad DCT header" + return false; + default: + // Пропускам маркеры типа: APPn, COM и т.д. + if (nChar >= 0xe0) + { + int nCount = Read16() - 2; + for (int nIndex = 0; nIndex < nCount; ++nIndex) + { + m_pStream->GetChar(); + } + } + else + { + // TO DO: Error "Unknown DCT marker" + return false; + } + break; + } + } + + return true; + } + + bool DCTStream::ReadBaselineSOF() + { + int nLength = Read16(); + int nPrecision = m_pStream->GetChar(); + m_nHeight = Read16(); + m_nWidth = Read16(); + m_nComponentsCount = m_pStream->GetChar(); + if (m_nComponentsCount <= 0 || m_nComponentsCount > 4) + { + // TO DO: Error "Bad number of components in DCT stream" + m_nComponentsCount = 0; + return false; + } + if (nPrecision != 8) + { + // TO DO: Error "Bad DCT precision" + return false; + } + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + m_arrCompInfo[nIndex].nID = m_pStream->GetChar(); + int nChar = m_pStream->GetChar(); + m_arrCompInfo[nIndex].nXResolution = (nChar >> 4) & 0x0f; + m_arrCompInfo[nIndex].nYResolution = nChar & 0x0f; + m_arrCompInfo[nIndex].nQuantTableNum = m_pStream->GetChar(); + } + m_bProgressive = false; + return true; + } + + bool DCTStream::ReadProgressiveSOF() + { + int nLength = Read16(); + int ReadProgressiveSOF = m_pStream->GetChar(); + m_nHeight = Read16(); + m_nWidth = Read16(); + m_nComponentsCount = m_pStream->GetChar(); + + if (m_nComponentsCount <= 0 || m_nComponentsCount > 4) + { + // TO DO: Error "Bad number of components in DCT stream" + m_nComponentsCount = 0; + return false; + } + if (ReadProgressiveSOF != 8) + { + // TO DO: Error "Bad DCT precision" + return false; + } + for (int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex) + { + m_arrCompInfo[nIndex].nID = m_pStream->GetChar(); + int nChar = m_pStream->GetChar(); + m_arrCompInfo[nIndex].nXResolution = (nChar >> 4) & 0x0f; + m_arrCompInfo[nIndex].nYResolution = nChar & 0x0f; + m_arrCompInfo[nIndex].nQuantTableNum = m_pStream->GetChar(); + } + m_bProgressive = true; + return true; + } + + bool DCTStream::ReadScanInfo() + { + int nComp = 0; + + int nLength = Read16() - 2; + m_oCurScanInfo.nComponentsCount = m_pStream->GetChar(); + if (m_oCurScanInfo.nComponentsCount <= 0 || m_oCurScanInfo.nComponentsCount > 4) + { + // TO DO: Error "Bad number of components in DCT stream" + m_oCurScanInfo.nComponentsCount = 0; + return false; + } + --nLength; + if (nLength != 2 * m_oCurScanInfo.nComponentsCount + 3) + { + // TO DO: Error "Bad DCT scan info block" + return false; + } + m_bInterleaved = m_oCurScanInfo.nComponentsCount == m_nComponentsCount; + + for (nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + m_oCurScanInfo.arrbComponent[nComp] = false; + } + for (int nIndex = 0; nIndex < m_oCurScanInfo.nComponentsCount; ++nIndex) + { + int nID = m_pStream->GetChar(); + // некоторые(некорректные) DCT потоки используют свои ID числа много раз, но как минимум + // в потоке компоненты идут по порядку, поэтому мы сначала проверяем m_arrCompInfo[i], чтобы + // решить данную пробему + if (nID == m_arrCompInfo[nIndex].nID) + { + nComp = nIndex; + } + else + { + for (nComp = 0; nComp < m_nComponentsCount; ++nComp) + { + if (nID == m_arrCompInfo[nComp].nID) + { + break; + } + } + if (nComp == m_nComponentsCount) + { + // TO DO: Error "Bad DCT component ID in scan info block" + return false; + } + } + m_oCurScanInfo.arrbComponent[nComp] = true; + int nChar = m_pStream->GetChar(); + m_oCurScanInfo.arrDCHuffTable[nComp] = (nChar >> 4) & 0x0f; + m_oCurScanInfo.arrACHuffTable[nComp] = nChar & 0x0f; + } + m_oCurScanInfo.nFirstKoef = m_pStream->GetChar(); + m_oCurScanInfo.nLastKoef = m_pStream->GetChar(); + int nChar = m_pStream->GetChar(); + m_oCurScanInfo.nApproxH = (nChar >> 4) & 0x0f; + m_oCurScanInfo.nApproxL = nChar & 0x0f; + return true; + } + + bool DCTStream::ReadQuantTables() + { + int nLength = Read16() - 2; + while (nLength > 0) + { + int nTableIndex = m_pStream->GetChar(); + int nPrecision = (nTableIndex >> 4) & 0x0f; + nTableIndex &= 0x0f; + if (nPrecision > 1 || nTableIndex >= 4) + { + // TO DO: Error "Bad DCT quantization table" + return false; + } + if (nTableIndex == m_nQuantTablesCount) + { + m_nQuantTablesCount = nTableIndex + 1; + } + for (int nIndex = 0; nIndex < 64; ++nIndex) + { + if (nPrecision) + { + m_arrQuantTables[nTableIndex][arrDCTZigZag[nIndex]] = Read16(); + } + else + { + m_arrQuantTables[nTableIndex][arrDCTZigZag[nIndex]] = m_pStream->GetChar(); + } + } + if (nPrecision) + { + nLength -= 129; + } + else + { + nLength -= 65; + } + } + return true; + } + + bool DCTStream::ReadHuffmanTables() + { + int nLength = Read16() - 2; + + while (nLength > 0) + { + int nTableIndex = m_pStream->GetChar(); + --nLength; + if ((nTableIndex & 0x0f) >= 4) + { + // TO DO: Error "Bad DCT Huffman table" + return false; + } + DCTHuffTable *pTable = NULL; + if (nTableIndex & 0x10) + { + nTableIndex &= 0x0f; + if (nTableIndex >= m_nACHuffTablesCount) + m_nACHuffTablesCount = nTableIndex + 1; + pTable = &m_arrACHuffTables[nTableIndex]; + } + else + { + nTableIndex &= 0x0f; + if (nTableIndex >= m_nDCHuffTablesCount) + m_nDCHuffTablesCount = nTableIndex + 1; + pTable = &m_arrDCHuffTables[nTableIndex]; + } + unsigned char nSymbol = 0; + unsigned short nCode = 0; + for (int nIndex = 1; nIndex <= 16; ++nIndex) + { + int nChar = m_pStream->GetChar(); + pTable->arrunFirstSymbol[nIndex] = nSymbol; + pTable->arrunFirstCode[nIndex] = nCode; + pTable->arrunCodesCount[nIndex] = nChar; + nSymbol += nChar; + nCode = (nCode + nChar) << 1; + } + nLength -= 16; + for (int nIndex = 0; nIndex < nSymbol; ++nIndex) + pTable->arrunSymbols[nIndex] = m_pStream->GetChar(); + nLength -= nSymbol; + } + return true; + } + + bool DCTStream::ReadRestartInterval() + { + int nLength = Read16(); + if (nLength != 4) + { + // TO DO: Error "Bad DCT restart interval" + return false; + } + m_nRestartInterval = Read16(); + return true; + } + + bool DCTStream::ReadJFIFMarker() + { + char sBuffer[5]; + + int nLength = Read16(); + nLength -= 2; + if (nLength >= 5) + { + for (int nIndex = 0; nIndex < 5; ++nIndex) + { + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad DCT APP0 marker" + return false; + } + sBuffer[nIndex] = nChar; + } + nLength -= 5; + if (!memcmp(sBuffer, "JFIF\0", 5)) + { + m_bJFIFMarker = true; + } + } + while (nLength > 0) + { + if (m_pStream->GetChar() == EOF) + { + // TO DO: Error "Bad DCT APP0 marker" + return false; + } + --nLength; + } + return true; + } + + bool DCTStream::ReadAdobeMarker() + { + char sBuffer[12]; + + int nLength = Read16(); + if (nLength < 14) + { + // TO DO: Error "Bad DCT Adobe APP14 marker" + return false; + } + for (int nIndex = 0; nIndex < 12; ++nIndex) + { + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad DCT Adobe APP14 marker" + return false; + } + sBuffer[nIndex] = nChar; + } + if (strncmp(sBuffer, "Adobe", 5)) + { + // TO DO: Error "Bad DCT Adobe APP14 marker" + return false; + } + m_nColorTransform = sBuffer[11]; + m_bAdobeMarker = true; + for (int nIndex = 14; nIndex < nLength; ++nIndex) + { + if (m_pStream->GetChar() == EOF) + { + // TO DO: Error "Bad DCT Adobe APP14 marker" + return false; + } + } + return true; + } + + bool DCTStream::ReadTrailer() + { + int nChar = ReadMarker(); + if (nChar != 0xd9) // EOI + { + // TO DO: Error "Bad DCT trailer" + return false; + } + return true; + } + + int DCTStream::ReadMarker() + { + int nChar = 0; + + do { + do { + nChar = m_pStream->GetChar(); + } while (nChar != 0xff && nChar != EOF); + + do { + nChar = m_pStream->GetChar(); + } while (nChar == 0xff); + } while (nChar == 0x00); + return nChar; + } + + int DCTStream::Read16() + { + int nFirstChar = 0, nSecondChar = 0; + + if ((nFirstChar = m_pStream->GetChar()) == EOF) + return EOF; + if ((nSecondChar = m_pStream->GetChar()) == EOF) + return EOF; + return (nFirstChar << 8) + nSecondChar; + } + + StringExt *DCTStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 2) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("<< >> /DCTDecode filter\n"); + return seResult; + } + + bool DCTStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + //--------------------------------------------------------------------------------------------------------------- + // FlateZlibStream + //--------------------------------------------------------------------------------------------------------------- + + FlateZlibStream::FlateZlibStream(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent) : + FilterStream(pStream) + { + if (1 != nPredictor) + { + m_pPredictor = new StreamPredictor(this, nPredictor, nWidth, nComponents, nBitsPerComponent); + if (!m_pPredictor->CheckValidate()) + { + delete m_pPredictor; + m_pPredictor = NULL; + } + } + else + { + m_pPredictor = NULL; + } + + memset(m_arrInBuffer, 0, flateZlibWindow); + memset(m_arrBuffer, 0, flateZlibWindow); + + m_oZStream.zalloc = Z_NULL; + m_oZStream.zfree = Z_NULL; + m_oZStream.opaque = Z_NULL; + + inflateInit(&m_oZStream); + } + + FlateZlibStream::~FlateZlibStream() + { + if (m_pPredictor) + { + delete m_pPredictor; + } + delete m_pStream; + + inflateEnd(&m_oZStream); + } + + void FlateZlibStream::Reset() + { + m_nBufferCurPos = 0; + m_nRemain = 0; + + m_bEndOfBlock = true; + m_bEOF = true; + + + inflateEnd(&m_oZStream); + + m_oZStream.zalloc = Z_NULL; + m_oZStream.zfree = Z_NULL; + m_oZStream.opaque = Z_NULL; + + inflateInit(&m_oZStream); + + m_pStream->Reset(); + + m_bEOF = false; + } + + int FlateZlibStream::GetChar() + { + if (m_pPredictor) + { + return m_pPredictor->GetChar(); + } + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + + int nChar = m_arrBuffer[m_nBufferCurPos]; + m_nBufferCurPos = (m_nBufferCurPos + 1) & flateZlibMask; + --m_nRemain; + return nChar; + } + + int FlateZlibStream::LookChar() + { + if (m_pPredictor) + { + return m_pPredictor->LookChar(); + } + + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + int nChar = m_arrBuffer[m_nBufferCurPos]; + return nChar; + } + + int FlateZlibStream::GetRawChar() + { + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + int nChar = m_arrBuffer[m_nBufferCurPos]; + m_nBufferCurPos = (m_nBufferCurPos + 1) & flateZlibMask; + --m_nRemain; + return nChar; + } + + StringExt *FlateZlibStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 3 || m_pPredictor) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("<< >> /FlateDecode filter\n"); + return seResult; + } + + bool FlateZlibStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + void FlateZlibStream::ReadSome() + { + unsigned int unInSize = flateZlibWindow; + if (m_bEndOfBlock) + { + memset(m_arrInBuffer, 0, flateZlibWindow); + int nChar = 0; + for (unsigned int unIndex = 0; unIndex < flateZlibWindow; unIndex++) + { + nChar = m_pStream->GetChar(); + + if (EOF == nChar) + { + unInSize = unIndex; + if (0 == unInSize) + { + m_nRemain = 0; + m_bEndOfBlock = m_bEOF = true; + return; + } + break; + } + + m_arrInBuffer[unIndex] = nChar; + } + + m_oZStream.avail_in = unInSize; + m_oZStream.next_in = (Bytef *)m_arrInBuffer; + + m_bEndOfBlock = false; + } + + m_oZStream.avail_out = flateZlibWindow; + m_oZStream.next_out = (Bytef *)m_arrBuffer; + + int nRet = inflate(&m_oZStream, Z_NO_FLUSH); + + if (nRet == Z_DATA_ERROR || nRet == Z_MEM_ERROR) + { + m_nRemain = 0; + m_bEOF = m_bEndOfBlock = true; + return; + } + + m_nRemain = flateZlibWindow - m_oZStream.avail_out; + + if (m_oZStream.avail_out != 0) + m_bEndOfBlock = true; + + return; + } + + + //--------------------------------------------------------------------------------------------------------------- + // FlateStream + //--------------------------------------------------------------------------------------------------------------- + + int FlateStream::m_arrCodeLenCodeMap[flateMaxCodeLenCodes] = + { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + }; + + FlateDecode FlateStream::m_arrLengthDecode[flateMaxLitCodes - 257] = + { + { 0, 3 }, + { 0, 4 }, + { 0, 5 }, + { 0, 6 }, + { 0, 7 }, + { 0, 8 }, + { 0, 9 }, + { 0, 10 }, + { 1, 11 }, + { 1, 13 }, + { 1, 15 }, + { 1, 17 }, + { 2, 19 }, + { 2, 23 }, + { 2, 27 }, + { 2, 31 }, + { 3, 35 }, + { 3, 43 }, + { 3, 51 }, + { 3, 59 }, + { 4, 67 }, + { 4, 83 }, + { 4, 99 }, + { 4, 115 }, + { 5, 131 }, + { 5, 163 }, + { 5, 195 }, + { 5, 227 }, + { 0, 258 }, + { 0, 258 }, + { 0, 258 } + }; + + FlateDecode FlateStream::m_arrDistanceDecode[flateMaxDistCodes] = + { + { 0, 1 }, + { 0, 2 }, + { 0, 3 }, + { 0, 4 }, + { 1, 5 }, + { 1, 7 }, + { 2, 9 }, + { 2, 13 }, + { 3, 17 }, + { 3, 25 }, + { 4, 33 }, + { 4, 49 }, + { 5, 65 }, + { 5, 97 }, + { 6, 129 }, + { 6, 193 }, + { 7, 257 }, + { 7, 385 }, + { 8, 513 }, + { 8, 769 }, + { 9, 1025 }, + { 9, 1537 }, + { 10, 2049 }, + { 10, 3073 }, + { 11, 4097 }, + { 11, 6145 }, + { 12, 8193 }, + { 12, 12289 }, + { 13, 16385 }, + { 13, 24577 } + }; + + static FlateHuffmanCode c_arrFlateFixedLiteralCodeTableCodes[512] = + { + { 7, 0x0100 }, + { 8, 0x0050 }, + { 8, 0x0010 }, + { 8, 0x0118 }, + { 7, 0x0110 }, + { 8, 0x0070 }, + { 8, 0x0030 }, + { 9, 0x00c0 }, + { 7, 0x0108 }, + { 8, 0x0060 }, + { 8, 0x0020 }, + { 9, 0x00a0 }, + { 8, 0x0000 }, + { 8, 0x0080 }, + { 8, 0x0040 }, + { 9, 0x00e0 }, + { 7, 0x0104 }, + { 8, 0x0058 }, + { 8, 0x0018 }, + { 9, 0x0090 }, + { 7, 0x0114 }, + { 8, 0x0078 }, + { 8, 0x0038 }, + { 9, 0x00d0 }, + { 7, 0x010c }, + { 8, 0x0068 }, + { 8, 0x0028 }, + { 9, 0x00b0 }, + { 8, 0x0008 }, + { 8, 0x0088 }, + { 8, 0x0048 }, + { 9, 0x00f0 }, + { 7, 0x0102 }, + { 8, 0x0054 }, + { 8, 0x0014 }, + { 8, 0x011c }, + { 7, 0x0112 }, + { 8, 0x0074 }, + { 8, 0x0034 }, + { 9, 0x00c8 }, + { 7, 0x010a }, + { 8, 0x0064 }, + { 8, 0x0024 }, + { 9, 0x00a8 }, + { 8, 0x0004 }, + { 8, 0x0084 }, + { 8, 0x0044 }, + { 9, 0x00e8 }, + { 7, 0x0106 }, + { 8, 0x005c }, + { 8, 0x001c }, + { 9, 0x0098 }, + { 7, 0x0116 }, + { 8, 0x007c }, + { 8, 0x003c }, + { 9, 0x00d8 }, + { 7, 0x010e }, + { 8, 0x006c }, + { 8, 0x002c }, + { 9, 0x00b8 }, + { 8, 0x000c }, + { 8, 0x008c }, + { 8, 0x004c }, + { 9, 0x00f8 }, + { 7, 0x0101 }, + { 8, 0x0052 }, + { 8, 0x0012 }, + { 8, 0x011a }, + { 7, 0x0111 }, + { 8, 0x0072 }, + { 8, 0x0032 }, + { 9, 0x00c4 }, + { 7, 0x0109 }, + { 8, 0x0062 }, + { 8, 0x0022 }, + { 9, 0x00a4 }, + { 8, 0x0002 }, + { 8, 0x0082 }, + { 8, 0x0042 }, + { 9, 0x00e4 }, + { 7, 0x0105 }, + { 8, 0x005a }, + { 8, 0x001a }, + { 9, 0x0094 }, + { 7, 0x0115 }, + { 8, 0x007a }, + { 8, 0x003a }, + { 9, 0x00d4 }, + { 7, 0x010d }, + { 8, 0x006a }, + { 8, 0x002a }, + { 9, 0x00b4 }, + { 8, 0x000a }, + { 8, 0x008a }, + { 8, 0x004a }, + { 9, 0x00f4 }, + { 7, 0x0103 }, + { 8, 0x0056 }, + { 8, 0x0016 }, + { 8, 0x011e }, + { 7, 0x0113 }, + { 8, 0x0076 }, + { 8, 0x0036 }, + { 9, 0x00cc }, + { 7, 0x010b }, + { 8, 0x0066 }, + { 8, 0x0026 }, + { 9, 0x00ac }, + { 8, 0x0006 }, + { 8, 0x0086 }, + { 8, 0x0046 }, + { 9, 0x00ec }, + { 7, 0x0107 }, + { 8, 0x005e }, + { 8, 0x001e }, + { 9, 0x009c }, + { 7, 0x0117 }, + { 8, 0x007e }, + { 8, 0x003e }, + { 9, 0x00dc }, + { 7, 0x010f }, + { 8, 0x006e }, + { 8, 0x002e }, + { 9, 0x00bc }, + { 8, 0x000e }, + { 8, 0x008e }, + { 8, 0x004e }, + { 9, 0x00fc }, + { 7, 0x0100 }, + { 8, 0x0051 }, + { 8, 0x0011 }, + { 8, 0x0119 }, + { 7, 0x0110 }, + { 8, 0x0071 }, + { 8, 0x0031 }, + { 9, 0x00c2 }, + { 7, 0x0108 }, + { 8, 0x0061 }, + { 8, 0x0021 }, + { 9, 0x00a2 }, + { 8, 0x0001 }, + { 8, 0x0081 }, + { 8, 0x0041 }, + { 9, 0x00e2 }, + { 7, 0x0104 }, + { 8, 0x0059 }, + { 8, 0x0019 }, + { 9, 0x0092 }, + { 7, 0x0114 }, + { 8, 0x0079 }, + { 8, 0x0039 }, + { 9, 0x00d2 }, + { 7, 0x010c }, + { 8, 0x0069 }, + { 8, 0x0029 }, + { 9, 0x00b2 }, + { 8, 0x0009 }, + { 8, 0x0089 }, + { 8, 0x0049 }, + { 9, 0x00f2 }, + { 7, 0x0102 }, + { 8, 0x0055 }, + { 8, 0x0015 }, + { 8, 0x011d }, + { 7, 0x0112 }, + { 8, 0x0075 }, + { 8, 0x0035 }, + { 9, 0x00ca }, + { 7, 0x010a }, + { 8, 0x0065 }, + { 8, 0x0025 }, + { 9, 0x00aa }, + { 8, 0x0005 }, + { 8, 0x0085 }, + { 8, 0x0045 }, + { 9, 0x00ea }, + { 7, 0x0106 }, + { 8, 0x005d }, + { 8, 0x001d }, + { 9, 0x009a }, + { 7, 0x0116 }, + { 8, 0x007d }, + { 8, 0x003d }, + { 9, 0x00da }, + { 7, 0x010e }, + { 8, 0x006d }, + { 8, 0x002d }, + { 9, 0x00ba }, + { 8, 0x000d }, + { 8, 0x008d }, + { 8, 0x004d }, + { 9, 0x00fa }, + { 7, 0x0101 }, + { 8, 0x0053 }, + { 8, 0x0013 }, + { 8, 0x011b }, + { 7, 0x0111 }, + { 8, 0x0073 }, + { 8, 0x0033 }, + { 9, 0x00c6 }, + { 7, 0x0109 }, + { 8, 0x0063 }, + { 8, 0x0023 }, + { 9, 0x00a6 }, + { 8, 0x0003 }, + { 8, 0x0083 }, + { 8, 0x0043 }, + { 9, 0x00e6 }, + { 7, 0x0105 }, + { 8, 0x005b }, + { 8, 0x001b }, + { 9, 0x0096 }, + { 7, 0x0115 }, + { 8, 0x007b }, + { 8, 0x003b }, + { 9, 0x00d6 }, + { 7, 0x010d }, + { 8, 0x006b }, + { 8, 0x002b }, + { 9, 0x00b6 }, + { 8, 0x000b }, + { 8, 0x008b }, + { 8, 0x004b }, + { 9, 0x00f6 }, + { 7, 0x0103 }, + { 8, 0x0057 }, + { 8, 0x0017 }, + { 8, 0x011f }, + { 7, 0x0113 }, + { 8, 0x0077 }, + { 8, 0x0037 }, + { 9, 0x00ce }, + { 7, 0x010b }, + { 8, 0x0067 }, + { 8, 0x0027 }, + { 9, 0x00ae }, + { 8, 0x0007 }, + { 8, 0x0087 }, + { 8, 0x0047 }, + { 9, 0x00ee }, + { 7, 0x0107 }, + { 8, 0x005f }, + { 8, 0x001f }, + { 9, 0x009e }, + { 7, 0x0117 }, + { 8, 0x007f }, + { 8, 0x003f }, + { 9, 0x00de }, + { 7, 0x010f }, + { 8, 0x006f }, + { 8, 0x002f }, + { 9, 0x00be }, + { 8, 0x000f }, + { 8, 0x008f }, + { 8, 0x004f }, + { 9, 0x00fe }, + { 7, 0x0100 }, + { 8, 0x0050 }, + { 8, 0x0010 }, + { 8, 0x0118 }, + { 7, 0x0110 }, + { 8, 0x0070 }, + { 8, 0x0030 }, + { 9, 0x00c1 }, + { 7, 0x0108 }, + { 8, 0x0060 }, + { 8, 0x0020 }, + { 9, 0x00a1 }, + { 8, 0x0000 }, + { 8, 0x0080 }, + { 8, 0x0040 }, + { 9, 0x00e1 }, + { 7, 0x0104 }, + { 8, 0x0058 }, + { 8, 0x0018 }, + { 9, 0x0091 }, + { 7, 0x0114 }, + { 8, 0x0078 }, + { 8, 0x0038 }, + { 9, 0x00d1 }, + { 7, 0x010c }, + { 8, 0x0068 }, + { 8, 0x0028 }, + { 9, 0x00b1 }, + { 8, 0x0008 }, + { 8, 0x0088 }, + { 8, 0x0048 }, + { 9, 0x00f1 }, + { 7, 0x0102 }, + { 8, 0x0054 }, + { 8, 0x0014 }, + { 8, 0x011c }, + { 7, 0x0112 }, + { 8, 0x0074 }, + { 8, 0x0034 }, + { 9, 0x00c9 }, + { 7, 0x010a }, + { 8, 0x0064 }, + { 8, 0x0024 }, + { 9, 0x00a9 }, + { 8, 0x0004 }, + { 8, 0x0084 }, + { 8, 0x0044 }, + { 9, 0x00e9 }, + { 7, 0x0106 }, + { 8, 0x005c }, + { 8, 0x001c }, + { 9, 0x0099 }, + { 7, 0x0116 }, + { 8, 0x007c }, + { 8, 0x003c }, + { 9, 0x00d9 }, + { 7, 0x010e }, + { 8, 0x006c }, + { 8, 0x002c }, + { 9, 0x00b9 }, + { 8, 0x000c }, + { 8, 0x008c }, + { 8, 0x004c }, + { 9, 0x00f9 }, + { 7, 0x0101 }, + { 8, 0x0052 }, + { 8, 0x0012 }, + { 8, 0x011a }, + { 7, 0x0111 }, + { 8, 0x0072 }, + { 8, 0x0032 }, + { 9, 0x00c5 }, + { 7, 0x0109 }, + { 8, 0x0062 }, + { 8, 0x0022 }, + { 9, 0x00a5 }, + { 8, 0x0002 }, + { 8, 0x0082 }, + { 8, 0x0042 }, + { 9, 0x00e5 }, + { 7, 0x0105 }, + { 8, 0x005a }, + { 8, 0x001a }, + { 9, 0x0095 }, + { 7, 0x0115 }, + { 8, 0x007a }, + { 8, 0x003a }, + { 9, 0x00d5 }, + { 7, 0x010d }, + { 8, 0x006a }, + { 8, 0x002a }, + { 9, 0x00b5 }, + { 8, 0x000a }, + { 8, 0x008a }, + { 8, 0x004a }, + { 9, 0x00f5 }, + { 7, 0x0103 }, + { 8, 0x0056 }, + { 8, 0x0016 }, + { 8, 0x011e }, + { 7, 0x0113 }, + { 8, 0x0076 }, + { 8, 0x0036 }, + { 9, 0x00cd }, + { 7, 0x010b }, + { 8, 0x0066 }, + { 8, 0x0026 }, + { 9, 0x00ad }, + { 8, 0x0006 }, + { 8, 0x0086 }, + { 8, 0x0046 }, + { 9, 0x00ed }, + { 7, 0x0107 }, + { 8, 0x005e }, + { 8, 0x001e }, + { 9, 0x009d }, + { 7, 0x0117 }, + { 8, 0x007e }, + { 8, 0x003e }, + { 9, 0x00dd }, + { 7, 0x010f }, + { 8, 0x006e }, + { 8, 0x002e }, + { 9, 0x00bd }, + { 8, 0x000e }, + { 8, 0x008e }, + { 8, 0x004e }, + { 9, 0x00fd }, + { 7, 0x0100 }, + { 8, 0x0051 }, + { 8, 0x0011 }, + { 8, 0x0119 }, + { 7, 0x0110 }, + { 8, 0x0071 }, + { 8, 0x0031 }, + { 9, 0x00c3 }, + { 7, 0x0108 }, + { 8, 0x0061 }, + { 8, 0x0021 }, + { 9, 0x00a3 }, + { 8, 0x0001 }, + { 8, 0x0081 }, + { 8, 0x0041 }, + { 9, 0x00e3 }, + { 7, 0x0104 }, + { 8, 0x0059 }, + { 8, 0x0019 }, + { 9, 0x0093 }, + { 7, 0x0114 }, + { 8, 0x0079 }, + { 8, 0x0039 }, + { 9, 0x00d3 }, + { 7, 0x010c }, + { 8, 0x0069 }, + { 8, 0x0029 }, + { 9, 0x00b3 }, + { 8, 0x0009 }, + { 8, 0x0089 }, + { 8, 0x0049 }, + { 9, 0x00f3 }, + { 7, 0x0102 }, + { 8, 0x0055 }, + { 8, 0x0015 }, + { 8, 0x011d }, + { 7, 0x0112 }, + { 8, 0x0075 }, + { 8, 0x0035 }, + { 9, 0x00cb }, + { 7, 0x010a }, + { 8, 0x0065 }, + { 8, 0x0025 }, + { 9, 0x00ab }, + { 8, 0x0005 }, + { 8, 0x0085 }, + { 8, 0x0045 }, + { 9, 0x00eb }, + { 7, 0x0106 }, + { 8, 0x005d }, + { 8, 0x001d }, + { 9, 0x009b }, + { 7, 0x0116 }, + { 8, 0x007d }, + { 8, 0x003d }, + { 9, 0x00db }, + { 7, 0x010e }, + { 8, 0x006d }, + { 8, 0x002d }, + { 9, 0x00bb }, + { 8, 0x000d }, + { 8, 0x008d }, + { 8, 0x004d }, + { 9, 0x00fb }, + { 7, 0x0101 }, + { 8, 0x0053 }, + { 8, 0x0013 }, + { 8, 0x011b }, + { 7, 0x0111 }, + { 8, 0x0073 }, + { 8, 0x0033 }, + { 9, 0x00c7 }, + { 7, 0x0109 }, + { 8, 0x0063 }, + { 8, 0x0023 }, + { 9, 0x00a7 }, + { 8, 0x0003 }, + { 8, 0x0083 }, + { 8, 0x0043 }, + { 9, 0x00e7 }, + { 7, 0x0105 }, + { 8, 0x005b }, + { 8, 0x001b }, + { 9, 0x0097 }, + { 7, 0x0115 }, + { 8, 0x007b }, + { 8, 0x003b }, + { 9, 0x00d7 }, + { 7, 0x010d }, + { 8, 0x006b }, + { 8, 0x002b }, + { 9, 0x00b7 }, + { 8, 0x000b }, + { 8, 0x008b }, + { 8, 0x004b }, + { 9, 0x00f7 }, + { 7, 0x0103 }, + { 8, 0x0057 }, + { 8, 0x0017 }, + { 8, 0x011f }, + { 7, 0x0113 }, + { 8, 0x0077 }, + { 8, 0x0037 }, + { 9, 0x00cf }, + { 7, 0x010b }, + { 8, 0x0067 }, + { 8, 0x0027 }, + { 9, 0x00af }, + { 8, 0x0007 }, + { 8, 0x0087 }, + { 8, 0x0047 }, + { 9, 0x00ef }, + { 7, 0x0107 }, + { 8, 0x005f }, + { 8, 0x001f }, + { 9, 0x009f }, + { 7, 0x0117 }, + { 8, 0x007f }, + { 8, 0x003f }, + { 9, 0x00df }, + { 7, 0x010f }, + { 8, 0x006f }, + { 8, 0x002f }, + { 9, 0x00bf }, + { 8, 0x000f }, + { 8, 0x008f }, + { 8, 0x004f }, + { 9, 0x00ff } + }; + + FlateHuffmanTable FlateStream::m_oFixedLiteralCodeTable = + { + c_arrFlateFixedLiteralCodeTableCodes, 9 + }; + + static FlateHuffmanCode c_arrFlateFixedDistanceCodeTableCodes[32] = + { + { 5, 0x0000 }, + { 5, 0x0010 }, + { 5, 0x0008 }, + { 5, 0x0018 }, + { 5, 0x0004 }, + { 5, 0x0014 }, + { 5, 0x000c }, + { 5, 0x001c }, + { 5, 0x0002 }, + { 5, 0x0012 }, + { 5, 0x000a }, + { 5, 0x001a }, + { 5, 0x0006 }, + { 5, 0x0016 }, + { 5, 0x000e }, + { 0, 0x0000 }, + { 5, 0x0001 }, + { 5, 0x0011 }, + { 5, 0x0009 }, + { 5, 0x0019 }, + { 5, 0x0005 }, + { 5, 0x0015 }, + { 5, 0x000d }, + { 5, 0x001d }, + { 5, 0x0003 }, + { 5, 0x0013 }, + { 5, 0x000b }, + { 5, 0x001b }, + { 5, 0x0007 }, + { 5, 0x0017 }, + { 5, 0x000f }, + { 0, 0x0000 } + }; + + FlateHuffmanTable FlateStream::m_oFixedDistanceCodeTable = + { + c_arrFlateFixedDistanceCodeTableCodes, 5 + }; + + FlateStream::FlateStream(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent) : + FilterStream(pStream) + { + if (1 != nPredictor) + { + m_pPredictor = new StreamPredictor(this, nPredictor, nWidth, nComponents, nBitsPerComponent); + if (!m_pPredictor->CheckValidate()) + { + delete m_pPredictor; + m_pPredictor = NULL; + } + } + else + { + m_pPredictor = NULL; + } + m_oLiteratCodeTable.pCodes = NULL; + m_oDistanceCodeTable.pCodes = NULL; + + memset(m_arrBuffer, 0, flateWindow); + } + + FlateStream::~FlateStream() + { + if (m_oLiteratCodeTable.pCodes != m_oFixedLiteralCodeTable.pCodes) + { + MemUtilsFree(m_oLiteratCodeTable.pCodes); + } + if (m_oDistanceCodeTable.pCodes != m_oFixedDistanceCodeTable.pCodes) + { + MemUtilsFree(m_oDistanceCodeTable.pCodes); + } + if (m_pPredictor) + { + delete m_pPredictor; + } + delete m_pStream; + } + + void FlateStream::Reset() + { + m_nBufferCurPos = 0; + m_nRemain = 0; + m_nCodeBuffer = 0; + m_nCodeSize = 0; + m_bCompressedBlock = false; + m_bEndOfBlock = true; + m_bEOF = true; + + m_pStream->Reset(); + + m_bEndOfBlock = m_bEOF = true; + + //читаем заголовок + int nCmf = m_pStream->GetChar(); + int nFlag = m_pStream->GetChar(); + if (nCmf == EOF || nFlag == EOF) + return; + if ((nCmf & 0x0f) != 0x08) + { + //TO DO: Error "Unknown compression method in flate stream" + return; + } + if ((((nCmf << 8) + nFlag) % 31) != 0) + { + // TO DO: Error "Bad FCHECK in flate stream" + return; + } + if (nFlag & 0x20) + { + //TO DO: Error "FDICT bit set in flate stream" + return; + } + + m_bEOF = false; + } + + int FlateStream::GetChar() + { + if (m_pPredictor) + { + return m_pPredictor->GetChar(); + } + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + + int nChar = m_arrBuffer[m_nBufferCurPos]; + m_nBufferCurPos = (m_nBufferCurPos + 1) & flateMask; + --m_nRemain; + return nChar; + } + + int FlateStream::LookChar() + { + if (m_pPredictor) + { + return m_pPredictor->LookChar(); + } + + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + int nChar = m_arrBuffer[m_nBufferCurPos]; + return nChar; + } + + int FlateStream::GetRawChar() + { + while (m_nRemain == 0) + { + if (m_bEndOfBlock && m_bEOF) + return EOF; + ReadSome(); + } + int nChar = m_arrBuffer[m_nBufferCurPos]; + m_nBufferCurPos = (m_nBufferCurPos + 1) & flateMask; + --m_nRemain; + return nChar; + } + + StringExt *FlateStream::GetPSFilter(int nPSLevel, char *sIndent) + { + StringExt *seResult; + + if (nPSLevel < 3 || m_pPredictor) + { + return NULL; + } + if (!(seResult = m_pStream->GetPSFilter(nPSLevel, sIndent))) + { + return NULL; + } + seResult->Append(sIndent)->Append("<< >> /FlateDecode filter\n"); + return seResult; + } + + bool FlateStream::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + void FlateStream::ReadSome() + { + int nFirst = 0, nSecond = 0; + + if (m_bEndOfBlock) + { + if (!StartBlock()) + return; + } + + if (m_bCompressedBlock) + { + int nHuffCode = 0; + if ((nHuffCode = GetHuffmanCodeWord(&m_oLiteratCodeTable)) == EOF) + { + // TO DO: Error "Unexpected end of file in flate stream" + m_bEndOfBlock = m_bEOF = true; + m_nRemain = 0; + } + if (nHuffCode < 256) + { + m_arrBuffer[m_nBufferCurPos] = nHuffCode; + m_nRemain = 1; + } + else if (nHuffCode == 256) + { + m_bEndOfBlock = true; + m_nRemain = 0; + } + else + { + nHuffCode -= 257; + int nExtraCode = m_arrLengthDecode[nHuffCode].nExtraBitsCount; + if (nExtraCode > 0 && (nExtraCode = GetCodeWord(nExtraCode)) == EOF) + { + // TO DO: Error "Unexpected end of file in flate stream" + m_bEndOfBlock = m_bEOF = true; + m_nRemain = 0; + } + int nLen = m_arrLengthDecode[nHuffCode].nFirst + nExtraCode; + if ((nHuffCode = GetHuffmanCodeWord(&m_oDistanceCodeTable)) == EOF) + { + // TO DO: Error "Unexpected end of file in flate stream" + m_bEndOfBlock = m_bEOF = true; + m_nRemain = 0; + } + nExtraCode = m_arrDistanceDecode[nHuffCode].nExtraBitsCount; + if (nExtraCode > 0 && (nExtraCode = GetCodeWord(nExtraCode)) == EOF) + { + // TO DO: Error "Unexpected end of file in flate stream" + m_bEndOfBlock = m_bEOF = true; + m_nRemain = 0; + } + int nDistance = m_arrDistanceDecode[nHuffCode].nFirst + nExtraCode; + nFirst = m_nBufferCurPos; + nSecond = (m_nBufferCurPos - nDistance) & flateMask; + for (int nK = 0; nK < nLen; ++nK) + { + m_arrBuffer[nFirst] = m_arrBuffer[nSecond]; + nFirst = (nFirst + 1) & flateMask; + nSecond = (nSecond + 1) & flateMask; + } + m_nRemain = nLen; + } + } + else + { + int nLen = (m_nUncompBlockLen < flateWindow) ? m_nUncompBlockLen : flateWindow; + for (nFirst = 0, nSecond = m_nBufferCurPos; nFirst < nLen; ++nFirst, nSecond = (nSecond + 1) & flateMask) + { + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + m_bEndOfBlock = m_bEOF = true; + break; + } + m_arrBuffer[nSecond] = nChar & 0xff; + } + m_nRemain = nFirst; + m_nUncompBlockLen -= nLen; + if (m_nUncompBlockLen == 0) + m_bEndOfBlock = true; + } + return; + } + + bool FlateStream::StartBlock() + { + // Освобождаем таблицы кодов из предыдущего блока + if (m_oLiteratCodeTable.pCodes != m_oFixedLiteralCodeTable.pCodes) + { + MemUtilsFree(m_oLiteratCodeTable.pCodes); + } + m_oLiteratCodeTable.pCodes = NULL; + if (m_oDistanceCodeTable.pCodes != m_oFixedDistanceCodeTable.pCodes) + { + MemUtilsFree(m_oDistanceCodeTable.pCodes); + } + m_oDistanceCodeTable.pCodes = NULL; + + // Считываем заголовок блока + int nBlockHeader = GetCodeWord(3); + if (nBlockHeader & 1) + m_bEOF = true; + + nBlockHeader >>= 1; + + if (nBlockHeader == 0) // uncompressed block + { + m_bCompressedBlock = false; + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + m_nUncompBlockLen = nChar & 0xff; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + m_nUncompBlockLen |= (nChar & 0xff) << 8; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + int nCheck = nChar & 0xff; + if ((nChar = m_pStream->GetChar()) == EOF) + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + nCheck |= (nChar & 0xff) << 8; + if (nCheck != (~m_nUncompBlockLen & 0xffff)) + { + // TO DO: Error "Bad uncompressed block length in flate stream" + } + m_nCodeBuffer = 0; + m_nCodeSize = 0; + } + else if (nBlockHeader == 1) // compressed block with fixed codes + { + m_bCompressedBlock = true; + LoadFixedCodes(); + } + else if (nBlockHeader == 2) // compressed block with dynamic codes + { + m_bCompressedBlock = true; + if (!ReadDynamicCodes()) + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + } + else // unknown block type + { + // TO DO: Error "Bad block header in flate stream" + m_bEndOfBlock = m_bEOF = true; + return false; + } + + m_bEndOfBlock = false; + return true; + } + + void FlateStream::LoadFixedCodes() + { + m_oLiteratCodeTable.pCodes = m_oFixedLiteralCodeTable.pCodes; + m_oLiteratCodeTable.nMaxLen = m_oFixedLiteralCodeTable.nMaxLen; + m_oDistanceCodeTable.pCodes = m_oFixedDistanceCodeTable.pCodes; + m_oDistanceCodeTable.nMaxLen = m_oFixedDistanceCodeTable.nMaxLen; + } + + bool FlateStream::ReadDynamicCodes() + { + int arrCodeLenCodeLengths[flateMaxCodeLenCodes]; + FlateHuffmanTable oCodeLenCodeTable; + + oCodeLenCodeTable.pCodes = NULL; + + // Lengths + int nNumLiteralCodes = 0; + if ((nNumLiteralCodes = GetCodeWord(5)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nNumLiteralCodes += 257; + + int nNumDistanceCodes = 0; + if ((nNumDistanceCodes = GetCodeWord(5)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nNumDistanceCodes += 1; + + int nNumCodeLenCodes = 0; + if ((nNumCodeLenCodes = GetCodeWord(4)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nNumCodeLenCodes += 4; + + if (nNumLiteralCodes > flateMaxLitCodes || nNumDistanceCodes > flateMaxDistCodes || nNumCodeLenCodes > flateMaxCodeLenCodes) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + + // code length code table + for (int nI = 0; nI < flateMaxCodeLenCodes; ++nI) + { + arrCodeLenCodeLengths[nI] = 0; + } + for (int nI = 0; nI < nNumCodeLenCodes; ++nI) + { + if ((arrCodeLenCodeLengths[m_arrCodeLenCodeMap[nI]] = GetCodeWord(3)) == -1) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + } + ConvertHuffmanCodes(arrCodeLenCodeLengths, flateMaxCodeLenCodes, &oCodeLenCodeTable); + + // Literal, distance code tables + int nLen = 0; + int nRepeat = 0; + int nIndex = 0; + int nCurCode = 0; + while (nIndex < nNumLiteralCodes + nNumDistanceCodes) + { + if ((nCurCode = GetHuffmanCodeWord(&oCodeLenCodeTable)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + if (nCurCode == 16) + { + if ((nRepeat = GetCodeWord(2)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nRepeat += 3; + if (nIndex + nRepeat > nNumLiteralCodes + nNumDistanceCodes) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + for (; nRepeat > 0; --nRepeat) + { + m_arrCodeLengths[nIndex++] = nLen; + } + } + else if (nCurCode == 17) + { + if ((nRepeat = GetCodeWord(3)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nRepeat += 3; + if (nIndex + nRepeat > nNumLiteralCodes + nNumDistanceCodes) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nLen = 0; + for (; nRepeat > 0; --nRepeat) + { + m_arrCodeLengths[nIndex++] = 0; + } + } + else if (nCurCode == 18) + { + if ((nRepeat = GetCodeWord(7)) == EOF) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nRepeat += 11; + if (nIndex + nRepeat > nNumLiteralCodes + nNumDistanceCodes) + { + // TO DO: Error "Bad dynamic code table in flate stream" + MemUtilsFree(oCodeLenCodeTable.pCodes); + return false; + } + nLen = 0; + for (; nRepeat > 0; --nRepeat) + { + m_arrCodeLengths[nIndex++] = 0; + } + } + else + { + m_arrCodeLengths[nIndex++] = nLen = nCurCode; + } + } + ConvertHuffmanCodes(m_arrCodeLengths, nNumLiteralCodes, &m_oLiteratCodeTable); + ConvertHuffmanCodes(m_arrCodeLengths + nNumLiteralCodes, nNumDistanceCodes, &m_oDistanceCodeTable); + + MemUtilsFree(oCodeLenCodeTable.pCodes); + return true; + } + + // Конвертируем массив , в таблицу Хаффмана(сортируя по значениям) + void FlateStream::ConvertHuffmanCodes(int *pLengths, int nCount, FlateHuffmanTable *pTable) + { + // Ищем макимальный элемент + pTable->nMaxLen = 0; + for (int nValue = 0; nValue < nCount; ++nValue) + { + if (pLengths[nValue] > pTable->nMaxLen) + { + pTable->nMaxLen = pLengths[nValue]; + } + } + + // Выделяем место для таблицы + int nTableSize = 1 << pTable->nMaxLen; + pTable->pCodes = (FlateHuffmanCode *)MemUtilsMallocArray(nTableSize, sizeof(FlateHuffmanCode)); + + // Очищаем таблицу + for (int nIndex = 0; nIndex < nTableSize; ++nIndex) + { + pTable->pCodes[nIndex].nLength = 0; + pTable->pCodes[nIndex].nValue = 0; + } + + // Заполняем таблицу + int nLen = 0, nSkip = 0, nCode = 0; + for (nLen = 1, nCode = 0, nSkip = 2; nLen <= pTable->nMaxLen; ++nLen, nCode <<= 1, nSkip <<= 1) + { + for (int nValue = 0; nValue < nCount; ++nValue) + { + if (pLengths[nValue] == nLen) + { + // bit-reverse code + int nReverseCode = 0; + int nTemp = nCode; + for (int nIndex = 0; nIndex < nLen; ++nIndex) + { + nReverseCode = (nReverseCode << 1) | (nTemp & 1); + nTemp >>= 1; + } + + for (int nIndex = nReverseCode; nIndex < nTableSize; nIndex += nSkip) + { + pTable->pCodes[nIndex].nLength = (unsigned short)nLen; + pTable->pCodes[nIndex].nValue = (unsigned short)nValue; + } + ++nCode; + } + } + } + } + + int FlateStream::GetHuffmanCodeWord(FlateHuffmanTable *pTable) + { + while (m_nCodeSize < pTable->nMaxLen) + { + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + break; + } + m_nCodeBuffer |= (nChar & 0xff) << m_nCodeSize; + m_nCodeSize += 8; + } + FlateHuffmanCode *pHuffCode = &pTable->pCodes[m_nCodeBuffer & ((1 << pTable->nMaxLen) - 1)]; + if (m_nCodeSize == 0 || m_nCodeSize < pHuffCode->nLength || pHuffCode->nLength == 0) + { + return EOF; + } + m_nCodeBuffer >>= pHuffCode->nLength; + m_nCodeSize -= pHuffCode->nLength; + return (int)pHuffCode->nValue; + } + + int FlateStream::GetCodeWord(int nBits) + { + int nChar = 0; + while (m_nCodeSize < nBits) + { + if ((nChar = m_pStream->GetChar()) == EOF) + return EOF; + m_nCodeBuffer |= (nChar & 0xff) << m_nCodeSize; + m_nCodeSize += 8; + } + nChar = m_nCodeBuffer & ((1 << nBits) - 1); + m_nCodeBuffer >>= nBits; + m_nCodeSize -= nBits; + return nChar; + } + + //--------------------------------------------------------------------------------------------------------------- + // EOFStream + //--------------------------------------------------------------------------------------------------------------- + + EOFStream::EOFStream(Stream *pStream) : + FilterStream(pStream) + { + } + + EOFStream::~EOFStream() + { + delete m_pStream; + } + + //--------------------------------------------------------------------------------------------------------------- + // FixedLengthEncoder + //--------------------------------------------------------------------------------------------------------------- + + FixedLengthEncoder::FixedLengthEncoder(Stream *pStream, int nLength) : + FilterStream(pStream) + { + m_nLength = nLength; + m_nCount = 0; + } + + FixedLengthEncoder::~FixedLengthEncoder() + { + if (m_pStream->IsEncoder()) + delete m_pStream; + } + + void FixedLengthEncoder::Reset() + { + m_pStream->Reset(); + m_nCount = 0; + } + + int FixedLengthEncoder::GetChar() + { + if (m_nLength >= 0 && m_nCount >= m_nLength) + return EOF; + ++m_nCount; + return m_pStream->GetChar(); + } + + int FixedLengthEncoder::LookChar() + { + if (m_nLength >= 0 && m_nCount >= m_nLength) + return EOF; + return m_pStream->GetChar(); + } + + bool FixedLengthEncoder::IsBinary(bool bLast) + { + return m_pStream->IsBinary(true); + } + + //--------------------------------------------------------------------------------------------------------------- + // ASCIIHexEncoder + //--------------------------------------------------------------------------------------------------------------- + + ASCIIHexEncoder::ASCIIHexEncoder(Stream *pStream) : + FilterStream(pStream) + { + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_nLineLength = 0; + m_bEOF = false; + } + + ASCIIHexEncoder::~ASCIIHexEncoder() + { + if (m_pStream->IsEncoder()) + delete m_pStream; + } + + void ASCIIHexEncoder::Reset() + { + m_pStream->Reset(); + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_nLineLength = 0; + m_bEOF = false; + } + + bool ASCIIHexEncoder::FillBuffer() + { + static char *c_sHex = "0123456789abcdef"; + + if (m_bEOF) + { + return false; + } + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + + int nChar = 0; + if ((nChar = m_pStream->GetChar()) == EOF) + { + *m_pBufferEnd++ = '>'; + m_bEOF = true; + } + else + { + if (m_nLineLength >= 64) + { + *m_pBufferEnd++ = '\n'; + m_nLineLength = 0; + } + *m_pBufferEnd++ = c_sHex[(nChar >> 4) & 0x0f]; + *m_pBufferEnd++ = c_sHex[nChar & 0x0f]; + m_nLineLength += 2; + } + return true; + } + + //--------------------------------------------------------------------------------------------------------------- + // ASCII85Encoder + //--------------------------------------------------------------------------------------------------------------- + + ASCII85Encoder::ASCII85Encoder(Stream *pStream) : + FilterStream(pStream) + { + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_nLineLength = 0; + m_bEOF = false; + } + + ASCII85Encoder::~ASCII85Encoder() + { + if (m_pStream->IsEncoder()) + delete m_pStream; + } + + void ASCII85Encoder::Reset() + { + m_pStream->Reset(); + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + m_nLineLength = 0; + m_bEOF = false; + } + + bool ASCII85Encoder::FillBuffer() + { + unsigned long unTemp = 0; + char arrB[5]; + int arrC[4] ={ 0, 0, 0, 0 }; + int nLen = 0; + + if (m_bEOF) + { + return false; + } + arrC[0] = m_pStream->GetChar(); + arrC[1] = m_pStream->GetChar(); + arrC[2] = m_pStream->GetChar(); + arrC[3] = m_pStream->GetChar(); + m_pBufferPointer = m_pBufferEnd = m_sBuffer; + if (arrC[3] == EOF) + { + if (arrC[0] == EOF) + { + nLen = 0; + unTemp = 0; + } + else + { + if (arrC[1] == EOF) + { + nLen = 1; + unTemp = arrC[0] << 24; + } + else if (arrC[2] == EOF) + { + nLen = 2; + unTemp = (arrC[0] << 24) | (arrC[1] << 16); + } + else + { + nLen = 3; + unTemp = (arrC[0] << 24) | (arrC[1] << 16) | (arrC[2] << 8); + } + for (int nIndex = 4; nIndex >= 0; --nIndex) + { + arrB[nIndex] = (char)(unTemp % 85 + 0x21); + unTemp /= 85; + } + for (int nIndex = 0; nIndex <= nLen; ++nIndex) + { + *m_pBufferEnd++ = arrB[nIndex]; + if (++m_nLineLength == 65) + { + *m_pBufferEnd++ = '\n'; + m_nLineLength = 0; + } + } + } + *m_pBufferEnd++ = '~'; + *m_pBufferEnd++ = '>'; + m_bEOF = true; + } + else + { + unTemp = (arrC[0] << 24) | (arrC[1] << 16) | (arrC[2] << 8) | arrC[3]; + if (unTemp == 0) + { + *m_pBufferEnd++ = 'z'; + if (++m_nLineLength == 65) + { + *m_pBufferEnd++ = '\n'; + m_nLineLength = 0; + } + } + else + { + for (int nIndex = 4; nIndex >= 0; --nIndex) + { + arrB[nIndex] = (char)(unTemp % 85 + 0x21); + unTemp /= 85; + } + for (int nIndex = 0; nIndex <= 4; ++nIndex) + { + *m_pBufferEnd++ = arrB[nIndex]; + if (++m_nLineLength == 65) + { + *m_pBufferEnd++ = '\n'; + m_nLineLength = 0; + } + } + } + } + return true; + } + + //--------------------------------------------------------------------------------------------------------------- + // RunLengthEncoder + //--------------------------------------------------------------------------------------------------------------- + + RunLengthEncoder::RunLengthEncoder(Stream *pStream) : + FilterStream(pStream) + { + m_pBufferPointer = m_pBufferEnd = m_pNextEnd = m_sBuffer; + m_bEOF = false; + } + + RunLengthEncoder::~RunLengthEncoder() + { + if (m_pStream->IsEncoder()) + delete m_pStream; + } + + void RunLengthEncoder::Reset() + { + m_pStream->Reset(); + m_pBufferPointer = m_pBufferEnd = m_pNextEnd = m_sBuffer; + m_bEOF = false; + } + + // + // После выполнения функции FillBuffer, m_sBuffer[] выглядит следующим образом: + // +-----+--------------+-----------------+-- + // + tag | ... data ... | next 0, 1, or 2 | + // +-----+--------------+-----------------+-- + // ^ ^ ^ + // m_pBufferPointer m_pBufferEnd m_pNextEnd + // + bool RunLengthEncoder::FillBuffer() + { + if (m_bEOF) + return false; + + // считываем два байта + int nChar1 = 0, nChar2 = 0; + if (m_pNextEnd < m_pBufferEnd + 1) + { + if ((nChar1 = m_pStream->GetChar()) == EOF) + { + m_bEOF = true; + return false; + } + } + else + { + nChar1 = m_pBufferEnd[0] & 0xff; + } + if (m_pNextEnd < m_pBufferEnd + 2) + { + if ((nChar2 = m_pStream->GetChar()) == EOF) + { + m_bEOF = true; + m_sBuffer[0] = 0; + m_sBuffer[1] = nChar1; + m_pBufferPointer = m_sBuffer; + m_pBufferEnd = &m_sBuffer[2]; + return true; + } + } + else + { + nChar2 = m_pBufferEnd[1] & 0xff; + } + + int nChar = 0; + if (nChar1 == nChar2) + { + int nLen = 2; + while (nLen < 128 && (nChar = m_pStream->GetChar()) == nChar1) + ++nLen; + m_sBuffer[0] = (char)(257 - nLen); + m_sBuffer[1] = nChar1; + m_pBufferEnd = &m_sBuffer[2]; + if (nChar == EOF) + { + m_bEOF = true; + } + else if (nLen < 128) + { + m_sBuffer[2] = nChar; + m_pNextEnd = &m_sBuffer[3]; + } + else + { + m_pNextEnd = m_pBufferEnd; + } + + + } + else + { + m_sBuffer[1] = nChar1; + m_sBuffer[2] = nChar2; + int nLen = 2; + while (nLen < 128) + { + if ((nChar = m_pStream->GetChar()) == EOF) + { + m_bEOF = true; + break; + } + ++nLen; + m_sBuffer[nLen] = nChar; + if (m_sBuffer[nLen] == m_sBuffer[nLen - 1]) + break; + } + if (m_sBuffer[nLen] == m_sBuffer[nLen - 1]) + { + m_sBuffer[0] = (char)(nLen - 2 - 1); + m_pBufferEnd = &m_sBuffer[nLen - 1]; + m_pNextEnd = &m_sBuffer[nLen + 1]; + } + else + { + m_sBuffer[0] = (char)(nLen - 1); + m_pBufferEnd = m_pNextEnd = &m_sBuffer[nLen + 1]; + } + } + m_pBufferPointer = m_sBuffer; + return true; + } +} \ No newline at end of file diff --git a/PdfReader/Src/Stream.h b/PdfReader/Src/Stream.h new file mode 100644 index 0000000000..f0fdfdf37b --- /dev/null +++ b/PdfReader/Src/Stream.h @@ -0,0 +1,1125 @@ +#ifndef _PDF_READER_STREAM_H +#define _PDF_READER_STREAM_H + +#include +#include "Object.h" + +#include "zlib.h" + +//#pragma comment(lib, "zlib.lib") + +namespace PdfReader +{ + class BaseStream; + + //------------------------------------------------------------------------ + + enum StreamType + { + strFile, + strASCIIHex, + strASCII85, + strLZW, + strRunLength, + strCCITTFax, + strDCT, + strFlate, + strJBIG2, + strJPX, + strWeird // internal-use stream types + }; + + enum StreamColorSpaceMode + { + streamCSNone, + streamCSDeviceGray, + streamCSDeviceRGB, + streamCSDeviceCMYK + }; + + //------------------------------------------------------------------------ + + enum CryptAlgorithm + { + cryptRC4, + cryptAES + }; + + //------------------------------------------------------------------------ + // Stream (основной класс) + //------------------------------------------------------------------------ + + class Stream + { + public: + + Stream(); + + virtual ~Stream(); + + // Счетчик ссылок. + int AddRef() + { + return ++m_nRef; + } + int Release() + { + return --m_nRef; + } + + // Тип потока. + virtual StreamType GetType() = 0; + + // Сбрасываем все параметры(к начальным). + virtual void Reset() = 0; + + // Закрываем поток. + virtual void Close(); + + // Передвигаемся к следующему символу в потоке. + virtual int GetChar() = 0; + + // Смотрим на следующий символ в потоке. + virtual int LookChar() = 0; + + // GetChar буз использования Predictor. + // Используется только в StreamPredictor. + virtual int GetRawChar(); + + // Следующая строка в потоке. + virtual char *GetLine(char *sBuffer, int nSize); + + // Текущая позиция в потоке. + virtual int GetPos() = 0; + + // Устанавливаем текущую позицию в потоке. Если nDirection - + // отрицательно, тогда позицию отсчитваем от конца потока, а + // если положительно, тогда от начала. + virtual void SetPos(unsigned int unPos, int nDirection = 0) = 0; + + // PostScript'ое название фильтра. + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + + // Может ли поток содержать непечатыемые символы? + virtual bool IsBinary(bool bLast = true) = 0; + + virtual BaseStream *GetBaseStream() = 0; + + // Поток после последнего декодирования (это может быть BaseStream + // или DecryptStream). + virtual Stream *GetUndecodedStream() = 0; + + // Словарь связанный с данным потоком. + virtual Dict *GetDict() = 0; + + // Encoding filter? + virtual bool IsEncoder() + { + return false; + } + + // Получить параметры изображения, определенного содержимым данного потока. + virtual void GetImageParams(int *pnBitsPerComponent, StreamColorSpaceMode *peCSMode) + { + } + + // Возвращется следующий поток из стека. + virtual Stream *GetNextStream() + { + return NULL; + } + + // Применяем фильтры к данному потоку, описанные в параметрах словаря. + // Возвращается новый поток. + Stream *AddFilters(Object *pDict); + + private: + + Stream *ApplyFilter(char *sName, Stream *pStream, Object *pParams); + + private: + + int m_nRef; // счетчик ссылок + + }; + + //------------------------------------------------------------------------ + // BaseStream + // + // Это основной класс для всех потоков и чтения из файла. + //------------------------------------------------------------------------ + + class BaseStream : public Stream + { + public: + + BaseStream(Object *pDict); + virtual ~BaseStream(); + virtual Stream *MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict) = 0; + virtual void SetPos(unsigned int unPos, int nDirection = 0) = 0; + virtual bool IsBinary(bool bLast = true) + { + return bLast; + } + virtual BaseStream *GetBaseStream() + { + return this; + } + virtual Stream *GetUndecodedStream() + { + return this; + } + virtual Dict *GetDict() + { + return m_pDict.GetDict(); + } + virtual StringExt *GetFileName() + { + return NULL; + } + + // Запрашиваем/устанавливаем позицию первого байта в потоке файла. + virtual unsigned int GetStartPos() = 0; + virtual void SetStartPos(int nDelta) = 0; + + private: + + Object m_pDict; + }; + + //------------------------------------------------------------------------ + // FilterStream + // + // Это основной класс для всех потоков, к которым примене фильтр. + //------------------------------------------------------------------------ + + class FilterStream : public Stream + { + public: + + FilterStream(Stream *pStream); + virtual ~FilterStream(); + virtual void Close(); + virtual int GetPos() + { + return m_pStream->GetPos(); + } + virtual void SetPos(unsigned int unPos, int nDirection = 0); + virtual BaseStream *GetBaseStream() + { + return m_pStream->GetBaseStream(); + } + virtual Stream *GetUndecodedStream() + { + return m_pStream->GetUndecodedStream(); + } + virtual Dict *GetDict() + { + return m_pStream->GetDict(); + } + virtual Stream *GetNextStream() + { + return m_pStream; + } + + protected: + + Stream *m_pStream; + }; + + //------------------------------------------------------------------------ + // ImageStream + //------------------------------------------------------------------------ + + class ImageStream + { + public: + + // Создаем Image object по картинке с заданными параметрами( тут имеются ввиду + // реальные параметры картинки, а не те что могут прийти в Predictor). + ImageStream(Stream *pStream, int nWidth, int nComponents, int nBitsPerComponent); + + ~ImageStream(); + + void Reset(); + + // Считываем следующий пиксел из потока. pPixel должно указывать на место достаточное, + // для хранения как минимум m_nComponentsPerPixel элементов. + bool GetPixel(unsigned char *pPixel); + + unsigned char *GetNextLine(); + + void SkipLine(); + + private: + + Stream *m_pStream; // Основной поток + int m_nWidth; // Количество пикселей в строке + int m_nComponentsPerPixel; // Количество компонент на один пиксел + int m_nBitsPerComponent; // Количество бит в компоненте + int m_nComponentsPerLine; // Количество компонент в одной строке + unsigned char *m_pLineBuffer; // Буффер для одной строки изображения + int m_nLinePos; // Текущая позиция в m_pLineBuffer + }; + + //------------------------------------------------------------------------ + // StreamPredictor (Predictor - дополнительный фильтр для картинок) + //------------------------------------------------------------------------ + + class StreamPredictor + { + public: + + // Создаем Predictor object. Параметры, которые задаются здесь, могут + // не совпадать с реальными параметрами картинки. + StreamPredictor(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent); + + ~StreamPredictor(); + + bool CheckValidate() + { + return m_bSuccess; + } + + + int LookChar(); + int GetChar(); + + private: + + bool GetNextLine(); + + private: + + Stream *m_pStream; // Основной поток + int m_nPredictor; // Predictor + int m_nWidth; // Количество пикселей в строке + int m_nComponentsPerPixel; // Количество компонент на один пиксел + int m_nBitsPerComponent; // Количество бит в компоненте + int m_nComponentsPerLine; // Количество компонент в одной строке + int m_nBytesPerPixel; // Количество байт в одном пикселе + int m_nBytesPerLine; // Количество байт в строке + unsigned char *m_pLineBuffer; // Буффер для одной строки изображения + int m_nLinePos; // Текущая позиция в m_pLineBuffer + + bool m_bSuccess; + }; + + //------------------------------------------------------------------------ + // FileStream + //------------------------------------------------------------------------ + +#define FileStreamBufferSize 1024 + + class FileStream : public BaseStream + { + public: + + FileStream(FILE *pFile, unsigned int unStart, bool bLimited, unsigned int nLength, Object *pDict); + virtual ~FileStream(); + + virtual Stream *MakeSubStream(unsigned int unStart, bool bLimited, unsigned int nLength, Object *pDict); + virtual StreamType GetType() + { + return strFile; + } + virtual void Reset(); + virtual void Close(); + inline virtual int GetChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer++ & 0xff); + } + inline virtual int LookChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer & 0xff); + } + inline virtual int GetPos() + { + return m_unBufferPos + (m_pBufferPointer - m_sBuffer); + } + virtual void SetPos(unsigned int unPos, int nDirection = 0); + virtual unsigned int GetStartPos() + { + return m_unStart; + } + virtual void SetStartPos(int nDelta); + + private: + + bool FillBuffer(); + + private: + + FILE *m_pFile; + unsigned int m_unStart; + bool m_bLimited; + unsigned int m_unLength; + char m_sBuffer[FileStreamBufferSize]; + char *m_pBufferPointer; + char *m_pBufferEnd; + unsigned int m_unBufferPos; + int m_nSavePos; + bool m_bSaved; + }; + //------------------------------------------------------------------------ + // MemoryStream + //------------------------------------------------------------------------ + + class MemoryStream : public BaseStream + { + public: + + MemoryStream(char *sBuffer, unsigned int unStart, unsigned int unLength, Object *pDict); + virtual ~MemoryStream(); + virtual Stream *MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual void Close(); + virtual int GetChar() + { + return (m_pBufferPointer < m_pBufferEnd) ? (*m_pBufferPointer++ & 0xff) : EOF; + } + virtual int LookChar() + { + return (m_pBufferPointer < m_pBufferEnd) ? (*m_pBufferPointer & 0xff) : EOF; + } + virtual int GetPos() + { + return (int)(m_pBufferPointer - m_sBuffer); + } + virtual void SetPos(unsigned int unPos, int nDirection = 0); + virtual unsigned int GetStartPos() + { + return m_unStart; + } + virtual void SetStartPos(int delta); + + private: + + char *m_sBuffer; + unsigned int m_unStart; + unsigned int m_unLength; + char *m_pBufferEnd; + char *m_pBufferPointer; + bool m_bNeedFree; + }; + + //------------------------------------------------------------------------ + // EmbedStream + // + // Специальный тип потока, используемый для внутренныих(внедренных) потоков + // (Inline images). Читаем напрямую из Base stream -- после удаления + // EmbedStream, чтение из Base stream будет совершаться для оставшейся части + // потока. Это соверешнно подругому, чем просто создать новый поток + // FileStream (используя MakeSubStream). + //------------------------------------------------------------------------ + + class EmbedStream : public BaseStream + { + public: + + EmbedStream(Stream *pStream, Object *pDict, bool bLimited, unsigned int unLength); + virtual ~EmbedStream(); + virtual Stream *MakeSubStream(unsigned int unStart, bool bLimited, unsigned int unLength, Object *pDict); + virtual StreamType GetType() + { + return m_pStream->GetType(); + } + virtual void Reset() + { + } + virtual void Close(){}; + virtual int GetChar(); + virtual int LookChar(); + virtual int GetPos() + { + return m_pStream->GetPos(); + } + virtual void SetPos(unsigned int unPos, int nDirection = 0); + virtual unsigned int GetStartPos(); + virtual void SetStartPos(int nDelta); + + private: + + Stream *m_pStream; + bool m_bLimited; + unsigned int m_unLength; + }; + + //------------------------------------------------------------------------ + // ASCIIHexStream + //------------------------------------------------------------------------ + + class ASCIIHexStream : public FilterStream + { + public: + + ASCIIHexStream(Stream *pStream); + virtual ~ASCIIHexStream(); + virtual StreamType GetType() + { + return strASCIIHex; + } + virtual void Reset(); + virtual int GetChar() + { + int nChar = LookChar(); + m_nBuffer = EOF; + return nChar; + } + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + int m_nBuffer; + bool m_bEOF; + }; + + //------------------------------------------------------------------------ + // ASCII85Stream + //------------------------------------------------------------------------ + + class ASCII85Stream : public FilterStream + { + public: + + ASCII85Stream(Stream *pStream); + virtual ~ASCII85Stream(); + virtual StreamType GetType() + { + return strASCII85; + } + virtual void Reset(); + virtual int GetChar() + { + int nChar = LookChar(); + ++m_nIndex; + return nChar; + } + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + int m_arrC[5]; // Имена массивов C и B взяты из спецификации + int m_arrB[4]; + int m_nIndex; + int m_nCount; + bool m_bEOF; + }; + + //------------------------------------------------------------------------ + // LZWStream + //------------------------------------------------------------------------ + + class LZWStream : public FilterStream + { + public: + + LZWStream(Stream *pStream, int nPredictor, int nColumns, int nColors, int nBitPerPixel, int nEarlyChange); + virtual ~LZWStream(); + virtual StreamType GetType() + { + return strLZW; + } + virtual void Reset(); + virtual int GetChar(); + virtual int LookChar(); + virtual int GetRawChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + bool ProcessNextCode(); + void ClearTable(); + int GetCode(); + + private: + + StreamPredictor *m_pPredictor; // Predictor (еще один дополнительный фильтр) + int m_nEarlyChange; // Параметр и словаря для LZW фильтра + bool m_bEOF; // Конец потока? + int m_nInputBuffer; // Input buffer + int m_nInputBits; // Количество бит в буффере + struct + { + int nLength; + int nHead; + unsigned char unTail; + } m_pTable[4097]; // Таблица для декодирования + int m_nNextCode; // Следующий код + int m_nNextBits; // Число бит в следующем коде + int m_nPrevCode; // Предыдущий код в потоке + int m_nNewChar; // Новый символ, который мы добавим в таблицу + unsigned char m_arrCurBuffer[4097]; // Буффер для текущей последовательности + int m_nCurLength; // Длина текущей последовательности + int m_nCurPos; // Позиция в текущей последовательности + bool m_bFirst; // Является ли данный код первым после очищения таблицы + }; + + //------------------------------------------------------------------------ + // RunLengthStream + //------------------------------------------------------------------------ + + class RunLengthStream : public FilterStream + { + public: + + RunLengthStream(Stream *pStream); + virtual ~RunLengthStream(); + virtual StreamType GetType() + { + return strRunLength; + } + virtual void Reset(); + virtual int GetChar() + { + return (m_pBufferPointer >= m_pEndOfBuffer && !FillBuffer()) ? EOF : (*m_pBufferPointer++ & 0xff); + } + virtual int LookChar() + { + return (m_pBufferPointer >= m_pEndOfBuffer && !FillBuffer()) ? EOF : (*m_pBufferPointer & 0xff); + } + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + bool FillBuffer(); + + private: + + char m_sBuffer[128]; // Буфер + char *m_pBufferPointer; // Указатель на следующий символ в буфере + char *m_pEndOfBuffer; // Указатель на конец буфера + bool m_bEOF; + }; + + //------------------------------------------------------------------------ + // CCITTFaxStream + //------------------------------------------------------------------------ + + struct CCITTCodeTable; + + class CCITTFaxStream : public FilterStream + { + public: + + CCITTFaxStream(Stream *pStream, int nK, bool bEndOfLine, bool bByteAlign, int nColumns, int nRows, bool bEndOfBlock, bool bBlackIs1); + virtual ~CCITTFaxStream(); + virtual StreamType GetType() + { + return strCCITTFax; + } + virtual void Reset(); + virtual int GetChar() + { + int nChar = LookChar(); + m_nCharBuffer = EOF; + return nChar; + } + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + short Get2DCode(); + short GetWhiteCode(); + short GetBlackCode(); + short LookBits(int nCount); + void SkipBits(int nCount) + { + if ((m_nInputBits -= nCount) < 0) + m_nInputBits = 0; + } + + private: + + int m_nK; // Параметр 'K', определяющий тип кодировки + bool m_bEndOfLine; // Параметр 'EndOfLine' + bool m_bByteAlign; // Параметр 'EncodedByteAlign' + int m_nColumns; // Параметр 'Columns' + int m_nRows; // Параметр 'Rows' + bool m_bEndOfBlock; // Параметр 'EndOfBlock' + bool m_bBlackIs1; // Параметр 'BlackIs1' + + bool m_bEOF; // + bool m_bNextLine2D; // True, если следующая строка использует кодировку 2D + int m_mCurRow; // Текущая строка + int m_nInputBuffer; // Input buffer + int m_nInputBits; // Количество бит в Input buffer + short *m_pRefLine; // Ссылочная строка, меняющую элементы + int m_nCurPosRL; // Текущая позиция в m_pRefLine + short *m_pCodingLine; // Кодирующая строка, меняющая элементы + int m_nCurPosCL; // Текущая позиция в m_pCodingLine + int m_nOutputBits; // + int m_nCharBuffer; // + }; + + //------------------------------------------------------------------------ + // DCTStream + //------------------------------------------------------------------------ + + struct DCTCompInfo + { + int nID; // ID данного элемента + int nXResolution; // Разрешение по горизонтали + int nYResolution; // Разрешение по вертикали + int nQuantTableNum; // Номер таблицы квантования + int nPrevDC; // + }; + + struct DCTScanInfo + { + bool arrbComponent[4]; // arrbComponent[i] = true, если i-ая компонента включена в даннуб структуру + int nComponentsCount; // количество компонент в данной структуре + int arrDCHuffTable[4]; // номера таблиц DC Huffman + int arrACHuffTable[4]; // номера таблиц AC Huffman + int nFirstKoef; // первый DCT коэффициент + int nLastKoef; // последний DCT коэффициент + int nApproxH; + int nApproxL; + }; + + struct DCTHuffTable + { + unsigned char arrunFirstSymbol[17]; // Первый символ в данной группе + unsigned short arrunFirstCode[17]; // Первый код в данной группе + unsigned short arrunCodesCount[17]; // Количество кодов в данной группе + unsigned char arrunSymbols[256]; // Сами символы + }; + + class DCTStream : public FilterStream + { + public: + + DCTStream(Stream *pStream, int nColorTransform); + virtual ~DCTStream(); + virtual StreamType GetType() + { + return strDCT; + } + virtual void Reset(); + virtual void Close(); + virtual int GetChar(); + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + Stream *GetRawStream() + { + return m_pStream; + } + + private: + + void Restart(); + bool ReadMCURow(); + void ReadScan(); + bool ReadDataUnit(DCTHuffTable *pDCHuffTable, DCTHuffTable *pACHuffTable, int *pnPrevDC, int arrData[64]); + bool ReadProgressiveDataUnit(DCTHuffTable *pDCHuffTable, DCTHuffTable *pACHuffTable, int *pnPrevDC, int arrData[64]); + void DecodeImage(); + void TransformDataUnit(unsigned short *pQuantTable, int arrDataIn[64], unsigned char arrDataOut[64]); + int ReadHuffSymbol(DCTHuffTable *pTable); + int ReadAmp(int nSize); + int ReadBit(); + bool ReadHeader(); + bool ReadBaselineSOF(); + bool ReadProgressiveSOF(); + bool ReadScanInfo(); + bool ReadQuantTables(); + bool ReadHuffmanTables(); + bool ReadRestartInterval(); + bool ReadJFIFMarker(); + bool ReadAdobeMarker(); + bool ReadTrailer(); + int ReadMarker(); + int Read16(); + + private: + + bool m_bProgressive; // True, если мод progressive + bool m_bInterleaved; // True, если мод interleaved + int m_nWidth; // ширина изображения + int m_nHeight; // высота изображения + int m_nMCUWidth; // ширина min coding unit(MCU) + int m_nMCUHeight; // высота min coding unit(MCU) + int m_nBufferWidth; // ширина FrameBuffer + int m_nBufferHeight; // высота FrameBuffer + DCTCompInfo m_arrCompInfo[4]; // Структура Info для каждой компоненты + DCTScanInfo m_oCurScanInfo; // Структура Info для текущего Scan + int m_nComponentsCount; // Количество компонент изображения + int m_nColorTransform; // Преобразования пространства цветов: + // -1 = непоределено + // 0 = нет преобразования + // 1 = YUV/YUVK -> RGB/CMYK + bool m_bJFIFMarker; // True, если есть маркер APP0 JFIF + bool m_bAdobeMarker; // True, если есть маркер APP14 Adobe + int m_nRestartInterval; // в MCU + unsigned short m_arrQuantTables[4][64]; // Таблицы квантования + int m_nQuantTablesCount; // количество таблицы квантования + DCTHuffTable m_arrDCHuffTables[4]; // Таблицы DC Huffman + DCTHuffTable m_arrACHuffTables[4]; // Таблицы AC Huffman + int m_nDCHuffTablesCount; // Количество таблиц DC Huffman + int m_nACHuffTablesCount; // Количество таблиц AC Huffman + unsigned char *m_pppRowBuffer[4][32]; // Буфер для MCU (non-progressive mode) + int *m_ppFrameBuffer[4]; // Буфер для фрэйма (progressive mode) + + int m_nCurComponent; // Текущие параметры для кртинки/MCU + int m_nX; // + int m_nY; // + int m_nDY; // + + int m_nRestartCtr; // количество оставишхся MCU до рестарта + int m_nRestartMarker; // + int m_nEOBRun; // количество оставшихся EOB(end-of-block) в текущей группе + + int m_nInputBuffer; // Буфер для кодов разной длины + int m_nInputBits; // Число корректных бит в Input buffer + + }; + + //------------------------------------------------------------------------ + // FlateZlibStream + //------------------------------------------------------------------------ + +#define flateZlibWindow 32768 // Размер буфера +#define flateZlibMask 32767 // (flateZlibWindow - 1) + + class FlateZlibStream : public FilterStream + { + public: + + FlateZlibStream(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent); + virtual ~FlateZlibStream(); + virtual StreamType GetType() + { + return strFlate; + } + virtual void Reset(); + virtual int GetChar(); + virtual int LookChar(); + virtual int GetRawChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + void ReadSome(); + + private: + + z_stream m_oZStream; // Zlib поток + StreamPredictor *m_pPredictor; // Predictor + unsigned int m_nInSize; // Размер входного буффера + unsigned char m_arrInBuffer[flateZlibWindow]; // Входной буффер + unsigned char m_arrBuffer[flateZlibWindow]; // Буфер для результата декодирования + int m_nBufferCurPos; // Текущая позиция в буфере + int m_nRemain; // Число корректных байт в буфере + bool m_bEndOfBlock; // True, когда достигли конца блока + bool m_bEOF; // True, когда достигли конца потока + }; + + + //------------------------------------------------------------------------ + // FlateStream + //------------------------------------------------------------------------ + +#define flateWindow 32768 // Размер буфера +#define flateMask (flateWindow-1) +#define flateMaxHuffman 15 // макимальная длина кода Huffman +#define flateMaxCodeLenCodes 19 // max # code length codes +#define flateMaxLitCodes 288 // max # literal codes +#define flateMaxDistCodes 30 // max # distance codes + + struct FlateHuffmanCode + { + unsigned short nLength; // длина кода в битах + unsigned short nValue; // значение данного коду + }; + + struct FlateHuffmanTable + { + FlateHuffmanCode *pCodes; // таблица кодов + int nMaxLen; // макимальная длина кода + }; + + struct FlateDecode + { + int nExtraBitsCount; // количество дополнительных бит + int nFirst; // первая длина + }; + + class FlateStream : public FilterStream + { + public: + + FlateStream(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent); + virtual ~FlateStream(); + virtual StreamType GetType() + { + return strFlate; + } + virtual void Reset(); + virtual int GetChar(); + virtual int LookChar(); + virtual int GetRawChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); + virtual bool IsBinary(bool bLast = true); + + private: + + void ReadSome(); + bool StartBlock(); + void LoadFixedCodes(); + bool ReadDynamicCodes(); + void ConvertHuffmanCodes(int *pLengths, int nCount, FlateHuffmanTable *pTable); + int GetHuffmanCodeWord(FlateHuffmanTable *pTable); + int GetCodeWord(int nBits); + + private: + + StreamPredictor *m_pPredictor; // Predictor + unsigned char m_arrBuffer[flateWindow]; // Буфер для результата декодирования + int m_nBufferCurPos; // Текущая позиция в буфере + int m_nRemain; // Число корректных байт в буфере + int m_nCodeBuffer; // Бефер исходных кодов + int m_nCodeSize; // Число бит в m_nCodeBuffer + int m_arrCodeLengths[flateMaxLitCodes + flateMaxDistCodes]; // Длины кодов(и для самих слов и для расстояний) + FlateHuffmanTable m_oLiteratCodeTable; // Таблица буквенных кодов + FlateHuffmanTable m_oDistanceCodeTable; // Таблица кодов-расстояний + bool m_bCompressedBlock; // True, если читаем сжатый блок + int m_nUncompBlockLen; // Оставшаяся длина несжатого блока + bool m_bEndOfBlock; // True, когда достигли конца блока + bool m_bEOF; // True, когда достигли конца потока + + static int m_arrCodeLenCodeMap[flateMaxCodeLenCodes]; // + static FlateDecode m_arrLengthDecode[flateMaxLitCodes - 257]; // + static FlateDecode m_arrDistanceDecode[flateMaxDistCodes]; // + static FlateHuffmanTable m_oFixedLiteralCodeTable; // + static FlateHuffmanTable m_oFixedDistanceCodeTable; // + }; + + //------------------------------------------------------------------------ + // EOFStream + //------------------------------------------------------------------------ + + class EOFStream : public FilterStream + { + public: + + EOFStream(Stream *pStream); + virtual ~EOFStream(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset() + { + } + virtual int GetChar() + { + return EOF; + } + virtual int LookChar() + { + return EOF; + } + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + virtual bool IsBinary(bool bLast = true) + { + return false; + } + }; + + //------------------------------------------------------------------------ + // FixedLengthEncoder + //------------------------------------------------------------------------ + + class FixedLengthEncoder : public FilterStream + { + public: + + FixedLengthEncoder(Stream *pStream, int nLength); + ~FixedLengthEncoder(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual int GetChar(); + virtual int LookChar(); + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + virtual bool IsBinary(bool bLast = true); + virtual bool IsEncoder() + { + return true; + } + + private: + + int m_nLength; + int m_nCount; + }; + + //------------------------------------------------------------------------ + // ASCIIHexEncoder + //------------------------------------------------------------------------ + + class ASCIIHexEncoder : public FilterStream + { + public: + + ASCIIHexEncoder(Stream *pStream); + virtual ~ASCIIHexEncoder(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual int GetChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer++ & 0xff); + } + virtual int LookChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer & 0xff); + } + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + virtual bool IsBinary(bool bLast = true) + { + return false; + } + virtual bool IsEncoder() + { + return true; + } + + private: + + bool FillBuffer(); + + private: + + char m_sBuffer[4]; + char *m_pBufferPointer; + char *m_pBufferEnd; + int m_nLineLength; + bool m_bEOF; + }; + + //------------------------------------------------------------------------ + // ASCII85Encoder + //------------------------------------------------------------------------ + + class ASCII85Encoder : public FilterStream + { + public: + + ASCII85Encoder(Stream *pStream); + virtual ~ASCII85Encoder(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual int GetChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer++ & 0xff); + } + virtual int LookChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer & 0xff); + } + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + virtual bool IsBinary(bool bLast = true) + { + return false; + } + virtual bool IsEncoder() + { + return true; + } + private: + + bool FillBuffer(); + + private: + + char m_sBuffer[8]; + char *m_pBufferPointer; + char *m_pBufferEnd; + int m_nLineLength; + bool m_bEOF; + }; + + //------------------------------------------------------------------------ + // RunLengthEncoder + //------------------------------------------------------------------------ + + class RunLengthEncoder : public FilterStream + { + public: + + RunLengthEncoder(Stream *pStream); + virtual ~RunLengthEncoder(); + virtual StreamType GetType() + { + return strWeird; + } + virtual void Reset(); + virtual int GetChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer++ & 0xff); + } + virtual int LookChar() + { + return (m_pBufferPointer >= m_pBufferEnd && !FillBuffer()) ? EOF : (*m_pBufferPointer & 0xff); + } + virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent) + { + return NULL; + } + virtual bool IsBinary(bool bLast = true) + { + return true; + } + virtual bool IsEncoder() + { + return true; + } + + private: + + bool FillBuffer(); + + private: + + char m_sBuffer[131]; + char *m_pBufferPointer; + char *m_pBufferEnd; + char *m_pNextEnd; + bool m_bEOF; + }; +} + +#endif // _PDF_READER_STREAM_H diff --git a/PdfReader/Src/StringExt.cpp b/PdfReader/Src/StringExt.cpp new file mode 100644 index 0000000000..0728b409f0 --- /dev/null +++ b/PdfReader/Src/StringExt.cpp @@ -0,0 +1,758 @@ +#include +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "StringExt.h" + +namespace PdfReader +{ + union StringExtFormatArg + { + int iValue; + unsigned int uiValue; + long lValue; + unsigned long ulValue; + double fValue; + char cValue; + char *sValue; + StringExt *seValue; + }; + + enum StringExtFormatType + { + fmtIntDecimal, + fmtIntHex, + fmtIntOctal, + fmtIntBinary, + fmtUIntDecimal, + fmtUIntHex, + fmtUIntOctal, + fmtUIntBinary, + fmtLongDecimal, + fmtLongHex, + fmtLongOctal, + fmtLongBinary, + fmtULongDecimal, + fmtULongHex, + fmtULongOctal, + fmtULongBinary, + fmtDouble, + fmtDoubleTrim, + fmtChar, + fmtString, + fmtStringExt, + fmtSpace + }; + + static char *c_arrsFormatStrings[] = + { + "d", "x", "o", "b", "ud", "ux", "uo", "ub", + "ld", "lx", "lo", "lb", "uld", "ulx", "ulo", "ulb", + "f", "g", + "c", + "s", + "t", + "w", + NULL + }; + + //------------------------------------------------------------------------ + + static inline int Size(int nLen) + { + int nDelta; + for (nDelta = 8; nDelta < nLen && nDelta < 0x100000; nDelta <<= 1); + // ((nLen + 1) + (delta - 1)) & ~(delta - 1) + return (nLen + nDelta) & ~(nDelta - 1); + } + + inline void StringExt::Resize(int nLength) + { + char *sTemp = NULL; + + if (!m_sData) + m_sData = new char[Size(nLength)]; + else if (Size(nLength) != Size(m_nLength)) + { + sTemp = new char[Size(nLength)]; + if (nLength < m_nLength) + { + memcpy(sTemp, m_sData, nLength); + sTemp[nLength] = '\0'; + } + else + memcpy(sTemp, m_sData, m_nLength + 1); + delete[] m_sData; + m_sData = sTemp; + } + } + + StringExt::StringExt() + { + m_sData = NULL; + Resize(m_nLength = 0); + m_sData[0] = '\0'; + } + + StringExt::StringExt(std::wstring& wsString) + { + int nLen = wsString.length(); + + m_sData = NULL; + Resize(m_nLength = nLen); + for (int nPos = 0; nPos < nLen; nPos++) + { + m_sData[nPos] = (unsigned char)wsString.at(nPos); + } + } + + StringExt::StringExt(const wchar_t* _wsString) + { + std::wstring wsString(_wsString); + int nLen = wsString.length(); + + m_sData = NULL; + Resize(m_nLength = nLen); + for (int nPos = 0; nPos < nLen; nPos++) + { + m_sData[nPos] = (unsigned char)wsString.at(nPos); + } + } + + StringExt::StringExt(const char *sSrc) + { + int nLen = strlen(sSrc); + + m_sData = NULL; + Resize(m_nLength = nLen); + memcpy(m_sData, sSrc, nLen + 1); + } + + StringExt::StringExt(const char *sSrc, int nLength) + { + m_sData = NULL; + Resize(m_nLength = nLength); + memcpy(m_sData, sSrc, m_nLength * sizeof(char)); + m_sData[m_nLength] = '\0'; + } + + StringExt::StringExt(StringExt *seSrc, int nIndex, int nLength) + { + m_sData = NULL; + Resize(m_nLength = nLength); + memcpy(m_sData, seSrc->GetBuffer() + nIndex, m_nLength); + m_sData[m_nLength] = '\0'; + } + + StringExt::StringExt(StringExt *seSrc) + { + m_sData = NULL; + Resize(m_nLength = seSrc->GetLength()); + memcpy(m_sData, seSrc->GetBuffer(), m_nLength + 1); + } + + StringExt::StringExt(StringExt *seString1, StringExt *seString2) + { + int nLen1 = seString1->GetLength(); + int nLen2 = seString2->GetLength(); + + m_sData = NULL; + Resize(m_nLength = nLen1 + nLen2); + memcpy(m_sData, seString1->GetBuffer(), nLen1); + memcpy(m_sData + nLen1, seString2->GetBuffer(), nLen2 + 1); + } + + StringExt *StringExt::FromInt(int nValue) + { + char sBuffer[24]; + char *pData = NULL; + int nLen; + + FormatInt(nValue, sBuffer, sizeof(sBuffer), false, 0, 10, &pData, &nLen); + return new StringExt(pData, nLen); + } + + StringExt *StringExt::Format(char *sFormat, ...) + { + va_list sArgList; + StringExt *seResult = new StringExt(); + va_start(sArgList, sFormat); + seResult->AppendFormatV(sFormat, sArgList); + va_end(sArgList); + return seResult; + } + + StringExt *StringExt::FormatV(char *sFormat, va_list sArgList) + { + StringExt *seResult = new StringExt(); + seResult->AppendFormatV(sFormat, sArgList); + return seResult; + } + + StringExt::~StringExt() + { + delete[] m_sData; + } + + StringExt *StringExt::Clear() + { + m_sData[m_nLength = 0] = '\0'; + Resize(0); + return this; + } + + StringExt *StringExt::Append(char nChar) + { + Resize(m_nLength + 1); + m_sData[m_nLength++] = nChar; + m_sData[m_nLength] = '\0'; + return this; + } + + StringExt *StringExt::Append(StringExt *seString) + { + int nLen = seString->GetLength(); + + Resize(m_nLength + nLen); + memcpy(m_sData + m_nLength, seString->GetBuffer(), nLen + 1); + m_nLength += nLen; + return this; + } + + StringExt *StringExt::Append(const char *sString) + { + int nLen = strlen(sString); + + Resize(m_nLength + nLen); + memcpy(m_sData + m_nLength, sString, nLen + 1); + m_nLength += nLen; + return this; + } + + StringExt *StringExt::Append(const char *sString, int nLength) + { + Resize(m_nLength + nLength); + memcpy(m_sData + m_nLength, sString, nLength); + m_nLength += nLength; + m_sData[m_nLength] = '\0'; + return this; + } + + StringExt *StringExt::AppendFormat(char *sFormat, ...) + { + va_list sArgList; + va_start(sArgList, sFormat); + AppendFormatV(sFormat, sArgList); + va_end(sArgList); + return this; + } + + StringExt *StringExt::AppendFormatV(char *sFormat, va_list sArgList) + { + StringExtFormatArg uArg; + int nIndex, nWidth, nPrecision; + bool bReverseAlign, bZeroFill; + StringExtFormatType eFormatType; + char sBuffer[65]; + int nLen; + char *pCur, *pTemp, *sTemp; + + int nArgsLen = 0; + int nArgsSize = 8; + StringExtFormatArg *arrArgs = (StringExtFormatArg *)MemUtilsMallocArray(nArgsSize, sizeof(StringExtFormatArg)); + + pCur = sFormat; + while (*pCur) + { + if (*pCur == '{') + { + ++pCur; + if (*pCur == '{') + { + ++pCur; + Append('{'); + } + else + { + // Разбираем форматированную строку + if (!(*pCur >= '0' && *pCur <= '9')) + break; + nIndex = *pCur - '0'; + for (++pCur; *pCur >= '0' && *pCur <= '9'; ++pCur) + nIndex = 10 * nIndex + (*pCur - '0'); + + if (*pCur != ':') + break; + ++pCur; + if (*pCur == '-') + { + bReverseAlign = true; + ++pCur; + } + else + bReverseAlign = false; + nWidth = 0; + bZeroFill = *pCur == '0'; + for (; *pCur >= '0' && *pCur <= '9'; ++pCur) + nWidth = 10 * nWidth + (*pCur - '0'); + if (*pCur == '.') + { + ++pCur; + nPrecision = 0; + for (; *pCur >= '0' && *pCur <= '9'; ++pCur) + { + nPrecision = 10 * nPrecision + (*pCur - '0'); + } + } + else + { + nPrecision = 0; + } + for (eFormatType = (StringExtFormatType)0; + c_arrsFormatStrings[eFormatType]; + eFormatType = (StringExtFormatType)(eFormatType + 1)) + { + if (!strncmp(pCur, c_arrsFormatStrings[eFormatType], strlen(c_arrsFormatStrings[eFormatType]))) + { + break; + } + } + if (!c_arrsFormatStrings[eFormatType]) + { + break; + } + pCur += strlen(c_arrsFormatStrings[eFormatType]); + if (*pCur != '}') + { + break; + } + ++pCur; + // fetch the argument + if (nIndex > nArgsLen) + { + break; + } + if (nIndex == nArgsLen) + { + if (nArgsLen == nArgsSize) + { + nArgsSize *= 2; + arrArgs = (StringExtFormatArg *)MemUtilsReallocArray(arrArgs, nArgsSize, sizeof(StringExtFormatArg)); + } + switch (eFormatType) + { + case fmtIntDecimal: + case fmtIntHex: + case fmtIntOctal: + case fmtIntBinary: + case fmtSpace: + arrArgs[nArgsLen].iValue = va_arg(sArgList, int); + break; + case fmtUIntDecimal: + case fmtUIntHex: + case fmtUIntOctal: + case fmtUIntBinary: + arrArgs[nArgsLen].uiValue = va_arg(sArgList, unsigned int); + break; + case fmtLongDecimal: + case fmtLongHex: + case fmtLongOctal: + case fmtLongBinary: + arrArgs[nArgsLen].lValue = va_arg(sArgList, long); + break; + case fmtULongDecimal: + case fmtULongHex: + case fmtULongOctal: + case fmtULongBinary: + arrArgs[nArgsLen].ulValue = va_arg(sArgList, unsigned long); + break; + case fmtDouble: + case fmtDoubleTrim: + arrArgs[nArgsLen].fValue = va_arg(sArgList, double); + break; + case fmtChar: + arrArgs[nArgsLen].cValue = (char)va_arg(sArgList, int); + break; + case fmtString: + arrArgs[nArgsLen].sValue = va_arg(sArgList, char *); + break; + case fmtStringExt: + arrArgs[nArgsLen].seValue = va_arg(sArgList, StringExt *); + break; + } + ++nArgsLen; + } + + uArg = arrArgs[nIndex]; + switch (eFormatType) + { + case fmtIntDecimal: + FormatInt(uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen); + break; + case fmtIntHex: + FormatInt(uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen); + break; + case fmtIntOctal: + FormatInt(uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen); + break; + case fmtIntBinary: + FormatInt(uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen); + break; + case fmtUIntDecimal: + FormatUInt(uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen); + break; + case fmtUIntHex: + FormatUInt(uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen); + break; + case fmtUIntOctal: + FormatUInt(uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen); + break; + case fmtUIntBinary: + FormatUInt(uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen); + break; + case fmtLongDecimal: + FormatInt(uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen); + break; + case fmtLongHex: + FormatInt(uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen); + break; + case fmtLongOctal: + FormatInt(uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen); + break; + case fmtLongBinary: + FormatInt(uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen); + break; + case fmtULongDecimal: + FormatUInt(uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen); + break; + case fmtULongHex: + FormatUInt(uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen); + break; + case fmtULongOctal: + FormatUInt(uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen); + break; + case fmtULongBinary: + FormatUInt(uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen); + break; + case fmtDouble: + FormatDouble(uArg.fValue, sBuffer, sizeof(sBuffer), nPrecision, false, &sTemp, &nLen); + break; + case fmtDoubleTrim: + FormatDouble(uArg.fValue, sBuffer, sizeof(sBuffer), nPrecision, true, &sTemp, &nLen); + break; + case fmtChar: + sBuffer[0] = uArg.cValue; + sTemp = sBuffer; + nLen = 1; + bReverseAlign = !bReverseAlign; + break; + case fmtString: + sTemp = uArg.sValue; + nLen = strlen(sTemp); + bReverseAlign = !bReverseAlign; + break; + case fmtStringExt: + sTemp = uArg.seValue->GetBuffer(); + nLen = uArg.seValue->GetLength(); + bReverseAlign = !bReverseAlign; + break; + case fmtSpace: + sTemp = sBuffer; + nLen = 0; + nWidth = uArg.iValue; + break; + } + // Добавляем аргумент в нужном формате, с нужным прилеганием + if (!bReverseAlign && nLen < nWidth) + { + for (int nCounter = nLen; nCounter < nWidth; ++nCounter) + Append(' '); + } + Append(sTemp, nLen); + if (bReverseAlign && nLen < nWidth) + { + for (int nCounter = nLen; nCounter < nWidth; ++nCounter) + Append(' '); + } + } + } + else if (*pCur == '}') + { + ++pCur; + if (*pCur == '}') + ++pCur; + Append('}'); + } + else + { + for (pTemp = pCur + 1; *pTemp && *pTemp != '{' && *pTemp != '}'; ++pTemp); + Append(pCur, pTemp - pCur); + pCur = pTemp; + } + } + MemUtilsFree(arrArgs); + return this; + } + + void StringExt::FormatInt(long nValue, char *sBuffer, int nBufferSize, bool bZeroFill, int nWidth, int nBase, char **ppData, int *pnLen) + { + static char c_sValues[17] = "0123456789abcdef"; + bool bNegative = false; + int nStart; + + int nCur = nBufferSize; + if ((bNegative = nValue < 0)) + { + nValue = -nValue; + } + nStart = bNegative ? 1 : 0; + if (nValue == 0) + { + sBuffer[--nCur] = '0'; + } + else + { + while (nCur > nStart && nValue) + { + sBuffer[--nCur] = c_sValues[nValue % nBase]; + nValue /= nBase; + } + } + if (bZeroFill) + { + for (int nCounter = nBufferSize - nCur; nCur > nStart && nCounter < nWidth - nStart; ++nCounter) + { + sBuffer[--nCur] = '0'; + } + } + if (bNegative) + { + sBuffer[--nCur] = '-'; + } + *ppData = sBuffer + nCur; + *pnLen = nBufferSize - nCur; + } + + void StringExt::FormatUInt(unsigned long nValue, char *sBuffer, int nBufferSize, bool bZeroFill, int nWidth, int nBase, char **ppData, int *pnLen) + { + static char c_sValues[17] = "0123456789abcdef"; + + int nCur = nBufferSize; + if (nValue == 0) + { + sBuffer[--nCur] = '0'; + } + else + { + while (nCur > 0 && nValue) + { + sBuffer[--nCur] = c_sValues[nValue % nBase]; + nValue /= nBase; + } + } + if (bZeroFill) + { + for (int nCounter = nBufferSize - nCur; nCur > 0 && nCounter < nWidth; ++nCounter) + { + sBuffer[--nCur] = '0'; + } + } + *ppData = sBuffer + nCur; + *pnLen = nBufferSize - nCur; + } + + void StringExt::FormatDouble(double dValue, char *sBuffer, int nBufferSize, int nPrecision, bool bTrim, char **ppData, int *pnLen) + { + bool bNegative = false, bStarted = false; + double dTemp = 0; + int nInt; + + if ((bNegative = dValue < 0)) + dValue = -dValue; + + dValue = floor(dValue * pow((double)10, nPrecision) + 0.5); + int nCur = nBufferSize; + bStarted = !bTrim; + for (int nCounter = 0; nCounter < nPrecision && nCur > 1; ++nCounter) + { + dTemp = floor(0.1 * (dValue + 0.5)); + nInt = (int)floor(dValue - 10 * dTemp + 0.5); + if (bStarted || nInt != 0) + { + sBuffer[--nCur] = '0' + nInt; + bStarted = true; + } + dValue = dTemp; + } + if (nCur > 1 && bStarted) + sBuffer[--nCur] = '.'; + if (nCur > 1) + { + do { + dTemp = floor(0.1 * (dValue + 0.5)); + nInt = (int)floor(dValue - 10 * dTemp + 0.5); + sBuffer[--nCur] = '0' + nInt; + dValue = dTemp; + } while (nCur > 1 && dValue); + } + if (bNegative) + sBuffer[--nCur] = '-'; + + *ppData = sBuffer + nCur; + *pnLen = nBufferSize - nCur; + } + + StringExt *StringExt::Insert(int nIndex, char nChar) + { + Resize(m_nLength + 1); + for (int nJ = m_nLength + 1; nJ > nIndex; --nJ) + m_sData[nJ] = m_sData[nJ - 1]; + m_sData[nIndex] = nChar; + ++m_nLength; + return this; + } + + StringExt *StringExt::Insert(int nIndex, StringExt *seString) + { + int nLen = seString->GetLength(); + Resize(m_nLength + nLen); + for (int nJ = m_nLength; nJ >= nIndex; --nJ) + m_sData[nJ + nLen] = m_sData[nJ]; + memcpy(m_sData + nIndex, seString->GetBuffer(), nLen); + m_nLength += nLen; + return this; + } + + StringExt *StringExt::Insert(int nIndex, const char *sString) + { + int nLen = strlen(sString); + + Resize(m_nLength + nLen); + for (int nJ = m_nLength; nJ >= nIndex; --nJ) + m_sData[nJ + nLen] = m_sData[nJ]; + memcpy(m_sData + nIndex, sString, nLen); + m_nLength += nLen; + return this; + } + + StringExt *StringExt::Insert(int nIndex, const char *sString, int nLength) + { + Resize(m_nLength + nLength); + for (int nJ = m_nLength; nJ >= nIndex; --nJ) + m_sData[nJ + nLength] = m_sData[nJ]; + memcpy(m_sData + nIndex, sString, nLength); + m_nLength += nLength; + return this; + } + + StringExt *StringExt::Delete(int nIndex, int nCount) + { + if (nCount > 0) + { + if (nIndex + nCount > m_nLength) + nCount = m_nLength - nIndex; + for (int nJ = nIndex; nJ <= m_nLength - nCount; ++nJ) + { + m_sData[nJ] = m_sData[nJ + nCount]; + } + Resize(m_nLength -= nCount); + } + return this; + } + + StringExt *StringExt::MakeUpper() + { + for (int nIndex = 0; nIndex < m_nLength; ++nIndex) + { + if (islower(m_sData[nIndex])) + m_sData[nIndex] = toupper(m_sData[nIndex]); + } + return this; + } + + StringExt *StringExt::MakeLower() + { + for (int nIndex = 0; nIndex < m_nLength; ++nIndex) + { + if (isupper(m_sData[nIndex])) + m_sData[nIndex] = tolower(m_sData[nIndex]); + } + return this; + } + + int StringExt::Compare(StringExt *seOther) + { + int nIndex = 0; + char *pThis, *pOther; + + int nThisLen = m_nLength; + int nOtherLen = seOther->m_nLength; + for (nIndex = 0, pThis = m_sData, pOther = seOther->m_sData; nIndex < nThisLen && nIndex < nOtherLen; ++nIndex, ++pThis, ++pOther) + { + int nRes = *pThis - *pOther; + if (0 != nRes) + return nRes; + } + return nThisLen - nOtherLen; + } + + int StringExt::CompareN(StringExt *seOther, int nCount) + { + int nIndex; + char *pThis, *pOther; + + int nThisLen = m_nLength; + int nOtherLen = seOther->m_nLength; + for (nIndex = 0, pThis = m_sData, pOther = seOther->m_sData; nIndex < nThisLen && nIndex < nOtherLen && nIndex < nCount; ++nIndex, ++pThis, ++pOther) + { + int nRes = *pThis - *pOther; + if (0 != nRes) + return nRes; + } + if (nIndex == nCount) + return 0; + return nThisLen - nOtherLen; + } + + int StringExt::Compare(const char *sOther) + { + int nIndex; + const char *pThis, *pOther; + + int nThisLen = m_nLength; + for (nIndex = 0, pThis = m_sData, pOther = sOther; nIndex < nThisLen && *pOther; ++nIndex, ++pThis, ++pOther) + { + int nRes = *pThis - *pOther; + if (0 != nRes) + return nRes; + } + if (nIndex < nThisLen) + return 1; + if (*pOther) + return -1; + return 0; + } + + int StringExt::CompareN(const char *sOther, int nCount) + { + int nIndex; + const char *pThis, *pOther; + + int nThisLen = m_nLength; + for (nIndex = 0, pThis = m_sData, pOther = sOther; nIndex < nThisLen && *pOther && nIndex < nCount; ++nIndex, ++pThis, ++pOther) + { + int nRes = *pThis - *pOther; + if (0 != nRes) + return nRes; + } + if (nIndex == nCount) + return 0; + if (nIndex < nThisLen) + return 1; + if (*pOther) + return -1; + return 0; + } +} \ No newline at end of file diff --git a/PdfReader/Src/StringExt.h b/PdfReader/Src/StringExt.h new file mode 100644 index 0000000000..7fde31fbf5 --- /dev/null +++ b/PdfReader/Src/StringExt.h @@ -0,0 +1,191 @@ +#ifndef _PDF_READER_STRING_EXT_H +#define _PDF_READER_STRING_EXT_H + +#include +#include +#include "../../DesktopEditor/common/String.h" + +namespace PdfReader +{ + //--------------------------------------------------------------------------------------- + // WString - аналог BSTR + //--------------------------------------------------------------------------------------- + typedef wchar_t* WString; + + static WString AllocWString(std::wstring& wsString) + { + int nLen = wsString.length(); + WString wsResult = new wchar_t[nLen + 1]; + wsResult[nLen] = 0x0000; + + for (int nIndex = 0; nIndex < nLen; nIndex++) + { + wsResult[nIndex] = (wchar_t)wsString.at(nIndex); + } + + return wsResult; + } + static WString AllocWString(const wchar_t* wsString) + { + return AllocWString(std::wstring(wsString)); + } + static WString AllocWString(WString wsString) + { + return AllocWString(std::wstring(wsString)); + } + static void FreeWString(WString wString) + { + if (wString) + delete[] wString; + } + + static std::wstring* AStringToPWString(const char* sString) + { + return new std::wstring(NSString::CConverter::GetUnicodeFromSingleByteString((unsigned char*)sString, strlen(sString))); + } + static std::wstring AStringToWString(const char* sString) + { + return std::wstring(NSString::CConverter::GetUnicodeFromSingleByteString((unsigned char*)sString, strlen(sString))); + } + + + //--------------------------------------------------------------------------------------- + // класс StringExt - аналог CString + //--------------------------------------------------------------------------------------- + + class StringExt + { + + public: + + // Создаем пустую строку. + StringExt(); + + StringExt(std::wstring& wsString); + + StringExt(const wchar_t* wsString); + + // Создаем строку из Сишной строки. + StringExt(const char *sString); + + // Создаем строку из символов в . Данная строка + // может содержать нулевые символы. + StringExt(const char *sString, int nLength); + + // Создаем строку из символов, начиная с , строки . + StringExt(StringExt *seString, int nIndex, int nLength); + + // Копируем строку. + StringExt(StringExt *seString); + StringExt *Copy() + { + return new StringExt(this); + } + + // Соединяем две строки. + StringExt(StringExt *seString1, StringExt *seString2); + + // Переводим целое значение в строку. + static StringExt *FromInt(int nValue); + + // Создаем форматированную строку. Функция подобна printf, но без проблем + // с переполнением строки. Формат выглядит следующим образом: + // {:[][.]} + // где: + // - номер аргумента (нумерация начинается с 0). + // -- PS: сами аргументы должны идти по порядку, а использовать их можно + // многократно и в любом порядке. + // - ширина поля, если она отрицательна, тогда прилежание будет + // сменено на противоположное, а пустые места будут заполнены нулями. + // - количество знаков после запятой + // - тип один из слудющих: + // d, x, o, b -- целое(int) в десятичной, шестнадцатиричной, восьмиричной + // и двоичной системах исчисления + // ud, ux, uo, ub -- тоже самое, только беззнаковое целое(uint) + // ld, lx, lo, lb, uld, ulx, ulo, ulb -- аналогичной long и ulong + // f, g -- double + // c -- char + // s -- string (char *) + // t -- StringExt * + // w -- Пробелы; значение аргументы означает количество пробелов + // Для вывода фигурных скобок надо использовать {{ и }}. + static StringExt *Format(char *sFormat, ...); + static StringExt *FormatV(char *sFormat, va_list sArgList); + + // Деструктор. + ~StringExt(); + + int GetLength() + { + return m_nLength; + } + + // Возвращаем строку в виде char*. + char *GetBuffer() + { + return m_sData; + } + + std::wstring GetWString() + { + return NSString::CConverter::GetUnicodeFromSingleByteString((const unsigned char*)m_sData, m_nLength); + } + + char GetAt(int nIndex) + { + return m_sData[nIndex]; + } + void SetAt(int nIndex, char nChar) + { + m_sData[nIndex] = nChar; + } + + // Очищаем строку. + StringExt *Clear(); + + // Добавляем символ или строку. + StringExt *Append(char nChar); + StringExt *Append(StringExt *seString); + StringExt *Append(const char *sString); + StringExt *Append(const char *sString, int nLength); + + // Добавляем форматированную строку. + StringExt *AppendFormat(char *sFormat, ...); + StringExt *AppendFormatV(char *sFormat, va_list sArgList); + + // Вставляем символ или строку. + StringExt *Insert(int nIndex, char nChar); + StringExt *Insert(int nIndex, StringExt *seString); + StringExt *Insert(int nIndex, const char *sString); + StringExt *Insert(int nIndex, const char *sString, int nLength); + + // Удаляем один символ или массив символов. + StringExt *Delete(int nIndex, int nCount = 1); + + // Делаем в строке все символы большими/маленькими буквами. + StringExt *MakeUpper(); + StringExt *MakeLower(); + + // Сравнение двух строк: -1:< 0:= +1:> + int Compare(StringExt *seString); + int CompareN(StringExt *seString, int nCount); + int Compare(const char *sString); + int CompareN(const char *sString, int nCount); + + private: + + void Resize(int nLength); + + static void FormatInt(long nValue, char *sBuffer, int nBufferSize, bool bZeroFill, int nWidth, int nBase, char **ppData, int *nLen); + static void FormatUInt(unsigned long nValue, char *sBuffer, int nBufferSize, bool bZeroFill, int nWidth, int nBase, char **ppData, int *nLen); + static void FormatDouble(double nValue, char *sBuffer, int nBufferSize, int nPrecision, bool bTrim, char **ppData, int *nLen); + + private: + + int m_nLength; + char *m_sData; + + }; +} + +#endif //_PDF_READER_STRING_EXT_H diff --git a/PdfReader/Src/UTF8.h b/PdfReader/Src/UTF8.h new file mode 100644 index 0000000000..571dce45c5 --- /dev/null +++ b/PdfReader/Src/UTF8.h @@ -0,0 +1,75 @@ +#ifndef _PDF_READER_UTF8_H +#define _PDF_READER_UTF8_H + +namespace PdfReader +{ + static int MapUTF8(Unicode nUnicode, char *sBuffer, int nBufferSize) + { + if (nUnicode <= 0x0000007f) + { + if (nBufferSize < 1) + { + return 0; + } + sBuffer[0] = (char)nUnicode; + return 1; + } + else if (nUnicode <= 0x000007ff) + { + if (nBufferSize < 2) + { + return 0; + } + sBuffer[0] = (char)(0xc0 + (nUnicode >> 6)); + sBuffer[1] = (char)(0x80 + (nUnicode & 0x3f)); + return 2; + } + else if (nUnicode <= 0x0000ffff) + { + if (nBufferSize < 3) + { + return 0; + } + sBuffer[0] = (char)(0xe0 + (nUnicode >> 12)); + sBuffer[1] = (char)(0x80 + ((nUnicode >> 6) & 0x3f)); + sBuffer[2] = (char)(0x80 + (nUnicode & 0x3f)); + return 3; + } + else if (nUnicode <= 0x0010ffff) + { + if (nBufferSize < 4) + { + return 0; + } + sBuffer[0] = (char)(0xf0 + (nUnicode >> 18)); + sBuffer[1] = (char)(0x80 + ((nUnicode >> 12) & 0x3f)); + sBuffer[2] = (char)(0x80 + ((nUnicode >> 6) & 0x3f)); + sBuffer[3] = (char)(0x80 + (nUnicode & 0x3f)); + return 4; + } + else + { + return 0; + } + } + + static int MapUCS2(Unicode nUnicode, char *sBuffer, int nBufferSize) + { + if (nUnicode <= 0xffff) + { + if (nBufferSize < 2) + { + return 0; + } + sBuffer[0] = (char)((nUnicode >> 8) & 0xff); + sBuffer[1] = (char)(nUnicode & 0xff); + return 2; + } + else + { + return 0; + } + } +} + +#endif // _PDF_READER_UTF8_H \ No newline at end of file diff --git a/PdfReader/Src/UnicodeMap.cpp b/PdfReader/Src/UnicodeMap.cpp new file mode 100644 index 0000000000..d0d035e2d3 --- /dev/null +++ b/PdfReader/Src/UnicodeMap.cpp @@ -0,0 +1,318 @@ +#include +#include +#include "MemoryUtils.h" +#include "File.h" +#include "StringExt.h" +#include "List.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" +#include "CharTypes.h" + +//------------------------------------------------------------------------------------------------------------------------------- + +#define maxExtCode 16 + +namespace PdfReader +{ + struct UnicodeMapExt + { + Unicode nUnicode; + char arrCode[maxExtCode]; + unsigned int unBytesCount; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + + UnicodeMap *UnicodeMap::Parse(StringExt *seEncodingName, GlobalParams *pGlobalParams) + { + FILE *pFile = NULL; + if (pGlobalParams && !(pFile = pGlobalParams->GetUnicodeMapFile(seEncodingName))) + { + // TO DO: Error "Couldn't find UnicodeMap file for the encoding" + return NULL; + } + + UnicodeMap *pMap = new UnicodeMap(seEncodingName->Copy()); + + int nSize = 8; + pMap->m_pRanges = (UnicodeMapRange *)MemUtilsMallocArray(nSize, sizeof(UnicodeMapRange)); + int nEMapsSize = 0; + + int nLineNum = 1; + char sBuffer[256]; + while (GetLine(sBuffer, sizeof(sBuffer), pFile)) + { + char *sToken1, *sToken2, *sToken3; + if ((sToken1 = strtok(sBuffer, " \t\r\n")) && (sToken2 = strtok(NULL, " \t\r\n"))) + { + if (!(sToken3 = strtok(NULL, " \t\r\n"))) + { + sToken3 = sToken2; + sToken2 = sToken1; + } + int nBytesCount = strlen(sToken3) / 2; + + if (nBytesCount <= 4) + { + if (pMap->m_nLen == nSize) + { + nSize *= 2; + pMap->m_pRanges = (UnicodeMapRange *)MemUtilsReallocArray(pMap->m_pRanges, nSize, sizeof(UnicodeMapRange)); + } + UnicodeMapRange *pRange = &pMap->m_pRanges[pMap->m_nLen]; + sscanf(sToken1, "%x", &pRange->nStart); + sscanf(sToken2, "%x", &pRange->nEnd); + sscanf(sToken3, "%x", &pRange->unCode); + pRange->nBytesCount = nBytesCount; + ++pMap->m_nLen; + } + else if (sToken2 == sToken1) + { + if (pMap->m_nEMapsLen == nEMapsSize) + { + nEMapsSize += 16; + pMap->m_pEMaps = (UnicodeMapExt *)MemUtilsReallocArray(pMap->m_pEMaps, nEMapsSize, sizeof(UnicodeMapExt)); + } + UnicodeMapExt *pEMap = &pMap->m_pEMaps[pMap->m_nEMapsLen]; + sscanf(sToken1, "%x", &pEMap->nUnicode); + for (int nIndex = 0; nIndex < nBytesCount; ++nIndex) + { + int nValue = 0; + sscanf(sToken3 + nIndex * 2, "%2x", &nValue); + pEMap->arrCode[nIndex] = (char)nValue; + } + pEMap->unBytesCount = nBytesCount; + ++pMap->m_nEMapsLen; + } + else + { + // TO DO: Error "Bad line in unicodeMap file for encoding" + } + } + else + { + // TO DO: Error "Bad line in unicodeMap file for encoding" + } + ++nLineNum; + } + + fclose(pFile); + + return pMap; + } + + UnicodeMap::UnicodeMap(StringExt *seEncodingName) + { + m_seEncodingName = seEncodingName; + m_bUnicodeOut = false; + m_eType = unicodeMapUser; + + m_pRanges = NULL; + m_nLen = 0; + + m_pEMaps = NULL; + m_nEMapsLen = 0; + + m_nRefCount = 1; + + m_oCS.InitializeCriticalSection(); + } + + UnicodeMap::UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapRange *pRanges, int nLen) + { + m_seEncodingName = new StringExt(sEncodingName); + m_bUnicodeOut = bUnicodeOut; + m_eType = unicodeMapResident; + + m_pRanges = pRanges; + m_nLen = nLen; + + m_pEMaps = NULL; + m_nEMapsLen = 0; + + m_nRefCount = 1; + + m_oCS.InitializeCriticalSection(); + } + + UnicodeMap::UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapFunc pFunction) + { + m_seEncodingName = new StringExt(sEncodingName); + m_bUnicodeOut = bUnicodeOut; + m_eType = unicodeMapFunc; + + m_pFunction = pFunction; + + m_pEMaps = NULL; + m_nEMapsLen = 0; + + m_nRefCount = 1; + + m_oCS.InitializeCriticalSection(); + } + + UnicodeMap::~UnicodeMap() + { + if (m_seEncodingName) + delete m_seEncodingName; + + if (m_eType == unicodeMapUser && m_pRanges) + { + MemUtilsFree(m_pRanges); + } + + if (m_pEMaps) + { + MemUtilsFree(m_pEMaps); + } + + m_oCS.DeleteCriticalSection(); + } + + void UnicodeMap::AddRef() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + + ++m_nRefCount; + + RELEASEOBJECT(pCS); + } + + void UnicodeMap::Release() + { + CTemporaryCS *pCS = new CTemporaryCS(&m_oCS); + + bool bDone = (--m_nRefCount == 0); + + RELEASEOBJECT(pCS); + + if (bDone) + { + delete this; + } + } + + bool UnicodeMap::Match(StringExt *seEncodingName) + { + return (!m_seEncodingName->Compare(seEncodingName)); + } + + int UnicodeMap::MapUnicode(Unicode nUnicode, char *sBuffer, int nBufferSize) + { + if (m_eType == unicodeMapFunc) + { + return (*m_pFunction)(nUnicode, sBuffer, nBufferSize); + } + + int nFirst = 0; + int nLast = m_nLen; + if (nUnicode >= m_pRanges[nFirst].nStart) + { + // m_pRanges[nFirst].nStart <= nUnicode < m_pRanges[nLast].nStart + while (nLast - nFirst > 1) + { + int nMiddle = (nFirst + nLast) / 2; + if (nUnicode >= m_pRanges[nMiddle].nStart) + { + nFirst = nMiddle; + } + else if (nUnicode < m_pRanges[nMiddle].nStart) + { + nLast = nMiddle; + } + } + + if (nUnicode <= m_pRanges[nFirst].nEnd) + { + int nLen = m_pRanges[nFirst].nBytesCount; + if (nLen > nBufferSize) + { + return 0; + } + unsigned int unCode = m_pRanges[nFirst].unCode + (nUnicode - m_pRanges[nFirst].nStart); + for (int nIndex = nLen - 1; nIndex >= 0; --nIndex) + { + sBuffer[nIndex] = (char)(unCode & 0xff); + unCode >>= 8; + } + return nLen; + } + } + + for (int nIndex = 0; nIndex < m_nEMapsLen; ++nIndex) + { + if (m_pEMaps[nIndex].nUnicode == nUnicode) + { + int nLen = m_pEMaps[nIndex].unBytesCount; + for (int nJ = 0; nJ < nLen; ++nJ) + { + sBuffer[nJ] = m_pEMaps[nIndex].arrCode[nJ]; + } + return nLen; + } + } + + return 0; + } + + //------------------------------------------------------------------------------------------------------------------------------- + + UnicodeMapCache::UnicodeMapCache() + { + for (int nIndex = 0; nIndex < unicodeMapCacheSize; ++nIndex) + { + m_ppCache[nIndex] = NULL; + } + } + + UnicodeMapCache::~UnicodeMapCache() + { + for (int nIndex = 0; nIndex < unicodeMapCacheSize; ++nIndex) + { + if (m_ppCache[nIndex]) + { + m_ppCache[nIndex]->Release(); + } + } + } + + UnicodeMap *UnicodeMapCache::GetUnicodeMap(StringExt *seEncodingName, GlobalParams *pGlobalParams) + { + if (m_ppCache[0] && m_ppCache[0]->Match(seEncodingName)) + { + m_ppCache[0]->AddRef(); + return m_ppCache[0]; + } + UnicodeMap *pMap = NULL; + for (int nIndex = 1; nIndex < unicodeMapCacheSize; ++nIndex) + { + if (m_ppCache[nIndex] && m_ppCache[nIndex]->Match(seEncodingName)) + { + pMap = m_ppCache[nIndex]; + for (int nJ = nIndex; nJ >= 1; --nJ) + { + m_ppCache[nJ] = m_ppCache[nJ - 1]; + } + m_ppCache[0] = pMap; + pMap->AddRef(); + return pMap; + } + } + if ((pMap = UnicodeMap::Parse(seEncodingName, pGlobalParams))) + { + if (m_ppCache[unicodeMapCacheSize - 1]) + { + m_ppCache[unicodeMapCacheSize - 1]->Release(); + } + for (int nJ = unicodeMapCacheSize - 1; nJ >= 1; --nJ) + { + m_ppCache[nJ] = m_ppCache[nJ - 1]; + } + m_ppCache[0] = pMap; + pMap->AddRef(); + return pMap; + } + return NULL; + } +} diff --git a/PdfReader/Src/UnicodeMap.h b/PdfReader/Src/UnicodeMap.h new file mode 100644 index 0000000000..190d592a7e --- /dev/null +++ b/PdfReader/Src/UnicodeMap.h @@ -0,0 +1,117 @@ +#ifndef _PDF_READER_UNICODE_MAP_H +#define _PDF_READER_UNICODE_MAP_H + +#include "CharTypes.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" + +namespace PdfReader +{ + class StringExt; + + //------------------------------------------------------------------------------------------------------------------------------- + + enum UnicodeMapType + { + unicodeMapUser, // Чтение из файла + unicodeMapResident, // Статический список + unicodeMapFunc // Указатель на функцию + }; + + typedef int(*UnicodeMapFunc)(Unicode nUnicode, char *sBuffer, int nBufferSize); + + struct UnicodeMapRange + { + Unicode nStart; // Диапазон юникодных символов + Unicode nEnd; // + unsigned int unCode; // Первый код + unsigned int nBytesCount; // + }; + + struct UnicodeMapExt; + + //------------------------------------------------------------------------------------------------------------------------------- + // UnicodeMap + //------------------------------------------------------------------------------------------------------------------------------- + + class UnicodeMap + { + public: + + // Создаем UnicodeMap по имени . Устанавливаем счетчик ссылок равный 1. + static UnicodeMap *Parse(StringExt *seEncodingName, GlobalParams *pGlobalParams); + + // Создаем Resident UnicodeMap. + UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapRange *pRanges, int nLen); + + // Создаем Resident UnicodeMap, который использует функцию вместо диапазона значений. + UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapFunc pFunction); + + ~UnicodeMap(); + + // Счетчик ссылок + void AddRef(); + void Release(); + + StringExt *GetEncodingName() + { + return m_seEncodingName; + } + + bool IsUnicode() + { + return m_bUnicodeOut; + } + + + // Совпадают ли названия кодировок? + bool Match(StringExt *seEncodingName); + + // Находим образ текущего юникодного значения в кодировке. Заполняем результатом и возвращаем + // количество используемых байт. Никаких строковых разделителей (типа \0) не пишем. + int MapUnicode(Unicode nUnicode, char *sBuffer, int nBufferSize); + + private: + + UnicodeMap(StringExt *seEncodingName); + + private: + + StringExt *m_seEncodingName; + UnicodeMapType m_eType; + bool m_bUnicodeOut; + union + { + UnicodeMapRange *m_pRanges; // Для типов: User, Resident + UnicodeMapFunc m_pFunction; // Для типа Func + }; + int m_nLen; // User, Resident + UnicodeMapExt *m_pEMaps; // User + int m_nEMapsLen; // User + + int m_nRefCount; + + NSCriticalSection::CRITICAL_SECTION m_oCS; + }; + + //------------------------------------------------------------------------------------------------------------------------------- + // UnicodeMapCache + //------------------------------------------------------------------------------------------------------------------------------- + +#define unicodeMapCacheSize 4 + + class UnicodeMapCache + { + public: + + UnicodeMapCache(); + ~UnicodeMapCache(); + + UnicodeMap *GetUnicodeMap(StringExt *seEncodingName, GlobalParams *pGlobalParams); + + private: + + UnicodeMap *m_ppCache[unicodeMapCacheSize]; + }; +} + +#endif // _PDF_READER_UNICODE_MAP_H diff --git a/PdfReader/Src/UnicodeMapTables.h b/PdfReader/Src/UnicodeMapTables.h new file mode 100644 index 0000000000..4a171958a4 --- /dev/null +++ b/PdfReader/Src/UnicodeMapTables.h @@ -0,0 +1,365 @@ +#ifndef _PDF_READER_UNICODE_MAP_TABLES_H +#define _PDF_READER_UNICODE_MAP_TABLES_H + +namespace PdfReader +{ + static UnicodeMapRange c_arrLatin1UnicodeMapRanges[] = + { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x007e, 0x20, 1 }, + { 0x00a0, 0x00a0, 0x20, 1 }, + { 0x00a1, 0x00ac, 0xa1, 1 }, + { 0x00ae, 0x00ff, 0xae, 1 }, + { 0x010c, 0x010c, 0x43, 1 }, + { 0x010d, 0x010d, 0x63, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0142, 0x0142, 0x6c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0161, 0x0161, 0x73, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x017e, 0x017e, 0x7a, 1 }, + { 0x02c6, 0x02c6, 0x5e, 1 }, + { 0x02da, 0x02da, 0xb0, 1 }, + { 0x02dc, 0x02dc, 0x7e, 1 }, + { 0x2013, 0x2013, 0xad, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201a, 0x201a, 0x2c, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x201e, 0x201e, 0x2c2c, 2 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2039, 0x2039, 0x3c, 1 }, + { 0x203a, 0x203a, 0x3e, 1 }, + { 0x2044, 0x2044, 0x2f, 1 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fc, 0xf6fc, 0xb0, 1 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7a1, 0xf7a2, 0xa1, 1 }, + { 0xf7bf, 0xf7bf, 0xbf, 1 }, + { 0xf7e0, 0xf7f6, 0xc0, 1 }, + { 0xf7f8, 0xf7fe, 0xd8, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 } + }; +#define Latin1UnicodeMapLen (sizeof(c_arrLatin1UnicodeMapRanges) / sizeof(UnicodeMapRange)) + + static UnicodeMapRange c_arrASCII7UnicodeMapRanges[] = + { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x005f, 0x20, 1 }, + { 0x0061, 0x007e, 0x61, 1 }, + { 0x00a6, 0x00a6, 0x7c, 1 }, + { 0x00a9, 0x00a9, 0x286329, 3 }, + { 0x00ae, 0x00ae, 0x285229, 3 }, + { 0x00b7, 0x00b7, 0x2a, 1 }, + { 0x00bc, 0x00bc, 0x312f34, 3 }, + { 0x00bd, 0x00bd, 0x312f32, 3 }, + { 0x00be, 0x00be, 0x332f34, 3 }, + { 0x00c0, 0x00c0, 0x41, 1 }, + { 0x00c1, 0x00c1, 0x41, 1 }, + { 0x00c2, 0x00c2, 0x41, 1 }, + { 0x00c3, 0x00c3, 0x41, 1 }, + { 0x00c4, 0x00c4, 0x41, 1 }, + { 0x00c5, 0x00c5, 0x41, 1 }, + { 0x00c6, 0x00c6, 0x4145, 2 }, + { 0x00c7, 0x00c7, 0x43, 1 }, + { 0x00c8, 0x00c8, 0x45, 1 }, + { 0x00c9, 0x00c9, 0x45, 1 }, + { 0x00ca, 0x00ca, 0x45, 1 }, + { 0x00cb, 0x00cb, 0x45, 1 }, + { 0x00cc, 0x00cc, 0x49, 1 }, + { 0x00cd, 0x00cd, 0x49, 1 }, + { 0x00ce, 0x00ce, 0x49, 1 }, + { 0x00cf, 0x00cf, 0x49, 1 }, + { 0x00d1, 0x00d2, 0x4e, 1 }, + { 0x00d3, 0x00d3, 0x4f, 1 }, + { 0x00d4, 0x00d4, 0x4f, 1 }, + { 0x00d5, 0x00d5, 0x4f, 1 }, + { 0x00d6, 0x00d6, 0x4f, 1 }, + { 0x00d7, 0x00d7, 0x78, 1 }, + { 0x00d8, 0x00d8, 0x4f, 1 }, + { 0x00d9, 0x00d9, 0x55, 1 }, + { 0x00da, 0x00da, 0x55, 1 }, + { 0x00db, 0x00db, 0x55, 1 }, + { 0x00dc, 0x00dc, 0x55, 1 }, + { 0x00dd, 0x00dd, 0x59, 1 }, + { 0x00e0, 0x00e0, 0x61, 1 }, + { 0x00e1, 0x00e1, 0x61, 1 }, + { 0x00e2, 0x00e2, 0x61, 1 }, + { 0x00e3, 0x00e3, 0x61, 1 }, + { 0x00e4, 0x00e4, 0x61, 1 }, + { 0x00e5, 0x00e5, 0x61, 1 }, + { 0x00e6, 0x00e6, 0x6165, 2 }, + { 0x00e7, 0x00e7, 0x63, 1 }, + { 0x00e8, 0x00e8, 0x65, 1 }, + { 0x00e9, 0x00e9, 0x65, 1 }, + { 0x00ea, 0x00ea, 0x65, 1 }, + { 0x00eb, 0x00eb, 0x65, 1 }, + { 0x00ec, 0x00ec, 0x69, 1 }, + { 0x00ed, 0x00ed, 0x69, 1 }, + { 0x00ee, 0x00ee, 0x69, 1 }, + { 0x00ef, 0x00ef, 0x69, 1 }, + { 0x00f1, 0x00f2, 0x6e, 1 }, + { 0x00f3, 0x00f3, 0x6f, 1 }, + { 0x00f4, 0x00f4, 0x6f, 1 }, + { 0x00f5, 0x00f5, 0x6f, 1 }, + { 0x00f6, 0x00f6, 0x6f, 1 }, + { 0x00f7, 0x00f7, 0x2f, 1 }, + { 0x00f8, 0x00f8, 0x6f, 1 }, + { 0x00f9, 0x00f9, 0x75, 1 }, + { 0x00fa, 0x00fa, 0x75, 1 }, + { 0x00fb, 0x00fb, 0x75, 1 }, + { 0x00fc, 0x00fc, 0x75, 1 }, + { 0x00fd, 0x00fd, 0x79, 1 }, + { 0x00ff, 0x00ff, 0x79, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x2013, 0x2013, 0x2d, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x2022, 0x2022, 0x2a, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7e0, 0xf7e0, 0x41, 1 }, + { 0xf7e1, 0xf7e1, 0x41, 1 }, + { 0xf7e2, 0xf7e2, 0x41, 1 }, + { 0xf7e3, 0xf7e3, 0x41, 1 }, + { 0xf7e4, 0xf7e4, 0x41, 1 }, + { 0xf7e5, 0xf7e5, 0x41, 1 }, + { 0xf7e6, 0xf7e6, 0x4145, 2 }, + { 0xf7e7, 0xf7e7, 0x43, 1 }, + { 0xf7e8, 0xf7e8, 0x45, 1 }, + { 0xf7e9, 0xf7e9, 0x45, 1 }, + { 0xf7ea, 0xf7ea, 0x45, 1 }, + { 0xf7eb, 0xf7eb, 0x45, 1 }, + { 0xf7ec, 0xf7ec, 0x49, 1 }, + { 0xf7ed, 0xf7ed, 0x49, 1 }, + { 0xf7ee, 0xf7ee, 0x49, 1 }, + { 0xf7ef, 0xf7ef, 0x49, 1 }, + { 0xf7f1, 0xf7f2, 0x4e, 1 }, + { 0xf7f3, 0xf7f3, 0x4f, 1 }, + { 0xf7f4, 0xf7f4, 0x4f, 1 }, + { 0xf7f5, 0xf7f5, 0x4f, 1 }, + { 0xf7f6, 0xf7f6, 0x4f, 1 }, + { 0xf7f8, 0xf7f8, 0x4f, 1 }, + { 0xf7f9, 0xf7f9, 0x55, 1 }, + { 0xf7fa, 0xf7fa, 0x55, 1 }, + { 0xf7fb, 0xf7fb, 0x55, 1 }, + { 0xf7fc, 0xf7fc, 0x55, 1 }, + { 0xf7fd, 0xf7fd, 0x59, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 } + }; +#define ASCII7UnicodeMapLen (sizeof(c_arrASCII7UnicodeMapRanges) / sizeof(UnicodeMapRange)) + + static UnicodeMapRange c_arrSymbolUnicodeMapRanges[] = + { + { 0x0020, 0x0021, 0x20, 1 }, + { 0x0023, 0x0023, 0x23, 1 }, + { 0x0025, 0x0026, 0x25, 1 }, + { 0x0028, 0x0029, 0x28, 1 }, + { 0x002b, 0x002c, 0x2b, 1 }, + { 0x002e, 0x003f, 0x2e, 1 }, + { 0x005b, 0x005b, 0x5b, 1 }, + { 0x005d, 0x005d, 0x5d, 1 }, + { 0x005f, 0x005f, 0x5f, 1 }, + { 0x007b, 0x007d, 0x7b, 1 }, + { 0x00ac, 0x00ac, 0xd8, 1 }, + { 0x00b0, 0x00b1, 0xb0, 1 }, + { 0x00b5, 0x00b5, 0x6d, 1 }, + { 0x00d7, 0x00d7, 0xb4, 1 }, + { 0x00f7, 0x00f7, 0xb8, 1 }, + { 0x0192, 0x0192, 0xa6, 1 }, + { 0x0391, 0x0392, 0x41, 1 }, + { 0x0393, 0x0393, 0x47, 1 }, + { 0x0395, 0x0395, 0x45, 1 }, + { 0x0396, 0x0396, 0x5a, 1 }, + { 0x0397, 0x0397, 0x48, 1 }, + { 0x0398, 0x0398, 0x51, 1 }, + { 0x0399, 0x0399, 0x49, 1 }, + { 0x039a, 0x039d, 0x4b, 1 }, + { 0x039e, 0x039e, 0x58, 1 }, + { 0x039f, 0x03a0, 0x4f, 1 }, + { 0x03a1, 0x03a1, 0x52, 1 }, + { 0x03a3, 0x03a5, 0x53, 1 }, + { 0x03a6, 0x03a6, 0x46, 1 }, + { 0x03a7, 0x03a7, 0x43, 1 }, + { 0x03a8, 0x03a8, 0x59, 1 }, + { 0x03b1, 0x03b2, 0x61, 1 }, + { 0x03b3, 0x03b3, 0x67, 1 }, + { 0x03b4, 0x03b5, 0x64, 1 }, + { 0x03b6, 0x03b6, 0x7a, 1 }, + { 0x03b7, 0x03b7, 0x68, 1 }, + { 0x03b8, 0x03b8, 0x71, 1 }, + { 0x03b9, 0x03b9, 0x69, 1 }, + { 0x03ba, 0x03bb, 0x6b, 1 }, + { 0x03bd, 0x03bd, 0x6e, 1 }, + { 0x03be, 0x03be, 0x78, 1 }, + { 0x03bf, 0x03c0, 0x6f, 1 }, + { 0x03c1, 0x03c1, 0x72, 1 }, + { 0x03c2, 0x03c2, 0x56, 1 }, + { 0x03c3, 0x03c5, 0x73, 1 }, + { 0x03c6, 0x03c6, 0x66, 1 }, + { 0x03c7, 0x03c7, 0x63, 1 }, + { 0x03c8, 0x03c8, 0x79, 1 }, + { 0x03c9, 0x03c9, 0x77, 1 }, + { 0x03d1, 0x03d1, 0x4a, 1 }, + { 0x03d2, 0x03d2, 0xa1, 1 }, + { 0x03d5, 0x03d5, 0x6a, 1 }, + { 0x03d6, 0x03d6, 0x76, 1 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0xbc, 1 }, + { 0x2032, 0x2032, 0xa2, 1 }, + { 0x2033, 0x2033, 0xb2, 1 }, + { 0x2044, 0x2044, 0xa4, 1 }, + { 0x2111, 0x2111, 0xc1, 1 }, + { 0x2118, 0x2118, 0xc3, 1 }, + { 0x211c, 0x211c, 0xc2, 1 }, + { 0x2126, 0x2126, 0x57, 1 }, + { 0x2135, 0x2135, 0xc0, 1 }, + { 0x2190, 0x2193, 0xac, 1 }, + { 0x2194, 0x2194, 0xab, 1 }, + { 0x21b5, 0x21b5, 0xbf, 1 }, + { 0x21d0, 0x21d3, 0xdc, 1 }, + { 0x21d4, 0x21d4, 0xdb, 1 }, + { 0x2200, 0x2200, 0x22, 1 }, + { 0x2202, 0x2202, 0xb6, 1 }, + { 0x2203, 0x2203, 0x24, 1 }, + { 0x2205, 0x2205, 0xc6, 1 }, + { 0x2206, 0x2206, 0x44, 1 }, + { 0x2207, 0x2207, 0xd1, 1 }, + { 0x2208, 0x2209, 0xce, 1 }, + { 0x220b, 0x220b, 0x27, 1 }, + { 0x220f, 0x220f, 0xd5, 1 }, + { 0x2211, 0x2211, 0xe5, 1 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0x2217, 0x2217, 0x2a, 1 }, + { 0x221a, 0x221a, 0xd6, 1 }, + { 0x221d, 0x221d, 0xb5, 1 }, + { 0x221e, 0x221e, 0xa5, 1 }, + { 0x2220, 0x2220, 0xd0, 1 }, + { 0x2227, 0x2228, 0xd9, 1 }, + { 0x2229, 0x222a, 0xc7, 1 }, + { 0x222b, 0x222b, 0xf2, 1 }, + { 0x2234, 0x2234, 0x5c, 1 }, + { 0x223c, 0x223c, 0x7e, 1 }, + { 0x2245, 0x2245, 0x40, 1 }, + { 0x2248, 0x2248, 0xbb, 1 }, + { 0x2260, 0x2261, 0xb9, 1 }, + { 0x2264, 0x2264, 0xa3, 1 }, + { 0x2265, 0x2265, 0xb3, 1 }, + { 0x2282, 0x2282, 0xcc, 1 }, + { 0x2283, 0x2283, 0xc9, 1 }, + { 0x2284, 0x2284, 0xcb, 1 }, + { 0x2286, 0x2286, 0xcd, 1 }, + { 0x2287, 0x2287, 0xca, 1 }, + { 0x2295, 0x2295, 0xc5, 1 }, + { 0x2297, 0x2297, 0xc4, 1 }, + { 0x22a5, 0x22a5, 0x5e, 1 }, + { 0x22c5, 0x22c5, 0xd7, 1 }, + { 0x2320, 0x2320, 0xf3, 1 }, + { 0x2321, 0x2321, 0xf5, 1 }, + { 0x2329, 0x2329, 0xe1, 1 }, + { 0x232a, 0x232a, 0xf1, 1 }, + { 0x25ca, 0x25ca, 0xe0, 1 }, + { 0x2660, 0x2660, 0xaa, 1 }, + { 0x2663, 0x2663, 0xa7, 1 }, + { 0x2665, 0x2665, 0xa9, 1 }, + { 0x2666, 0x2666, 0xa8, 1 }, + { 0xf6d9, 0xf6d9, 0xd3, 1 }, + { 0xf6da, 0xf6da, 0xd2, 1 }, + { 0xf6db, 0xf6db, 0xd4, 1 }, + { 0xf8e5, 0xf8e5, 0x60, 1 }, + { 0xf8e6, 0xf8e7, 0xbd, 1 }, + { 0xf8e8, 0xf8ea, 0xe2, 1 }, + { 0xf8eb, 0xf8f4, 0xe6, 1 }, + { 0xf8f5, 0xf8f5, 0xf4, 1 }, + { 0xf8f6, 0xf8fe, 0xf6, 1 } + }; +#define SymbolUnicodeMapLen (sizeof(c_arrSymbolUnicodeMapRanges) / sizeof(UnicodeMapRange)) + + static UnicodeMapRange c_arrZapfDingbatsUnicodeMapRanges[] = + { + { 0x0020, 0x0020, 0x20, 1 }, + { 0x2192, 0x2192, 0xd5, 1 }, + { 0x2194, 0x2195, 0xd6, 1 }, + { 0x2460, 0x2469, 0xac, 1 }, + { 0x25a0, 0x25a0, 0x6e, 1 }, + { 0x25b2, 0x25b2, 0x73, 1 }, + { 0x25bc, 0x25bc, 0x74, 1 }, + { 0x25c6, 0x25c6, 0x75, 1 }, + { 0x25cf, 0x25cf, 0x6c, 1 }, + { 0x25d7, 0x25d7, 0x77, 1 }, + { 0x2605, 0x2605, 0x48, 1 }, + { 0x260e, 0x260e, 0x25, 1 }, + { 0x261b, 0x261b, 0x2a, 1 }, + { 0x261e, 0x261e, 0x2b, 1 }, + { 0x2660, 0x2660, 0xab, 1 }, + { 0x2663, 0x2663, 0xa8, 1 }, + { 0x2665, 0x2665, 0xaa, 1 }, + { 0x2666, 0x2666, 0xa9, 1 }, + { 0x2701, 0x2704, 0x21, 1 }, + { 0x2706, 0x2709, 0x26, 1 }, + { 0x270c, 0x2727, 0x2c, 1 }, + { 0x2729, 0x274b, 0x49, 1 }, + { 0x274d, 0x274d, 0x6d, 1 }, + { 0x274f, 0x2752, 0x6f, 1 }, + { 0x2756, 0x2756, 0x76, 1 }, + { 0x2758, 0x275e, 0x78, 1 }, + { 0x2761, 0x2767, 0xa1, 1 }, + { 0x2776, 0x2794, 0xb6, 1 }, + { 0x2798, 0x27af, 0xd8, 1 }, + { 0x27b1, 0x27be, 0xf1, 1 } + }; +#define ZapfDingbatsUnicodeMapLen (sizeof(c_arrZapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange)) +} + +#endif // _PDF_READER_UNICODE_MAP_TABLES_H \ No newline at end of file diff --git a/PdfReader/Src/XRef.cpp b/PdfReader/Src/XRef.cpp new file mode 100644 index 0000000000..17615c44a6 --- /dev/null +++ b/PdfReader/Src/XRef.cpp @@ -0,0 +1,1038 @@ +#include +#include +#include +#include +#include "MemoryUtils.h" +#include "Object.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "Dict.h" +#include "ErrorConstants.h" +#include "XRef.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" + +namespace PdfReader +{ +#define XrefSearchSize 1024 // Читаем столько байт, начиная с конца файла, чтобы найти 'startxref' + + //--------------------------------------------------------------------------------------------------------------------------- + // Permission bits + //--------------------------------------------------------------------------------------------------------------------------- + +#define PermissionPrint ( 1 << 2 ) +#define PermissionChange ( 1 << 3 ) +#define PermissionCopy ( 1 << 4 ) +#define PermissionNotes ( 1 << 5 ) +#define DefaultPermissionFlags 0xfffc + + //--------------------------------------------------------------------------------------------------------------------------- + // ObjectStream + //--------------------------------------------------------------------------------------------------------------------------- + + class ObjectStream + { + public: + + ObjectStream(XRef *pXref, int nObjectStreamNum); + + ~ObjectStream(); + + int GetObjectStreamNum() + { + return m_nObjectStreamNum; + } + + Object *GetObject(int nObjectIndex, int nObjectNum, Object *pObject); + + private: + + int m_nObjectStreamNum; // Порядковый номер объекта(Stream Objects) + int m_nObjectsCount; // Количество объектов в потоке + Object *m_arrObjects; // Список объектов в потоке + int *m_arrObjectsNums; // Порядковые номера объектов в потоке + + }; + + ObjectStream::ObjectStream(XRef *pXref, int nObjectStreamNum) + { + Object oTempObject1, oTempObject2; + + m_nObjectStreamNum = nObjectStreamNum; + m_nObjectsCount = 0; + m_arrObjects = NULL; + m_arrObjectsNums = NULL; + + Object oObjectStream; + if (!pXref->Fetch(m_nObjectStreamNum, 0, &oObjectStream)->IsStream()) + { + oObjectStream.Free(); + return; + } + + if (!oObjectStream.StreamGetDict()->Search("N", &oTempObject1)->IsInt()) + { + oTempObject1.Free(); + oObjectStream.Free(); + return; + } + m_nObjectsCount = oTempObject1.GetInt(); + oTempObject1.Free(); + + if (m_nObjectsCount <= 0) + { + oObjectStream.Free(); + return; + } + + if (!oObjectStream.StreamGetDict()->Search("First", &oTempObject1)->IsInt()) + { + oTempObject1.Free(); + oObjectStream.Free(); + return; + } + + int nFirst = oTempObject1.GetInt(); + oTempObject1.Free(); + + if (nFirst < 0) + { + oObjectStream.Free(); + return; + } + + m_arrObjects = new Object[m_nObjectsCount]; + m_arrObjectsNums = (int *)MemUtilsMallocArray(m_nObjectsCount, sizeof(int)); + int *arrnOffsets = (int *)MemUtilsMallocArray(m_nObjectsCount, sizeof(int)); + + oObjectStream.StreamReset(); + oTempObject1.InitNull(); + + Stream *pStream = new EmbedStream(oObjectStream.GetStream(), &oTempObject1, true, nFirst); + Parser *pParser = new Parser(pXref, new Lexer(pXref, pStream), false); + for (int nIndex = 0; nIndex < m_nObjectsCount; ++nIndex) + { + pParser->GetObject(&oTempObject1); + pParser->GetObject(&oTempObject2); + + if (!oTempObject1.IsInt() || !oTempObject2.IsInt()) + { + oTempObject1.Free(); + oTempObject2.Free(); + delete pParser; + MemUtilsFree(arrnOffsets); + oObjectStream.Free(); + return; + } + m_arrObjectsNums[nIndex] = oTempObject1.GetInt(); + arrnOffsets[nIndex] = oTempObject2.GetInt(); + oTempObject1.Free(); + oTempObject2.Free(); + if (m_arrObjectsNums[nIndex] < 0 || arrnOffsets[nIndex] < 0 || (nIndex > 0 && arrnOffsets[nIndex] < arrnOffsets[nIndex - 1])) + { + delete pParser; + MemUtilsFree(arrnOffsets); + oObjectStream.Free(); + return; + } + } + while (pStream->GetChar() != EOF); + delete pParser; + + // Сдвигаемся к началу первого объекта + for (int nIndex = nFirst; nIndex < arrnOffsets[0]; ++nIndex) + { + oObjectStream.GetStream()->GetChar(); + } + + for (int nIndex = 0; nIndex < m_nObjectsCount; ++nIndex) + { + oTempObject1.InitNull(); + if (nIndex == m_nObjectsCount - 1) + { + pStream = new EmbedStream(oObjectStream.GetStream(), &oTempObject1, false, 0); + } + else + { + pStream = new EmbedStream(oObjectStream.GetStream(), &oTempObject1, true, arrnOffsets[nIndex + 1] - arrnOffsets[nIndex]); + } + pParser = new Parser(pXref, new Lexer(pXref, pStream), false); + pParser->GetObject(&m_arrObjects[nIndex]); + while (pStream->GetChar() != EOF); + delete pParser; + } + + MemUtilsFree(arrnOffsets); + + oObjectStream.Free(); + return; + } + + ObjectStream::~ObjectStream() + { + if (m_arrObjects) + { + for (int nIndex = 0; nIndex < m_nObjectsCount; ++nIndex) + { + m_arrObjects[nIndex].Free(); + } + delete[] m_arrObjects; + } + MemUtilsFree(m_arrObjectsNums); + } + + Object *ObjectStream::GetObject(int nObjectIndex, int nObjectNum, Object *pObject) + { + if (nObjectIndex < 0 || nObjectIndex >= m_nObjectsCount || nObjectNum != m_arrObjectsNums[nObjectIndex]) + { + return pObject->InitNull(); + } + return m_arrObjects[nObjectIndex].Copy(pObject); + } + + //------------------------------------------------------------------------ + // XRef + //------------------------------------------------------------------------ + + XRef::XRef(BaseStream *pStream) + { + m_oCS.InitializeCriticalSection(); + + m_bValidXref = true; + m_eErrorCode = errorNone; + m_nEntrySize = 0; + m_arrEntries = NULL; + m_punStreamEnds = NULL; + m_nStreamEndsCount = 0; + m_pObjectStream = NULL; + + m_bEncrypted = false; + m_nPermissionFlags = DefaultPermissionFlags; + m_bOwnerPassword = false; + + // Читаем Trailer + m_pStream = pStream; + m_nStart = m_pStream->GetStartPos(); + unsigned int nPos = GetStartXref(); + + // Если возникла проблема при поиске 'startxref', пытаемся восстановить + // таблицу xref + + if (0 == nPos) + { + if (!(m_bValidXref = ConstructXRef())) + { + m_eErrorCode = errorDamaged; + return; + } + } + else // читаем таблицу Xref + { + while (ReadXRef(&nPos)); + + // Если возникла проблема при поиске 'startxref', пытаемся восстановить + // таблицу xref + if (!m_bValidXref) + { + if (!(m_bValidXref = ConstructXRef())) + { + m_eErrorCode = errorDamaged; + return; + } + } + } + + Object oTempObject; + + m_oTrailerDict.DictLookupAndCopy("Root", &oTempObject); + if (oTempObject.IsRef()) + { + m_nRootNum = oTempObject.GetRefNum(); + m_nRootGen = oTempObject.GetRefGen(); + oTempObject.Free(); + } + else + { + oTempObject.Free(); + if (!(m_bValidXref = ConstructXRef())) + { + m_eErrorCode = errorDamaged; + return; + } + } + + // Теперь устанавливаем в словарь Trailer ссылку на таблиу xref, чтобы мы могли + // по данной таблице находить косвенные объекты + m_oTrailerDict.GetDict()->SetXRef(this); + } + + XRef::~XRef() + { + MemUtilsFree(m_arrEntries); + m_oTrailerDict.Free(); + if (m_punStreamEnds) + { + MemUtilsFree(m_punStreamEnds); + } + if (m_pObjectStream) + { + delete m_pObjectStream; + } + + m_oCS.DeleteCriticalSection(); + } + + unsigned int XRef::GetStartXref() + { + char sBuffer[XrefSearchSize + 1]; + char *pCurChar; + int nChar = 0, nPos = 0, nCur = 0; + + // считываем последние xrefSearchSize байт + m_pStream->SetPos(XrefSearchSize, -1); + for (nPos = 0; nPos < XrefSearchSize; ++nPos) + { + if ((nChar = m_pStream->GetChar()) == EOF) + { + break; + } + sBuffer[nPos] = nChar; + } + sBuffer[nPos] = '\0'; + + // ищем startxref + for (nCur = nPos - 9; nCur >= 0; --nCur) + { + if (!strncmp(&sBuffer[nCur], "startxref", 9)) + { + break; + } + } + if (nCur < 0) + return 0; + + for (pCurChar = &sBuffer[nCur + 9]; isspace(*pCurChar); ++pCurChar); + + m_unLastXRefOffset = StrintToUInt(pCurChar); + + return m_unLastXRefOffset; + } + + // Считываем одну секцию таблицы Xref. Также считываем соответствующий словарь Trailer + // и возвращаем указатель на предыдущий. + bool XRef::ReadXRef(unsigned int *punPos) + { + Object oObject; + bool bResult = true; + + oObject.InitNull(); + Parser *pParser = new Parser(NULL, new Lexer(NULL, m_pStream->MakeSubStream(m_nStart + *punPos, false, 0, &oObject)), true); + pParser->GetObject(&oObject); + + // Парсим таблицу xref в старой форме + if (oObject.IsCommand("xref")) + { + oObject.Free(); + bResult = ReadXRefTable(pParser, punPos); + } + // Парсим таблицу xref, когда она записана в виде потока + else if (oObject.IsInt()) + { + oObject.Free(); + if (!pParser->GetObject(&oObject)->IsInt()) + { + oObject.Free(); + delete pParser; + m_bValidXref = false; + return false; + } + oObject.Free(); + if (!pParser->GetObject(&oObject)->IsCommand("obj")) + { + oObject.Free(); + delete pParser; + m_bValidXref = false; + return false; + } + oObject.Free(); + if (!pParser->GetObject(&oObject)->IsStream()) + { + oObject.Free(); + delete pParser; + m_bValidXref = false; + return false; + } + bResult = ReadXRefStream(oObject.GetStream(), punPos); + oObject.Free(); + + } + else + { + oObject.Free(); + delete pParser; + m_bValidXref = false; + return false; + } + + delete pParser; + return bResult; + } + + bool XRef::ReadXRefTable(Parser *pParser, unsigned int *punPos) + { + Object oTempObject; + + while (1) + { + // сначала в секции идут номер первого объекта и количество объектов + pParser->GetObject(&oTempObject); + if (oTempObject.IsCommand("trailer")) + { + oTempObject.Free(); + break; + } + if (!oTempObject.IsInt()) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + int nFirst = oTempObject.GetInt(); + oTempObject.Free(); + if (!pParser->GetObject(&oTempObject)->IsInt()) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + int nCount = oTempObject.GetInt(); + oTempObject.Free(); + + if (nFirst < 0 || nCount < 0 || nFirst + nCount < 0) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + if (nFirst + nCount > m_nEntrySize) + { + int nNewSize = 0; + for (nNewSize = m_nEntrySize ? 2 * m_nEntrySize : 1024; nFirst + nCount > nNewSize && nNewSize > 0; nNewSize <<= 1); + if (nNewSize < 0) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + m_arrEntries = (XRefEntry *)MemUtilsReallocArray(m_arrEntries, nNewSize, sizeof(XRefEntry)); + for (int nIndex = m_nEntrySize; nIndex < nNewSize; ++nIndex) + { + m_arrEntries[nIndex].unOffset = 0xffffffff; + m_arrEntries[nIndex].eType = xrefEntryFree; + } + m_nEntrySize = nNewSize; + } + for (int nIndex = nFirst; nIndex < nFirst + nCount; ++nIndex) + { + // формат: nnnnnnnnnn ggggg n eol + // nnnnnnnnnn - байтовый сдвиг + // ggggg - Generation number(номер версии объекта) + // n - Ключ, определяющий используется ли объект + // eol - Конец строки(два символа) + if (!pParser->GetObject(&oTempObject)->IsInt()) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + + XRefEntry oEntry; + oEntry.unOffset = (unsigned int)oTempObject.GetInt(); + oTempObject.Free(); + if (!pParser->GetObject(&oTempObject)->IsInt()) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + oEntry.nGen = oTempObject.GetInt(); + oTempObject.Free(); + pParser->GetObject(&oTempObject); + if (oTempObject.IsCommand("n")) + { + oEntry.eType = xrefEntryUncompressed; + } + else if (oTempObject.IsCommand("f")) + { + oEntry.eType = xrefEntryFree; + } + else + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + oTempObject.Free(); + if (m_arrEntries[nIndex].unOffset == 0xffffffff) + { + m_arrEntries[nIndex] = oEntry; + // в PDF файлах, созданных с помощью Intellectual Property + // Network, имеется баг: таблица Xref начинается с объекта + // под номером 1, вместо 0. + if (nIndex == 1 && nFirst == 1 && m_arrEntries[1].unOffset == 0 && m_arrEntries[1].nGen == 65535 && m_arrEntries[1].eType == xrefEntryFree) + { + nIndex = nFirst = 0; + m_arrEntries[0] = m_arrEntries[1]; + m_arrEntries[1].unOffset = 0xffffffff; + } + } + } + } + + // Читаем словарь Trailer + if (!pParser->GetObject(&oTempObject)->IsDict()) + { + oTempObject.Free(); + m_bValidXref = false; + return false; + } + + // Считываем указатель 'Prev' + Object oPrev; + bool bPrev = false; + oTempObject.GetDict()->SearchAndCopy("Prev", &oPrev); + if (oPrev.IsInt()) + { + *punPos = (unsigned int)oPrev.GetInt(); + bPrev = true; + } + else if (oPrev.IsRef()) + { + // Некоторые программы пишут "/Prev NNN 0 R" вместо "/Prev NNN" + *punPos = (unsigned int)oPrev.GetRefNum(); + bPrev = true; + } + else + { + bPrev = false; + } + oPrev.Free(); + + // Сохраняем первый словарь Trailer + if (m_oTrailerDict.IsNone()) + { + oTempObject.Copy(&m_oTrailerDict); + } + + // Проверяем есть ли элемент 'XRefStm' + if (oTempObject.GetDict()->Search("XRefStm", &oPrev)->IsInt()) + { + unsigned int unPos2 = (unsigned int)oPrev.GetInt(); + ReadXRef(&unPos2); + if (!m_bValidXref) + { + oPrev.Free(); + oTempObject.Free(); + m_bValidXref = false; + return false; + } + } + oPrev.Free(); + + oTempObject.Free(); + return bPrev; + } + + bool XRef::ReadXRefStream(Stream *pXrefStream, unsigned int *punPos) + { + int arrW[3]; + + Dict *pDict = pXrefStream->GetDict(); + Object oTemp; + + if (!pDict->SearchAndCopy("Size", &oTemp)->IsInt()) + { + oTemp.Free(); + m_bValidXref = false; + return false; + } + int nNewSize = oTemp.GetInt(); + oTemp.Free(); + + if (nNewSize < 0) + { + oTemp.Free(); + m_bValidXref = false; + return false; + } + if (nNewSize > m_nEntrySize) + { + m_arrEntries = (XRefEntry *)MemUtilsReallocArray(m_arrEntries, nNewSize, sizeof(XRefEntry)); + for (int nIndex = m_nEntrySize; nIndex < nNewSize; ++nIndex) + { + m_arrEntries[nIndex].unOffset = 0xffffffff; + m_arrEntries[nIndex].eType = xrefEntryFree; + } + m_nEntrySize = nNewSize; + } + + if (!pDict->SearchAndCopy("W", &oTemp)->IsArray() || oTemp.ArrayGetLength() < 3) + { + oTemp.Free(); + m_bValidXref = false; + return false; + } + for (int nIndex = 0; nIndex < 3; ++nIndex) + { + Object oWItem; + if (!oTemp.ArrayGet(nIndex, &oWItem)->IsInt()) + { + oWItem.Free(); + oTemp.Free(); + m_bValidXref = false; + return false; + } + arrW[nIndex] = oWItem.GetInt(); + oWItem.Free(); + if (arrW[nIndex] < 0 || arrW[nIndex] > 4) + { + oTemp.Free(); + m_bValidXref = false; + return false; + } + } + oTemp.Free(); + + pXrefStream->Reset(); + Object oIndex; + pDict->SearchAndCopy("Index", &oIndex); + + if (oIndex.IsArray()) + { + for (int nIndex = 0; nIndex + 1 < oIndex.ArrayGetLength(); nIndex += 2) + { + if (!oIndex.ArrayGet(nIndex, &oTemp)->IsInt()) + { + oIndex.Free(); + oTemp.Free(); + m_bValidXref = false; + return false; + } + int nFirst = oTemp.GetInt(); + oTemp.Free(); + if (!oIndex.ArrayGet(nIndex + 1, &oTemp)->IsInt()) + { + oIndex.Free(); + oTemp.Free(); + m_bValidXref = false; + return false; + } + int nCount = oTemp.GetInt(); + oTemp.Free(); + if (nFirst < 0 || nCount < 0 || !ReadXRefStreamSection(pXrefStream, arrW, nFirst, nCount)) + { + oIndex.Free(); + m_bValidXref = false; + return false; + } + } + } + else + { + if (!ReadXRefStreamSection(pXrefStream, arrW, 0, nNewSize)) + { + oIndex.Free(); + m_bValidXref = false; + return false; + } + } + oIndex.Free(); + + pDict->SearchAndCopy("Prev", &oTemp); + bool bPrev = false; + if (oTemp.IsInt()) + { + *punPos = (unsigned int)oTemp.GetInt(); + bPrev = true; + } + else + { + bPrev = false; + } + oTemp.Free(); + if (m_oTrailerDict.IsNone()) + { + m_oTrailerDict.InitDict(pDict); + } + + return bPrev; + } + + bool XRef::ReadXRefStreamSection(Stream *pXrefStream, int *arrW, int nFirst, int nCount) + { + if (nFirst + nCount < 0) + { + return false; + } + if (nFirst + nCount > m_nEntrySize) + { + int nNewSize = 0; + for (nNewSize = m_nEntrySize ? 2 * m_nEntrySize : 1024; nFirst + nCount > nNewSize && nNewSize > 0; nNewSize <<= 1); + if (nNewSize < 0) + { + return false; + } + m_arrEntries = (XRefEntry *)MemUtilsReallocArray(m_arrEntries, nNewSize, sizeof(XRefEntry)); + for (int nIndex = m_nEntrySize; nIndex < nNewSize; ++nIndex) + { + m_arrEntries[nIndex].unOffset = 0xffffffff; + m_arrEntries[nIndex].eType = xrefEntryFree; + } + m_nEntrySize = nNewSize; + } + for (int nIndex = nFirst; nIndex < nFirst + nCount; ++nIndex) + { + int nType = -1; + int nChar = 0, nGen = 0, nJ = 0; + unsigned int unOffset = 0; + if (arrW[0] == 0) + { + nType = 1; + } + else + { + for (nType = 0, nJ = 0; nJ < arrW[0]; ++nJ) + { + if ((nChar = pXrefStream->GetChar()) == EOF) + { + return false; + } + nType = (nType << 8) + nChar; + } + } + for (unOffset = 0, nJ = 0; nJ < arrW[1]; ++nJ) + { + if ((nChar = pXrefStream->GetChar()) == EOF) + { + return false; + } + unOffset = (unOffset << 8) + nChar; + } + for (nGen = 0, nJ = 0; nJ < arrW[2]; ++nJ) + { + if ((nChar = pXrefStream->GetChar()) == EOF) + { + return false; + } + nGen = (nGen << 8) + nChar; + } + if (m_arrEntries[nIndex].unOffset == 0xffffffff) + { + switch (nType) + { + case 0: + m_arrEntries[nIndex].unOffset = unOffset; + m_arrEntries[nIndex].nGen = nGen; + m_arrEntries[nIndex].eType = xrefEntryFree; + break; + case 1: + m_arrEntries[nIndex].unOffset = unOffset; + m_arrEntries[nIndex].nGen = nGen; + m_arrEntries[nIndex].eType = xrefEntryUncompressed; + break; + case 2: + m_arrEntries[nIndex].unOffset = unOffset; + m_arrEntries[nIndex].nGen = nGen; + m_arrEntries[nIndex].eType = xrefEntryCompressed; + break; + default: + return false; + } + } + } + + return true; + } + + // Пробуем построить таблицу Xref для поврежденного файла. + bool XRef::ConstructXRef() + { + bool bGetRoot = false; + + MemUtilsFree(m_arrEntries); + m_nEntrySize = 0; + m_arrEntries = NULL; + + // TO DO : Error "PDF file is damaged - attempting to reconstruct xref table..." + m_nStreamEndsCount = 0; + + int nStreamEndsSize = 0; + + m_pStream->Reset(); + + while (1) + { + unsigned int nPos = m_pStream->GetPos(); + char sBuffer[256]; + if (!m_pStream->GetLine(sBuffer, 256)) + { + break; + } + unsigned char *pCur = (unsigned char*)sBuffer; + + // Пропускаем пробелы + while (*pCur && Lexer::IsSpace(*pCur & 0xff)) ++pCur; + + // Cчитываем словарь Trailer + if (!strncmp((char*)pCur, "trailer", 7)) + { + Object oTemp; + oTemp.InitNull(); + Parser *pParser = new Parser(NULL, new Lexer(NULL, m_pStream->MakeSubStream(nPos + 7, false, 0, &oTemp)), false); + Object oNewTrailerDict; + pParser->GetObject(&oNewTrailerDict); + if (oNewTrailerDict.IsDict()) + { + oNewTrailerDict.DictLookupAndCopy("Root", &oTemp); + if (oTemp.IsRef()) + { + m_nRootNum = oTemp.GetRefNum(); + m_nRootGen = oTemp.GetRefGen(); + if (!m_oTrailerDict.IsNone()) + { + m_oTrailerDict.Free(); + } + oNewTrailerDict.Copy(&m_oTrailerDict); + bGetRoot = true; + } + oTemp.Free(); + } + oNewTrailerDict.Free(); + delete pParser; + } + else if (isdigit(*pCur)) // Ищем объект + { + int nNum = atoi((char*)pCur); + if (nNum > 0) + { + do { + ++pCur; + } while (*pCur && isdigit(*pCur)); + if (isspace(*pCur)) + { + do { + ++pCur; + } while (*pCur && isspace(*pCur)); + if (isdigit(*pCur)) + { + int nGen = atoi((char*)pCur); + do { + ++pCur; + } while (*pCur && isdigit(*pCur)); + if (isspace(*pCur)) + { + do { + ++pCur; + } while (*pCur && isspace(*pCur)); + if (!strncmp((char*)pCur, "obj", 3)) + { + if (nNum >= m_nEntrySize) + { + int nNewSize = (nNum + 1 + 255) & ~255; + if (nNewSize < 0) + { + // TO DO: Error "Bad object number" + return false; + } + m_arrEntries = (XRefEntry *)MemUtilsReallocArray(m_arrEntries, nNewSize, sizeof(XRefEntry)); + for (int nIndex = m_nEntrySize; nIndex < nNewSize; ++nIndex) + { + m_arrEntries[nIndex].unOffset = 0xffffffff; + m_arrEntries[nIndex].eType = xrefEntryFree; + } + m_nEntrySize = nNewSize; + } + if (m_arrEntries[nNum].eType == xrefEntryFree || nGen >= m_arrEntries[nNum].nGen) + { + m_arrEntries[nNum].unOffset = nPos - m_nStart; + m_arrEntries[nNum].nGen = nGen; + m_arrEntries[nNum].eType = xrefEntryUncompressed; + } + } + } + } + } + } + + } + else if (!strncmp((char*)pCur, "endstream", 9)) + { + if (m_nStreamEndsCount == nStreamEndsSize) + { + nStreamEndsSize += 64; + m_punStreamEnds = (unsigned int *)MemUtilsReallocArray(m_punStreamEnds, nStreamEndsSize, sizeof(int)); + } + m_punStreamEnds[m_nStreamEndsCount++] = nPos; + } + } + + if (bGetRoot) + return true; + + // TO DO: Error "Couldn't find trailer dictionary" + return false; + } + + void XRef::SetEncryption(int nPermissionFlags, bool bOwnerPassword, unsigned char *sDecryptKey, int nKeyLength, int nEncryptVersion, CryptAlgorithm eEncryptAlgorithm) + { + m_bEncrypted = true; + m_nPermissionFlags = nPermissionFlags; + m_bOwnerPassword = bOwnerPassword; + if (nKeyLength <= 16) + { + m_nKeyLength = nKeyLength; + } + else + { + m_nKeyLength = 16; + } + for (int nIndex = 0; nIndex < m_nKeyLength; ++nIndex) + { + m_arrDecryptKey[nIndex] = sDecryptKey[nIndex]; + } + m_nEncryptVersion = nEncryptVersion; + m_eEncryptAlgorithm = eEncryptAlgorithm; + } + + bool XRef::CheckPrint(bool bIgnoreOwnerPassword) + { + return (!bIgnoreOwnerPassword && m_bOwnerPassword) || (m_nPermissionFlags & PermissionPrint); + } + + bool XRef::CheckChange(bool bIgnoreOwnerPassword) + { + return (!bIgnoreOwnerPassword && m_bOwnerPassword) || (m_nPermissionFlags & PermissionChange); + } + + bool XRef::CheckCopy(bool bIgnoreOwnerPassword) + { + return (!bIgnoreOwnerPassword && m_bOwnerPassword) || (m_nPermissionFlags & PermissionCopy); + } + + bool XRef::CheckAddNotes(bool bIgnoreOwnerPassword) + { + return (!bIgnoreOwnerPassword && m_bOwnerPassword) || (m_nPermissionFlags & PermissionNotes); + } + + Object *XRef::Fetch(int nNum, int nGen, Object *pObject) + { + CTemporaryCS oCS(&m_oCS); + + Object oObjNum, oObjGen, oObjContent; + + if (nNum < 0 || nNum >= m_nEntrySize) + { + return pObject->InitNull(); + } + Parser *pParser = NULL; + XRefEntry *pEntry = &m_arrEntries[nNum]; + switch (pEntry->eType) + { + case xrefEntryUncompressed: + if (pEntry->nGen != nGen) + { + return pObject->InitNull(); + } + oObjNum.InitNull(); + pParser = new Parser(this, new Lexer(this, m_pStream->MakeSubStream(m_nStart + pEntry->unOffset, false, 0, &oObjNum)), true); + pParser->GetObject(&oObjNum); + pParser->GetObject(&oObjGen); + pParser->GetObject(&oObjContent); + if (!oObjNum.IsInt() || oObjNum.GetInt() != nNum || !oObjGen.IsInt() || oObjGen.GetInt() != nGen || !oObjContent.IsCommand("obj")) + { + oObjNum.Free(); + oObjGen.Free(); + oObjContent.Free(); + delete pParser; + return pObject->InitNull(); + } + pParser->GetObject(pObject, m_bEncrypted ? m_arrDecryptKey : (unsigned char *)NULL, m_eEncryptAlgorithm, m_nKeyLength, nNum, nGen); + oObjNum.Free(); + oObjGen.Free(); + oObjContent.Free(); + delete pParser; + break; + + case xrefEntryCompressed: + if (nGen != 0) + { + return pObject->InitNull(); + } + if (!m_pObjectStream || m_pObjectStream->GetObjectStreamNum() != (int)pEntry->unOffset) + { + if (m_pObjectStream) + { + delete m_pObjectStream; + } + m_pObjectStream = new ObjectStream(this, pEntry->unOffset); + } + m_pObjectStream->GetObject(pEntry->nGen, nNum, pObject); + break; + + default: + return pObject->InitNull(); + } + + return pObject; + } + + Object *XRef::GetDocInfo(Object *pObject) + { + CTemporaryCS oCS(&m_oCS); + + return m_oTrailerDict.DictLookup("Info", pObject); + } + Object *XRef::GetDocInfoCopy(Object *pObject) + { + CTemporaryCS oCS(&m_oCS); + + return m_oTrailerDict.DictLookupAndCopy("Info", pObject); + } + + bool XRef::GetStreamEnd(unsigned int nStreamStart, unsigned int *pnStreamEnd) + { + if (m_nStreamEndsCount == 0 || nStreamStart > m_punStreamEnds[m_nStreamEndsCount - 1]) + return false; + + int nStart = -1; + int nEnd = m_nStreamEndsCount - 1; + // m_punStreamEnds[ nStart ] < streamStart <= m_punStreamEnds[ nEnd ] + while (nEnd - nStart > 1) + { + int nMid = (nStart + nEnd) / 2; + if (nStreamStart <= m_punStreamEnds[nMid]) + { + nEnd = nMid; + } + else + { + nStart = nMid; + } + } + *pnStreamEnd = m_punStreamEnds[nEnd]; + return true; + } + + unsigned int XRef::StrintToUInt(char *sString) + { + char *pCur; + int nIndex = 0; + + unsigned int unRes = 0; + for (pCur = sString, nIndex = 0; *pCur && isdigit(*pCur) && nIndex < 10; ++pCur, ++nIndex) + { + unRes = 10 * unRes + (*pCur - '0'); + } + return unRes; + } +} \ No newline at end of file diff --git a/PdfReader/Src/XRef.h b/PdfReader/Src/XRef.h new file mode 100644 index 0000000000..40b36d3896 --- /dev/null +++ b/PdfReader/Src/XRef.h @@ -0,0 +1,157 @@ +#ifndef _PDF_READER_XREF_H +#define _PDF_READER_XREF_H + +#include "Object.h" +#include "Stream.h" +#include "../../DesktopEditor/graphics/TemporaryCS.h" +#include "ErrorConstants.h" + +namespace PdfReader +{ + class Dict; + class Stream; + class Parser; + class ObjectStream; + + //------------------------------------------------------------------------ + // XRef + //------------------------------------------------------------------------ + + enum XRefEntryType + { + xrefEntryFree, + xrefEntryUncompressed, + xrefEntryCompressed + }; + + struct XRefEntry + { + unsigned int unOffset; + int nGen; + XRefEntryType eType; + }; + + class XRef + { + public: + + XRef(BaseStream *pStream); + + ~XRef(); + + bool CheckValidate() + { + return m_bValidXref; + } + + // Если CheckValidate вернул false + EError GetErrorCode() + { + return m_eErrorCode; + } + + void SetEncryption(int nPermissionFlags, bool bOwnerPassword, unsigned char *sDecryptKey, int nKeyLength, int nEncryptVersion, CryptAlgorithm eEncryptAlgorithm); + + bool CheckEncrypted() + { + return m_bEncrypted; + } + + // Проверяем ограничения. + bool CheckPrint(bool bIgnoreOwnerPassword = false); + bool CheckChange(bool bIgnoreOwnerPassword = false); + bool CheckCopy(bool bIgnoreOwnerPassword = false); + bool CheckAddNotes(bool bIgnoreOwnerPassword = false); + + Object *GetCatalog(Object *pObject) + { + return Fetch(m_nRootNum, m_nRootGen, pObject); + } + + // Вытаскиваем косвенный объект. + Object *Fetch(int nNum, int nGen, Object *pObject); + + Object *GetDocInfo(Object *pObject); + Object *GetDocInfoCopy(Object *pObject); + + int GetObjectsCount() + { + return m_nEntrySize; + } + + unsigned int GetLastXRefPos() + { + return m_unLastXRefOffset; + } + + + // объект Root (Catalog) + int GetRootNum() + { + return m_nRootNum; + } + int GetRootGen() + { + return m_nRootGen; + } + + // Получаем конечную позицию в поврежденном файле. + // Возвращаем false, если позиция неизвестна или файл не поврежден. + bool GetStreamEnd(unsigned int nStreamStart, unsigned int *pnStreamEnd); + + int GetSize() + { + return m_nEntrySize; + } + XRefEntry *GetEntry(int nIndex) + { + return &m_arrEntries[nIndex]; + } + Object *GetTrailerDict() + { + return &m_oTrailerDict; + } + + private: + + unsigned int GetStartXref(); + bool ReadXRef(unsigned int *punPos); + bool ReadXRefTable(Parser *pParser, unsigned int *punPos); + bool ReadXRefStreamSection(Stream *pXrefStream, int *arrW, int nFirst, int nCount); + bool ReadXRefStream(Stream *pXrefStream, unsigned int *punPos); + bool ConstructXRef(); + unsigned int StrintToUInt(char *sString); + + private: + + BaseStream *m_pStream; // Основной поток + unsigned int m_nStart; // Сдвиг в потоке + + XRefEntry *m_arrEntries; // Элементы таблицы Xref + int m_nEntrySize; // Размер элемента в списке m_arrEntries + int m_nRootNum; // Номер объекта Root (Catalog) + int m_nRootGen; // Номер версии объекта Root (Catalog) + + bool m_bValidXref; // Проверяем корректность таблицы Xref + EError m_eErrorCode; // Номер ошибки, если m_bValidXref = false + + Object m_oTrailerDict; // Словарь Trailer + + unsigned int m_unLastXRefOffset; // Сдвиг последней таблицы Xref + unsigned int *m_punStreamEnds; // Позиция конца потока - используется только для поврежденных файлов + + int m_nStreamEndsCount; // Количество корректных элементов в m_punStreamEnds + ObjectStream *m_pObjectStream; // Object Stream + bool m_bEncrypted; // Поток зашифрован или нет? + int m_nPermissionFlags; // Различные ограничения + bool m_bOwnerPassword; // Проверяем правильный ли был введен пароль владельца файла + unsigned char m_arrDecryptKey[16]; // Ключ для расшифровки + int m_nKeyLength; // Размер ключа в байтах + int m_nEncryptVersion; // Версия шифровки + CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования + + NSCriticalSection::CRITICAL_SECTION m_oCS; + }; +} + +#endif // _PDF_READER_XREF_H diff --git a/PdfReader/Src/XmlUtils.h b/PdfReader/Src/XmlUtils.h new file mode 100644 index 0000000000..70f1e5cc3e --- /dev/null +++ b/PdfReader/Src/XmlUtils.h @@ -0,0 +1,179 @@ +#ifndef _PDF_READER_XML_UTILS_H +#define _PDF_READER_XML_UTILS_H + +#include +#include "../../DesktopEditor/common/File.h" +#include "../../DesktopEditor/common/Base64.h" +#include + +namespace PdfReader +{ + class CXmlWriter + { + public: + + CXmlWriter() + { + m_wsXml.clear(); + } + + const wchar_t* GetXmlString() + { + return m_wsXml.c_str(); + } + void SetXmlString(const std::wstring& wsXml) + { + m_wsXml = wsXml; + } + bool SaveToFile(const std::wstring& wsFilePath, bool bEncodingToUTF8 = false) + { + return NSFile::CFileBinary::SaveToFile(wsFilePath, m_wsXml); + } + void WriteString(const std::wstring& wsString) + { + m_wsXml += wsString; + } + void WriteInteger(int nValue, int Base = 10) + { + m_wsXml += std::to_wstring(nValue); + } + void WriteDouble(double dValue) + { + m_wsXml += std::to_wstring(dValue); + } + void WriteBoolean(bool bValue) + { + if (bValue) + m_wsXml += L"true"; + else + m_wsXml += L"false"; + } + void WriteNodeBegin(const std::wstring& wsNodeName, bool bAttributed = false) + { + m_wsXml += L"<" + wsNodeName; + + if (!bAttributed) + m_wsXml += L">"; + } + void WriteNodeEnd(const std::wstring& wsNodeName, bool bEmptyNode = false, bool bEndNode = true) + { + if (bEmptyNode) + { + if (bEndNode) + m_wsXml += L" />"; + else + m_wsXml += L">"; + } + else + m_wsXml += L""; + } + void WriteNode(const std::wstring& wsNodeName, const std::wstring& wsNodeValue) + { + if (0 == wsNodeValue.length()) + m_wsXml += L"<" + wsNodeName + L"/>"; + else + m_wsXml += L"<" + wsNodeName + L">" + wsNodeValue + L""; + } + void WriteNode(const std::wstring& wsNodeName, int nValue, int nBase = 10, const std::wstring& wsTextBeforeValue = L"", const std::wstring& wsTextAfterValue = L"") + { + WriteNodeBegin(wsNodeName); + WriteString(wsTextBeforeValue); + WriteInteger(nValue, nBase); + WriteString(wsTextAfterValue); + WriteNodeEnd(wsNodeName); + } + void WriteNode(const std::wstring& wsNodeName, double dValue) + { + WriteNodeBegin(wsNodeName); + WriteDouble(dValue); + WriteNodeEnd(wsNodeName); + } + void WriteAttribute(const std::wstring& wsAttributeName, const std::wstring& wsAttributeValue) + { + m_wsXml += L" " + wsAttributeName + L"=\"" + wsAttributeValue + L"\""; + } + void WriteAttribute(const std::wstring& wsAttributeName, int nValue, int nBase = 10, const std::wstring& wsTextBeforeValue = L"", const std::wstring& wsTextAfterValue = L"") + { + WriteString(L" " + wsAttributeName + L"="); + WriteString(L"\""); + WriteString(wsTextBeforeValue); + WriteInteger(nValue, nBase); + WriteString(wsTextAfterValue); + WriteString(L"\""); + } + void WriteAttribute(const std::wstring& wsAttributeName, double dValue) + { + WriteString(L" " + wsAttributeName + L"="); + WriteString(L"\""); + WriteDouble(dValue); + WriteString(L"\""); + } + public: + static void ReplaceSpecialCharacters(std::wstring& wsString) + { + ReplaceAll(wsString, L"&", L"&"); + ReplaceAll(wsString, L"<", L"<"); + ReplaceAll(wsString, L">", L">"); + ReplaceAll(wsString, L"\"", L"""); + ReplaceAll(wsString, L"'", L"'"); + } + static void ReplaceAll(std::wstring& wsSrc, const std::wstring& wsFrom, const std::wstring& wsTo) + { + if (wsFrom.empty()) + return; + + int nFromLen = wsFrom.length(); + int nToLen = wsTo.length(); + + size_t nStartPos = 0; + while (std::string::npos != (nStartPos = wsSrc.find(wsFrom, nStartPos))) + { + wsSrc.replace(nStartPos, nFromLen, wsTo); + nStartPos += nToLen; + } + } + + private: + + std::wstring m_wsXml; + + }; + + class CBase64 + { + public: + + void Encode(unsigned char* pSrc, int nSrcLen) + { + m_sBuffer.clear(); + int nRequiredLen = NSBase64::Base64EncodeGetRequiredLength(nSrcLen); + if (0 == nRequiredLen) + return; + + unsigned char* pDst = new unsigned char[nRequiredLen + 1]; + if (!pDst) + return; + + pDst[nRequiredLen] = 0x00; + + int nDstLen; + NSBase64::Base64Encode(pSrc, nSrcLen, pDst, &nDstLen); + m_sBuffer.append((char*)pDst); + delete[] pDst; + } + std::string& GetString() + { + return m_sBuffer; + } + const char* GetCString() + { + return m_sBuffer.c_str(); + } + + private: + + std::string m_sBuffer; + }; +} + +#endif // _PDF_READER_XML_UTILS_H \ No newline at end of file diff --git a/PdfReader/Src/version.h b/PdfReader/Src/version.h new file mode 100644 index 0000000000..76c89a17c7 --- /dev/null +++ b/PdfReader/Src/version.h @@ -0,0 +1,7 @@ +#pragma once +//1 +//0 +//0 +//75 +#define INTVER 1,0,0,75 +#define STRVER "1,0,0,75\0" diff --git a/PdfReader/Types.h b/PdfReader/Types.h new file mode 100644 index 0000000000..cc976bc778 --- /dev/null +++ b/PdfReader/Types.h @@ -0,0 +1,8 @@ +#ifndef _PDF_READER_TYPES_H +#define _PDF_READER_TYPES_H + +namespace MetaFile +{ +} + +#endif // _PDF_READER_TYPES_H \ No newline at end of file