summaryrefslogtreecommitdiff
path: root/xfa/src/fee
diff options
context:
space:
mode:
authorBo Xu <bo_xu@foxitsoftware.com>2014-10-28 23:03:33 -0700
committerBo Xu <bo_xu@foxitsoftware.com>2014-11-03 11:10:11 -0800
commitfdc00a7042d912aafaabddae4d9c84199921ef23 (patch)
tree32ab8ac91cc68d2cd15b9168782a71b3f3f5e7b9 /xfa/src/fee
parente9b38fa38de2c95d8260be31c57d9272c4d127ed (diff)
downloadpdfium-fdc00a7042d912aafaabddae4d9c84199921ef23.tar.xz
Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
Diffstat (limited to 'xfa/src/fee')
-rw-r--r--xfa/src/fee/include/fx_wordbreak.h24
-rw-r--r--xfa/src/fee/include/ifde_txtedtbuf.h31
-rw-r--r--xfa/src/fee/include/ifde_txtedtengine.h233
-rw-r--r--xfa/src/fee/include/ifde_txtedtpage.h32
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtblock.cpp674
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtblock.h227
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtbuf.cpp446
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtbuf.h90
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtengine.cpp2871
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtengine.h341
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp8
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtkmpmatch.h9
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtpage.cpp647
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtpage.h130
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtparag.cpp149
-rw-r--r--xfa/src/fee/src/fee/fde_txtedtparag.h39
-rw-r--r--xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp263
-rw-r--r--xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h64
-rw-r--r--xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp2062
19 files changed, 8340 insertions, 0 deletions
diff --git a/xfa/src/fee/include/fx_wordbreak.h b/xfa/src/fee/include/fx_wordbreak.h
new file mode 100644
index 0000000000..c91aca694a
--- /dev/null
+++ b/xfa/src/fee/include/fx_wordbreak.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_WORDBREAK_H
+#define _FX_WORDBREAK_H
+class IFX_CharIter;
+class IFX_WordBreak
+{
+public:
+ virtual void Release() = 0;
+ virtual void Attach(IFX_CharIter * pIter) = 0;
+ virtual void Attach(const CFX_WideString & wsText) = 0;
+ virtual FX_BOOL Next(FX_BOOL bPrev) = 0;
+ virtual void SetAt(FX_INT32 nIndex) = 0;
+ virtual FX_INT32 GetWordPos() const = 0;
+ virtual FX_INT32 GetWordLength() const = 0;
+ virtual void GetWord(CFX_WideString &wsWord) const = 0;
+ virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
+};
+IFX_WordBreak * FX_WordBreak_Create();
+#endif
diff --git a/xfa/src/fee/include/ifde_txtedtbuf.h b/xfa/src/fee/include/ifde_txtedtbuf.h
new file mode 100644
index 0000000000..6cfc3ec977
--- /dev/null
+++ b/xfa/src/fee/include/ifde_txtedtbuf.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _IFDE_TXTEDTBUF_H
+#define _IFDE_TXTEDTBUF_H
+#define FDE_DEFCHUNKLENGTH (1024)
+class IFDE_TxtEdtBuf;
+class IFDE_TxtEdtBuf
+{
+public:
+ virtual void Release() = 0;
+
+ virtual FX_BOOL SetChunkSize(FX_INT32 nChunkSize) = 0;
+ virtual FX_INT32 GetChunkSize() const = 0;
+ virtual FX_INT32 GetTextLength() const = 0;
+ virtual void SetText(const CFX_WideString &wsText) = 0;
+ virtual void GetText(CFX_WideString &wsText) const = 0;
+ virtual FX_WCHAR GetCharByIndex(FX_INT32 nIndex) const = 0;
+ virtual void GetRange(CFX_WideString &wsText, FX_INT32 nBegin, FX_INT32 nCount = - 1) const = 0;
+
+ virtual void Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength = 1) = 0;
+ virtual void Delete(FX_INT32 nIndex, FX_INT32 nLength = 1) = 0;
+
+ virtual void Clear(FX_BOOL bRelease = TRUE) = 0;
+
+ virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL) = 0;
+};
+#endif
diff --git a/xfa/src/fee/include/ifde_txtedtengine.h b/xfa/src/fee/include/ifde_txtedtengine.h
new file mode 100644
index 0000000000..a47739c3c5
--- /dev/null
+++ b/xfa/src/fee/include/ifde_txtedtengine.h
@@ -0,0 +1,233 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _IFDE_TXTEDTENGINE_H
+#define _IFDE_TXTEDTENGINE_H
+class IFDE_TxtEdtBuf;
+class IFDE_TxtEdtPage;
+class IFDE_TxtEdtEngine;
+class IFDE_TxtEdtEventSink;
+class IFDE_TxtEdtParag;
+#define FDE_TXTEDT_FIND_FLAGS_Prev (0L << 0)
+#define FDE_TXTEDT_FIND_FLAGS_Next (1L << 0)
+#define FDE_TXTEDT_FIND_FLAGS_WholeWord (1L << 1)
+#define FDE_TXTEDT_FIND_FLAGS_NoCase (1L << 2)
+typedef struct _FDE_HTXTEDTFIND {
+ FX_LPVOID pData;
+} * FDE_HTXTEDTFIND;
+#define FDE_TEXTEDITMODE_MultiLines (1L << 0)
+#define FDE_TEXTEDITMODE_AutoLineWrap (1L << 1)
+#define FDE_TEXTEDITMODE_ReadOnly (1L << 2)
+#define FDE_TEXTEDITMODE_LimitArea_Vert (1L << 3)
+#define FDE_TEXTEDITMODE_LimitArea_Horz (1L << 4)
+#define FDE_TEXTEDITMODE_NoRedoUndo (1L << 5)
+#define FDE_TEXTEDITMODE_FIELD_TAB (1L << 6)
+#define FDE_TEXTEDITMODE_FIELD_AUTO (1L << 7)
+#define FDE_TEXTEDITMODE_Validate (1L << 8)
+#define FDE_TEXTEDITMODE_Password (1L << 9)
+#define FDE_TEXTEDITALIGN_Left (0L << 0)
+#define FDE_TEXTEDITALIGN_Center (1L << 0)
+#define FDE_TEXTEDITALIGN_Right (2L << 0)
+#define FDE_TEXTEDITALIGN_Normal (1L << 3)
+#define FDE_TEXTEDITALIGN_Justified (1L << 4)
+#define FDE_TEXTEDITALIGN_Distributed (1L << 5)
+#define FDE_TEXTEDITLAYOUT_DocVertical (1L << 0)
+#define FDE_TEXTEDITLAYOUT_CharVertial (1L << 1)
+#define FDE_TEXTEDITLAYOUT_LineReserve (1L << 2)
+#define FDE_TEXTEDITLAYOUT_RTL (1L << 3)
+#define FDE_TEXTEDITLAYOUT_CombText (1L << 4)
+#define FDE_TEXTEDITLAYOUT_ExpandTab (1L << 5)
+#define FDE_TEXTEDITLAYOUT_ArabicContext (1L << 6)
+#define FDE_TEXTEDITLAYOUT_ArabicShapes (1L << 7)
+#define FDE_TEXTEDITLAYOUT_LastLineHeight (1L << 8)
+enum FDE_TXTEDTMOVECARET {
+ MC_MoveNone = 0 ,
+ MC_Left ,
+ MC_Right ,
+ MC_Up ,
+ MC_Down ,
+ MC_WordBackward ,
+ MC_WordForward ,
+ MC_LineStart ,
+ MC_LineEnd ,
+ MC_ParagStart ,
+ MC_ParagEnd ,
+ MC_PageUp ,
+ MC_PageDown ,
+ MC_Home ,
+ MC_End ,
+};
+enum FDE_TXTEDT_MODIFY_RET {
+ FDE_TXTEDT_MODIFY_RET_F_Tab = -6,
+ FDE_TXTEDT_MODIFY_RET_F_Locked = -5,
+ FDE_TXTEDT_MODIFY_RET_F_Invalidate = -4,
+ FDE_TXTEDT_MODIFY_RET_F_Boundary = -3,
+ FDE_TXTEDT_MODIFY_RET_F_Full = -2,
+ FDE_TXTEDT_MODIFY_RET_F_Normal = -1,
+ FDE_TXTEDT_MODIFY_RET_S_Normal = 0,
+ FDE_TXTEDT_MODIFY_RET_S_Full = 1,
+ FDE_TXTEDT_MODIFY_RET_S_Part = 2,
+ FDE_TXTEDT_MODIFY_RET_S_Empty = 3,
+ FDE_TXTEDT_MODIFY_RET_T_Tab = 4,
+};
+enum FDE_TXTEDIT_LINEEND {
+ FDE_TXTEDIT_LINEEND_Auto,
+ FDE_TXTEDIT_LINEEND_CRLF,
+ FDE_TXTEDIT_LINEEND_CR,
+ FDE_TXTEDIT_LINEEND_LF,
+};
+struct _FDE_TXTEDTPARAMS : public CFX_Object {
+ _FDE_TXTEDTPARAMS()
+ : fPlateWidth(0)
+ , fPlateHeight(0)
+ , nLineCount(0)
+ , dwLayoutStyles(0)
+ , dwAlignment(0)
+ , dwMode(0)
+ , pFont(NULL)
+ , fFontSize(10.0f)
+ , dwFontColor(0xff000000)
+ , fLineSpace(10.0f)
+ , fTabWidth(36)
+ , bTabEquidistant(FALSE)
+ , wDefChar(0xFEFF)
+ , wLineBreakChar('\n')
+ , nCharRotation(0)
+ , nLineEnd(0)
+ , nHorzScale(100)
+ , fCharSpace(0)
+ , pEventSink(NULL)
+ {
+ }
+ FX_FLOAT fPlateWidth;
+ FX_FLOAT fPlateHeight;
+ FX_INT32 nLineCount;
+ FX_DWORD dwLayoutStyles;
+ FX_DWORD dwAlignment;
+ FX_DWORD dwMode;
+ IFX_Font *pFont;
+ FX_FLOAT fFontSize;
+ FX_ARGB dwFontColor;
+ FX_FLOAT fLineSpace;
+ FX_FLOAT fTabWidth;
+ FX_BOOL bTabEquidistant;
+ FX_WCHAR wDefChar;
+ FX_WCHAR wLineBreakChar;
+ FX_INT32 nCharRotation;
+ FX_INT32 nLineEnd;
+ FX_INT32 nHorzScale;
+ FX_FLOAT fCharSpace;
+ IFDE_TxtEdtEventSink * pEventSink;
+};
+typedef _FDE_TXTEDTPARAMS FDE_TXTEDTPARAMS;
+typedef _FDE_TXTEDTPARAMS* FDE_LPTXTEDTPARAMS;
+enum FDE_TXTEDT_TEXTCHANGE_TYPE {
+ FDE_TXTEDT_TEXTCHANGE_TYPE_Insert = 0 ,
+ FDE_TXTEDT_TEXTCHANGE_TYPE_Delete ,
+ FDE_TXTEDT_TEXTCHANGE_TYPE_Replace ,
+};
+struct _FDE_TXTEDT_TEXTCHANGE_INFO : public CFX_Object {
+ FX_INT32 nChangeType;
+ CFX_WideString wsInsert;
+ CFX_WideString wsDelete;
+ CFX_WideString wsPrevText;
+};
+typedef _FDE_TXTEDT_TEXTCHANGE_INFO FDE_TXTEDT_TEXTCHANGE_INFO;
+typedef _FDE_TXTEDT_TEXTCHANGE_INFO* FDE_LPTXTEDT_TEXTCHANGE_INFO;
+class IFDE_TxtEdtEventSink
+{
+public:
+ virtual void On_CaretChanged(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPage, FX_BOOL bVisible = TRUE) = 0;
+ virtual void On_TextChanged(IFDE_TxtEdtEngine * pEdit, FDE_TXTEDT_TEXTCHANGE_INFO &ChangeInfo) = 0;
+ virtual void On_PageCountChanged(IFDE_TxtEdtEngine * pEdit) = 0;
+ virtual void On_SelChanged(IFDE_TxtEdtEngine * pEdit) = 0;
+ virtual FX_BOOL On_PageLoad(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) = 0;
+ virtual FX_BOOL On_PageUnload(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex, FX_INT32 nPurpose) = 0;
+ virtual FX_BOOL On_PageChange(IFDE_TxtEdtEngine * pEdit, FX_INT32 nPageIndex) = 0;
+ virtual void On_AddDoRecord(IFDE_TxtEdtEngine * pEdit, FX_BSTR bsDoRecord) = 0;
+ virtual FX_BOOL On_ValidateField(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, \
+ const CFX_WideString &wsFieldText, FX_INT32 nCharIndex) = 0;
+ virtual FX_BOOL On_ValidateBlock(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex) = 0;
+ virtual FX_BOOL On_GetBlockFormatText(IFDE_TxtEdtEngine * pEdit, FX_INT32 nBlockIndex, CFX_WideString &wsBlockText) = 0;
+ virtual FX_BOOL On_Validate(IFDE_TxtEdtEngine * pEdit, CFX_WideString &wsText) = 0;
+};
+class IFX_CharIter
+{
+public:
+ virtual void Release() = 0;
+ virtual FX_BOOL Next(FX_BOOL bPrev = FALSE) = 0;
+ virtual FX_WCHAR GetChar() = 0;
+ virtual void SetAt(FX_INT32 nIndex) = 0;
+ virtual FX_INT32 GetAt() const = 0;
+ virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const = 0;
+ virtual IFX_CharIter * Clone() = 0;
+};
+class IFDE_TxtEdtEngine
+{
+public:
+ static IFDE_TxtEdtEngine* Create();
+
+ virtual void Release() = 0;
+ virtual void SetEditParams(const FDE_TXTEDTPARAMS &params) = 0;
+ virtual const FDE_TXTEDTPARAMS* GetEditParams() const = 0;
+
+ virtual FX_INT32 CountPages() const = 0;
+ virtual IFDE_TxtEdtPage* GetPage(FX_INT32 nIndex) = 0;
+ virtual FX_BOOL SetBufChunkSize(FX_INT32 nChunkSize) = 0;
+ virtual void SetTextByStream(IFX_Stream * pStream) = 0;
+ virtual void SetText(const CFX_WideString &wsText) = 0;
+ virtual FX_INT32 GetTextLength() const = 0;
+ virtual void GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount = -1) = 0;
+ virtual void ClearText() = 0;
+
+ virtual FX_INT32 GetCaretRect(CFX_RectF &rtCaret) const = 0;
+ virtual FX_INT32 GetCaretPos() const = 0;
+ virtual FX_INT32 SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore = TRUE) = 0;
+ virtual FX_INT32 MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, FX_BOOL bShift = FALSE, FX_BOOL bCtrl = FALSE) = 0;
+
+ virtual void Lock() = 0;
+ virtual void Unlock() = 0;
+ virtual FX_BOOL IsLocked() const = 0;
+
+ virtual FX_INT32 Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength) = 0;
+ virtual FX_INT32 Delete(FX_INT32 nStart, FX_BOOL bBackspace = FALSE) = 0;
+ virtual FX_INT32 DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1) = 0;
+ virtual FX_INT32 Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace) = 0;
+ virtual void SetLimit(FX_INT32 nLimit) = 0;
+ virtual void SetAliasChar(FX_WCHAR wAlias) = 0;
+ virtual void SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat) = 0;
+ virtual FX_INT32 CountEditBlocks() const = 0;
+ virtual void GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const = 0;
+ virtual FX_INT32 CountEditFields(FX_INT32 nBlockIndex) const = 0;
+ virtual void GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const = 0;
+ virtual void StartEdit() = 0;
+ virtual void EndEdit() = 0;
+ virtual void AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1) = 0;
+ virtual FX_INT32 CountSelRanges() = 0;
+ virtual FX_INT32 GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart) = 0;
+ virtual void ClearSelection() = 0;
+
+ virtual FX_BOOL Redo(FX_BSTR bsRedo) = 0;
+ virtual FX_BOOL Undo(FX_BSTR bsUndo) = 0;
+
+ virtual FX_INT32 StartLayout() = 0;
+ virtual FX_INT32 DoLayout(IFX_Pause *pPause) = 0;
+ virtual void EndLayout() = 0;
+
+ virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL) = 0;
+ virtual FX_INT32 CountParags() const = 0;
+ virtual IFDE_TxtEdtParag* GetParag(FX_INT32 nParagIndex) const = 0;
+ virtual IFX_CharIter* CreateCharIter() = 0;
+};
+class IFDE_TxtEdtParag
+{
+public:
+ virtual FX_INT32 GetTextLength() const = 0;
+ virtual FX_INT32 GetStartIndex() const = 0;
+ virtual FX_INT32 CountLines() const = 0;
+ virtual void GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const = 0;
+};
+#endif
diff --git a/xfa/src/fee/include/ifde_txtedtpage.h b/xfa/src/fee/include/ifde_txtedtpage.h
new file mode 100644
index 0000000000..7555434f5f
--- /dev/null
+++ b/xfa/src/fee/include/ifde_txtedtpage.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _IFDE_TXTEDTPAGE_H
+#define _IFDE_TXTEDTPAGE_H
+class IFDE_TxtEdtEngine;
+class IFDE_TxtEdtPage;
+class IFDE_TxtEdtPage : public IFDE_CanvasSet, public IFX_TxtAccess
+{
+public:
+ static IFDE_TxtEdtPage * Create(IFDE_TxtEdtEngine * pEngine, FX_INT32 nIndex);
+
+ virtual void Release() = 0;
+
+ virtual IFDE_TxtEdtEngine * GetEngine() const = 0;
+ virtual FX_INT32 GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox = FALSE) const = 0;
+ virtual FX_INT32 GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore) = 0;
+ virtual void CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const = 0;
+ virtual FX_INT32 SelectWord (const CFX_PointF &fPoint, FX_INT32 &nCount) = 0;
+ virtual FX_INT32 GetCharStart() const = 0;
+ virtual FX_INT32 GetCharCount() const = 0;
+
+ virtual FX_INT32 GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS* &pCharPos, FX_LPRECTF pBBox = NULL) const = 0;
+ virtual FX_BOOL IsLoaded(FX_LPCRECTF pClipBox = NULL) = 0;
+ virtual FX_INT32 LoadPage(FX_LPCRECTF pClipBox = NULL, IFX_Pause *pPause = NULL) = 0;
+ virtual void UnloadPage(FX_LPCRECTF pClipBox = NULL) = 0;
+ virtual const CFX_RectF& GetContentsBox() = 0;
+};
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtblock.cpp b/xfa/src/fee/src/fee/fde_txtedtblock.cpp
new file mode 100644
index 0000000000..89515bdb00
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtblock.cpp
@@ -0,0 +1,674 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "fde_txtedtblock.h"
+#ifdef FDE_USEFORMATBLOCK
+#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
+#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
+#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
+#define FDE_TXTEDT_ISINTEGER(a) ((a) >= L'0' && (a) <= L'9')
+#define FDE_TXTEDT_ISSIGN(a) (((a) == L'-') || ((a) == L'+'))
+CFDE_TxtEdtBlock::CFDE_TxtEdtBlock(CFDE_TxtEdtEngine * pEngine, const CFX_WideString &wsBlock, FX_INT32 nPosition)
+ : m_pEngine(pEngine)
+ , m_nDisplayLength(0)
+ , m_nIndex(0)
+ , m_nPosition(nPosition)
+{
+ FX_LPCWSTR lpBuf = FX_LPCWSTR(wsBlock);
+ FX_INT32 nCount = wsBlock.GetLength();
+ FX_INT32 i = 0;
+ CFX_WideString wsFix;
+ FX_INT32 j = 0;
+ while (i < nCount) {
+ if (lpBuf[i] != L'%') {
+ wsFix += lpBuf[i];
+ } else {
+ i ++;
+ if (i < nCount) {
+ if (lpBuf[i] == L'%') {
+ wsFix += lpBuf[i];
+ } else {
+ if (!wsFix.IsEmpty()) {
+ CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this);
+ j ++;
+ FXSYS_assert(pField);
+ m_FieldArr.Add(pField);
+ m_nDisplayLength += pField->GetDisplayLength();
+ wsFix.Empty();
+ }
+ FX_INT32 nPos = i - 1;
+ while (lpBuf[i ++] != L')')
+ ;
+ i ++;
+ CFX_WideStringC wsField(lpBuf + nPos, i - nPos);
+ CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsField, j, this);
+ j ++;
+ FXSYS_assert(pField);
+ m_FieldArr.Add(pField);
+ m_EditFieldArr.Add(pField);
+ m_nDisplayLength += pField->GetDisplayLength();
+ i --;
+ }
+ }
+ }
+ i ++;
+ }
+ if (!wsFix.IsEmpty()) {
+ CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this);
+ FXSYS_assert(pField);
+ m_FieldArr.Add(pField);
+ m_nDisplayLength += pField->GetDisplayLength();
+ }
+}
+CFDE_TxtEdtBlock::~CFDE_TxtEdtBlock()
+{
+ FX_INT32 nCount = m_FieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_FieldArr[i];
+ pField->Release();
+ }
+ m_FieldArr.RemoveAll();
+}
+void CFDE_TxtEdtBlock::GetDisplayText(CFX_WideString &wsDisplay)
+{
+ FX_INT32 nCount = m_FieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_FieldArr[i];
+ CFX_WideString wsTemp;
+ pField->GetDisplayText(wsTemp);
+ wsDisplay += wsTemp;
+ }
+}
+FX_INT32 CFDE_TxtEdtBlock::GetLength() const
+{
+ FX_INT32 nDisplayLength = 0;
+ FX_INT32 nCount = m_FieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_FieldArr[i];
+ nDisplayLength += pField->GetDisplayLength();
+ }
+ return nDisplayLength;
+}
+void CFDE_TxtEdtBlock::GetBlockText(CFX_WideString &wsBlock)
+{
+ FX_INT32 nCount = m_FieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_FieldArr[i];
+ CFX_WideString wsTemp;
+ pField->GetFieldText(wsTemp);
+ wsBlock += wsTemp;
+ }
+}
+FX_INT32 CFDE_TxtEdtBlock::CountField() const
+{
+ return m_EditFieldArr.GetSize();
+}
+void CFDE_TxtEdtBlock::GetFieldText(FX_INT32 nIndex, CFX_WideString &wsField)
+{
+ CFDE_TxtEdtField * pField = m_EditFieldArr[nIndex];
+ pField->GetFieldText(wsField);
+}
+FX_INT32 CFDE_TxtEdtBlock::GetFieldTextLength() const
+{
+ FX_INT32 nTotalLength = 0;
+ FX_INT32 nCount = m_EditFieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_EditFieldArr[i];
+ nTotalLength = pField->GetFieldTextLength();
+ }
+ return nTotalLength;
+}
+FX_INT32 CFDE_TxtEdtBlock::GetPos() const
+{
+ return m_nPosition;
+}
+void CFDE_TxtEdtBlock::GetRealText(CFX_WideString &wsText) const
+{
+ FX_INT32 nCount = m_FieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtField * pField = m_FieldArr[i];
+ CFX_WideString wsTemp;
+ pField->GetFieldText(wsTemp);
+ wsText += wsTemp;
+ }
+}
+void CFDE_TxtEdtBlock::Backup()
+{
+ FX_INT32 nCount = m_EditFieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ m_EditFieldArr[i]->Backup();
+ }
+}
+void CFDE_TxtEdtBlock::Restore()
+{
+ FX_INT32 nCount = m_EditFieldArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ m_EditFieldArr[i]->Restore();
+ }
+}
+CFDE_TxtEdtFieldFormatParser::CFDE_TxtEdtFieldFormatParser()
+{
+}
+CFDE_TxtEdtFieldFormatParser::~CFDE_TxtEdtFieldFormatParser()
+{
+ FDE_LPTXTEDTFORMATITEM lpItem = NULL;
+ FX_INT32 nCount = m_ItemArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ lpItem = m_ItemArr[i];
+ delete lpItem;
+ }
+ m_ItemArr.RemoveAll();
+}
+FX_BOOL CFDE_TxtEdtFieldFormatParser::Parse(const CFX_WideString &wsFormat)
+{
+ m_wsFormat = wsFormat;
+ FX_LPCWSTR pBuf = FX_LPCWSTR(m_wsFormat);
+ FX_INT32 nCount = m_wsFormat.GetLength();
+ nCount -= 2;
+ FX_INT32 i = 0;
+ for (; i < nCount; i ++) {
+ FX_WCHAR wChar = pBuf[i];
+ if (wChar == L'(') {
+ break;
+ }
+ }
+ i ++;
+ FDE_TXTEDTFORMATITEM FormatItem;
+ for (; i < nCount; i ++) {
+ while (pBuf[i] == L' ') {
+ i ++;
+ }
+ FormatItem.nKeyStart = i;
+ while (pBuf[i] != L':') {
+ i ++;
+ }
+ FormatItem.nKeyCount = i - FormatItem.nKeyStart;
+ i ++;
+ FormatItem.nValStart = i;
+ while (pBuf[i] != L';' && i < nCount) {
+ i ++;
+ }
+ FormatItem.nValCount = i - FormatItem.nValStart;
+ FDE_LPTXTEDTFORMATITEM pFormatItem = FX_NEW FDE_TXTEDTFORMATITEM;
+ FXSYS_memcpy(pFormatItem, &FormatItem, sizeof(FDE_TXTEDTFORMATITEM));
+ m_ItemArr.Add(pFormatItem);
+ }
+ return TRUE;
+}
+FX_INT32 CFDE_TxtEdtFieldFormatParser::CountItems() const
+{
+ return m_ItemArr.GetSize();
+}
+void CFDE_TxtEdtFieldFormatParser::GetItem(FX_INT32 nIndex, CFX_WideString &wsKey, CFX_WideString &wsValue) const
+{
+ FDE_LPTXTEDTFORMATITEM lpItem = m_ItemArr[nIndex];
+ FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(m_wsFormat);
+ FX_LPWSTR lpDstBuf = wsKey.GetBuffer(lpItem->nKeyCount);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nKeyStart, lpItem->nKeyCount * sizeof(FX_WCHAR));
+ wsKey.ReleaseBuffer(lpItem->nKeyCount);
+ lpDstBuf = wsValue.GetBuffer(lpItem->nValCount);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nValStart, lpItem->nValCount * sizeof(FX_WCHAR));
+ wsValue.ReleaseBuffer(lpItem->nValCount);
+}
+CFDE_TxtEdtField * CFDE_TxtEdtField::Create(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+{
+ if (wsField[0] != L'%' || (wsField[0] == L'%' && wsField[1] == L'%')) {
+ return FX_NEW CFDE_TxtEdtField_Fixed(wsField, nIndex, pBlock);
+ }
+ FX_WCHAR wcType = wsField[wsField.GetLength() - 1];
+ switch(wcType) {
+ case L'd':
+ return FX_NEW CFDE_TxtEdtField_Integer(wsField, nIndex, pBlock);
+ case L'f':
+ return FX_NEW CFDE_TxtEdtField_Float(wsField, nIndex, pBlock);
+ case L's':
+ return FX_NEW CFDE_TxtEdtField_String(wsField, nIndex, pBlock);
+ case L'p':
+ return FX_NEW CFDE_TxtEdtField_Password(wsField, nIndex, pBlock);
+ default:
+ break;
+ }
+ return NULL;
+}
+void CFDE_TxtEdtField::Release()
+{
+ delete this;
+}
+CFDE_TxtEdtField::CFDE_TxtEdtField(FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : m_nLength(-1)
+ , m_wcFill(L' ')
+ , m_bReserveSpace(FALSE)
+ , m_bLeftAlignment(TRUE)
+ , m_nIndex(nIndex)
+ , m_pBlock(pBlock)
+{
+ FXSYS_assert(pBlock);
+}
+FX_INT32 CFDE_TxtEdtField::Insert(FX_INT32 nIndex, const CFX_WideString &wsIns,
+ FX_INT32 &nCaret, FX_BOOL &bBefore)
+{
+ FX_INT32 nFieldLength = m_wsField.GetLength();
+ FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ if (m_bReserveSpace && !m_bLeftAlignment) {
+ nInnerIndex -= (m_nLength - nFieldLength);
+ }
+ FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
+ CFX_WideString wsTemp = m_wsField;
+ FX_INT32 nInsLength = wsIns.GetLength();
+ for (FX_INT32 i = 0; i < nInsLength; i ++, nInnerIndex ++) {
+ wsTemp.Insert(nInnerIndex, wsIns[i]);
+ }
+ FX_INT32 nRet = Validate(wsTemp);
+ switch (nRet) {
+ case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
+ return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
+ case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
+ return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
+ case FDE_FORMAT_FIELD_VALIDATE_S:
+ default:
+ break;
+ }
+ m_wsField = wsTemp;
+ nCaret = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? -nInsLength : nInsLength);
+ bBefore = TRUE;
+ return (nFieldLength + nInsLength < m_nLength) ? FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL : FDE_FORMAT_FIELD_INSERT_RET_S_FULL;
+}
+FX_INT32 CFDE_TxtEdtField::Delete(FX_INT32 nIndex, FX_INT32 nCount,
+ CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore)
+{
+ FX_INT32 nFieldLength = m_wsField.GetLength();
+ FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ if (m_bReserveSpace && !m_bLeftAlignment) {
+ nInnerIndex -= (m_nLength - nFieldLength);
+ }
+ if (nInnerIndex < 0 || (nInnerIndex + nCount) > nFieldLength) {
+ return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
+ }
+ CFX_WideString wsTemp = m_wsField;
+ wsTemp.Delete(nInnerIndex, nCount);
+ FX_INT32 nRet = Validate(wsTemp);
+ switch (nRet) {
+ case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
+ return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
+ case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
+ return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
+ case FDE_FORMAT_FIELD_VALIDATE_S:
+ default:
+ break;
+ }
+ FX_LPWSTR lpBuf = wsDel.GetBuffer(nCount);
+ FXSYS_memcpy(lpBuf, FX_LPCWSTR(m_wsField) + nInnerIndex, nCount * sizeof(FX_WCHAR));
+ wsDel.ReleaseBuffer(nCount);
+ m_wsField = wsTemp;
+ nCaret = nIndex + (m_bReserveSpace && !m_bLeftAlignment) ? nCount : 0;
+ bBefore = TRUE;
+ return FDE_FORMAT_FIELD_DELETE_RET_S;
+}
+FX_INT32 CFDE_TxtEdtField::Replace(FX_INT32 nIndex, FX_INT32 nCount, const CFX_WideString &wsIns,
+ CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore)
+{
+ FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ FX_INT32 nInsLength = wsIns.GetLength();
+ FX_INT32 nFieldLength = m_wsField.GetLength();
+ CFX_WideString wsTemp = m_wsField;
+ if (m_bReserveSpace && !m_bLeftAlignment) {
+ nInnerIndex -= (m_nLength - nFieldLength);
+ }
+ FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
+ if (nInnerIndex + nCount > nFieldLength) {
+ return FALSE;
+ }
+ wsTemp.Delete(nInnerIndex, nCount);
+ FX_INT32 nInnerIndexBK = nInnerIndex;
+ for (FX_INT32 i = 0; i < nInsLength; i ++, nInnerIndex ++) {
+ wsTemp.Insert(nInnerIndex, wsIns[i]);
+ }
+ FX_INT32 nRet = Validate(wsTemp);
+ switch(nRet) {
+ case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
+ return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
+ case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
+ return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
+ default:
+ break;
+ }
+ FX_LPWSTR lpBuffer = wsDel.GetBuffer(nCount);
+ FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(m_wsField);
+ FXSYS_memcpy(lpBuffer, lpSrcBuf + nInnerIndexBK, nCount * sizeof(FX_WCHAR));
+ wsDel.ReleaseBuffer(nCount);
+ m_wsField = wsTemp;
+ nCaret = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? (nCount - nInsLength) : (nInsLength));
+ return FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL;
+}
+void CFDE_TxtEdtField::GetDisplayText(CFX_WideString &wsDisplay)
+{
+ CFX_WideString wsField;
+ GetNormalizedFieldText(wsField);
+ FX_INT32 nLength = wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
+ FX_LPWSTR lpBuffer = wsDisplay.GetBuffer(nLength);
+ lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
+ lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
+ FX_DWORD nAddress = (FX_DWORD)this;
+ FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
+ FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(wsField), (nLength - 4) * sizeof(FX_WCHAR));
+ wsDisplay.ReleaseBuffer(nLength);
+}
+FX_INT32 CFDE_TxtEdtField::GetDisplayLength()
+{
+ return (m_bReserveSpace ? m_nLength : m_wsField.GetLength()) + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
+}
+void CFDE_TxtEdtField::GetFieldText(CFX_WideString &wsField)
+{
+ wsField = m_wsField;
+}
+FX_INT32 CFDE_TxtEdtField::GetFieldTextLength() const
+{
+ return m_wsField.GetLength();
+}
+FX_INT32 CFDE_TxtEdtField::GetRealIndex(FX_INT32 nIndex) const
+{
+ FX_INT32 nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ if (nInnerIndex < 0) {
+ return 0;
+ }
+ FX_INT32 nFieldLength = m_wsField.GetLength();
+ if (m_bReserveSpace && !m_bLeftAlignment) {
+ nInnerIndex -= (m_nLength - nFieldLength);
+ }
+ if (nInnerIndex < 0) {
+ return 0;
+ }
+ if (nInnerIndex >= nFieldLength) {
+ return nFieldLength;
+ }
+ return nInnerIndex + 1;
+}
+FX_INT32 CFDE_TxtEdtField::NormalizeCaretPos(FX_INT32 nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const
+{
+ nIndex -= FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ FX_INT32 nLength = m_wsField.GetLength();
+ if (m_bReserveSpace) {
+ FX_INT32 nFieldLength = m_wsField.GetLength();
+ if (m_bLeftAlignment) {
+ if (nIndex > nFieldLength) {
+ if (eDirection == FDE_FORMAT_CARET_FORWARD) {
+ return -1;
+ }
+ nIndex = nFieldLength;
+ }
+ } else {
+ FX_INT32 nReserveLength = m_nLength - nFieldLength;
+ if (nIndex < nReserveLength) {
+ if (eDirection == FDE_FORMAT_CARET_BACKWARD) {
+ return -2;
+ }
+ nIndex = nReserveLength;
+ }
+ }
+ }
+ return nIndex + FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+}
+FX_BOOL CFDE_TxtEdtField::GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const
+{
+ if (m_bReserveSpace && !m_bLeftAlignment) {
+ nEnd = FDE_FORMAT_EDIT_FIELD_HADERSIZE + m_nLength;
+ nBgn = nEnd - m_wsField.GetLength();
+ } else {
+ nBgn = FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ nEnd = nBgn + m_wsField.GetLength();
+ }
+ return TRUE;
+}
+void CFDE_TxtEdtField::Backup()
+{
+ m_wsBackup = m_wsField;
+}
+void CFDE_TxtEdtField::Restore()
+{
+ m_wsField = m_wsBackup;
+}
+FX_INT32 CFDE_TxtEdtField::Validate(const CFX_WideString & wsText) const
+{
+ if (m_nLength < 0) {
+ return FDE_FORMAT_FIELD_DELETE_RET_S;
+ }
+ return wsText.GetLength() <= m_nLength ? FDE_FORMAT_FIELD_VALIDATE_S : FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+}
+void CFDE_TxtEdtField::GetNormalizedFieldText(CFX_WideString &wsField) const
+{
+ wsField = m_wsField;
+ if (m_nLength == -1) {
+ return;
+ }
+ if (m_bReserveSpace) {
+ FX_INT32 nField = wsField.GetLength();
+ FX_INT32 nFill = m_nLength - nField;
+ if (m_bLeftAlignment) {
+ while (nFill --) {
+ wsField.Insert(nField++, m_wcFill);
+ }
+ } else {
+ while (nFill --) {
+ wsField.Insert(0, m_wcFill);
+ }
+ }
+ }
+}
+CFDE_TxtEdtField_Integer::CFDE_TxtEdtField_Integer(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : m_bSign(FALSE)
+ , CFDE_TxtEdtField(nIndex, pBlock)
+{
+ CFDE_TxtEdtFieldFormatParser FormatParser;
+ FormatParser.Parse(wsField);
+ FX_INT32 nCount = FormatParser.CountItems();
+ CFX_WideString wskey;
+ CFX_WideString wsVal;
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FormatParser.GetItem(i, wskey, wsVal);
+ if (wskey.Equal(L"Length")) {
+ m_nLength = wsVal.GetInteger();
+ } else if (wskey.Equal(L"Sign")) {
+ m_bSign = wsVal.GetInteger() != 0;
+ } else if (wskey.Equal(L"FillChar")) {
+ m_wcFill = wsVal[0];
+ } else {
+ FXSYS_assert(0);
+ }
+ wskey.Empty();
+ wsVal.Empty();
+ }
+ if (m_nLength == -1) {
+ m_bReserveSpace = FALSE;
+ }
+}
+FX_INT32 CFDE_TxtEdtField_Integer::Validate(const CFX_WideString &wsText) const
+{
+ FX_INT32 i = 0;
+ if (m_bSign) {
+ FX_WCHAR wcTemp = wsText[0];
+ if (FDE_TXTEDT_ISSIGN(wcTemp)) {
+ i ++;
+ }
+ }
+ FX_INT32 nLength = wsText.GetLength();
+ if (m_nLength > 0) {
+ if (nLength - i > (m_nLength - (m_bSign ? 1 : 0))) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+ }
+ }
+ for (; i < nLength; i ++) {
+ FX_WCHAR wcTemp = wsText[i];
+ if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
+ }
+ }
+ return FDE_FORMAT_FIELD_VALIDATE_S;
+}
+CFDE_TxtEdtField_Float::CFDE_TxtEdtField_Float(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : CFDE_TxtEdtField(nIndex, pBlock)
+ , m_bSigned(FALSE)
+ , m_nIntPartlength(-1)
+ , m_nDecPartLength(-1)
+{
+ CFDE_TxtEdtFieldFormatParser FormatParser;
+ FormatParser.Parse(wsField);
+ FX_INT32 nCount = FormatParser.CountItems();
+ CFX_WideString wskey;
+ CFX_WideString wsVal;
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FormatParser.GetItem(i, wskey, wsVal);
+ if (wskey.Equal(L"DecLength")) {
+ m_nDecPartLength = wsVal.GetInteger();
+ } else if (wskey.Equal(L"IntLength")) {
+ m_nIntPartlength = wsVal.GetInteger();
+ } else if (wskey.Equal(L"Sign")) {
+ m_bSigned = wsVal.GetInteger() != 0;
+ } else if (wskey.Equal(L"FillChar")) {
+ m_wcFill = wsVal[0];
+ } else {
+ FXSYS_assert(0);
+ }
+ if (m_nIntPartlength == -1 || m_nDecPartLength == -1) {
+ m_nLength = -1;
+ } else {
+ m_nLength = m_nIntPartlength + m_nDecPartLength + 1 + (m_bSigned ? 1 : 0);
+ }
+ m_bReserveSpace = TRUE;
+ wskey.Empty();
+ wsVal.Empty();
+ }
+}
+FX_INT32 CFDE_TxtEdtField_Float::Validate(const CFX_WideString & wsText) const
+{
+ FX_INT32 nLength = wsText.GetLength();
+ if (m_nLength != -1 && (nLength > m_nLength)) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+ }
+ FX_LPCWSTR lpBuf = FX_LPCWSTR(wsText);
+ FX_INT32 i = 0;
+ if (m_bSigned) {
+ FX_WCHAR wcTemp = lpBuf[0];
+ if (FDE_TXTEDT_ISSIGN(wcTemp)) {
+ i ++;
+ }
+ }
+ FX_INT32 nIntPart = 0;
+ FX_INT32 nPoint = 0;
+ for (; i < nLength; i ++) {
+ FX_WCHAR wcTemp = lpBuf[i];
+ if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
+ if (wcTemp != L'.') {
+ return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
+ }
+ nPoint = 1;
+ break;
+ }
+ nIntPart ++;
+ }
+ if (m_nIntPartlength != -1 && (nIntPart > m_nIntPartlength)) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+ }
+ if (m_nDecPartLength != -1 && (nLength - nIntPart - nPoint > m_nDecPartLength)) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+ }
+ i ++;
+ for (; i < nLength; i ++) {
+ FX_WCHAR wcTemp = lpBuf[i];
+ if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
+ return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
+ }
+ }
+ return FDE_FORMAT_FIELD_VALIDATE_S;
+}
+CFDE_TxtEdtField_Password::CFDE_TxtEdtField_Password(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : CFDE_TxtEdtField(nIndex, pBlock)
+ , m_wcAlias(L'*')
+{
+ CFDE_TxtEdtFieldFormatParser FormatParser;
+ FormatParser.Parse(wsField);
+ FX_INT32 nCount = FormatParser.CountItems();
+ CFX_WideString wskey;
+ CFX_WideString wsVal;
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FormatParser.GetItem(i, wskey, wsVal);
+ if (wskey.Equal(L"Length")) {
+ m_nLength = wsVal.GetInteger();
+ } else if (wskey.Equal(L"AliasChar")) {
+ m_wcAlias = wsVal[0];
+ } else {
+ FXSYS_assert(0);
+ }
+ wskey.Empty();
+ wsVal.Empty();
+ }
+ if (m_nLength == -1) {
+ m_bReserveSpace = FALSE;
+ }
+}
+void CFDE_TxtEdtField_Password::GetNormalizedFieldText(CFX_WideString &wsField) const
+{
+ FX_INT32 nFiledLength = m_wsField.GetLength();
+ FX_INT32 nLength = m_bReserveSpace ? m_nLength : nFiledLength;
+ FX_LPWSTR lpBuf = wsField.GetBuffer(nLength);
+ FX_INT32 nSpaceLength = nLength - nFiledLength;
+ FX_INT32 nFirstPart = m_bLeftAlignment ? nFiledLength : nSpaceLength;
+ FX_WCHAR wFirstChar = m_bLeftAlignment ? m_wcAlias : L' ';
+ FX_WCHAR wSecondChar = m_bLeftAlignment ? L' ' : m_wcAlias;
+ FX_INT32 i = 0;
+ for (; i < nFirstPart; i ++) {
+ lpBuf[i] = wFirstChar;
+ }
+ for (; i < nLength; i ++) {
+ lpBuf[i] = wSecondChar;
+ }
+ wsField.ReleaseBuffer(nLength);
+}
+CFDE_TxtEdtField_String::CFDE_TxtEdtField_String(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : CFDE_TxtEdtField(nIndex, pBlock)
+{
+ CFDE_TxtEdtFieldFormatParser FormatParser;
+ FormatParser.Parse(wsField);
+ FX_INT32 nCount = FormatParser.CountItems();
+ CFX_WideString wskey;
+ CFX_WideString wsVal;
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FormatParser.GetItem(i, wskey, wsVal);
+ if (wskey.Equal(L"Length")) {
+ m_nLength = wsVal.GetInteger();
+ } else {
+ FXSYS_assert(0);
+ }
+ wskey.Empty();
+ wsVal.Empty();
+ }
+}
+CFDE_TxtEdtField_Fixed::CFDE_TxtEdtField_Fixed(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock)
+ : CFDE_TxtEdtField(nIndex, pBlock)
+{
+ m_wsField = wsField;
+ m_nLength = wsField.GetLength();
+}
+void CFDE_TxtEdtField_Fixed::GetDisplayText(CFX_WideString &wsDisplay)
+{
+ FX_INT32 nLength = m_wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
+ FX_LPWSTR lpBuffer = wsDisplay.GetBuffer(nLength);
+ lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
+ lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
+ FX_DWORD nAddress = (FX_DWORD)this;
+ FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
+ FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(m_wsField), (nLength - 4) * sizeof(FX_WCHAR));
+ wsDisplay.ReleaseBuffer(nLength);
+}
+FX_INT32 CFDE_TxtEdtField_Fixed::NormalizeCaretPos(FX_INT32 nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const
+{
+ FXSYS_assert(nIndex >= 0 && nIndex <= m_nLength);
+ if (eDirection == FDE_FORMAT_CARET_MIDDLE) {
+ return (nIndex > m_wsField.GetLength() / 2) ? -1 : -2;
+ }
+ return eDirection == FDE_FORMAT_CARET_BACKWARD ? -2 : -1;
+}
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtblock.h b/xfa/src/fee/src/fee/fde_txtedtblock.h
new file mode 100644
index 0000000000..12aee74d39
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtblock.h
@@ -0,0 +1,227 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_TXTEDTBLOCK_H
+#define _FDE_TXTEDTBLOCK_H
+#ifdef FDE_USEFORMATBLOCK
+class CFDE_TxtEdtEngine;
+class CFDE_TxtEdtBlock;
+class CFDE_TxtEdtFieldFormatParser;
+class CFDE_TxtEdtField;
+class CFDE_TxtEdtField_Integer;
+class CFDE_TxtEdtField_Float;
+class CFDE_TxtEdtField_Password;
+class CFDE_TxtEdtField_String;
+class CFDE_TxtEdtField_Fixed;
+#define FDE_FORMAT_EDIT_FIELD_HADERSIZE 3
+#define FDE_FORMAT_EDIT_FIELD_TAILSIZE 1
+enum FDE_FORMAT_FIELD_INSERT_RET {
+ FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL = 0,
+ FDE_FORMAT_FIELD_INSERT_RET_S_FULL ,
+ FDE_FORMAT_FIELD_INSERT_RET_F_FULL ,
+ FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE,
+};
+enum FDE_FORMAT_FIELD_DELETE_RET {
+ FDE_FORMAT_FIELD_DELETE_RET_S = 0 ,
+ FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE ,
+ FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY ,
+};
+enum FDE_FORMAT_FIELD_VALIDATE_RET {
+ FDE_FORMAT_FIELD_VALIDATE_S = 0 ,
+ FDE_FORMAT_FIELD_VALIDATE_F_FULL ,
+ FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE ,
+};
+enum FDE_FORMAT_CARET_DIRECTION {
+ FDE_FORMAT_CARET_FORWARD,
+ FDE_FORMAT_CARET_MIDDLE,
+ FDE_FORMAT_CARET_BACKWARD
+};
+class CFDE_TxtEdtBlock : public CFX_Object
+{
+public:
+ CFDE_TxtEdtBlock(CFDE_TxtEdtEngine * pEngine, const CFX_WideString &wsBlock, FX_INT32 nPosition);
+ ~CFDE_TxtEdtBlock();
+ void GetDisplayText(CFX_WideString &wsDisplay);
+ FX_INT32 GetLength() const;
+ void GetBlockText(CFX_WideString &wsBlock);
+ FX_INT32 CountField() const;
+ void GetFieldText(FX_INT32 nIndex, CFX_WideString &wsField);
+ FX_INT32 GetFieldTextLength() const;
+
+ FX_INT32 GetPos() const;
+ void GetRealText(CFX_WideString &wsText) const;
+ void Backup();
+ void Restore();
+ void SetIndex(FX_INT32 nIndex)
+ {
+ m_nIndex = nIndex;
+ }
+ FX_INT32 GetIndex() const
+ {
+ return m_nIndex;
+ }
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_INT32 m_nDisplayLength;
+ FX_INT32 m_nIndex;
+
+ FX_INT32 m_nPosition;
+ CFX_ArrayTemplate<CFDE_TxtEdtField*> m_FieldArr;
+ CFX_ArrayTemplate<CFDE_TxtEdtField*> m_EditFieldArr;
+};
+class CFDE_TxtEdtFieldFormatParser : public CFX_Object
+{
+public:
+ CFDE_TxtEdtFieldFormatParser();
+ ~CFDE_TxtEdtFieldFormatParser();
+ FX_BOOL Parse(const CFX_WideString &wsFormat);
+ FX_INT32 CountItems() const;
+ void GetItem(FX_INT32 nIndex, CFX_WideString &wsKey, CFX_WideString &wsValue) const;
+private:
+ typedef struct : public CFX_Object {
+ FX_INT32 nKeyStart;
+ FX_INT32 nKeyCount;
+ FX_INT32 nValStart;
+ FX_INT32 nValCount;
+ } FDE_TXTEDTFORMATITEM, * FDE_LPTXTEDTFORMATITEM;
+
+ CFX_WideString m_wsFormat;
+ CFX_ArrayTemplate<FDE_LPTXTEDTFORMATITEM> m_ItemArr;
+};
+class CFDE_TxtEdtField : public CFX_Object
+{
+public:
+ static CFDE_TxtEdtField * Create(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+ virtual void Release();
+ virtual FX_INT32 Insert( FX_INT32 nIndex, const CFX_WideString &wsIns,
+ FX_INT32 &nCaret, FX_BOOL &bBefore);
+ virtual FX_INT32 Delete( FX_INT32 nIndex, FX_INT32 nCount,
+ CFX_WideString &wsDel, FX_INT32 &nCaret,
+ FX_BOOL &bBefore);
+ virtual FX_INT32 Replace(FX_INT32 nIndex, FX_INT32 nCount,
+ const CFX_WideString &wsIns, CFX_WideString &wsDel,
+ FX_INT32 &nCaret, FX_BOOL &bBefore);
+ virtual void GetDisplayText(CFX_WideString &wsDisplay);
+ virtual FX_INT32 GetDisplayLength();
+ virtual void GetFieldText(CFX_WideString &wsField);
+ virtual FX_INT32 GetFieldTextLength() const;
+ virtual FX_INT32 GetRealIndex(FX_INT32 nIndex) const;
+
+
+ virtual FX_INT32 NormalizeCaretPos( FX_INT32 nIndex,
+ FDE_FORMAT_CARET_DIRECTION eDirection = FDE_FORMAT_CARET_MIDDLE) const;
+
+ virtual FX_BOOL GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const;
+ virtual void Backup();
+ virtual void Restore();
+ virtual FX_BOOL IsFix() const
+ {
+ return FALSE;
+ }
+ void SetIndex(FX_INT32 nIndex)
+ {
+ m_nIndex = nIndex;
+ }
+ FX_INT32 GetIndex() const
+ {
+ return m_nIndex;
+ }
+ FX_INT32 GetBlockIndex() const
+ {
+ return m_pBlock->GetIndex();
+ }
+protected:
+ CFDE_TxtEdtField(FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+ virtual ~CFDE_TxtEdtField() {}
+ virtual FX_INT32 Validate(const CFX_WideString & wsText) const;
+ virtual void GetNormalizedFieldText(CFX_WideString &wsField) const;
+ FX_INT32 m_nLength;
+ CFX_WideString m_wsField;
+ CFX_WideString m_wsBackup;
+ FX_WCHAR m_wcFill;
+ FX_BOOL m_bReserveSpace;
+ FX_BOOL m_bLeftAlignment;
+ FX_INT32 m_nIndex;
+ CFDE_TxtEdtBlock * m_pBlock;
+};
+class CFDE_TxtEdtField_Integer : public CFDE_TxtEdtField
+{
+public:
+ CFDE_TxtEdtField_Integer(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+protected:
+ virtual ~CFDE_TxtEdtField_Integer() {}
+ virtual FX_INT32 Validate(const CFX_WideString &wsText) const;
+private:
+ FX_BOOL m_bSign;
+};
+class CFDE_TxtEdtField_Float : public CFDE_TxtEdtField
+{
+public:
+ CFDE_TxtEdtField_Float(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+protected:
+ virtual ~CFDE_TxtEdtField_Float() {}
+ virtual FX_INT32 Validate(const CFX_WideString & wsText) const;
+private:
+ FX_BOOL m_bSigned;
+ FX_INT32 m_nIntPartlength;
+ FX_INT32 m_nDecPartLength;
+};
+class CFDE_TxtEdtField_Password : public CFDE_TxtEdtField
+{
+public:
+ CFDE_TxtEdtField_Password(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+
+protected:
+ virtual ~CFDE_TxtEdtField_Password() {}
+ virtual void GetNormalizedFieldText(CFX_WideString &wsField) const;
+private:
+ FX_WCHAR m_wcAlias;
+};
+class CFDE_TxtEdtField_String : public CFDE_TxtEdtField
+{
+public:
+ CFDE_TxtEdtField_String(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+protected:
+ virtual ~CFDE_TxtEdtField_String() {}
+};
+class CFDE_TxtEdtField_Fixed : public CFDE_TxtEdtField
+{
+public:
+ CFDE_TxtEdtField_Fixed(const CFX_WideString &wsField, FX_INT32 nIndex, CFDE_TxtEdtBlock * pBlock);
+ virtual FX_INT32 Insert( FX_INT32 nIndex, const CFX_WideString &wsIns,
+ FX_INT32 &nCaret, FX_BOOL &bBefore)
+ {
+ return FALSE;
+ }
+ virtual FX_INT32 Delete( FX_INT32 nIndex, FX_INT32 nCount, CFX_WideString &wsDel,
+ FX_INT32 &nCaret, FX_BOOL &bBefore)
+ {
+ return FALSE;
+ }
+ virtual FX_INT32 Replace(FX_INT32 nIndex, FX_INT32 nCount, const CFX_WideString &wsIns,
+ CFX_WideString &wsDel, FX_INT32 &nCaret, FX_BOOL &bBefore)
+ {
+ return FALSE;
+ }
+ virtual void GetDisplayText(CFX_WideString &wsDisplay);
+ virtual FX_INT32 NormalizeCaretPos( FX_INT32 nIndex,
+ FDE_FORMAT_CARET_DIRECTION eDirection ) const;
+ virtual FX_BOOL GetEditableRange(FX_INT32 &nBgn, FX_INT32 &nEnd) const
+ {
+ return FALSE;
+ }
+ virtual void Backup() {}
+ virtual void Restore() {}
+
+ virtual FX_BOOL IsFix() const
+ {
+ return TRUE;
+ }
+protected:
+ virtual ~CFDE_TxtEdtField_Fixed() {}
+};
+#endif
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtbuf.cpp b/xfa/src/fee/src/fee/fde_txtedtbuf.cpp
new file mode 100644
index 0000000000..f2cb0c57f2
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtbuf.cpp
@@ -0,0 +1,446 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "../../include/ifde_txtedtbuf.h"
+#include "../../include/ifde_txtedtengine.h"
+#include "fde_txtedtbuf.h"
+#define FDE_DEFCHUNKCOUNT 2
+#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
+#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
+#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
+#ifdef FDE_USEFORMATBLOCK
+CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_BOOL bForDisplay )
+#else
+CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_WCHAR wcAlias )
+#endif
+ : m_nCurChunk(0)
+ , m_nCurIndex(0)
+ , m_nIndex(0)
+ , m_pBuf(pBuf)
+#ifdef FDE_USEFORMATBLOCK
+ , m_bForDisplay(bForDisplay)
+ , m_nAliasCount(0)
+#endif
+ , m_bInField(FALSE)
+ , m_Alias(wcAlias)
+{
+ FXSYS_assert(m_pBuf);
+}
+CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter()
+{
+}
+void CFDE_TxtEdtBufIter::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev )
+{
+ if (bPrev) {
+ if (m_nIndex == 0) {
+ return FALSE;
+ }
+ FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
+ CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = NULL;
+ if (m_nCurIndex > 0) {
+ m_nCurIndex --;
+ } else {
+ while (m_nCurChunk > 0) {
+ --m_nCurChunk;
+ lpChunk = (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+ if (lpChunk->nUsed > 0) {
+ m_nCurIndex = lpChunk->nUsed - 1;
+ break;
+ }
+ }
+ }
+ FXSYS_assert(m_nCurChunk >= 0);
+ m_nIndex --;
+ return TRUE;
+ } else {
+ if (m_nIndex >= (m_pBuf->m_nTotal - 1)) {
+ return FALSE;
+ }
+ FXSYS_assert(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
+ CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunk = \
+ (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+ if (lpChunk->nUsed != (m_nCurIndex + 1)) {
+ m_nCurIndex ++;
+ } else {
+ FX_INT32 nEnd = m_pBuf->m_Chunks.GetSize() - 1;
+ while (m_nCurChunk < nEnd) {
+ m_nCurChunk ++;
+ CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER lpChunkTemp = \
+ (CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk];
+ if (lpChunkTemp->nUsed > 0) {
+ m_nCurIndex = 0;
+ break;
+ }
+ }
+ }
+ m_nIndex ++;
+ return TRUE;
+ }
+}
+void CFDE_TxtEdtBufIter::SetAt(FX_INT32 nIndex)
+{
+ FXSYS_assert(nIndex >= 0 && nIndex < m_pBuf->m_nTotal);
+ CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp;
+ m_pBuf->Index2CP(nIndex, cp);
+ m_nIndex = nIndex;
+ m_nCurChunk = cp.nChunkIndex;
+ m_nCurIndex = cp.nCharIndex;
+}
+FX_INT32 CFDE_TxtEdtBufIter::GetAt() const
+{
+ return m_nIndex;
+}
+FX_WCHAR CFDE_TxtEdtBufIter::GetChar()
+{
+ FXSYS_assert(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal);
+#ifdef FDE_USEFORMATBLOCK
+ if (m_bForDisplay) {
+ if (m_bInField) {
+ FXSYS_assert(m_nAliasCount >= 0 && m_nAliasCount <= 2);
+ if (m_nAliasCount > 0) {
+ m_nAliasCount --;
+ return FDE_TXTEDT_ZEROWIDTHSPACE;
+ }
+ FX_WCHAR wc = ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex];
+ if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
+ m_nAliasCount = 0;
+ m_bInField = FALSE;
+ }
+ return wc;
+ } else {
+ FX_WCHAR wc = ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex];
+ if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
+ m_nAliasCount = 2;
+ m_bInField = TRUE;
+ }
+ return wc;
+ }
+ }
+#endif
+ if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1)) {
+ return ((CFDE_TxtEdtBuf::FDE_LPCHUNKHEADER)m_pBuf->m_Chunks[m_nCurChunk])->wChars[m_nCurIndex];
+ }
+ return m_Alias;
+}
+FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail ) const
+{
+ return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0;
+}
+IFX_CharIter * CFDE_TxtEdtBufIter::Clone()
+{
+ CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter(m_pBuf);
+ pIter->m_nCurChunk = m_nCurChunk;
+ pIter->m_nCurIndex = m_nCurIndex;
+ pIter->m_nIndex = m_nIndex;
+ pIter->m_Alias = m_Alias;
+ return pIter;
+}
+CFDE_TxtEdtBuf::CFDE_TxtEdtBuf(FX_INT32 nDefChunkSize )
+ : m_nChunkSize(nDefChunkSize)
+ , m_nTotal(0)
+ , m_bChanged(FALSE)
+ , m_pAllocator(NULL)
+{
+ FXSYS_assert(m_nChunkSize);
+ ResetChunkBuffer(FDE_DEFCHUNKCOUNT, m_nChunkSize);
+}
+void CFDE_TxtEdtBuf::Release()
+{
+ delete this;
+}
+CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf()
+{
+ Clear(TRUE);
+ m_pAllocator->Release();
+ m_Chunks.RemoveAll();
+}
+FX_BOOL CFDE_TxtEdtBuf::SetChunkSize(FX_INT32 nChunkSize)
+{
+ FXSYS_assert(nChunkSize);
+ ResetChunkBuffer(FDE_DEFCHUNKCOUNT, nChunkSize);
+ return TRUE;
+}
+FX_INT32 CFDE_TxtEdtBuf::GetChunkSize() const
+{
+ return m_nChunkSize;
+}
+FX_INT32 CFDE_TxtEdtBuf::GetTextLength() const
+{
+ return m_nTotal;
+}
+void CFDE_TxtEdtBuf::SetText(const CFX_WideString &wsText)
+{
+ FXSYS_assert(!wsText.IsEmpty());
+ Clear(FALSE);
+ FX_INT32 nTextLength = wsText.GetLength();
+ FX_INT32 nNeedCount = ((nTextLength - 1) / m_nChunkSize + 1) - m_Chunks.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nNeedCount; i ++) {
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \
+ (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+ lpChunk->nUsed = 0;
+ m_Chunks.Add(lpChunk);
+ }
+ FX_INT32 nTotalCount = m_Chunks.GetSize();
+ FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(wsText);
+ FX_INT32 nLeave = nTextLength;
+ FX_INT32 nCopyedLength = m_nChunkSize;
+ for (i = 0; i < nTotalCount && nLeave > 0; i ++) {
+ if (nLeave < nCopyedLength) {
+ nCopyedLength = nLeave;
+ }
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+ FXSYS_memcpy(lpChunk->wChars, lpSrcBuf, nCopyedLength * sizeof(FX_WCHAR));
+ nLeave -= nCopyedLength;
+ lpSrcBuf += nCopyedLength;
+ lpChunk->nUsed = nCopyedLength;
+ }
+ m_nTotal = nTextLength;
+ m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::GetText(CFX_WideString &wsText) const
+{
+ GetRange(wsText, 0, m_nTotal);
+}
+FX_WCHAR CFDE_TxtEdtBuf::GetCharByIndex(FX_INT32 nIndex) const
+{
+ FXSYS_assert(nIndex >= 0 && nIndex < GetTextLength());
+ FDE_LPCHUNKHEADER pChunkHeader = NULL;
+ FX_INT32 nTotal = 0;
+ FX_INT32 nCount = m_Chunks.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ pChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[i];
+ nTotal += pChunkHeader->nUsed;
+ if (nTotal > nIndex) {
+ break;
+ }
+ }
+ FXSYS_assert(pChunkHeader);
+ return pChunkHeader->wChars[pChunkHeader->nUsed - (nTotal - nIndex)];
+}
+void CFDE_TxtEdtBuf::GetRange(CFX_WideString &wsText, FX_INT32 nBegin, FX_INT32 nLength) const
+{
+ FDE_CHUNKPLACE cp;
+ Index2CP(nBegin, cp);
+ FX_INT32 nLeave = nLength;
+ FX_INT32 nCount = m_Chunks.GetSize();
+ FX_LPWSTR lpDstBuf = wsText.GetBuffer(nLength);
+ FX_INT32 nChunkIndex = cp.nChunkIndex;
+ FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
+ FX_INT32 nCopyLength = lpChunkHeader->nUsed - cp.nCharIndex;
+ FX_LPWSTR lpSrcBuf = lpChunkHeader->wChars + cp.nCharIndex;
+ while (nLeave > 0) {
+ if (nLeave <= nCopyLength) {
+ nCopyLength = nLeave;
+ }
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nCopyLength * sizeof(FX_WCHAR));
+ nChunkIndex ++;
+ if (nChunkIndex >= nCount) {
+ break;
+ }
+ lpChunkHeader = (FDE_LPCHUNKHEADER)m_Chunks[nChunkIndex];
+ lpSrcBuf = lpChunkHeader->wChars;
+ nLeave -= nCopyLength;
+ lpDstBuf += nCopyLength;
+ nCopyLength = lpChunkHeader->nUsed;
+ }
+ wsText.ReleaseBuffer();
+}
+void CFDE_TxtEdtBuf::Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength )
+{
+ FXSYS_assert(nPos >= 0 && nPos <= m_nTotal);
+ FDE_CHUNKPLACE cp;
+ Index2CP(nPos, cp);
+ FX_INT32 nLengthTemp = nLength;
+ if (cp.nCharIndex != 0) {
+ FDE_LPCHUNKHEADER lpNewChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \
+ (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex];
+ FX_INT32 nCopy = lpChunk->nUsed - cp.nCharIndex;
+ FXSYS_memcpy(lpNewChunk->wChars, lpChunk->wChars + cp.nCharIndex, nCopy * sizeof(FX_WCHAR));
+ lpChunk->nUsed -= nCopy;
+ cp.nChunkIndex ++;
+ m_Chunks.InsertAt(cp.nChunkIndex, lpNewChunk);
+ lpNewChunk->nUsed = nCopy;
+ cp.nCharIndex = 0;
+ }
+ if (cp.nChunkIndex != 0) {
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex - 1];
+ if (lpChunk->nUsed != m_nChunkSize) {
+ cp.nChunkIndex --;
+ FX_INT32 nFree = m_nChunkSize - lpChunk->nUsed;
+ FX_INT32 nCopy = FX_MIN(nLengthTemp, nFree);
+ FXSYS_memcpy(lpChunk->wChars + lpChunk->nUsed, lpText, nCopy * sizeof(FX_WCHAR));
+ lpText += nCopy;
+ nLengthTemp -= nCopy;
+ lpChunk->nUsed += nCopy;
+ cp.nChunkIndex++;
+ }
+ }
+ while (nLengthTemp > 0) {
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(sizeof(FDE_CHUNKHEADER) + \
+ (m_nChunkSize - 1) * sizeof(FX_WCHAR));
+ FXSYS_assert(lpChunk);
+ FX_INT32 nCopy = FX_MIN(nLengthTemp, m_nChunkSize);
+ FXSYS_memcpy(lpChunk->wChars, lpText, nCopy * sizeof(FX_WCHAR));
+ lpText += nCopy;
+ nLengthTemp -= nCopy;
+ lpChunk->nUsed = nCopy;
+ m_Chunks.InsertAt(cp.nChunkIndex, lpChunk);
+ cp.nChunkIndex ++;
+ }
+ m_nTotal += nLength;
+ m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::Delete(FX_INT32 nIndex, FX_INT32 nLength )
+{
+ FXSYS_assert(nLength > 0 && nIndex >= 0 && nIndex + nLength <= m_nTotal);
+ FDE_CHUNKPLACE cpEnd;
+ Index2CP(nIndex + nLength - 1, cpEnd);
+ m_nTotal -= nLength;
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
+ FX_INT32 nFirstPart = cpEnd.nCharIndex + 1;
+ FX_INT32 nMovePart = lpChunk->nUsed - nFirstPart;
+ if (nMovePart != 0) {
+ FX_INT32 nDelete = FX_MIN(nFirstPart, nLength);
+ FXSYS_memmove(lpChunk->wChars + nFirstPart - nDelete, \
+ lpChunk->wChars + nFirstPart, nMovePart * sizeof(FX_WCHAR));
+ lpChunk->nUsed -= nDelete;
+ nLength -= nDelete;
+ cpEnd.nChunkIndex --;
+ }
+ while (nLength > 0) {
+ lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[cpEnd.nChunkIndex];
+ FX_INT32 nDeleted = FX_MIN(lpChunk->nUsed, nLength);
+ lpChunk->nUsed -= nDeleted;
+ if (lpChunk->nUsed == 0) {
+ m_pAllocator->Free(lpChunk);
+ m_Chunks.RemoveAt(cpEnd.nChunkIndex);
+ lpChunk = NULL;
+ }
+ nLength -= nDeleted;
+ cpEnd.nChunkIndex --;
+ }
+ m_bChanged = TRUE;
+}
+void CFDE_TxtEdtBuf::Clear(FX_BOOL bRelease )
+{
+ FX_INT32 i = 0;
+ FX_INT32 nCount = m_Chunks.GetSize();
+ if (bRelease) {
+ while (i < nCount) {
+ m_pAllocator->Free(m_Chunks[i++]);
+ }
+ m_Chunks.RemoveAll();
+ } else {
+ while (i < nCount) {
+ ((FDE_LPCHUNKHEADER)m_Chunks[i++])->nUsed = 0;
+ }
+ }
+ m_nTotal = 0;
+ m_bChanged = TRUE;
+}
+FX_BOOL CFDE_TxtEdtBuf::Optimize(IFX_Pause * pPause )
+{
+ if (m_bChanged == FALSE) {
+ return TRUE;
+ }
+ if (m_nTotal == 0) {
+ return TRUE;
+ }
+ FX_INT32 nCount = m_Chunks.GetSize();
+ if (nCount == 0) {
+ return TRUE;
+ }
+ FX_INT32 i = 0;
+ for ( ; i < nCount; i ++) {
+ FDE_LPCHUNKHEADER lpChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+ if (lpChunk->nUsed == 0) {
+ m_pAllocator->Free(lpChunk);
+ m_Chunks.RemoveAt(i);
+ --i;
+ --nCount;
+ }
+ }
+ if (pPause != NULL && pPause->NeedToPauseNow()) {
+ return FALSE;
+ }
+ FDE_LPCHUNKHEADER lpPreChunk = (FDE_LPCHUNKHEADER)m_Chunks[0];
+ FDE_LPCHUNKHEADER lpCurChunk = NULL;
+ for (i = 1; i < nCount; i ++) {
+ lpCurChunk = (FDE_LPCHUNKHEADER)m_Chunks[i];
+ if (lpPreChunk->nUsed + lpCurChunk->nUsed <= m_nChunkSize) {
+ FXSYS_memcpy(lpPreChunk->wChars + lpPreChunk->nUsed, lpCurChunk->wChars, \
+ lpCurChunk->nUsed * sizeof(FX_WCHAR));
+ lpPreChunk->nUsed += lpCurChunk->nUsed;
+ m_pAllocator->Free(lpCurChunk);
+ m_Chunks.RemoveAt(i);
+ --i;
+ --nCount;
+ } else {
+ lpPreChunk = lpCurChunk;
+ }
+ if (pPause != NULL && pPause->NeedToPauseNow()) {
+ return FALSE;
+ }
+ }
+ m_bChanged = FALSE;
+ return TRUE;
+}
+void CFDE_TxtEdtBuf::ResetChunkBuffer(FX_INT32 nDefChunkCount, FX_INT32 nChunkSize)
+{
+ FXSYS_assert(nChunkSize);
+ FXSYS_assert(nDefChunkCount);
+ if (m_pAllocator) {
+ m_pAllocator->Release();
+ m_pAllocator = NULL;
+ }
+ m_Chunks.RemoveAll();
+ m_nChunkSize = nChunkSize;
+ FX_INT32 nChunkLength = sizeof(FDE_CHUNKHEADER) + (m_nChunkSize - 1) * sizeof(FX_WCHAR);
+ m_pAllocator = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, nDefChunkCount, nChunkLength);
+ FXSYS_assert(m_pAllocator);
+ FDE_LPCHUNKHEADER lpChunkHeader = (FDE_LPCHUNKHEADER)m_pAllocator->Alloc(nChunkLength);
+ FXSYS_assert(lpChunkHeader);
+ lpChunkHeader->nUsed = 0;
+ m_Chunks.Add(lpChunkHeader);
+ m_nTotal = 0;
+}
+FX_INT32 CFDE_TxtEdtBuf::CP2Index(const FDE_CHUNKPLACE & cp) const
+{
+ FX_INT32 nTotal = cp.nCharIndex;
+ FX_INT32 i = 0;
+ for (i = 0; i < cp.nChunkIndex; i ++) {
+ nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
+ }
+ return nTotal;
+}
+void CFDE_TxtEdtBuf::Index2CP(FX_INT32 nIndex, FDE_CHUNKPLACE & cp) const
+{
+ FXSYS_assert(nIndex <= GetTextLength());
+ if (nIndex == m_nTotal) {
+ cp.nChunkIndex = m_Chunks.GetSize() - 1;
+ cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[cp.nChunkIndex])->nUsed;
+ return;
+ }
+ FX_INT32 i = 0;
+ FX_INT32 nTotal = 0;
+ FX_INT32 nCount = m_Chunks.GetSize();
+ for ( ; i < nCount; i ++) {
+ nTotal += ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed;
+ if (nTotal > nIndex) {
+ break;
+ }
+ }
+ cp.nChunkIndex = i;
+ cp.nCharIndex = ((FDE_LPCHUNKHEADER)m_Chunks[i])->nUsed - (nTotal - nIndex);
+}
diff --git a/xfa/src/fee/src/fee/fde_txtedtbuf.h b/xfa/src/fee/src/fee/fde_txtedtbuf.h
new file mode 100644
index 0000000000..5baeacd2f6
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtbuf.h
@@ -0,0 +1,90 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_TXTEDTBUF_H
+#define _FDE_TXTEDTBUF_H
+class IFX_CharIter;
+class CFDE_TxtEdtBufIter;
+class CFDE_TxtEdtBuf;
+class CFDE_TxtEdtBufIter : public IFX_CharIter, public CFX_Object
+{
+public:
+#ifdef FDE_USEFORMATBLOCK
+ CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_BOOL bForDisplay = TRUE);
+#else
+ CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf * pBuf, FX_WCHAR wcAlias = 0);
+#endif
+
+ virtual void Release();
+ virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
+ virtual FX_WCHAR GetChar();
+ virtual void SetAt(FX_INT32 nIndex);
+ virtual FX_INT32 GetAt() const;
+ virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
+ virtual IFX_CharIter * Clone();
+protected:
+ ~CFDE_TxtEdtBufIter();
+private:
+ CFDE_TxtEdtBuf* m_pBuf;
+ FX_INT32 m_nCurChunk;
+ FX_INT32 m_nCurIndex;
+ FX_INT32 m_nIndex;
+ FX_BOOL m_bInField;
+#ifdef FDE_USEFORMATBLOCK
+ FX_BOOL m_bForDisplay;
+ FX_INT32 m_nAliasCount;
+#endif
+ FX_WCHAR m_Alias;
+};
+class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf, public CFX_Object
+{
+ friend class CFDE_TxtEdtBufIter;
+ struct _FDE_CHUNKHEADER : public CFX_Object {
+ FX_INT32 nUsed;
+ FX_WCHAR wChars[1];
+ };
+ typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER;
+ typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER;
+ struct _FDE_CHUNKPLACE : public CFX_Object {
+ FX_INT32 nChunkIndex;
+ FX_INT32 nCharIndex;
+ };
+ typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE;
+ typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE;
+
+public:
+ CFDE_TxtEdtBuf(FX_INT32 nDefChunkSize = FDE_DEFCHUNKLENGTH);
+
+ virtual void Release();
+ virtual FX_BOOL SetChunkSize(FX_INT32 nChunkSize);
+ virtual FX_INT32 GetChunkSize() const;
+ virtual FX_INT32 GetTextLength() const;
+ virtual void SetText(const CFX_WideString &wsText);
+ virtual void GetText(CFX_WideString &wsText) const;
+ virtual FX_WCHAR GetCharByIndex(FX_INT32 nIndex) const;
+ virtual void GetRange(CFX_WideString &wsText, FX_INT32 nBegine, FX_INT32 nCount = -1) const;
+
+ virtual void Insert(FX_INT32 nPos, FX_LPCWSTR lpText, FX_INT32 nLength = 1);
+ virtual void Delete(FX_INT32 nIndex, FX_INT32 nLength = 1);
+ virtual void Clear(FX_BOOL bRelease = TRUE);
+
+ virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL);
+
+protected:
+ virtual ~CFDE_TxtEdtBuf();
+private:
+ void ResetChunkBuffer(FX_INT32 nDefChunkCount, FX_INT32 nChunkSize);
+ FX_INT32 CP2Index(const FDE_CHUNKPLACE & cp) const;
+ void Index2CP(FX_INT32 nIndex, FDE_CHUNKPLACE & cp) const;
+
+ FX_INT32 m_nChunkSize;
+
+ FX_INT32 m_nTotal;
+ FX_BOOL m_bChanged;
+ CFX_PtrArray m_Chunks;
+ IFX_MEMAllocator * m_pAllocator;
+};
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtengine.cpp b/xfa/src/fee/src/fee/fde_txtedtengine.cpp
new file mode 100644
index 0000000000..2dbd1384cb
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtengine.cpp
@@ -0,0 +1,2871 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "../../include/ifde_txtedtengine.h"
+#include "../../include/ifde_txtedtbuf.h"
+#include "../../include/ifde_txtedtpage.h"
+#include "fde_txtedtengine.h"
+#include "fde_txtedtparag.h"
+#include "fde_txtedtkmpmatch.h"
+#include "fde_txtedtbuf.h"
+#ifdef FDE_USEFORMATBLOCK
+#include "fde_txtedtblock.h"
+#endif
+#define FDE_PAGEWIDTH_MAX 0xFFFF
+#define FDE_TXTPLATESIZE (1024 * 12)
+#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029)
+#define FDE_TXTEDT_DORECORD_INS 0
+#define FDE_TXTEDT_DORECORD_DEL 1
+#ifdef FDE_USEFORMATBLOCK
+#define FDE_TXTEDT_DORECORD_FORMATINS 3
+#define FDE_TXTEDT_DORECORD_FORMATDEL 4
+#define FDE_TXTEDT_DORECORD_FORMATREP 5
+#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
+#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
+#endif
+IFDE_TxtEdtEngine * IFDE_TxtEdtEngine::Create()
+{
+ return FX_NEW CFDE_TxtEdtEngine();
+}
+CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
+ : m_nPageLineCount(20)
+ , m_nLineCount(0)
+ , m_nAnchorPos(-1)
+ , m_nLayoutPos(0)
+ , m_fCaretPosReserve(0.0)
+ , m_nCaret(0)
+ , m_bBefore(TRUE)
+ , m_nCaretPage(0)
+ , m_bLock(FALSE)
+ , m_nLimit(0)
+ , m_wcAliasChar(L'*')
+ , m_pTextBreak(NULL)
+#ifdef FDE_USEFORMATBLOCK
+ , m_nFixLength(-1)
+#endif
+ , m_dwFindFlags(0)
+ , m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto)
+ , m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR)
+ , m_bAutoLineEnd(TRUE)
+{
+ FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
+ m_pTxtBuf = FX_NEW CFDE_TxtEdtBuf();
+ m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+}
+CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine()
+{
+ if (m_pTxtBuf) {
+ m_pTxtBuf->Release();
+ m_pTxtBuf = NULL;
+ }
+ if (m_pTextBreak) {
+ m_pTextBreak->Release();
+ m_pTextBreak = NULL;
+ }
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount > 0) {
+ FX_INT32 i = 0;
+ for (; i < nBlockCount; i ++) {
+ CFDE_TxtEdtBlock * pBlock = m_BlockArray[i];
+ delete pBlock;
+ }
+ m_BlockArray.RemoveAll();
+ }
+#endif
+ RemoveAllParags();
+ RemoveAllPages();
+ m_Param.pEventSink = NULL;
+ ClearSelection();
+}
+void CFDE_TxtEdtEngine::Release()
+{
+ delete this;
+}
+void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS &params)
+{
+ if (m_pTextBreak == NULL) {
+ m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
+ }
+ FXSYS_memcpy(&m_Param, &params, sizeof(FDE_TXTEDTPARAMS));
+ m_wLineEnd = params.wLineBreakChar;
+ m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
+ UpdateTxtBreak();
+}
+const FDE_TXTEDTPARAMS * CFDE_TxtEdtEngine::GetEditParams() const
+{
+ return &m_Param;
+}
+FX_INT32 CFDE_TxtEdtEngine::CountPages() const
+{
+ if (m_nLineCount == 0) {
+ return 0;
+ }
+ return ((m_nLineCount - 1) / m_nPageLineCount) + 1;
+}
+IFDE_TxtEdtPage * CFDE_TxtEdtEngine::GetPage(FX_INT32 nIndex)
+{
+ if (m_PagePtrArray.GetSize() <= nIndex) {
+ return NULL;
+ }
+ return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex];
+}
+FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(FX_INT32 nChunkSize)
+{
+ return m_pTxtBuf->SetChunkSize(nChunkSize);
+}
+void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream *pStream)
+{
+ ResetEngine();
+ FX_INT32 nIndex = 0;
+ if (pStream != NULL && pStream->GetLength()) {
+ FX_INT32 nStreamLength = pStream->GetLength();
+ FX_BOOL bValid = TRUE;
+ if (m_nLimit > 0 && nStreamLength > m_nLimit) {
+ bValid = FALSE;
+ }
+ FX_BOOL bPreIsCR = FALSE;
+ if (bValid) {
+ FX_BYTE bom[4];
+ FX_INT32 nPos = pStream->GetBOM(bom);
+ pStream->Seek(FX_STREAMSEEK_Begin, nPos);
+ FX_INT32 bEos = FALSE;
+ FX_INT32 nPlateSize = FX_MIN(nStreamLength, m_pTxtBuf->GetChunkSize());
+ FX_LPWSTR lpwstr = (FX_LPWSTR)FDE_Alloc(nPlateSize * sizeof(FX_WCHAR));
+ FXSYS_assert(lpwstr);
+ FX_INT32 nRead = 0;
+ while (!bEos) {
+ nRead = pStream->ReadString(lpwstr, nPlateSize, bEos);
+ bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR);
+ m_pTxtBuf->Insert(nIndex, lpwstr, nRead);
+ nIndex += nRead;
+ }
+ FDE_Free(lpwstr);
+ }
+ }
+ m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1);
+ RebuildParagraphs();
+}
+void CFDE_TxtEdtEngine::SetText(const CFX_WideString &wsText)
+{
+ ResetEngine();
+ FX_INT32 nLength = wsText.GetLength();
+ if (nLength > 0) {
+ CFX_WideString wsTemp;
+ FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nLength);
+ FXSYS_memcpy(lpBuffer, FX_LPCWSTR(wsText), nLength * sizeof(FX_WCHAR));
+ ReplaceParagEnd(lpBuffer, nLength, FALSE);
+ wsTemp.ReleaseBuffer(nLength);
+ if (m_nLimit > 0 && nLength > m_nLimit) {
+ wsTemp.Delete(m_nLimit, nLength - m_nLimit);
+ nLength = m_nLimit;
+ }
+ m_pTxtBuf->SetText(wsTemp);
+ }
+ m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1);
+ RebuildParagraphs();
+}
+FX_INT32 CFDE_TxtEdtEngine::GetTextLength() const
+{
+ return GetTextBufLength();
+}
+void CFDE_TxtEdtEngine::GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount )
+{
+ FX_INT32 nTextBufLength = GetTextBufLength();
+ if (nCount == -1) {
+ nCount = nTextBufLength - nStart;
+ }
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount == 0 || m_wsFixText.IsEmpty()) {
+ m_pTxtBuf->GetRange(wsText, nStart, nCount);
+ return;
+ }
+ CFX_WideString wsTemp;
+ FX_LPCWSTR lpFixBuffer = FX_LPCWSTR(m_wsFixText);
+ FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nTextBufLength);
+ FX_INT32 nRealLength = 0;
+ FX_INT32 nPrePos = 0;
+ for (FX_INT32 i = 0; i < nBlockCount; i ++) {
+ CFDE_TxtEdtBlock *pBlock = m_BlockArray[i];
+ FX_INT32 nPos = pBlock->GetPos();
+ FX_INT32 nCopyLength = nPos - nPrePos;
+ FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, nCopyLength * sizeof(FX_WCHAR));
+ nRealLength += nCopyLength;
+ nPrePos = nPos;
+ CFX_WideString wsBlock;
+ pBlock->GetRealText(wsBlock);
+ nCopyLength = wsBlock.GetLength();
+ FXSYS_memcpy(lpBuffer + nRealLength, FX_LPCWSTR(wsBlock), nCopyLength * sizeof(FX_WCHAR));
+ nRealLength += nCopyLength;
+ }
+ FX_INT32 nLeftLength = m_wsFixText.GetLength() - nPrePos;
+ if (nLeftLength > 0) {
+ FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, nLeftLength * sizeof(FX_WCHAR));
+ nRealLength += nLeftLength;
+ }
+ wsTemp.ReleaseBuffer(nRealLength);
+ FX_INT32 nRealBgn = GetRealIndex(nStart);
+ FX_INT32 nRealEnd = GetRealIndex(nStart + nCount - 1);
+ FX_INT32 nRealCount = nRealEnd - nRealBgn;
+ FX_LPWSTR lpDestBuf = wsText.GetBuffer(nRealCount);
+ FXSYS_memcpy(lpDestBuf, FX_LPCWSTR(wsTemp) + nRealBgn, nRealCount * sizeof(FX_WCHAR));
+ wsText.ReleaseBuffer();
+#else
+ m_pTxtBuf->GetRange(wsText, nStart, nCount);
+ RecoverParagEnd(wsText);
+ return;
+#endif
+}
+void CFDE_TxtEdtEngine::ClearText()
+{
+ DeleteRange(0, -1);
+}
+FX_INT32 CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF &rtCaret) const
+{
+ rtCaret = m_rtCaret;
+ return m_nCaret;
+}
+FX_INT32 CFDE_TxtEdtEngine::GetCaretPos() const
+{
+ if (IsLocked()) {
+ return 0;
+ }
+ return m_nCaret + (m_bBefore ? 0 : 1);
+}
+FX_INT32 CFDE_TxtEdtEngine::SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore)
+{
+ if (IsLocked()) {
+ return 0;
+ }
+ FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength());
+ if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
+ return 0;
+ }
+#ifdef FDE_USEFORMATBLOCK
+ if (m_BlockArray.GetSize() > 0) {
+ nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_MIDDLE, bBefore);
+ }
+#endif
+ m_bBefore = bBefore;
+ m_nCaret = nIndex;
+ MovePage2Char(m_nCaret);
+ GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
+ if (!m_bBefore) {
+ m_nCaret ++;
+ m_bBefore = TRUE;
+ }
+ m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) ? \
+ m_rtCaret.top : m_rtCaret.left;
+ m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
+ m_nAnchorPos = -1;
+ return m_nCaret;
+}
+FX_INT32 CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
+ FX_BOOL bShift ,
+ FX_BOOL bCtrl )
+{
+ if (IsLocked()) {
+ return 0;
+ }
+ if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
+ return 0;
+ }
+ FX_BOOL bSelChange = FALSE;
+ if (IsSelect()) {
+ ClearSelection();
+ bSelChange = TRUE;
+ }
+ if (bShift) {
+ if (m_nAnchorPos == -1) {
+ m_nAnchorPos = m_nCaret;
+ }
+ } else {
+ m_nAnchorPos = -1;
+ }
+ FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
+ FX_INT32 nCaret = m_nCaret;
+ FX_INT32 nCaretPage = m_nCaretPage;
+ switch (eMoveCaret) {
+ case MC_Left: {
+ if (bVertical) {
+ CFX_PointF ptCaret;
+ if (MoveUp(ptCaret)) {
+ UpdateCaretIndex(ptCaret);
+ }
+ } else {
+ FX_BOOL bBefore = TRUE;
+ FX_INT32 nIndex = MoveBackward(bBefore);
+#ifdef FDE_USEFORMATBLOCK
+ if (m_BlockArray.GetSize()) {
+ nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore);
+ if (nIndex < 0) {
+ return m_nCaret;
+ }
+ }
+#endif
+ if (nIndex >= 0) {
+ UpdateCaretRect(nIndex, bBefore);
+ }
+ }
+ }
+ break;
+ case MC_Right: {
+ if (bVertical) {
+ CFX_PointF ptCaret;
+ if (MoveDown(ptCaret)) {
+ UpdateCaretIndex(ptCaret);
+ }
+ } else {
+ FX_BOOL bBefore = TRUE;
+ FX_INT32 nIndex = MoveForward(bBefore);
+#ifdef FDE_USEFORMATBLOCK
+ if (m_BlockArray.GetSize()) {
+ if (nIndex == -1) {
+ nIndex = GetTextBufLength();
+ }
+ nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore);
+ }
+#endif
+ if (nIndex >= 0) {
+ UpdateCaretRect(nIndex, bBefore);
+ }
+ }
+ }
+ break;
+ case MC_Up: {
+ if (bVertical) {
+ FX_BOOL bBefore = TRUE;
+ FX_INT32 nIndex = MoveBackward(bBefore);
+#ifdef FDE_USEFORMATBLOCK
+ if (m_BlockArray.GetSize()) {
+ nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore);
+ }
+#endif
+ if (nIndex >= 0) {
+ UpdateCaretRect(nIndex, bBefore);
+ }
+ } else {
+ CFX_PointF ptCaret;
+ if (MoveUp(ptCaret)) {
+ UpdateCaretIndex(ptCaret);
+ }
+ }
+ }
+ break;
+ case MC_Down: {
+ if (bVertical) {
+ FX_BOOL bBefore = TRUE;
+ FX_INT32 nIndex = MoveForward(bBefore);
+#ifdef FDE_USEFORMATBLOCK
+ if (m_BlockArray.GetSize()) {
+ nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore);
+ }
+#endif
+ if (nIndex >= 0) {
+ UpdateCaretRect(nIndex, bBefore);
+ }
+ } else {
+ CFX_PointF ptCaret;
+ if (MoveDown(ptCaret)) {
+ UpdateCaretIndex(ptCaret);
+ }
+ }
+ }
+ break;
+ case MC_WordBackward:
+ break;
+ case MC_WordForward:
+ break;
+ case MC_LineStart:
+ MoveLineStart();
+ break;
+ case MC_LineEnd:
+ MoveLineEnd();
+ break;
+ case MC_ParagStart:
+ MoveParagStart();
+ break;
+ case MC_ParagEnd:
+ MoveParagEnd();
+ break;
+ case MC_PageDown:
+ break;
+ case MC_PageUp:
+ break;
+ case MC_Home:
+ MoveHome();
+ break;
+ case MC_End:
+ MoveEnd();
+ break;
+ default:
+ break;
+ }
+ if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) {
+ AddSelRange(FX_MIN(m_nAnchorPos, m_nCaret), FXSYS_abs(m_nAnchorPos - m_nCaret));
+ m_Param.pEventSink->On_SelChanged(this);
+ }
+ if (bSelChange) {
+ m_Param.pEventSink->On_SelChanged(this);
+ }
+ return m_nCaret;
+}
+void CFDE_TxtEdtEngine::Lock()
+{
+ m_bLock = TRUE;
+}
+void CFDE_TxtEdtEngine::Unlock()
+{
+ m_bLock = FALSE;
+}
+FX_BOOL CFDE_TxtEdtEngine::IsLocked() const
+{
+ return m_bLock;
+}
+FX_INT32 CFDE_TxtEdtEngine::Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength)
+{
+ if (IsLocked()) {
+ return FDE_TXTEDT_MODIFY_RET_F_Locked;
+ }
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount) {
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_TAB && nLength == 1 && lpText[0] == L'\t') {
+ return Move2NextEditableField(nStart) ? FDE_TXTEDT_MODIFY_RET_T_Tab : \
+ FDE_TXTEDT_MODIFY_RET_F_Tab;
+ }
+ FX_INT32 nSelRangeCount = CountSelRanges();
+ if (nSelRangeCount > 0) {
+ if (nSelRangeCount > 1) {
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ }
+ FX_INT32 nSelStart;
+ FX_INT32 nSelCount;
+ nSelCount = GetSelRange(0, nSelStart);
+ FX_INT32 nSelEnd = nSelStart + nSelCount;
+ FX_INT32 nBgn = 0;
+ FX_INT32 nEnd = 0;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField);
+ if (nSelEnd > nEnd) {
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ }
+ if (bInField) {
+ pField->Backup();
+ FX_BOOL bBefore = FALSE;
+ CFX_WideString wsDel;
+ FX_INT32 nCaret;
+ FX_INT32 nIndexInField = nSelStart - nBgn;
+ FX_INT32 nRet = pField->Replace(nSelStart - nBgn, nSelCount, CFX_WideStringC(lpText, nLength), wsDel, nCaret, bBefore);
+ switch(nRet) {
+ case FDE_FORMAT_FIELD_INSERT_RET_F_FULL:
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE:
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ default:
+ break;
+ }
+ CFX_WideString wsField;
+ pField->GetFieldText(wsField);
+ if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ CFX_WideString wsDisplay;
+ pField->GetDisplayText(wsDisplay);
+ if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
+ CFX_WideString wsText;
+ GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength());
+ if (!IsFitArea(wsText)) {
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ }
+ }
+ Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
+ FX_INT32 nNewCaret = nBgn + nCaret;
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldReplace(this, \
+ m_nCaret, nNewCaret, pField, nIndexInField, nBgn, wsDisplay.GetLength(), \
+ wsDel, CFX_WideStringC(lpText, nLength), TRUE);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ SetCaretPos(nBgn + nCaret, bBefore);
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+ }
+ }
+ FX_INT32 nBgn = 0;
+ FX_INT32 nEnd = 0;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bInField = GetFieldBoundary(m_nCaret, nBgn, nEnd, pField);
+ FX_INT32 nCaretInField = m_nCaret - nBgn;
+ FX_BOOL bBefore = FALSE;
+ if (bInField) {
+ pField->Backup();
+ CFX_WideStringC wsIns(lpText, nLength);
+ FX_INT32 nRet = pField->Insert(nCaretInField, wsIns, nCaretInField, bBefore);
+ FX_BOOL bFull = FALSE;
+ switch (nRet) {
+ case FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL:
+ break;
+ case FDE_FORMAT_FIELD_INSERT_RET_S_FULL:
+ bFull = TRUE;
+ break;
+ case FDE_FORMAT_FIELD_INSERT_RET_F_FULL:
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE:
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ default:
+ return FDE_TXTEDT_MODIFY_RET_F_Normal;
+ }
+ CFX_WideString wsField;
+ pField->GetFieldText(wsField);
+ if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ CFX_WideString wsDisplay;
+ pField->GetDisplayText(wsDisplay);
+ if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
+ CFX_WideString wsText;
+ GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength());
+ if (!IsFitArea(wsText)) {
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ }
+ }
+ Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldInsert(this, \
+ m_nCaret, pField, m_nCaret - nBgn, nBgn, \
+ nEnd - nBgn + 1, wsDisplay.GetLength(), \
+ CFX_WideStringC(lpText, nLength), FALSE);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ FX_INT32 nCaretPos = nBgn + nCaretInField;
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_AUTO && bFull && nCaretPos == nEnd) {
+ if (Move2NextEditableField(nEnd, TRUE, FALSE)) {
+ return TRUE;
+ }
+ }
+ SetCaretPos(nCaretPos, bBefore);
+ return bFull ? FDE_TXTEDT_MODIFY_RET_S_Full : FDE_TXTEDT_MODIFY_RET_S_Normal;
+ }
+ FXSYS_assert(0);
+ return FDE_TXTEDT_MODIFY_RET_F_Normal;
+ }
+#endif
+ CFX_WideString wsTemp;
+ FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nLength);
+ FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
+ ReplaceParagEnd(lpBuffer, nLength, FALSE);
+ wsTemp.ReleaseBuffer(nLength);
+ FX_BOOL bPart = FALSE;
+ if (m_nLimit > 0) {
+ FX_INT32 nTotalLength = GetTextBufLength();
+ FX_INT32 nDelLength = 0;
+ FX_INT32 nCount = m_SelRangePtrArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i);
+ nTotalLength -= lpSelRange->nCount;
+ }
+ FX_INT32 nExpectLength = nTotalLength + nLength;
+ if (nTotalLength == m_nLimit) {
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ }
+ if (nExpectLength > m_nLimit) {
+ nLength -= (nExpectLength - m_nLimit);
+ bPart = TRUE;
+ }
+ }
+ if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
+ FX_INT32 nTemp = nLength;
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) {
+ CFX_WideString wsText;
+ while (nLength > 0) {
+ GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+ FX_INT32 nTotal = wsText.GetLength();
+ FX_LPWSTR lpBuf = wsText.GetBuffer(nTotal);
+ for (FX_INT32 i = 0; i < nTotal; i ++) {
+ lpBuf[i] = m_wcAliasChar;
+ }
+ wsText.ReleaseBuffer(nTotal);
+ if (IsFitArea(wsText)) {
+ break;
+ }
+ nLength --;
+ }
+ } else {
+ CFX_WideString wsText;
+ while (nLength > 0) {
+ GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+ if (IsFitArea(wsText)) {
+ break;
+ }
+ nLength --;
+ }
+ }
+ if (nLength == 0) {
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ }
+ if (nLength < nTemp) {
+ bPart = TRUE;
+ }
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+ CFX_WideString wsText;
+ GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+ if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ }
+ if (IsSelect()) {
+ DeleteSelect();
+ }
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ GetText(m_ChangeInfo.wsPrevText, 0);
+ Inner_Insert(m_nCaret, lpBuffer, nLength);
+ m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+ m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength);
+ nStart = m_nCaret;
+ nStart += nLength;
+ FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
+ FX_BOOL bBefore = TRUE;
+ if (wChar != L'\n' && wChar != L'\r') {
+ nStart --;
+ bBefore = FALSE;
+ }
+ SetCaretPos(nStart, bBefore);
+ m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+ return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+FX_INT32 CFDE_TxtEdtEngine::Delete(FX_INT32 nStart, FX_BOOL bBackspace )
+{
+ if (IsLocked()) {
+ return FDE_TXTEDT_MODIFY_RET_F_Locked;
+ }
+ if (IsSelect()) {
+ DeleteSelect();
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+ }
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount > 0) {
+ if (bBackspace) {
+ nStart --;
+ }
+ FX_INT32 nCount = 1;
+ FX_INT32 nBgn = 0;
+ FX_INT32 nEnd = 0;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bInField = GetFieldBoundary(nStart, nBgn, nEnd, pField);
+ FX_INT32 nCaretInField = nStart - nBgn;
+ FX_BOOL bBefore = FALSE;
+ if (bInField && !pField->IsFix()) {
+ pField->Backup();
+ CFX_WideString wsDel;
+ FX_INT32 nCaret = 0;
+ FX_INT32 nRet = pField->Delete(nCaretInField, nCount, wsDel, nCaret, bBefore);
+ nCaret += nBgn;
+ switch (nRet) {
+ case FDE_FORMAT_FIELD_DELETE_RET_S:
+ break;
+ case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE:
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY:
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ default:
+ FXSYS_assert(0);
+ break;
+ }
+ CFX_WideString wsField;
+ pField->GetFieldText(wsField);
+ if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
+ pField->Restore();
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ CFX_WideString wsDisplay;
+ pField->GetDisplayText(wsDisplay);
+ Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(this, nStart, pField, nCaretInField,
+ nBgn, nEnd - nBgn + 1, wsDisplay.GetLength(), wsDel, FALSE);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ SetCaretPos(nStart, bBefore);
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+ }
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ }
+#endif
+ FX_INT32 nCount = 1;
+ if (bBackspace) {
+ if (nStart == 0) {
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ }
+ if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' && \
+ m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') {
+ nStart --;
+ nCount ++;
+ }
+ nStart --;
+ } else {
+ if (nStart == GetTextBufLength()) {
+ return FDE_TXTEDT_MODIFY_RET_F_Full;
+ }
+ if ((nStart + 1 < GetTextBufLength()) && (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') && \
+ (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) {
+ nCount ++;
+ }
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+ CFX_WideString wsText;
+ GetPreDeleteText(wsText, nStart, nCount);
+ if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ }
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ CFX_WideString wsRange;
+ m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+ GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+ Inner_DeleteRange(nStart, nCount);
+ SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), (bBackspace || nStart == 0));
+ m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+FX_INT32 CFDE_TxtEdtEngine::DeleteRange(FX_INT32 nStart, FX_INT32 nCount )
+{
+ if (IsLocked()) {
+ return FDE_TXTEDT_MODIFY_RET_F_Locked;
+ }
+ if (nCount == -1) {
+ nCount = GetTextBufLength();
+ }
+ if (nCount == 0) {
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+ CFX_WideString wsText;
+ GetPreDeleteText(wsText, nStart, nCount);
+ if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ }
+ DeleteRange_DoRecord(nStart, nCount);
+ m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+ SetCaretPos(nStart, TRUE);
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+FX_INT32 CFDE_TxtEdtEngine::Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace)
+{
+ if (IsLocked()) {
+ return FDE_TXTEDT_MODIFY_RET_F_Locked;
+ }
+ if (nStart < 0 || (nStart + nLength > GetTextBufLength())) {
+ return FDE_TXTEDT_MODIFY_RET_F_Boundary;
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
+ CFX_WideString wsText;
+ GetPreReplaceText(wsText, nStart, nLength, FX_LPCWSTR(wsReplace), wsReplace.GetLength());
+ if (!m_Param.pEventSink->On_Validate(this, wsText)) {
+ return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
+ }
+ }
+ if (IsSelect()) {
+ ClearSelection();
+ }
+ m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace;
+ GetText(m_ChangeInfo.wsDelete, nStart, nLength);
+ if (nLength > 0) {
+ Inner_DeleteRange(nStart, nLength);
+ }
+ FX_INT32 nTextLength = wsReplace.GetLength();
+ if (nTextLength > 0) {
+ Inner_Insert(nStart, FX_LPCWSTR(wsReplace), nTextLength);
+ }
+ m_ChangeInfo.wsInsert = CFX_WideString(FX_LPCWSTR(wsReplace), nTextLength);
+ nStart += nTextLength;
+ FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
+ FX_BOOL bBefore = TRUE;
+ if (wChar != L'\n' && wChar != L'\r') {
+ nStart --;
+ bBefore = FALSE;
+ }
+ SetCaretPos(nStart, bBefore);
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+ m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+ return FDE_TXTEDT_MODIFY_RET_S_Normal;
+}
+void CFDE_TxtEdtEngine::SetLimit(FX_INT32 nLimit)
+{
+ m_nLimit = nLimit;
+}
+void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias)
+{
+ m_wcAliasChar = wcAlias;
+}
+void CFDE_TxtEdtEngine::SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat)
+{
+#ifdef FDE_USEFORMATBLOCK
+ if (m_nFixLength == -1) {
+ m_nFixLength = GetTextLength();
+ FXSYS_assert(m_wsFixText.IsEmpty());
+ GetText(m_wsFixText, 0, -1);
+ }
+ FX_BOOL bInBlock = FALSE;
+ FX_INT32 nCharIndex = 0;
+ FX_INT32 nBlockIndex = 0;
+ FX_INT32 nBlockPos = -1;
+ FX_WCHAR wc;
+ CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
+ pIter->SetAt(0);
+ do {
+ wc = pIter->GetChar();
+ if (bInBlock) {
+ if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
+ nBlockIndex ++;
+ bInBlock = FALSE;
+ }
+ } else {
+ if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
+ bInBlock = TRUE;
+ } else {
+ if (nCharIndex ++ == nIndex) {
+ nBlockPos = pIter->GetAt();
+ break;
+ }
+ }
+ }
+ } while (pIter->Next());
+ pIter->Release();
+ if (nBlockPos == -1) {
+ nBlockPos = GetTextBufLength();
+ }
+ CFDE_TxtEdtBlock * pEditBlock = FX_NEW CFDE_TxtEdtBlock(this, wsBlockFormat, nIndex);
+ m_BlockArray.InsertAt(m_BlockArray.GetSize(), pEditBlock);
+ CFX_WideString wsDisplay;
+ pEditBlock->GetDisplayText(wsDisplay);
+ m_nCaret = nBlockPos;
+ if (wsDisplay.GetLength() > 0) {
+ RawInsert(nBlockPos, FX_LPCWSTR(wsDisplay), wsDisplay.GetLength());
+ }
+#endif
+}
+FX_INT32 CFDE_TxtEdtEngine::CountEditBlocks() const
+{
+#ifdef FDE_USEFORMATBLOCK
+ return m_BlockArray.GetSize();
+#else
+ return 0;
+#endif
+}
+void CFDE_TxtEdtEngine::GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const
+{
+#ifdef FDE_USEFORMATBLOCK
+ CFDE_TxtEdtBlock * pBlock = m_BlockArray[nIndex];
+ pBlock->GetBlockText(wsBlockText);
+#endif
+}
+FX_INT32 CFDE_TxtEdtEngine::CountEditFields(FX_INT32 nBlockIndex) const
+{
+#ifdef FDE_USEFORMATBLOCK
+ CFDE_TxtEdtBlock * pBlock = m_BlockArray[nBlockIndex];
+ return pBlock->CountField();
+#else
+ return 0;
+#endif
+}
+void CFDE_TxtEdtEngine::GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const
+{
+#ifdef FDE_USEFORMATBLOCK
+ CFDE_TxtEdtBlock * pBlock = m_BlockArray[nBlockIndex];
+ pBlock->GetFieldText(nFieldIndex, wsFieldText);
+#endif
+}
+void CFDE_TxtEdtEngine::StartEdit()
+{
+#ifdef FDE_USEFORMATBLOCK
+#endif
+}
+void CFDE_TxtEdtEngine::EndEdit()
+{
+#ifdef FDE_USEFORMATBLOCK
+#endif
+}
+void CFDE_TxtEdtEngine::RemoveSelRange(FX_INT32 nStart, FX_INT32 nCount )
+{
+ FDE_LPTXTEDTSELRANGE lpTemp = NULL;
+ FX_INT32 nRangeCount = m_SelRangePtrArr.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nRangeCount; i ++) {
+ lpTemp = m_SelRangePtrArr[i];
+ if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) {
+ delete lpTemp;
+ m_SelRangePtrArr.RemoveAt(i);
+ return;
+ }
+ }
+ return;
+}
+void CFDE_TxtEdtEngine::AddSelRange(FX_INT32 nStart, FX_INT32 nCount )
+{
+ if (nCount == -1) {
+ nCount = GetTextLength() - nStart;
+ }
+ FX_INT32 nSize = m_SelRangePtrArr.GetSize();
+ if (nSize <= 0) {
+ FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE;
+ lpSelRange->nStart = nStart;
+ lpSelRange->nCount = nCount;
+ m_SelRangePtrArr.Add(lpSelRange);
+ m_Param.pEventSink->On_SelChanged(this);
+ return;
+ }
+ FDE_LPTXTEDTSELRANGE lpTemp = NULL;
+ lpTemp = m_SelRangePtrArr[nSize - 1];
+ if (nStart >= lpTemp->nStart + lpTemp->nCount) {
+ FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE;
+ lpSelRange->nStart = nStart;
+ lpSelRange->nCount = nCount;
+ m_SelRangePtrArr.Add(lpSelRange);
+ m_Param.pEventSink->On_SelChanged(this);
+ return;
+ }
+ FX_INT32 nEnd = nStart + nCount - 1;
+ FX_BOOL bBegin = FALSE;
+ FX_INT32 nRangeBgn = 0;
+ FX_INT32 nRangeCnt = 0;
+ for (FX_INT32 i = 0; i < nSize; i ++) {
+ lpTemp = m_SelRangePtrArr[i];
+ FX_INT32 nTempBgn = lpTemp->nStart;
+ FX_INT32 nTempEnd = nTempBgn + lpTemp->nCount - 1;
+ if (bBegin) {
+ if (nEnd < nTempBgn) {
+ break;
+ } else if (nStart >= nTempBgn && nStart <= nTempEnd) {
+ nRangeCnt ++;
+ break;
+ }
+ nRangeCnt ++;
+ } else {
+ if (nStart <= nTempEnd) {
+ nRangeBgn = i;
+ if (nEnd < nTempBgn) {
+ break;
+ }
+ nRangeCnt = 1;
+ bBegin = TRUE;
+ }
+ }
+ }
+ if (nRangeCnt == 0) {
+ FDE_LPTXTEDTSELRANGE lpSelRange = FX_NEW FDE_TXTEDTSELRANGE;
+ lpSelRange->nStart = nStart;
+ lpSelRange->nCount = nCount;
+ m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange);
+ } else {
+ lpTemp = m_SelRangePtrArr[nRangeBgn];
+ lpTemp->nStart = nStart;
+ lpTemp->nCount = nCount;
+ nRangeCnt --;
+ nRangeBgn ++;
+ while (nRangeCnt--) {
+ delete m_SelRangePtrArr[nRangeBgn];
+ m_SelRangePtrArr.RemoveAt(nRangeBgn);
+ }
+ }
+ m_Param.pEventSink->On_SelChanged(this);
+ return;
+}
+FX_INT32 CFDE_TxtEdtEngine::CountSelRanges()
+{
+ return m_SelRangePtrArr.GetSize();
+}
+FX_INT32 CFDE_TxtEdtEngine::GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart)
+{
+ nStart = m_SelRangePtrArr[nIndex]->nStart;
+ return m_SelRangePtrArr[nIndex]->nCount;
+}
+void CFDE_TxtEdtEngine::ClearSelection()
+{
+ FX_INT32 nCount = m_SelRangePtrArr.GetSize();
+ FDE_LPTXTEDTSELRANGE lpRange = NULL;
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ lpRange = m_SelRangePtrArr[i];
+ if (lpRange != NULL) {
+ delete lpRange;
+ lpRange = NULL;
+ }
+ }
+ m_SelRangePtrArr.RemoveAll();
+ if (nCount && m_Param.pEventSink) {
+ m_Param.pEventSink->On_SelChanged(this);
+ }
+}
+FX_BOOL CFDE_TxtEdtEngine::Redo(FX_BSTR bsRedo)
+{
+ if (IsLocked()) {
+ return FALSE;
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
+ return FALSE;
+ }
+ IFDE_TxtEdtDoRecord * pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo);
+ FXSYS_assert(pDoRecord);
+ if (pDoRecord == NULL) {
+ return FALSE;
+ }
+ FX_BOOL bOK = pDoRecord->Redo();
+ pDoRecord->Release();
+ return bOK;
+}
+FX_BOOL CFDE_TxtEdtEngine::Undo(FX_BSTR bsUndo)
+{
+ if (IsLocked()) {
+ return FALSE;
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
+ return FALSE;
+ }
+ IFDE_TxtEdtDoRecord * pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo);
+ FXSYS_assert(pDoRecord);
+ if (pDoRecord == NULL) {
+ return FALSE;
+ }
+ FX_BOOL bOK = pDoRecord->Undo();
+ pDoRecord->Release();
+ return bOK;
+}
+FX_INT32 CFDE_TxtEdtEngine::StartLayout()
+{
+ Lock();
+ RemoveAllPages();
+ m_nLayoutPos = 0;
+ m_nLineCount = 0;
+ return 0;
+}
+FX_INT32 CFDE_TxtEdtEngine::DoLayout(IFX_Pause * pPause)
+{
+ FX_INT32 nCount = m_ParagPtrArray.GetSize();
+ CFDE_TxtEdtParag * pParag = NULL;
+ FX_INT32 nLineCount = 0;
+ for (; m_nLayoutPos < nCount; m_nLayoutPos ++) {
+ pParag = m_ParagPtrArray[m_nLayoutPos];
+ pParag->CalcLines();
+ nLineCount += pParag->m_nLineCount;
+ if ((pPause != NULL) && (nLineCount > m_nPageLineCount) && pPause->NeedToPauseNow()) {
+ m_nLineCount += nLineCount;
+ return (++m_nLayoutPos * 100) / nCount;
+ }
+ }
+ m_nLineCount += nLineCount;
+ return 100;
+}
+void CFDE_TxtEdtEngine::EndLayout()
+{
+ UpdatePages();
+ FX_INT32 nLength = GetTextLength();
+ if (m_nCaret > nLength) {
+ m_nCaret = nLength;
+ }
+ FX_INT32 nIndex = m_nCaret;
+ if (!m_bBefore) {
+ nIndex --;
+ }
+ m_rtCaret.Set(0, 0, 1, m_Param.fFontSize);
+ Unlock();
+}
+FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause * pPause )
+{
+ return m_pTxtBuf->Optimize(pPause);
+}
+IFDE_TxtEdtBuf * CFDE_TxtEdtEngine::GetTextBuf() const
+{
+ return (IFDE_TxtEdtBuf*)m_pTxtBuf;
+}
+FX_INT32 CFDE_TxtEdtEngine::GetTextBufLength() const
+{
+ return m_pTxtBuf->GetTextLength() - 1;
+}
+IFX_TxtBreak * CFDE_TxtEdtEngine::GetTextBreak() const
+{
+ return m_pTextBreak;
+}
+FX_INT32 CFDE_TxtEdtEngine::GetLineCount() const
+{
+ return m_nLineCount;
+}
+FX_INT32 CFDE_TxtEdtEngine::GetPageLineCount() const
+{
+ return m_nPageLineCount;
+}
+FX_INT32 CFDE_TxtEdtEngine::CountParags() const
+{
+ return m_ParagPtrArray.GetSize();
+}
+IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(FX_INT32 nParagIndex) const
+{
+ return m_ParagPtrArray[nParagIndex];
+}
+IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter()
+{
+ if (!m_pTxtBuf) {
+ return NULL;
+ }
+ return FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
+}
+FX_INT32 CFDE_TxtEdtEngine::Line2Parag(FX_INT32 nStartParag, FX_INT32 nStartLineofParag, \
+ FX_INT32 nLineIndex, FX_INT32 &nStartLine) const
+{
+ FX_INT32 nLineTotal = nStartLineofParag;
+ FX_INT32 nCount = m_ParagPtrArray.GetSize();
+ CFDE_TxtEdtParag * pParag = NULL;
+ FX_INT32 i = nStartParag;
+ for (; i < nCount; i ++) {
+ pParag = m_ParagPtrArray[i];
+ nLineTotal += pParag->m_nLineCount;
+ if (nLineTotal > nLineIndex) {
+ break;
+ }
+ }
+ nStartLine = nLineTotal - pParag->m_nLineCount;
+ return i;
+}
+void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nLength)
+{
+ GetText(wsText, 0, GetTextBufLength());
+ wsText.Delete(nIndex, nLength);
+}
+void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString &wsText, FX_INT32 nIndex, FX_LPCWSTR lpText, FX_INT32 nLength)
+{
+ GetText(wsText, 0, GetTextBufLength());
+ FX_INT32 nSelIndex = 0;
+ FX_INT32 nSelLength = 0;
+ FX_INT32 nSelCount = CountSelRanges();
+ while (nSelCount --) {
+ nSelLength = GetSelRange(nSelCount, nSelIndex);
+ wsText.Delete(nSelIndex, nSelLength);
+ nIndex = nSelIndex;
+ }
+ CFX_WideString wsTemp;
+ FX_INT32 nOldLength = wsText.GetLength();
+ FX_LPCWSTR pOldBuffer = FX_LPCWSTR(wsText);
+ FX_LPWSTR lpBuffer = wsTemp.GetBuffer(nOldLength + nLength);
+ FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR));
+ FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR));
+ FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex, (nOldLength - nIndex) * sizeof(FX_WCHAR));
+ wsTemp.ReleaseBuffer(nOldLength + nLength);
+ wsText = wsTemp;
+}
+void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nOriginLength, FX_LPCWSTR lpText, FX_INT32 nLength)
+{
+ GetText(wsText, 0, GetTextBufLength());
+ FX_INT32 nSelIndex = 0;
+ FX_INT32 nSelLength = 0;
+ FX_INT32 nSelCount = CountSelRanges();
+ while (nSelCount --) {
+ nSelLength = GetSelRange(nSelCount, nSelIndex);
+ wsText.Delete(nSelIndex, nSelLength);
+ }
+ wsText.Delete(nIndex, nOriginLength);
+ FX_INT32 i = 0;
+ for (i = 0; i < nLength; i ++) {
+ wsText.Insert(nIndex ++, lpText[i]);
+ }
+}
+void CFDE_TxtEdtEngine::Inner_Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength)
+{
+ FXSYS_assert(nLength > 0);
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nStart, ParagPos);
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+ FX_INT32 nParagCount = m_ParagPtrArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = ParagPos.nParagIndex + 1; i < nParagCount; i ++) {
+ m_ParagPtrArray[i]->m_nCharStart += nLength;
+ }
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ FX_INT32 nReserveLineCount = pParag->m_nLineCount;
+ FX_INT32 nReserveCharStart = pParag->m_nCharStart;
+ FX_INT32 nLeavePart = ParagPos.nCharIndex;
+ FX_INT32 nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
+ FX_INT32 nTextStart = 0;
+ FX_WCHAR wCurChar = L' ';
+ FX_LPCWSTR lpPos = lpText;
+ FX_BOOL bFirst = TRUE;
+ FX_INT32 nParagIndex = ParagPos.nParagIndex;
+ for (i = 0; i < nLength; i ++, lpPos ++) {
+ wCurChar = *lpPos;
+ if (wCurChar == m_wLineEnd) {
+ if (bFirst) {
+ pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
+ pParag->m_nLineCount = -1;
+ nReserveCharStart += pParag->m_nCharCount;
+ bFirst = FALSE;
+ } else {
+ pParag = FX_NEW CFDE_TxtEdtParag(this);
+ pParag->m_nLineCount = -1;
+ pParag->m_nCharCount = i - nTextStart + 1;
+ pParag->m_nCharStart = nReserveCharStart;
+ m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+ nReserveCharStart += pParag->m_nCharCount;
+ }
+ nTextStart = i + 1;
+ }
+ }
+ if (bFirst) {
+ pParag->m_nCharCount += nLength;
+ pParag->m_nLineCount = -1;
+ bFirst = FALSE;
+ } else {
+ pParag = FX_NEW CFDE_TxtEdtParag(this);
+ pParag->m_nLineCount = -1;
+ pParag->m_nCharCount = nLength - nTextStart + nCutPart;
+ pParag->m_nCharStart = nReserveCharStart;
+ m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+ }
+ m_pTxtBuf->Insert(nStart, lpText, nLength);
+ FX_INT32 nTotalLineCount = 0;
+ for (i = ParagPos.nParagIndex; i <= nParagIndex; i ++) {
+ pParag = m_ParagPtrArray[i];
+ pParag->CalcLines();
+ nTotalLineCount += pParag->m_nLineCount;
+ }
+ m_nLineCount += nTotalLineCount - nReserveLineCount;
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+ UpdatePages();
+}
+#ifdef FDE_USEFORMATBLOCK
+void CFDE_TxtEdtEngine::RawInsert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength)
+{
+ FXSYS_assert(nLength > 0);
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nStart, ParagPos);
+ FX_INT32 nParagCount = m_ParagPtrArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = ParagPos.nParagIndex + 1; i < nParagCount; i ++) {
+ m_ParagPtrArray[i]->m_nCharStart += nLength;
+ }
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ FX_INT32 nReserveLineCount = pParag->m_nLineCount;
+ FX_INT32 nReserveCharStart = pParag->m_nCharStart;
+ FX_INT32 nLeavePart = ParagPos.nCharIndex;
+ FX_INT32 nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
+ FX_INT32 nTextStart = 0;
+ FX_WCHAR wCurChar = L' ';
+ FX_LPCWSTR lpPos = lpText;
+ FX_BOOL bFirst = TRUE;
+ FX_INT32 nParagIndex = ParagPos.nParagIndex;
+ for (i = 0; i < nLength; i ++, lpPos ++) {
+ wCurChar = *lpPos;
+ if (wCurChar == m_wLineEnd) {
+ if (bFirst) {
+ pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
+ pParag->m_nLineCount = -1;
+ nReserveCharStart += pParag->m_nCharCount;
+ bFirst = FALSE;
+ } else {
+ pParag = FX_NEW CFDE_TxtEdtParag(this);
+ pParag->m_nLineCount = -1;
+ pParag->m_nCharCount = i - nTextStart + 1;
+ pParag->m_nCharStart = nReserveCharStart;
+ m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+ nReserveCharStart += pParag->m_nCharCount;
+ }
+ nTextStart = i + 1;
+ }
+ }
+ if (bFirst) {
+ pParag->m_nCharCount += nLength;
+ pParag->m_nLineCount = -1;
+ bFirst = FALSE;
+ } else {
+ pParag = FX_NEW CFDE_TxtEdtParag(this);
+ pParag->m_nLineCount = -1;
+ pParag->m_nCharCount = nLength - nTextStart + nCutPart;
+ pParag->m_nCharStart = nReserveCharStart;
+ m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
+ }
+ m_pTxtBuf->Insert(nStart, lpText, nLength);
+}
+#endif
+void CFDE_TxtEdtEngine::Inner_DeleteRange(FX_INT32 nStart, FX_INT32 nCount )
+{
+ if (nCount == -1) {
+ nCount = m_pTxtBuf->GetTextLength() - nStart;
+ }
+ FX_INT32 nEnd = nStart + nCount - 1;
+ FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength());
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+ FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd;
+ TextPos2ParagPos(nStart, ParagPosBgn);
+ TextPos2ParagPos(nEnd, ParagPosEnd);
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex];
+ FX_BOOL bLastParag = FALSE;
+ if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) {
+ if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) {
+ ParagPosEnd.nParagIndex ++;
+ } else {
+ bLastParag = TRUE;
+ }
+ }
+ FX_INT32 nTotalLineCount = 0;
+ FX_INT32 nTotalCharCount = 0;
+ FX_INT32 i = 0;
+ for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i ++) {
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[i];
+ pParag->CalcLines();
+ nTotalLineCount += pParag->m_nLineCount;
+ nTotalCharCount += pParag->m_nCharCount;
+ }
+ m_pTxtBuf->Delete(nStart, nCount);
+ CFDE_TxtEdtParag * pEndParag = m_ParagPtrArray[ParagPosEnd.nParagIndex];
+ FX_INT32 nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag) ? ParagPosBgn.nParagIndex : \
+ (ParagPosBgn.nParagIndex + 1);
+ for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i ++) {
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[nNextParagIndex];
+ delete pParag;
+ m_ParagPtrArray.RemoveAt(nNextParagIndex);
+ }
+ if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) {
+ pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex];
+ pParag->m_nCharCount = nTotalCharCount - nCount;
+ pParag->CalcLines();
+ nTotalLineCount -= pParag->m_nLineCount;
+ }
+ FX_INT32 nParagCount = m_ParagPtrArray.GetSize();
+ for (i = nNextParagIndex; i < nParagCount; i ++) {
+ m_ParagPtrArray[i]->m_nCharStart -= nCount;
+ }
+ m_nLineCount -= nTotalLineCount;
+ UpdatePages();
+ FX_INT32 nPageCount = CountPages();
+ if (m_nCaretPage >= nPageCount) {
+ m_nCaretPage = nPageCount - 1;
+ }
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::DeleteRange_DoRecord(FX_INT32 nStart, FX_INT32 nCount, FX_BOOL bSel )
+{
+ FXSYS_assert(nStart >= 0);
+ if (nCount == -1) {
+ nCount = GetTextLength() - nStart;
+ }
+ FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength());
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount > 0) {
+ }
+#endif
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ CFX_WideString wsRange;
+ m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, \
+ wsRange, bSel);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+ GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+ Inner_DeleteRange(nStart, nCount);
+}
+void CFDE_TxtEdtEngine::ResetEngine()
+{
+ RemoveAllPages();
+ RemoveAllParags();
+ ClearSelection();
+ m_nCaret = 0;
+ m_pTxtBuf->Clear(FALSE);
+ m_nCaret = 0;
+}
+void CFDE_TxtEdtEngine::RebuildParagraphs()
+{
+ RemoveAllParags();
+ FX_WCHAR wChar = L' ';
+ FX_WCHAR wCharPre = L' ';
+ FX_INT32 nParagStart = 0;
+ FX_INT32 nCount = m_pTxtBuf->GetTextLength();
+ FX_INT32 nIndex = 0;
+ CFDE_TxtEdtParag * pParag = NULL;
+ IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
+ pIter->SetAt(0);
+ do {
+ wChar = pIter->GetChar();
+ nIndex = pIter->GetAt();
+ if (wChar == m_wLineEnd) {
+ CFDE_TxtEdtParag * pParag = FX_NEW CFDE_TxtEdtParag(this);
+ pParag->m_nCharStart = nParagStart;
+ pParag->m_nCharCount = nIndex - nParagStart + 1;
+ pParag->m_nLineCount = -1;
+ m_ParagPtrArray.Add(pParag);
+ nParagStart = nIndex + 1;
+ }
+ } while (pIter->Next());
+ pIter->Release();
+}
+void CFDE_TxtEdtEngine::RemoveAllParags()
+{
+ FX_INT32 nCount = m_ParagPtrArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[i];
+ if (pParag) {
+ delete pParag;
+ }
+ }
+ m_ParagPtrArray.RemoveAll();
+}
+void CFDE_TxtEdtEngine::RemoveAllPages()
+{
+ FX_INT32 nCount = m_PagePtrArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ IFDE_TxtEdtPage * pPage = m_PagePtrArray[i];
+ if (pPage) {
+ pPage->Release();
+ }
+ }
+ m_PagePtrArray.RemoveAll();
+}
+void CFDE_TxtEdtEngine::UpdateParags()
+{
+ FX_INT32 nCount = m_ParagPtrArray.GetSize();
+ if (nCount == 0) {
+ return;
+ }
+ CFDE_TxtEdtParag * pParag = NULL;
+ FX_INT32 nLineCount = 0;
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ pParag = m_ParagPtrArray[i];
+ if (pParag->m_nLineCount == -1) {
+ pParag->CalcLines();
+ }
+ nLineCount += pParag->m_nLineCount;
+ }
+ m_nLineCount = nLineCount;
+}
+void CFDE_TxtEdtEngine::UpdatePages()
+{
+ if (m_nLineCount == 0) {
+ return;
+ }
+ FX_INT32 nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1;
+ FX_INT32 nSize = m_PagePtrArray.GetSize();
+ if (nSize == nPageCount) {
+ return;
+ }
+ if (nSize > nPageCount) {
+ IFDE_TxtEdtPage * pPage = NULL;
+ FX_INT32 i = 0;
+ for (i = nSize - 1; i >= nPageCount; i --) {
+ pPage = m_PagePtrArray[i];
+ if (pPage) {
+ pPage->Release();
+ }
+ m_PagePtrArray.RemoveAt(i);
+ }
+ m_Param.pEventSink->On_PageCountChanged(this);
+ return;
+ }
+ if (nSize < nPageCount) {
+ IFDE_TxtEdtPage * pPage = NULL;
+ FX_INT32 i = 0;
+ for (i = nSize; i < nPageCount; i ++) {
+ pPage = IFDE_TxtEdtPage::Create(this, i);
+ m_PagePtrArray.Add(pPage);
+ }
+ m_Param.pEventSink->On_PageCountChanged(this);
+ return;
+ }
+}
+void CFDE_TxtEdtEngine::UpdateTxtBreak()
+{
+ FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles();
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine;
+ } else {
+ dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_CombText;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab;
+ } else {
+ dwStyle &= ~ FX_TXTLAYOUTSTYLE_ExpandTab;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext;
+ }
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) {
+ dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes;
+ } else {
+ dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes;
+ }
+ m_pTextBreak->SetLayoutStyles(dwStyle);
+ FX_DWORD dwAligment = 0;
+ if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) {
+ dwAligment |= FX_TXTLINEALIGNMENT_Justified;
+ } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) {
+ dwAligment |= FX_TXTLINEALIGNMENT_Distributed;
+ }
+ if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) {
+ dwAligment |= FX_TXTLINEALIGNMENT_Center;
+ } else if(m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) {
+ dwAligment |= FX_TXTLINEALIGNMENT_Right;
+ }
+ m_pTextBreak->SetAlignment(dwAligment);
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+ m_pTextBreak->SetLineWidth(m_Param.fPlateHeight);
+ } else {
+ m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
+ }
+ } else {
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+ m_pTextBreak->SetLineWidth(m_Param.fPlateWidth);
+ } else {
+ m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
+ }
+ }
+ m_nPageLineCount = m_Param.nLineCount;
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
+ FX_FLOAT fCombWidth = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical ?
+ m_Param.fPlateHeight : m_Param.fPlateWidth;
+ if (m_nLimit > 0) {
+ fCombWidth /= m_nLimit;
+ }
+ m_pTextBreak->SetCombWidth(fCombWidth);
+ }
+ m_pTextBreak->SetFont(m_Param.pFont);
+ m_pTextBreak->SetFontSize(m_Param.fFontSize);
+ m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant);
+ m_pTextBreak->SetDefaultChar(m_Param.wDefChar);
+ m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar);
+ m_pTextBreak->SetCharRotation(m_Param.nCharRotation);
+ m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f);
+ m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale);
+ m_pTextBreak->SetCharSpace(m_Param.fCharSpace);
+}
+FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_LPWSTR &lpText, FX_INT32 &nLength, FX_BOOL bPreIsCR )
+{
+ for (FX_INT32 i = 0; i < nLength; i ++) {
+ FX_WCHAR wc = lpText[i];
+ switch(wc) {
+ case L'\r': {
+ lpText[i] = m_wLineEnd;
+ bPreIsCR = TRUE;
+ }
+ break;
+ case L'\n': {
+ if (bPreIsCR == TRUE) {
+ FX_INT32 nNext = i + 1;
+ if (nNext < nLength) {
+ FXSYS_memmove(lpText + i, lpText + nNext, (nLength - nNext) * sizeof(FX_WCHAR));
+ }
+ i --;
+ nLength --;
+ bPreIsCR = FALSE;
+ if (m_bAutoLineEnd) {
+ m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF;
+ m_bAutoLineEnd = FALSE;
+ }
+ } else {
+ lpText[i] = m_wLineEnd;
+ if (m_bAutoLineEnd) {
+ m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF;
+ m_bAutoLineEnd = FALSE;
+ }
+ }
+ }
+ break;
+ default: {
+ if (bPreIsCR && m_bAutoLineEnd) {
+ m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR;
+ m_bAutoLineEnd = FALSE;
+ }
+ bPreIsCR = FALSE;
+ }
+ break;
+ }
+ }
+ return bPreIsCR;
+}
+void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString &wsText)
+{
+ FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r';
+ if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) {
+ CFX_ArrayTemplate<FX_INT32> PosArr;
+ FX_INT32 nLength = wsText.GetLength();
+ FX_INT32 i = 0;
+ FX_LPWSTR lpPos = (FX_LPWSTR)(FX_LPCWSTR)wsText;
+ for (i = 0; i < nLength; i ++, lpPos ++) {
+ if (*lpPos == m_wLineEnd) {
+ *lpPos = wc;
+ PosArr.Add(i);
+ }
+ }
+ FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(wsText);
+ CFX_WideString wsTemp;
+ FX_INT32 nCount = PosArr.GetSize();
+ FX_LPWSTR lpDstBuf = wsTemp.GetBuffer(nLength + nCount);
+ FX_INT32 nDstPos = 0;
+ FX_INT32 nSrcPos = 0;
+ for (i = 0; i < nCount; i ++) {
+ FX_INT32 nPos = PosArr[i];
+ FX_INT32 nCopyLen = nPos - nSrcPos + 1;
+ FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, nCopyLen * sizeof(FX_WCHAR));
+ nDstPos += nCopyLen;
+ nSrcPos += nCopyLen;
+ lpDstBuf[nDstPos] = L'\n';
+ nDstPos ++;
+ }
+ if (nSrcPos < nLength) {
+ FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, (nLength - nSrcPos) * sizeof(FX_WCHAR));
+ }
+ wsTemp.ReleaseBuffer(nLength + nCount);
+ wsText = wsTemp;
+ } else {
+ FX_INT32 nLength = wsText.GetLength();
+ FX_LPWSTR lpBuf = (FX_LPWSTR)(FX_LPCWSTR)wsText;
+ for (FX_INT32 i = 0; i < nLength; i ++, lpBuf++) {
+ if (*lpBuf == m_wLineEnd) {
+ *lpBuf = wc;
+ }
+ }
+ }
+}
+FX_INT32 CFDE_TxtEdtEngine::MovePage2Char(FX_INT32 nIndex)
+{
+ FXSYS_assert(nIndex >= 0);
+ FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength());
+ if (m_nCaretPage >= 0) {
+ IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+ FX_INT32 nPageCharStart = pPage->GetCharStart();
+ FX_INT32 nPageCharCount = pPage->GetCharCount();
+ if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) {
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+ return m_nCaretPage;
+ }
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+ }
+ CFDE_TxtEdtParag * pParag = NULL;
+ FX_INT32 nLineCount = 0;
+ FX_INT32 nParagCount = m_ParagPtrArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < nParagCount; i ++) {
+ pParag = m_ParagPtrArray[i];
+ if (pParag->m_nCharStart <= nIndex && nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) {
+ break;
+ }
+ nLineCount += pParag->m_nLineCount;
+ }
+ pParag->LoadParag();
+ FX_INT32 nLineStart = -1;
+ FX_INT32 nLineCharCount = -1;
+ for (i = 0; i < pParag->m_nLineCount; i ++) {
+ pParag->GetLineRange(i, nLineStart, nLineCharCount);
+ if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) {
+ break;
+ }
+ }
+ FXSYS_assert(i < pParag->m_nLineCount);
+ nLineCount += (i + 1);
+ m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1;
+ m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+ pParag->UnloadParag();
+ return m_nCaretPage;
+}
+void CFDE_TxtEdtEngine::TextPos2ParagPos(FX_INT32 nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const
+{
+ FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength());
+ FX_INT32 nCount = m_ParagPtrArray.GetSize();
+ FX_INT32 nBgn = 0;
+ FX_INT32 nMid = 0;
+ FX_INT32 nEnd = nCount - 1;
+ while (nEnd > nBgn) {
+ nMid = (nBgn + nEnd) / 2;
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[nMid];
+ if (nIndex < pParag->m_nCharStart) {
+ nEnd = nMid - 1;
+ } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) {
+ nBgn = nMid + 1;
+ } else {
+ break;
+ }
+ }
+ if (nBgn == nEnd) {
+ nMid = nBgn;
+ }
+ FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart && \
+ (nIndex < m_ParagPtrArray[nMid]->m_nCharStart + m_ParagPtrArray[nMid]->m_nCharCount));
+ ParagPos.nParagIndex = nMid;
+ ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart;
+}
+FX_INT32 CFDE_TxtEdtEngine::MoveForward(FX_BOOL &bBefore)
+{
+ if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) {
+ return -1;
+ }
+ FX_INT32 nCaret = m_nCaret;
+ if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) && (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') && \
+ (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) {
+ nCaret ++;
+ }
+ nCaret ++;
+ bBefore = TRUE;
+ return nCaret;
+}
+FX_INT32 CFDE_TxtEdtEngine::MoveBackward(FX_BOOL &bBefore)
+{
+ if (m_nCaret == 0) {
+ return FALSE;
+ }
+ FX_INT32 nCaret = m_nCaret;
+ if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' && \
+ m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') {
+ nCaret --;
+ }
+ nCaret --;
+ bBefore = TRUE;
+ return nCaret;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF &ptCaret)
+{
+ IFDE_TxtEdtPage * pPage = GetPage(m_nCaretPage);
+ const CFX_RectF& rtContent = pPage->GetContentsBox();
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace;
+ ptCaret.y = m_fCaretPosReserve;
+ FX_BOOL bLineReserve = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+ if (ptCaret.x < rtContent.left) {
+ if (bLineReserve) {
+ if (m_nCaretPage == CountPages() - 1) {
+ return FALSE;
+ }
+ } else {
+ if (m_nCaretPage == 0) {
+ return FALSE;
+ }
+ }
+ if (bLineReserve) {
+ m_nCaretPage ++;
+ } else {
+ m_nCaretPage --;
+ }
+ m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+ ptCaret.x -= rtContent.left;
+ IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage);
+ ptCaret.x += pCurPage->GetContentsBox().right();
+ }
+ } else {
+ ptCaret.x = m_fCaretPosReserve;
+ ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace;
+ if (ptCaret.y < rtContent.top) {
+ if (m_nCaretPage == 0) {
+ return FALSE;
+ }
+ ptCaret.y -= rtContent.top;
+ m_nCaretPage --;
+ m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+ IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage);
+ ptCaret.y += pCurPage->GetContentsBox().bottom();
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF &ptCaret)
+{
+ IFDE_TxtEdtPage * pPage = GetPage(m_nCaretPage);
+ const CFX_RectF& rtContent = pPage->GetContentsBox();
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace;
+ ptCaret.y = m_fCaretPosReserve;
+ if (ptCaret.x >= rtContent.right()) {
+ FX_BOOL bLineReserve = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+ if (bLineReserve) {
+ if (m_nCaretPage == 0) {
+ return FALSE;
+ }
+ } else {
+ if (m_nCaretPage == CountPages() - 1) {
+ return FALSE;
+ }
+ }
+ if (bLineReserve) {
+ m_nCaretPage --;
+ } else {
+ m_nCaretPage ++;
+ }
+ m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+ ptCaret.x -= rtContent.right();
+ IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage);
+ ptCaret.x += pCurPage->GetContentsBox().left;
+ }
+ } else {
+ ptCaret.x = m_fCaretPosReserve;
+ ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace;
+ if (ptCaret.y >= rtContent.bottom()) {
+ if (m_nCaretPage == CountPages() - 1) {
+ return FALSE;
+ }
+ ptCaret.y -= rtContent.bottom();
+ m_nCaretPage ++;
+ m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
+ IFDE_TxtEdtPage * pCurPage = GetPage(m_nCaretPage);
+ ptCaret.y += pCurPage->GetContentsBox().top;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveLineStart()
+{
+ FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nIndex, ParagPos);
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ pParag->LoadParag();
+ FX_INT32 nLineCount = pParag->m_nLineCount;
+ FX_INT32 i = 0;
+ FX_INT32 nStart = 0;
+ FX_INT32 nCount = 0;
+ for (; i < nLineCount; i ++) {
+ pParag->GetLineRange(i, nStart, nCount);
+ if (nIndex >= nStart && nIndex < nStart + nCount) {
+ break;
+ }
+ }
+ UpdateCaretRect(nStart, TRUE);
+ pParag->UnloadParag();
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd()
+{
+ FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nIndex, ParagPos);
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ pParag->LoadParag();
+ FX_INT32 nLineCount = pParag->m_nLineCount;
+ FX_INT32 i = 0;
+ FX_INT32 nStart = 0;
+ FX_INT32 nCount = 0;
+ for (; i < nLineCount; i ++) {
+ pParag->GetLineRange(i, nStart, nCount);
+ if (nIndex >= nStart && nIndex < nStart + nCount) {
+ break;
+ }
+ }
+ nIndex = nStart + nCount - 1;
+ FXSYS_assert(nIndex <= GetTextBufLength());
+ FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+ FX_BOOL bBefore = FALSE;
+ if (nIndex <= GetTextBufLength()) {
+ if (wChar == L'\r') {
+ bBefore = TRUE;
+ } else if (wChar == L'\n' && nIndex > nStart) {
+ bBefore = TRUE;
+ nIndex --;
+ wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+ if (wChar != L'\r') {
+ nIndex ++;
+ }
+ }
+ }
+ UpdateCaretRect(nIndex, bBefore);
+ pParag->UnloadParag();
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveParagStart()
+{
+ FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nIndex, ParagPos);
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ UpdateCaretRect(pParag->m_nCharStart, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd()
+{
+ FX_INT32 nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
+ FDE_TXTEDTPARAGPOS ParagPos;
+ TextPos2ParagPos(nIndex, ParagPos);
+ CFDE_TxtEdtParag * pParag = m_ParagPtrArray[ParagPos.nParagIndex];
+ nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1;
+ FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+ if (wChar == L'\n' && nIndex > 0) {
+ nIndex --;
+ wChar = m_pTxtBuf->GetCharByIndex(nIndex);
+ if (wChar != L'\r') {
+ nIndex ++;
+ }
+ }
+ UpdateCaretRect(nIndex, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveHome()
+{
+ UpdateCaretRect(0, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtEngine::MoveEnd()
+{
+ UpdateCaretRect(GetTextBufLength(), TRUE);
+ return TRUE;
+}
+#ifdef FDE_USEFORMATBLOCK
+FX_INT32 CFDE_TxtEdtEngine::NormalizeCaretPos(FX_INT32 nIndex, FX_INT32 nFlags, FX_BOOL &bBefore)
+{
+ bBefore = TRUE;
+ FX_INT32 nBgn = 0, nEnd = 0;
+ FX_INT32 nRecord = -1;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bRet = GetFieldBoundary(nIndex, nBgn, nEnd, pField);
+ FX_INT32 nDelta = 0;
+ if (bRet && !pField->IsFix()) {
+ if (nIndex - nBgn < FDE_FORMAT_EDIT_FIELD_HADERSIZE) {
+ if (nFlags == FDE_FORMAT_CARET_BACKWARD) {
+ CFDE_TxtEdtField * pEditableField = NULL;
+ if (FindEditableField(nIndex, nBgn, nEnd, pEditableField, FALSE)) {
+ return pEditableField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn;
+ }
+ }
+ nIndex = nBgn + FDE_FORMAT_EDIT_FIELD_HADERSIZE;
+ }
+ FX_INT32 nRet = pField->NormalizeCaretPos(nIndex - nBgn, (FDE_FORMAT_CARET_DIRECTION)nFlags);
+ if (nRet >= 0) {
+ return nRet + nBgn;
+ }
+ if (nRet == -2) {
+ FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0;
+ pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
+ nRecord = nBgn + nEditablePosBgn;
+ nFlags = FDE_FORMAT_CARET_BACKWARD;
+ } else {
+ FXSYS_assert(nRet == -1);
+ FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0;
+ pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
+ nRecord = nBgn + nEditablePosEnd;
+ nFlags = FDE_FORMAT_CARET_FORWARD;
+ }
+ } else if (!bRet) {
+ nDelta = FDE_FORMAT_EDIT_FIELD_HADERSIZE - FDE_FORMAT_EDIT_FIELD_TAILSIZE;
+ }
+ switch (nFlags) {
+ case FDE_FORMAT_CARET_FORWARD: {
+ if (FindEditableField(nIndex, nBgn, nEnd, pField)) {
+ return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn;
+ } else {
+ if (nRecord != -1) {
+ return nRecord;
+ }
+ bRet = FindEditableField(nIndex, nBgn, nEnd, pField, FALSE);
+ FXSYS_assert(bRet);
+ return pField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn;
+ }
+ }
+ break;
+ case FDE_FORMAT_CARET_MIDDLE: {
+ FX_INT32 nBgn1 = 0, nEnd1 = 0, nBgn2 = 0, nEnd2 = 0;
+ CFDE_TxtEdtField * pEditableField1 = NULL;
+ CFDE_TxtEdtField * pEditableField2 = NULL;
+ FX_BOOL bRet1 = FindEditableField(nIndex, nBgn1, nEnd1, pEditableField1, FALSE);
+ FX_BOOL bRet2 = FindEditableField(nIndex, nBgn2, nEnd2, pEditableField2);
+ if (bRet1 == FALSE) {
+ FXSYS_assert(bRet2);
+ return pEditableField2->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn2;
+ } else if (bRet2 == FALSE) {
+ FXSYS_assert(bRet1);
+ return pEditableField1->NormalizeCaretPos(nEnd1 - nBgn1, FDE_FORMAT_CARET_BACKWARD) + nBgn1;
+ } else {
+ FX_INT32 nEditablePosBgn = 0, nEditablePosEnd = 0;
+ if (nIndex - nEnd1 < nBgn2 + nDelta - nIndex) {
+ pEditableField1->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
+ return nEditablePosEnd + nBgn1;
+ } else {
+ pEditableField2->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
+ return nEditablePosBgn + nBgn2;
+ }
+ }
+ }
+ break;
+ case FDE_FORMAT_CARET_BACKWARD: {
+ if (FindEditableField(nIndex, nBgn, nEnd, pField, FALSE)) {
+ return pField->NormalizeCaretPos(nEnd - nBgn, FDE_FORMAT_CARET_BACKWARD) + nBgn;
+ } else {
+ if (nRecord != -1) {
+ return nRecord;
+ }
+ bRet = FindEditableField(nIndex, nBgn, nEnd, pField);
+ FXSYS_assert(bRet);
+ return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + nBgn;
+ }
+ }
+ break;
+ default:
+ FXSYS_assert(0);
+ return nIndex;
+ }
+}
+FX_BOOL CFDE_TxtEdtEngine::GetFieldBoundary(FX_INT32 nIndex, FX_INT32 &nBgn, FX_INT32 &nEnd, CFDE_TxtEdtField * &pField)
+{
+ CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
+ pIter->SetAt(nIndex);
+ FX_BOOL bFind = FALSE;
+ do {
+ FX_WCHAR wc = pIter->GetChar();
+ if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
+ nEnd = pIter->GetAt();
+ bFind = TRUE;
+ nIndex --;
+ break;
+ }
+ if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
+ pIter->Release();
+ return FALSE;
+ }
+ } while (pIter->Next());
+ if (!bFind) {
+ pIter->Release();
+ return FALSE;
+ }
+ pIter->SetAt(nIndex);
+ do {
+ FX_WCHAR wc = pIter->GetChar();
+ if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
+ nBgn = pIter->GetAt();
+ pIter->Next();
+ FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
+ pIter->Next();
+ FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
+ pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre);
+ pIter->Release();
+ return TRUE;
+ }
+ if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
+ pIter->Release();
+ return FALSE;
+ }
+ } while (pIter->Next(TRUE));
+ pIter->Release();
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtEngine::FindEditableField(FX_INT32 nIndex, FX_INT32 &nBgn, FX_INT32 &nEnd, CFDE_TxtEdtField * &pField, FX_BOOL bForward )
+{
+ FX_WCHAR wcFirst = FDE_TXTEDT_FORMATBLOCK_BGN;
+ FX_WCHAR wcSecond = FDE_TXTEDT_FORMATBLOCK_END;
+ if (!bForward) {
+ wcFirst = FDE_TXTEDT_FORMATBLOCK_END;
+ wcSecond = FDE_TXTEDT_FORMATBLOCK_BGN;
+ }
+ CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
+ pIter->SetAt(nIndex);
+ FX_INT32 bFind = FALSE;
+ do {
+ FX_WCHAR wc = pIter->GetChar();
+ if (wc == wcFirst) {
+ nBgn = pIter->GetAt();
+ bFind = TRUE;
+ break;
+ }
+ } while (pIter->Next(!bForward));
+ if (!bFind) {
+ pIter->Release();
+ return FALSE;
+ }
+ bFind = FALSE;
+ do {
+ FX_WCHAR wc = pIter->GetChar();
+ if (wc == wcSecond) {
+ nEnd = pIter->GetAt();
+ bFind = TRUE;
+ break;
+ }
+ } while (pIter->Next(!bForward));
+ FXSYS_assert(bFind);
+ if (!bForward) {
+ FX_INT32 nTemp = nBgn;
+ nBgn = nEnd;
+ nEnd = nTemp;
+ }
+ pIter->SetAt(nBgn + 1);
+ FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
+ pIter->Next();
+ FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
+ pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre);
+ pIter->Release();
+ if (!pField->IsFix()) {
+ return TRUE;
+ }
+ return FindEditableField((bForward ? nEnd : nBgn), nBgn, nEnd, pField, bForward);
+}
+FX_BOOL CFDE_TxtEdtEngine::Move2NextEditableField(FX_INT32 nIndex, FX_BOOL bForward , FX_BOOL bSelect )
+{
+ if (m_SelRangePtrArr.GetSize() > 0) {
+ ClearSelection();
+ m_Param.pEventSink->On_SelChanged(this);
+ }
+ FX_INT32 nBgn = 0, nEnd = 0;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bRet = FindEditableField(nIndex, nBgn, nEnd, pField, bForward);
+ if (!bRet) {
+ return FALSE;
+ }
+ FX_INT32 nEditableBgn = 0, nEditableEnd = 0;
+ pField->GetEditableRange(nEditableBgn, nEditableEnd);
+ nEditableBgn += nBgn;
+ nEditableEnd += nBgn;
+ if (bSelect) {
+ FX_INT32 nRangeCount = nEditableEnd - nEditableBgn;
+ if (nRangeCount > 0) {
+ AddSelRange(nEditableBgn, nEditableEnd - nEditableBgn);
+ }
+ }
+ SetCaretPos(nEditableEnd, TRUE);
+ return TRUE;
+}
+FX_INT32 CFDE_TxtEdtEngine::GetRealIndex(FX_INT32 nIndex) const
+{
+ CFDE_TxtEdtBufIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
+ pIter->SetAt(0);
+ FX_BOOL bInField = FALSE;
+ FX_INT32 nFieldBgn = 0;
+ FX_INT32 nRealIndex = 0;
+ for (FX_INT32 i = 0; i <= nIndex; i ++) {
+ FX_WCHAR wc = pIter->GetChar();
+ if (bInField) {
+ if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
+ FX_DWORD dwPre = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 1);
+ FX_DWORD dwCur = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 2);
+ CFDE_TxtEdtField * pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre);
+ nRealIndex += pField->GetFieldTextLength();
+ bInField = FALSE;
+ }
+ } else {
+ if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
+ bInField = TRUE;
+ nFieldBgn = pIter->GetAt();
+ } else {
+ nRealIndex ++;
+ }
+ }
+ pIter->Next();
+ }
+ if (!bInField) {
+ pIter->Release();
+ return nRealIndex;
+ }
+ pIter->SetAt(nFieldBgn + 1);
+ FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
+ pIter->Next();
+ FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
+ CFDE_TxtEdtField * pField = (CFDE_TxtEdtField *)((dwCur << 16) | dwPre);
+ pIter->Release();
+ if (pField->IsFix()) {
+ FX_INT32 nDelta = nIndex - nFieldBgn - FDE_FORMAT_EDIT_FIELD_HADERSIZE + 1;
+ return nRealIndex + (nDelta > 0 ? nDelta : 0);
+ } else {
+ return nRealIndex + pField->GetRealIndex(nIndex - nFieldBgn);
+ }
+}
+#endif
+FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString &wsText)
+{
+ IFDE_TextOut * pTextOut = IFDE_TextOut::Create();
+ pTextOut->SetLineSpace(m_Param.fLineSpace);
+ pTextOut->SetFont(m_Param.pFont);
+ pTextOut->SetFontSize(m_Param.fFontSize);
+ CFX_RectF rcText;
+ FXSYS_memset(&rcText, 0, sizeof(rcText));
+ FX_DWORD dwStyle = 0;
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) {
+ dwStyle |= FDE_TTOSTYLE_SingleLine;
+ }
+ if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
+ dwStyle |= FDE_TTOSTYLE_LineWrap;
+ rcText.width = m_Param.fPlateWidth;
+ } else {
+ rcText.width = 65535;
+ }
+ pTextOut->SetStyles(dwStyle);
+ wsText += L"\n";
+ pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText);
+ pTextOut->Release();
+ wsText.Delete(wsText.GetLength() - 1);
+ if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) && (rcText.width > m_Param.fPlateWidth)) {
+ return FALSE;
+ }
+ if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) && \
+ (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CFDE_TxtEdtEngine::UpdateCaretRect(FX_INT32 nIndex, FX_BOOL bBefore)
+{
+ MovePage2Char(nIndex);
+ GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore);
+ m_nCaret = nIndex;
+ m_bBefore = bBefore;
+ if (!m_bBefore) {
+ m_nCaret ++;
+ m_bBefore = TRUE;
+ }
+ m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) ? \
+ m_rtCaret.top : m_rtCaret.left;
+ m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF &rtCaret, FX_INT32 nPageIndex, FX_INT32 nCaret, FX_BOOL bBefore )
+{
+ IFDE_TxtEdtPage * pPage = m_PagePtrArray[m_nCaretPage];
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+ FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText;
+ FX_INT32 nIndexInpage = nCaret - pPage->GetCharStart();
+ if (bBefore && bCombText && nIndexInpage > 0) {
+ nIndexInpage--;
+ bBefore = FALSE;
+ }
+ FX_INT32 nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText);
+ if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ if ((!FX_IsOdd(nBIDILevel) && !bBefore) || (FX_IsOdd(nBIDILevel) && bBefore)) {
+ rtCaret.Offset(0, rtCaret.height - 1.0f);
+ }
+ if (rtCaret.height == 0 && rtCaret.top > 1.0f) {
+ rtCaret.top -= 1.0f;
+ }
+ rtCaret.height = 1.0f;
+ } else {
+ if ((!FX_IsOdd(nBIDILevel) && !bBefore) || (FX_IsOdd(nBIDILevel) && bBefore)) {
+ rtCaret.Offset(rtCaret.width - 1.0f, 0);
+ }
+ if (rtCaret.width == 0 && rtCaret.left > 1.0f) {
+ rtCaret.left -= 1.0f;
+ }
+ rtCaret.width = 1.0f;
+ }
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+}
+void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF & ptCaret)
+{
+ IFDE_TxtEdtPage * pPage = m_PagePtrArray[m_nCaretPage];
+ m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
+ m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore);
+ GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
+ if (!m_bBefore) {
+ m_nCaret ++;
+ m_bBefore = TRUE;
+ }
+ m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage);
+ m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
+}
+FX_BOOL CFDE_TxtEdtEngine::IsSelect()
+{
+ return m_SelRangePtrArr.GetSize() > 0;
+}
+void CFDE_TxtEdtEngine::DeleteSelect()
+{
+ FX_INT32 nCountRange = CountSelRanges();
+ if (nCountRange > 0) {
+#ifdef FDE_USEFORMATBLOCK
+ FX_INT32 nBlockCount = m_BlockArray.GetSize();
+ if (nBlockCount > 0) {
+ if (nCountRange > 1) {
+ return;
+ }
+ FX_INT32 nSelStart;
+ FX_INT32 nSelCount;
+ nSelCount = GetSelRange(0, nSelStart);
+ FX_INT32 nSelEnd = nSelStart + nSelCount;
+ FX_INT32 nBgn = 0;
+ FX_INT32 nEnd = 0;
+ CFDE_TxtEdtField * pField = NULL;
+ FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField);
+ FX_INT32 nCaretInField = nSelStart - nBgn;
+ FX_BOOL bBefore = FALSE;
+ if (!bInField || pField->IsFix() || nSelEnd > nEnd) {
+ return;
+ }
+ pField->Backup();
+ CFX_WideString wsDel;
+ FX_INT32 nCaret = 0;
+ FX_INT32 nRet = pField->Delete(nCaretInField, nSelCount, wsDel, nCaret, bBefore);
+ nCaret += nBgn;
+ switch (nRet) {
+ case FDE_FORMAT_FIELD_DELETE_RET_S:
+ break;
+ case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE:
+ case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY:
+ return;
+ default:
+ FXSYS_assert(0);
+ break;
+ }
+ CFX_WideString wsField;
+ pField->GetFieldText(wsField);
+ if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
+ pField->Restore();
+ return;
+ }
+ CFX_WideString wsDisplay;
+ pField->GetDisplayText(wsDisplay);
+ Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
+ if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
+ IFDE_TxtEdtDoRecord * pRecord = FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(this, nSelStart, pField, nCaretInField,
+ nBgn, nEnd - nBgn + 1, wsDisplay.GetLength(), wsDel, FALSE);
+ CFX_ByteString bsDoRecord;
+ pRecord->Serialize(bsDoRecord);
+ m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
+ pRecord->Release();
+ }
+ SetCaretPos(nSelStart, bBefore);
+ return;
+ }
+#endif
+ FX_INT32 nSelStart;
+ FX_INT32 nSelCount;
+ while (nCountRange > 0) {
+ nSelCount = GetSelRange(--nCountRange, nSelStart);
+ FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange];
+ delete lpTemp;
+ m_SelRangePtrArr.RemoveAt(nCountRange);
+ DeleteRange_DoRecord(nSelStart, nSelCount, TRUE);
+ }
+ ClearSelection();
+ m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
+ m_Param.pEventSink->On_SelChanged(this);
+ SetCaretPos(nSelStart, TRUE);
+ return;
+ }
+}
+IFDE_TxtEdtDoRecord * IFDE_TxtEdtDoRecord::Create(FX_BSTR bsDoRecord)
+{
+ FX_LPCSTR lpBuf = bsDoRecord.GetCStr();
+ FX_INT32 nType = *((FX_INT32*)lpBuf);
+ switch(nType) {
+ case FDE_TXTEDT_DORECORD_INS:
+ return FX_NEW CFDE_TxtEdtDoRecord_Insert(bsDoRecord);
+ case FDE_TXTEDT_DORECORD_DEL:
+ return FX_NEW CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord);
+#ifdef FDE_USEFORMATBLOCK
+ case FDE_TXTEDT_DORECORD_FORMATINS:
+ return FX_NEW CFDE_TxtEdtDoRecord_FieldInsert(bsDoRecord);
+ case FDE_TXTEDT_DORECORD_FORMATDEL:
+ return FX_NEW CFDE_TxtEdtDoRecord_FieldDelete(bsDoRecord);
+ case FDE_TXTEDT_DORECORD_FORMATREP:
+ return FX_NEW CFDE_TxtEdtDoRecord_FieldReplace(bsDoRecord);
+#endif
+ default:
+ break;
+ }
+ return NULL;
+}
+CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(FX_BSTR bsDoRecord)
+{
+ Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ FX_LPCWSTR lpText,
+ FX_INT32 nLength)
+ : m_pEngine(pEngine)
+ , m_nCaret(nCaret)
+{
+ FXSYS_assert(pEngine);
+ FX_LPWSTR lpBuffer = m_wsInsert.GetBuffer(nLength);
+ FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
+ m_wsInsert.ReleaseBuffer();
+}
+CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert()
+{
+}
+void CFDE_TxtEdtDoRecord_Insert::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo()
+{
+ if (m_pEngine->IsSelect()) {
+ m_pEngine->ClearSelection();
+ }
+ m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength());
+ FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+ m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
+ m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
+ Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+ m_pEngine->SetCaretPos(m_nCaret, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo()
+{
+ m_pEngine->Inner_Insert(m_nCaret, FX_LPCWSTR(m_wsInsert), m_wsInsert.GetLength());
+ FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+ m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+ m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
+ Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+ m_pEngine->SetCaretPos(m_nCaret, FALSE);
+ return TRUE;
+}
+void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString &bsDoRecord) const
+{
+ CFX_ArchiveSaver ArchiveSaver;
+ ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_INS);
+ ArchiveSaver << (FX_INT32)(FX_UINTPTR)m_pEngine;
+ ArchiveSaver << m_nCaret;
+ ArchiveSaver << m_wsInsert;
+ FX_INT32 nLength = ArchiveSaver.GetLength();
+ FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer();
+ FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+ bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_Insert::Deserialize(FX_BSTR bsDoRecord)
+{
+ CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength());
+ FX_INT32 nType = 0;
+ ArchiveLoader >> nType;
+ FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS);
+ FX_INT32 nEngine = 0;
+ ArchiveLoader >> nEngine;
+ m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine;
+ ArchiveLoader >> m_nCaret;
+ ArchiveLoader >> m_wsInsert;
+}
+CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(FX_BSTR bsDoRecord)
+{
+ Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nIndex,
+ FX_INT32 nCaret,
+ const CFX_WideString &wsRange,
+ FX_BOOL bSel)
+ : m_pEngine(pEngine)
+ , m_nIndex(nIndex)
+ , m_nCaret(nCaret)
+ , m_wsRange(wsRange)
+ , m_bSel(bSel)
+{
+ FXSYS_assert(pEngine);
+}
+CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange()
+{
+}
+void CFDE_TxtEdtDoRecord_DeleteRange::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo()
+{
+ if (m_pEngine->IsSelect()) {
+ m_pEngine->ClearSelection();
+ }
+ m_pEngine->Inner_Insert(m_nIndex, FX_LPCWSTR(m_wsRange), m_wsRange.GetLength());
+ if (m_bSel) {
+ m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength());
+ }
+ FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+ m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+ m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
+ Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+ m_pEngine->SetCaretPos(m_nCaret, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo()
+{
+ m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength());
+ if (m_bSel) {
+ m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength());
+ }
+ FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
+ m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
+ m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
+ Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
+ m_pEngine->SetCaretPos(m_nIndex, TRUE);
+ return TRUE;
+}
+void CFDE_TxtEdtDoRecord_DeleteRange::Serialize(CFX_ByteString &bsDoRecord) const
+{
+ CFX_ArchiveSaver ArchiveSaver;
+ ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_DEL);
+ ArchiveSaver << (FX_INT32)(FX_UINTPTR)m_pEngine;
+ ArchiveSaver << m_bSel;
+ ArchiveSaver << m_nIndex;
+ ArchiveSaver << m_nCaret;
+ ArchiveSaver << m_wsRange;
+ FX_INT32 nLength = ArchiveSaver.GetLength();
+ FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer();
+ FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+ bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize(FX_BSTR bsDoRecord)
+{
+ CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength());
+ FX_INT32 nType = 0;
+ ArchiveLoader >> nType;
+ FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL);
+ FX_INT32 nEngine = 0;
+ ArchiveLoader >> nEngine;
+ m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine;
+ ArchiveLoader >> m_bSel;
+ ArchiveLoader >> m_nIndex;
+ ArchiveLoader >> m_nCaret;
+ ArchiveLoader >> m_wsRange;
+}
+#ifdef FDE_USEFORMATBLOCK
+CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(FX_BSTR bsDoRecord)
+{
+ Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nOldFieldLength,
+ FX_INT32 nNewFieldLength,
+ const CFX_WideString &wsIns,
+ FX_BOOL bSel )
+ : m_pEngine(pEngine)
+ , m_nCaret(nCaret)
+ , m_pField(pField)
+ , m_nIndexInField(nIndexInField)
+ , m_nFieldBgn(nFieldBgn)
+ , m_nOldFieldLength(nOldFieldLength)
+ , m_nNewFieldLength(nNewFieldLength)
+ , m_wsIns(wsIns)
+ , m_bSel(bSel)
+{
+ FXSYS_assert(pEngine);
+ FXSYS_assert(pField);
+}
+CFDE_TxtEdtDoRecord_FieldInsert::~CFDE_TxtEdtDoRecord_FieldInsert()
+{
+}
+void CFDE_TxtEdtDoRecord_FieldInsert::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Undo()
+{
+ CFX_WideString wsDel;
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = FALSE;
+ FX_INT32 nRet = m_pField->Delete(m_nIndexInField, m_wsIns.GetLength(), wsDel, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nCaret, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Redo()
+{
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = FALSE;
+ FX_INT32 nRet = m_pField->Insert(m_nIndexInField, m_wsIns, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nCaret + m_wsIns.GetLength(), TRUE);
+ return TRUE;
+}
+void CFDE_TxtEdtDoRecord_FieldInsert::Serialize(CFX_ByteString &bsDoRecord) const
+{
+ CFX_ArchiveSaver ArchiveSaver;
+ ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATINS);
+ ArchiveSaver << FX_INT32(m_pEngine);
+ ArchiveSaver << m_nCaret;
+ ArchiveSaver << FX_INT32(m_pField);
+ ArchiveSaver << m_nIndexInField;
+ ArchiveSaver << m_nFieldBgn;
+ ArchiveSaver << m_nOldFieldLength;
+ ArchiveSaver << m_nNewFieldLength;
+ ArchiveSaver << m_wsIns;
+ ArchiveSaver << m_bSel;
+ FX_INT32 nLength = ArchiveSaver.GetLength();
+ FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer();
+ FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+ bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_FieldInsert::Deserialize(FX_BSTR bsDoRecord)
+{
+ CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength());
+ FX_INT32 nType = 0;
+ ArchiveLoader >> nType;
+ FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATINS);
+ FX_INT32 nEngine = 0;
+ ArchiveLoader >> nEngine;
+ m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine;
+ ArchiveLoader >> m_nCaret;
+ FX_INT32 nField = 0;
+ ArchiveLoader >> nField;
+ m_pField = (CFDE_TxtEdtField*)nField;
+ ArchiveLoader >> m_nIndexInField;
+ ArchiveLoader >> m_nFieldBgn;
+ ArchiveLoader >> m_nOldFieldLength;
+ ArchiveLoader >> m_nNewFieldLength;
+ ArchiveLoader >> m_wsIns;
+ ArchiveLoader >> m_bSel;
+}
+CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(FX_BSTR bsDoRecord)
+{
+ Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nOldLength,
+ FX_INT32 nNewLength,
+ const CFX_WideString &wsDel,
+ FX_BOOL bSel )
+ : m_pEngine(pEngine)
+ , m_nCaret(nCaret)
+ , m_pField(pField)
+ , m_nIndexInField(nIndexInField)
+ , m_nFieldBgn(nFieldBgn)
+ , m_nOldFieldLength(nOldLength)
+ , m_nNewFieldLength(nNewLength)
+ , m_wsDel(wsDel)
+ , m_bSel(bSel)
+{
+ FXSYS_assert(m_pEngine);
+ FXSYS_assert(m_pField);
+}
+CFDE_TxtEdtDoRecord_FieldDelete::~CFDE_TxtEdtDoRecord_FieldDelete()
+{
+}
+void CFDE_TxtEdtDoRecord_FieldDelete::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Undo()
+{
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = FALSE;
+ FX_INT32 nRet = m_pField->Insert(m_nIndexInField, m_wsDel, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nCaret, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Redo()
+{
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = 0;
+ CFX_WideString wsDel;
+ FX_INT32 nRet = m_pField->Delete(m_nIndexInField, m_wsDel.GetLength(), wsDel, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nCaret - m_wsDel.GetLength(), TRUE);
+ return TRUE;
+}
+void CFDE_TxtEdtDoRecord_FieldDelete::Serialize(CFX_ByteString &bsDoRecord) const
+{
+ CFX_ArchiveSaver ArchiveSaver;
+ ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATDEL);
+ ArchiveSaver << FX_INT32(m_pEngine);
+ ArchiveSaver << m_nCaret;
+ ArchiveSaver << FX_INT32(m_pField);
+ ArchiveSaver << m_nIndexInField;
+ ArchiveSaver << m_nFieldBgn;
+ ArchiveSaver << m_nOldFieldLength;
+ ArchiveSaver << m_nNewFieldLength;
+ ArchiveSaver << m_wsDel;
+ ArchiveSaver << m_bSel;
+ FX_INT32 nLength = ArchiveSaver.GetLength();
+ FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer();
+ FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+ bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_FieldDelete::Deserialize(FX_BSTR bsDoRecord)
+{
+ CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength());
+ FX_INT32 nType = 0;
+ ArchiveLoader >> nType;
+ FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATDEL);
+ FX_INT32 nEngine = 0;
+ ArchiveLoader >> nEngine;
+ m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine;
+ ArchiveLoader >> m_nCaret;
+ FX_INT32 nField = 0;
+ ArchiveLoader >> nField;
+ m_pField = (CFDE_TxtEdtField*)nField;
+ ArchiveLoader >> m_nIndexInField;
+ ArchiveLoader >> m_nFieldBgn;
+ ArchiveLoader >> m_nOldFieldLength;
+ ArchiveLoader >> m_nNewFieldLength;
+ ArchiveLoader >> m_wsDel;
+ ArchiveLoader >> m_bSel;
+}
+CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace(FX_BSTR bsDoRecord)
+{
+ Deserialize(bsDoRecord);
+}
+CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace( CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ FX_INT32 nNewCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nFieldNewLength,
+ const CFX_WideString &wsDel,
+ const CFX_WideString &wsIns,
+ FX_BOOL bSel)
+ : m_pEngine(pEngine)
+ , m_nCaret(nCaret)
+ , m_nNewCaret(nNewCaret)
+ , m_pField(pField)
+ , m_nIndexInField(nIndexInField)
+ , m_nFieldBgn(nFieldBgn)
+ , m_nFieldNewLength(nFieldNewLength)
+ , m_wsDel(wsDel)
+ , m_wsIns(wsIns)
+ , m_bSel(bSel)
+{
+ FXSYS_assert(m_pEngine);
+ FXSYS_assert(m_pField);
+}
+CFDE_TxtEdtDoRecord_FieldReplace::~CFDE_TxtEdtDoRecord_FieldReplace()
+{
+}
+void CFDE_TxtEdtDoRecord_FieldReplace::Release()
+{
+ delete this;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Undo()
+{
+ CFX_WideString wsDel;
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = FALSE;
+ FX_INT32 nRet = m_pField->Replace(m_nIndexInField, m_wsIns.GetLength(), m_wsDel, wsDel, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nCaret, TRUE);
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Redo()
+{
+ CFX_WideString wsDel;
+ FX_INT32 nCaret = 0;
+ FX_BOOL bBefore = FALSE;
+ FX_INT32 nRet = m_pField->Replace(m_nIndexInField, m_wsDel.GetLength(), m_wsIns, wsDel, nCaret, bBefore);
+ FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
+ CFX_WideString wsDisplay;
+ m_pField->GetDisplayText(wsDisplay);
+ m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay);
+ m_pEngine->SetCaretPos(m_nNewCaret, TRUE);
+ return TRUE;
+}
+void CFDE_TxtEdtDoRecord_FieldReplace::Serialize(CFX_ByteString &bsDoRecord) const
+{
+ CFX_ArchiveSaver ArchiveSaver;
+ ArchiveSaver << FX_INT32(FDE_TXTEDT_DORECORD_FORMATREP);
+ ArchiveSaver << FX_INT32(m_pEngine);
+ ArchiveSaver << m_nCaret;
+ ArchiveSaver << m_nNewCaret;
+ ArchiveSaver << FX_INT32(m_pField);
+ ArchiveSaver << m_nIndexInField;
+ ArchiveSaver << m_nFieldBgn;
+ ArchiveSaver << m_nFieldNewLength;
+ ArchiveSaver << m_wsDel;
+ ArchiveSaver << m_wsIns;
+ ArchiveSaver << m_bSel;
+ FX_INT32 nLength = ArchiveSaver.GetLength();
+ FX_LPCBYTE lpSrcBuf = ArchiveSaver.GetBuffer();
+ FX_LPSTR lpDstBuf = bsDoRecord.GetBuffer(nLength);
+ FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
+ bsDoRecord.ReleaseBuffer(nLength);
+}
+void CFDE_TxtEdtDoRecord_FieldReplace::Deserialize(FX_BSTR bsDoRecord)
+{
+ CFX_ArchiveLoader ArchiveLoader((FX_LPCBYTE)bsDoRecord.GetCStr(), bsDoRecord.GetLength());
+ FX_INT32 nType = 0;
+ ArchiveLoader >> nType;
+ FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATREP);
+ FX_INT32 nEngine = 0;
+ ArchiveLoader >> nEngine;
+ m_pEngine = (CFDE_TxtEdtEngine*)(FX_UINTPTR)nEngine;
+ ArchiveLoader >> m_nCaret;
+ ArchiveLoader >> m_nNewCaret;
+ FX_INT32 nField = 0;
+ ArchiveLoader >> nField;
+ m_pField = (CFDE_TxtEdtField*)nField;
+ ArchiveLoader >> m_nIndexInField;
+ ArchiveLoader >> m_nFieldBgn;
+ ArchiveLoader >> m_nFieldNewLength;
+ ArchiveLoader >> m_wsDel;
+ ArchiveLoader >> m_wsIns;
+ ArchiveLoader >> m_bSel;
+}
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtengine.h b/xfa/src/fee/src/fee/fde_txtedtengine.h
new file mode 100644
index 0000000000..f9f7a6dc8e
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtengine.h
@@ -0,0 +1,341 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_TXTEDTENGINE_H
+#define _FDE_TXTEDTENGINE_H
+class CFDE_TxtEdtBuf;
+class CFDE_TxtEdtPage;
+class IFX_TxtBreak;
+class CFDE_TxtEdtParag;
+class CFDE_TxtEdtKMPMatch;
+class IFDE_TxtEdtFormator;
+class CFDE_TxtEdtField;
+class CFDE_TxtEdtBlock;
+class IFX_CharIter;
+class CFDE_TxtEdtEngine;
+class CFDE_TxtEdtDoRecord_Insert;
+class CFDE_TxtEdtDoRecord_DeleteRange;
+#ifdef FDE_USEFORMATBLOCK
+class CFDE_TxtEdtDoRecord_FormatInsert;
+class CFDE_TxtEdtDoRecord_FormatDelete;
+class CFDE_TxtEdtDoRecord_FormatReplace;
+class CFDE_TxtEdtDoRecord_FieldInsert;
+class CFDE_TxtEdtDoRecord_FieldDelete;
+class CFDE_TxtEdtDoRecord_FieldReplace;
+#endif
+class IFDE_TxtEdtDoRecord
+{
+public:
+ static IFDE_TxtEdtDoRecord * Create(FX_BSTR bsDoRecord);
+ virtual void Release() = 0;
+ virtual FX_BOOL Redo() = 0;
+ virtual FX_BOOL Undo() = 0;
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const = 0;
+};
+class CFDE_TxtEdtEngine : public IFDE_TxtEdtEngine, public CFX_Object
+{
+ friend class CFDE_TxtEdtDoRecord_Insert;
+ friend class CFDE_TxtEdtDoRecord_DeleteRange;
+ friend class CFDE_TxtEdtPage;
+#ifdef FDE_USEFORMATBLOCK
+ friend class CFDE_TxtEdtDoRecord_FormatInsert;
+ friend class CFDE_TxtEdtDoRecord_FormatDelete;
+ friend class CFDE_TxtEdtDoRecord_FormatReplace;
+ friend class CFDE_TxtEdtBlock;
+#endif
+ struct _FDE_TXTEDTSELRANGE : public CFX_Object {
+ FX_INT32 nStart;
+ FX_INT32 nCount;
+ };
+ typedef _FDE_TXTEDTSELRANGE FDE_TXTEDTSELRANGE;
+ typedef _FDE_TXTEDTSELRANGE * FDE_LPTXTEDTSELRANGE;
+ struct _FDE_TXTEDTPARAGPOS : public CFX_Object {
+ FX_INT32 nParagIndex;
+ FX_INT32 nCharIndex;
+ };
+ typedef _FDE_TXTEDTPARAGPOS FDE_TXTEDTPARAGPOS;
+ typedef _FDE_TXTEDTPARAGPOS * FDE_LPTXTEDTPARAGPOS;
+public:
+ CFDE_TxtEdtEngine();
+ virtual void Release();
+
+ virtual void SetEditParams(const FDE_TXTEDTPARAMS &params);
+ virtual const FDE_TXTEDTPARAMS* GetEditParams() const;
+
+ virtual FX_INT32 CountPages() const;
+ virtual IFDE_TxtEdtPage* GetPage(FX_INT32 nIndex);
+
+ virtual FX_BOOL SetBufChunkSize(FX_INT32 nChunkSize);
+ virtual void SetTextByStream(IFX_Stream *pStream);
+ virtual void SetText(const CFX_WideString &wsText);
+ virtual FX_INT32 GetTextLength() const;
+ virtual void GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount = -1);
+ virtual void ClearText();
+
+ virtual FX_INT32 GetCaretRect(CFX_RectF &rtCaret) const;
+ virtual FX_INT32 GetCaretPos() const;
+ virtual FX_INT32 SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore);
+ virtual FX_INT32 MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, FX_BOOL bShift = FALSE, FX_BOOL bCtrl = FALSE);
+ virtual void Lock();
+ virtual void Unlock();
+ virtual FX_BOOL IsLocked() const;
+
+ virtual FX_INT32 Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);
+ virtual FX_INT32 Delete(FX_INT32 nStart, FX_BOOL bBackspace = FALSE);
+ virtual FX_INT32 DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1);
+ virtual FX_INT32 Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace);
+
+ virtual void SetLimit(FX_INT32 nLimit);
+ virtual void SetAliasChar(FX_WCHAR wcAlias);
+ virtual void SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat);
+ virtual FX_INT32 CountEditBlocks() const;
+ virtual void GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const;
+ virtual FX_INT32 CountEditFields(FX_INT32 nBlockIndex) const;
+ virtual void GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const;
+ virtual void StartEdit();
+ virtual void EndEdit();
+
+ void RemoveSelRange(FX_INT32 nStart, FX_INT32 nCount = -1);
+
+ virtual void AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1);
+ virtual FX_INT32 CountSelRanges();
+ virtual FX_INT32 GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart);
+ virtual void ClearSelection();
+
+ virtual FX_BOOL Redo(FX_BSTR bsRedo);
+ virtual FX_BOOL Undo(FX_BSTR bsUndo);
+
+ virtual FX_INT32 StartLayout();
+ virtual FX_INT32 DoLayout(IFX_Pause *pPause);
+ virtual void EndLayout();
+
+ virtual FX_BOOL Optimize(IFX_Pause * pPause = NULL);
+ virtual FX_INT32 CountParags() const;
+ virtual IFDE_TxtEdtParag* GetParag(FX_INT32 nParagIndex) const;
+ virtual IFX_CharIter* CreateCharIter();
+ IFDE_TxtEdtBuf* GetTextBuf() const;
+ FX_INT32 GetTextBufLength() const;
+ IFX_TxtBreak* GetTextBreak() const;
+ FX_INT32 GetLineCount() const;
+ FX_INT32 GetPageLineCount() const;
+
+ FX_INT32 Line2Parag(FX_INT32 nStartParag, FX_INT32 nStartLineofParag,
+ FX_INT32 nLineIndex, FX_INT32 &nStartLine) const;
+ FX_WCHAR GetAliasChar() const
+ {
+ return m_wcAliasChar;
+ }
+
+protected:
+ virtual ~CFDE_TxtEdtEngine();
+private:
+ void Inner_Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);
+#ifdef FDE_USEFORMATBLOCK
+ void RawInsert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);
+#endif
+ void GetPreDeleteText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nLength);
+ void GetPreInsertText(CFX_WideString &wsText, FX_INT32 nIndex, FX_LPCWSTR lpText, FX_INT32 nLength);
+ void GetPreReplaceText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nOriginLength, FX_LPCWSTR lpText, FX_INT32 nLength);
+
+ void Inner_DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1);
+ void DeleteRange_DoRecord(FX_INT32 nStart, FX_INT32 nCount, FX_BOOL bSel = FALSE);
+ void ResetEngine();
+ void RebuildParagraphs();
+ void RemoveAllParags();
+ void RemoveAllPages();
+ void UpdateParags();
+ void UpdatePages();
+ void UpdateTxtBreak();
+
+ FX_BOOL ReplaceParagEnd(FX_LPWSTR &lpText, FX_INT32 &nLength, FX_BOOL bPreIsCR = FALSE);
+ void RecoverParagEnd(CFX_WideString &wsText);
+ FX_INT32 MovePage2Char(FX_INT32 nIndex);
+ void TextPos2ParagPos(FX_INT32 nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const;
+ FX_INT32 MoveForward(FX_BOOL &bBefore);
+ FX_INT32 MoveBackward(FX_BOOL &bBefore);
+ FX_BOOL MoveUp(CFX_PointF &ptCaret);
+ FX_BOOL MoveDown(CFX_PointF &ptCaret);
+ FX_BOOL MoveLineStart();
+ FX_BOOL MoveLineEnd();
+ FX_BOOL MoveParagStart();
+ FX_BOOL MoveParagEnd();
+ FX_BOOL MoveHome();
+ FX_BOOL MoveEnd();
+ FX_BOOL IsFitArea(CFX_WideString &wsText);
+ void UpdateCaretRect(FX_INT32 nIndex, FX_BOOL bBefore = TRUE);
+ void GetCaretRect(CFX_RectF &rtCaret, FX_INT32 nPageIndex, FX_INT32 nCaret, FX_BOOL bBefore = TRUE);
+ void UpdateCaretIndex(const CFX_PointF & ptCaret);
+
+ FX_BOOL IsSelect();
+ void DeleteSelect();
+ IFDE_TxtEdtBuf* m_pTxtBuf;
+ IFX_TxtBreak* m_pTextBreak;
+ FDE_TXTEDTPARAMS m_Param;
+ CFX_ArrayTemplate<IFDE_TxtEdtPage*> m_PagePtrArray;
+ CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray;
+ CFX_ArrayTemplate<FDE_LPTXTEDTSELRANGE> m_SelRangePtrArr;
+ FX_INT32 m_nPageLineCount;
+ FX_INT32 m_nLineCount;
+ FX_INT32 m_nAnchorPos;
+ FX_INT32 m_nLayoutPos;
+ FX_FLOAT m_fCaretPosReserve;
+ FX_INT32 m_nCaret;
+ FX_BOOL m_bBefore;
+ FX_INT32 m_nCaretPage;
+ CFX_RectF m_rtCaret;
+ FX_DWORD m_dwFindFlags;
+
+ FX_BOOL m_bLock;
+ FX_INT32 m_nLimit;
+ FX_WCHAR m_wcAliasChar;
+ FX_INT32 m_nFirstLineEnd;
+ FX_BOOL m_bAutoLineEnd;
+ FX_WCHAR m_wLineEnd;
+
+ FDE_TXTEDT_TEXTCHANGE_INFO m_ChangeInfo;
+};
+class CFDE_TxtEdtDoRecord_Insert : public IFDE_TxtEdtDoRecord, public CFX_Object
+{
+public:
+ CFDE_TxtEdtDoRecord_Insert(FX_BSTR bsDoRecord);
+ CFDE_TxtEdtDoRecord_Insert( CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ FX_LPCWSTR lpText,
+ FX_INT32 nLength);
+ virtual void Release();
+ virtual FX_BOOL Undo();
+ virtual FX_BOOL Redo();
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const;
+protected:
+ ~CFDE_TxtEdtDoRecord_Insert();
+ void Deserialize(FX_BSTR bsDoRecord);
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_INT32 m_nCaret;
+ CFX_WideString m_wsInsert;
+};
+class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord, public CFX_Object
+{
+public:
+ CFDE_TxtEdtDoRecord_DeleteRange(FX_BSTR bsDoRecord);
+ CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nIndex,
+ FX_INT32 nCaret,
+ const CFX_WideString &wsRange,
+ FX_BOOL bSel = FALSE);
+ virtual void Release();
+ virtual FX_BOOL Undo();
+ virtual FX_BOOL Redo();
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const;
+protected:
+ ~CFDE_TxtEdtDoRecord_DeleteRange();
+ void Deserialize(FX_BSTR bsDoRecord);
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_BOOL m_bSel;
+ FX_INT32 m_nIndex;
+ FX_INT32 m_nCaret;
+ CFX_WideString m_wsRange;
+};
+#ifdef FDE_USEFORMATBLOCK
+class CFDE_TxtEdtDoRecord_FieldInsert : public IFDE_TxtEdtDoRecord, public CFX_Object
+{
+public:
+ CFDE_TxtEdtDoRecord_FieldInsert(FX_BSTR bsDoRecord);
+ CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nOldFieldLength,
+ FX_INT32 nNewFieldLength,
+ const CFX_WideString &wsIns,
+ FX_BOOL bSel = FALSE);
+ virtual void Release();
+ virtual FX_BOOL Undo();
+ virtual FX_BOOL Redo();
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const;
+protected:
+ ~CFDE_TxtEdtDoRecord_FieldInsert();
+ void Deserialize(FX_BSTR bsDoRecord);
+
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_INT32 m_nCaret;
+ CFDE_TxtEdtField * m_pField;
+ FX_INT32 m_nIndexInField;
+ FX_INT32 m_nFieldBgn;
+ FX_INT32 m_nOldFieldLength;
+ FX_INT32 m_nNewFieldLength;
+ CFX_WideString m_wsIns;
+ FX_BOOL m_bSel;
+};
+class CFDE_TxtEdtDoRecord_FieldDelete : public IFDE_TxtEdtDoRecord, public CFX_Object
+{
+public:
+ CFDE_TxtEdtDoRecord_FieldDelete(FX_BSTR bsDoRecord);
+ CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nOldLength,
+ FX_INT32 nNewLength,
+ const CFX_WideString &wsDel,
+ FX_BOOL bSel = FALSE);
+ virtual void Release();
+ virtual FX_BOOL Undo();
+ virtual FX_BOOL Redo();
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const;
+protected:
+ ~CFDE_TxtEdtDoRecord_FieldDelete();
+ void Deserialize(FX_BSTR bsDoRecord);
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_INT32 m_nCaret;
+ CFDE_TxtEdtField * m_pField;
+ FX_INT32 m_nIndexInField;
+ FX_INT32 m_nFieldBgn;
+ FX_INT32 m_nOldFieldLength;
+ FX_INT32 m_nNewFieldLength;
+ CFX_WideString m_wsDel;
+ FX_BOOL m_bSel;
+};
+class CFDE_TxtEdtDoRecord_FieldReplace : public IFDE_TxtEdtDoRecord, public CFX_Object
+{
+public:
+ CFDE_TxtEdtDoRecord_FieldReplace(FX_BSTR bsDoRecord);
+ CFDE_TxtEdtDoRecord_FieldReplace( CFDE_TxtEdtEngine * pEngine,
+ FX_INT32 nCaret,
+ FX_INT32 nNewCaret,
+ CFDE_TxtEdtField * pField,
+ FX_INT32 nIndexInField,
+ FX_INT32 nFieldBgn,
+ FX_INT32 nFieldNewLength,
+ const CFX_WideString &wsDel,
+ const CFX_WideString &wsIns,
+ FX_BOOL bSel);
+ virtual void Release();
+ virtual FX_BOOL Undo();
+ virtual FX_BOOL Redo();
+ virtual void Serialize(CFX_ByteString &bsDoRecord) const;
+protected:
+ ~CFDE_TxtEdtDoRecord_FieldReplace();
+ void Deserialize(FX_BSTR bsDoRecord);
+private:
+ CFDE_TxtEdtEngine * m_pEngine;
+ FX_INT32 m_nCaret;
+ FX_INT32 m_nNewCaret;
+ CFDE_TxtEdtField * m_pField;
+ FX_INT32 m_nIndexInField;
+ FX_INT32 m_nFieldBgn;
+ FX_INT32 m_nFieldNewLength;
+ CFX_WideString m_wsDel;
+ CFX_WideString m_wsIns;
+ FX_BOOL m_bSel;
+};
+#endif
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp
new file mode 100644
index 0000000000..7d0790bf8c
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.cpp
@@ -0,0 +1,8 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "fde_txtedtkmpmatch.h"
diff --git a/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h
new file mode 100644
index 0000000000..0b5b477172
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtkmpmatch.h
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_KMPMATCH_H
+#define _FDE_KMPMATCH_H
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtpage.cpp b/xfa/src/fee/src/fee/fde_txtedtpage.cpp
new file mode 100644
index 0000000000..e0a94f81fa
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtpage.cpp
@@ -0,0 +1,647 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "../../include/ifde_txtedtbuf.h"
+#include "../../include/ifde_txtedtengine.h"
+#include "../../include/ifde_txtedtpage.h"
+#include "../../include/fx_wordbreak.h"
+#include "fde_txtedtpage.h"
+#include "fde_txtedtengine.h"
+#include "fde_txtedtparag.h"
+#include "fde_txtedtbuf.h"
+#define FDE_TXTEDT_TOLERANCE 0.1f
+IFDE_TxtEdtPage * IFDE_TxtEdtPage::Create(IFDE_TxtEdtEngine * pEngine, FX_INT32 nIndex)
+{
+ return (IFDE_TxtEdtPage*)FX_NEW CFDE_TxtEdtPage(pEngine, nIndex);
+}
+CFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage)
+ : m_pPage(pPage)
+{
+}
+CFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet()
+{
+}
+FDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType()
+{
+ return FDE_VISUALOBJ_Text;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox)
+{
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix)
+{
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt)
+{
+ rt = ((FDE_LPTEXTEDITPIECE)(hVisualObj))->rtPiece;
+ return TRUE;
+}
+FX_BOOL CFDE_TxtEdtTextSet::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt)
+{
+ return FALSE;
+}
+FX_INT32 CFDE_TxtEdtTextSet::GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText)
+{
+ FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
+ FX_LPWSTR pBuffer = wsText.GetBuffer(pPiece->nCount);
+ for (FX_INT32 i = 0; i < pPiece->nCount; i++) {
+ pBuffer[i] = m_pPage->GetChar((FX_LPVOID)hText, i);
+ }
+ wsText.ReleaseBuffer(pPiece->nCount);
+ return pPiece->nCount;
+}
+IFX_Font* CFDE_TxtEdtTextSet::GetFont(FDE_HVISUALOBJ hText)
+{
+ return m_pPage->GetEngine()->GetEditParams()->pFont;
+}
+FX_FLOAT CFDE_TxtEdtTextSet::GetFontSize(FDE_HVISUALOBJ hText)
+{
+ return m_pPage->GetEngine()->GetEditParams()->fFontSize;
+}
+FX_ARGB CFDE_TxtEdtTextSet::GetFontColor(FDE_HVISUALOBJ hText)
+{
+ return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
+}
+FX_INT32 CFDE_TxtEdtTextSet::GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode , CFX_WideString *pWSForms )
+{
+ if (hText == NULL) {
+ return 0;
+ }
+ FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
+ FX_INT32 nLength = pPiece->nCount;
+ if (nLength < 1) {
+ return 0;
+ }
+ CFDE_TxtEdtEngine * pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
+ const FDE_TXTEDTPARAMS * pTextParams = pEngine->GetEditParams();
+ IFX_TxtBreak * pBreak = pEngine->GetTextBreak();
+ FX_DWORD dwLayoutStyle = pBreak->GetLayoutStyles();
+ FX_TXTRUN tr;
+ tr.pAccess = m_pPage;
+ tr.pIdentity = (FX_LPVOID)hText;
+ tr.pStr = NULL;
+ tr.pWidths = NULL;
+ tr.iLength = nLength;
+ tr.pFont = pTextParams->pFont;
+ tr.fFontSize = pTextParams->fFontSize;
+ tr.dwStyles = dwLayoutStyle;
+ tr.iCharRotation = pTextParams->nCharRotation;
+ tr.dwCharStyles = pPiece->dwCharStyles;
+ tr.pRect = &(pPiece->rtPiece);
+ tr.wLineBreakChar = pTextParams->wLineBreakChar;
+ return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
+}
+FX_INT32 CFDE_TxtEdtTextSet::GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray)
+{
+ return GetCharRects_Impl(hText, rtArray);
+}
+FX_INT32 CFDE_TxtEdtTextSet::GetCharRects_Impl(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray, FX_BOOL bBBox )
+{
+ if (hText == NULL) {
+ return 0;
+ }
+ FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
+ CFDE_TxtEdtEngine * pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
+ FX_INT32 nLength = pPiece->nCount;
+ if (nLength < 1) {
+ return 0;
+ }
+ const FDE_TXTEDTPARAMS * pTextParams = pEngine->GetEditParams();
+ FX_DWORD dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
+ FX_TXTRUN tr;
+ tr.pAccess = m_pPage;
+ tr.pIdentity = (FX_LPVOID)hText;
+ tr.pStr = NULL;
+ tr.pWidths = NULL;
+ tr.iLength = nLength;
+ tr.pFont = pTextParams->pFont;
+ tr.fFontSize = pTextParams->fFontSize;
+ tr.dwStyles = dwLayoutStyle;
+ tr.iCharRotation = pTextParams->nCharRotation;
+ tr.dwCharStyles = pPiece->dwCharStyles;
+ tr.pRect = &(pPiece->rtPiece);
+ tr.wLineBreakChar = pTextParams->wLineBreakChar;
+ return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox);
+}
+CFDE_TxtEdtPage::CFDE_TxtEdtPage(IFDE_TxtEdtEngine * pEngine, FX_INT32 nPageIndex)
+ : m_pIter(NULL)
+ , m_pTextSet(NULL)
+ , m_nRefCount(0)
+ , m_nPageStart(-1)
+ , m_nCharCount(0)
+ , m_nPageIndex(nPageIndex)
+ , m_bLoaded(FALSE)
+ , m_bLastPage(FALSE)
+ , m_pCharWidth(NULL)
+ , m_pBgnParag(NULL)
+ , m_pEndParag(NULL)
+{
+ FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
+ FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
+ FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
+ FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
+ m_pEditEngine = (CFDE_TxtEdtEngine*)pEngine;
+}
+CFDE_TxtEdtPage::~CFDE_TxtEdtPage()
+{
+ m_PieceMassArr.RemoveAll(TRUE);
+ if (m_pTextSet) {
+ delete m_pTextSet;
+ m_pTextSet = NULL;
+ }
+ if (m_pCharWidth) {
+ delete [] m_pCharWidth;
+ m_pCharWidth = NULL;
+ }
+ if (m_pIter != NULL) {
+ m_pIter->Release();
+ m_pIter = NULL;
+ }
+}
+void CFDE_TxtEdtPage::Release()
+{
+ delete this;
+}
+IFDE_TxtEdtEngine * CFDE_TxtEdtPage::GetEngine() const
+{
+ return (IFDE_TxtEdtEngine*)m_pEditEngine;
+}
+FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType()
+{
+ return FDE_VISUALOBJ_Text;
+}
+FX_BOOL CFDE_TxtEdtPage::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox)
+{
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix)
+{
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt)
+{
+ return FALSE;
+}
+FX_BOOL CFDE_TxtEdtPage::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt)
+{
+ return FALSE;
+}
+FX_INT32 CFDE_TxtEdtPage::GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox ) const
+{
+ FXSYS_assert(m_nRefCount > 0);
+ FXSYS_assert(nIndex >= 0 && nIndex < m_nCharCount);
+ if (m_nRefCount < 1) {
+ return 0;
+ }
+ FX_INT32 nCount = m_PieceMassArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
+ if (nIndex >= pPiece->nStart && nIndex < (pPiece->nStart + pPiece->nCount)) {
+ CFX_RectFArray rectArr;
+ if (bBBox) {
+ m_pTextSet->GetCharRects_Impl((FDE_HVISUALOBJ)pPiece, rectArr, bBBox);
+ } else {
+ m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
+ }
+ rect = rectArr[nIndex - pPiece->nStart];
+ return pPiece->nBidiLevel;
+ }
+ }
+ FXSYS_assert(0);
+ return 0;
+}
+FX_INT32 CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore)
+{
+ FX_BOOL bVertical = m_pEditEngine->GetEditParams()->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
+ CFX_PointF ptF = fPoint;
+ NormalizePt2Rect(ptF, m_rtPageContents, FDE_TXTEDT_TOLERANCE);
+ FX_INT32 nCount = m_PieceMassArr.GetSize();
+ CFX_RectF rtLine;
+ FX_INT32 nBgn = 0;
+ FX_INT32 nEnd = 0;
+ FX_BOOL bInLine = FALSE;
+ FX_INT32 i = 0;
+ for (i = 0; i < nCount; i ++) {
+ const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
+ if (!bInLine && (bVertical ? (pPiece->rtPiece.left <= ptF.x && pPiece->rtPiece.right() > ptF.x) \
+ : (pPiece->rtPiece.top <= ptF.y && pPiece->rtPiece.bottom() > ptF.y))) {
+ nBgn = nEnd = i;
+ rtLine = pPiece->rtPiece;
+ bInLine = TRUE;
+ } else if (bInLine) {
+ if (bVertical ? (!(pPiece->rtPiece.left <= ptF.x && pPiece->rtPiece.right() > ptF.x)) : \
+ (pPiece->rtPiece.bottom() <= ptF.y || pPiece->rtPiece.top > ptF.y)) {
+ nEnd = i - 1;
+ break;
+ } else {
+ rtLine.Union(pPiece->rtPiece);
+ }
+ }
+ }
+ NormalizePt2Rect(ptF, rtLine, FDE_TXTEDT_TOLERANCE);
+ FX_INT32 nCaret = 0;
+ FDE_LPTEXTEDITPIECE pPiece = NULL;
+ for (i = nBgn; i <= nEnd; i ++) {
+ pPiece = m_PieceMassArr.GetPtrAt(i);
+ nCaret = m_nPageStart + pPiece->nStart;
+ if (pPiece->rtPiece.Contains(ptF)) {
+ CFX_RectFArray rectArr;
+ m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
+ FX_INT32 nRtCount = rectArr.GetSize();
+ for (FX_INT32 j = 0; j < nRtCount; j ++) {
+ if (rectArr[j].Contains(ptF)) {
+ nCaret = m_nPageStart + pPiece->nStart + j;
+ if (nCaret >= m_pEditEngine->GetTextBufLength()) {
+ bBefore = TRUE;
+ return m_pEditEngine->GetTextBufLength();
+ }
+ FX_WCHAR wChar = m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret);
+ if (wChar == L'\n' || wChar == L'\r') {
+ if (wChar == L'\n') {
+ if (m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret - 1) == L'\r') {
+ nCaret --;
+ }
+ }
+ bBefore = TRUE;
+ return nCaret;
+ }
+ if (bVertical ? (ptF.y > ((rectArr[j].top + rectArr[j].bottom()) / 2)) : \
+ (ptF.x > ((rectArr[j].left + rectArr[j].right()) / 2))) {
+ bBefore = FX_IsOdd(pPiece->nBidiLevel);
+ } else {
+ bBefore = !FX_IsOdd(pPiece->nBidiLevel);
+ }
+ return nCaret;
+ }
+ }
+ }
+ }
+ bBefore = TRUE;
+ return nCaret;
+}
+FX_INT32 CFDE_TxtEdtPage::GetCharStart() const
+{
+ return m_nPageStart;
+}
+FX_INT32 CFDE_TxtEdtPage::GetCharCount() const
+{
+ return m_nCharCount;
+}
+FX_INT32 CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS *&pCharPos, FX_LPRECTF pBBox ) const
+{
+ pCharPos = (FXTEXT_CHARPOS*)FDE_Alloc(sizeof(FXTEXT_CHARPOS) * m_nCharCount);
+ FX_INT32 nCharPosCount = 0;
+ FDE_HVISUALOBJ hVisualObj = NULL;
+ FX_INT32 nVisualObjCount = m_PieceMassArr.GetSize();
+ FXTEXT_CHARPOS* pos = pCharPos;
+ CFX_RectF rtObj;
+ for (FX_INT32 i = 0; i < nVisualObjCount; i ++) {
+ hVisualObj = (FDE_HVISUALOBJ)m_PieceMassArr.GetPtrAt(i);
+ m_pTextSet->GetRect(hVisualObj, rtObj);
+ if (!rtClip.IntersectWith(rtObj)) {
+ continue;
+ }
+ FX_INT32 nCount = m_pTextSet->GetDisplayPos(hVisualObj, pos, FALSE);
+ nCharPosCount += nCount;
+ pos += nCount;
+ }
+ if ((nCharPosCount * 5) < (m_nCharCount << 2)) {
+ FX_INT32 nLength = sizeof(FXTEXT_CHARPOS) * nCharPosCount;
+ FXTEXT_CHARPOS * pTemp = (FXTEXT_CHARPOS*)FDE_Alloc(nLength);
+ FXSYS_memcpy(pTemp, pCharPos, nLength);
+ FDE_Free(pCharPos);
+ pCharPos = pTemp;
+ }
+ return nCharPosCount;
+}
+void CFDE_TxtEdtPage::CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const
+{
+ FX_INT32 nPieceCount = m_PieceMassArr.GetSize();
+ FX_INT32 nEnd = nStart + nCount - 1;
+ FX_BOOL bInRange = FALSE;
+ for (FX_INT32 i = 0; i < nPieceCount; i ++) {
+ FDE_LPTEXTEDITPIECE piece = m_PieceMassArr.GetPtrAt(i);
+ if (!bInRange) {
+ if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) {
+ FX_INT32 nRangeEnd = piece->nCount - 1;
+ FX_BOOL bEnd = FALSE;
+ if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
+ nRangeEnd = nEnd - piece->nStart;
+ bEnd = TRUE;
+ }
+ CFX_RectFArray rcArr;
+ m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
+ FX_INT32 nSize = rcArr.GetSize();
+ CFX_RectF rectPiece = rcArr[nStart - piece->nStart];
+ rectPiece.Union(rcArr[nRangeEnd]);
+ RectFArr.Add(rectPiece);
+ if (bEnd) {
+ return;
+ }
+ bInRange = TRUE;
+ }
+ } else {
+ if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
+ CFX_RectFArray rcArr;
+ m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
+ CFX_RectF rectPiece = rcArr[0];
+ rectPiece.Union(rcArr[nEnd - piece->nStart]);
+ RectFArr.Add(rectPiece);
+ return;
+ }
+ RectFArr.Add(piece->rtPiece);
+ }
+ }
+ return;
+}
+FX_INT32 CFDE_TxtEdtPage::SelectWord(const CFX_PointF &fPoint, FX_INT32 &nCount)
+{
+ if (m_nRefCount < 0) {
+ return - 1;
+ }
+ IFDE_TxtEdtBuf * pBuf = m_pEditEngine->GetTextBuf();
+ FX_BOOL bBefore;
+ FX_INT32 nIndex = GetCharIndex(fPoint, bBefore);
+ if (nIndex == m_pEditEngine->GetTextBufLength()) {
+ nIndex = m_pEditEngine->GetTextBufLength() - 1;
+ }
+ if (nIndex < 0) {
+ return -1;
+ }
+ IFX_WordBreak * pIter = FX_WordBreak_Create();
+ pIter->Attach(FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf));
+ pIter->SetAt(nIndex);
+ nCount = pIter->GetWordLength();
+ FX_INT32 nRet = pIter->GetWordPos();
+ pIter->Release();
+ return nRet;
+}
+FX_BOOL CFDE_TxtEdtPage::IsLoaded(FX_LPCRECTF pClipBox )
+{
+ return m_bLoaded;
+}
+FX_INT32 CFDE_TxtEdtPage::LoadPage(FX_LPCRECTF pClipBox , IFX_Pause *pPause )
+{
+ if (m_nRefCount > 0) {
+ m_nRefCount ++;
+ return m_nRefCount;
+ }
+ IFDE_TxtEdtBuf * pBuf = m_pEditEngine->GetTextBuf();
+ const FDE_TXTEDTPARAMS * pParams = m_pEditEngine->GetEditParams();
+ if (m_pIter != NULL) {
+ m_pIter->Release();
+ }
+ FX_WCHAR wcAlias = 0;
+ if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
+ wcAlias = m_pEditEngine->GetAliasChar();
+ }
+ m_pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias);
+ IFX_TxtBreak * pBreak = m_pEditEngine->GetTextBreak();
+ pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ pBreak->ClearBreakPieces();
+ FX_INT32 nLineCount = m_pEditEngine->GetLineCount();
+ FX_INT32 nPageLineCount = m_pEditEngine->GetPageLineCount();
+ FX_INT32 nLength = pBuf->GetTextLength();
+ FX_INT32 nStartLine = nPageLineCount * m_nPageIndex;
+ FX_INT32 nEndLine = FX_MIN((nStartLine + nPageLineCount - 1), (m_pEditEngine->GetLineCount() - 1));
+ FX_INT32 nPageStart, nPageEnd, nTemp, nBgnParag, nStartLineInParag, nEndParag, nEndLineInParag;
+ nBgnParag = m_pEditEngine->Line2Parag(0, 0, nStartLine, nStartLineInParag);
+ m_pBgnParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nBgnParag);
+ m_pBgnParag->LoadParag();
+ m_pBgnParag->GetLineRange(nStartLine - nStartLineInParag, nPageStart, nTemp);
+ nEndParag = m_pEditEngine->Line2Parag(nBgnParag, nStartLineInParag, nEndLine, nEndLineInParag);
+ m_pEndParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nEndParag);
+ m_pEndParag->LoadParag();
+ m_pEndParag->GetLineRange(nEndLine - nEndLineInParag, nPageEnd, nTemp);
+ nPageEnd += (nTemp - 1);
+ FX_BOOL bVertial = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
+ FX_BOOL bLineReserve = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
+ FX_FLOAT fLineStart = bVertial ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f) : 0.0f;
+ FX_FLOAT fLineStep = (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
+ FX_FLOAT fLinePos = fLineStart;
+ if (m_pTextSet == NULL) {
+ m_pTextSet = FX_NEW CFDE_TxtEdtTextSet(this);
+ }
+ m_PieceMassArr.RemoveAll(TRUE);
+ FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+ FX_INT32 nLineStart = nPageStart;
+ FX_INT32 nPieceStart = 0;
+ if (m_pCharWidth != NULL) {
+ delete [] m_pCharWidth;
+ }
+ m_pCharWidth = new FX_INT32[nPageEnd - nPageStart + 1];
+ pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ pBreak->ClearBreakPieces();
+ m_nPageStart = nPageStart;
+ m_nCharCount = nPageEnd - nPageStart + 1;
+ FX_BOOL bReload = FALSE;
+ FX_FLOAT fDefCharWidth = 0;
+ IFX_CharIter * pIter = m_pIter->Clone();
+ pIter->SetAt(nPageStart);
+ m_pIter->SetAt(nPageStart);
+ FX_INT32 nTextEnd = m_pEditEngine->GetTextBufLength();
+ FX_BOOL bFirstPiece = TRUE;
+ do {
+ if (bReload) {
+ dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ } else {
+ FX_WCHAR wAppend = pIter->GetChar();
+ dwBreakStatus = pBreak->AppendChar(wAppend);
+ }
+ if (pIter->GetAt() == nPageEnd && dwBreakStatus < FX_TXTBREAK_LineBreak) {
+ dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ }
+ if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+ FX_INT32 nPieceCount = pBreak->CountBreakPieces();
+ for (FX_INT32 j = 0; j < nPieceCount; j ++) {
+ const CFX_TxtPiece * pPiece = pBreak->GetBreakPiece(j);
+ FDE_TEXTEDITPIECE TxtEdtPiece;
+ FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE));
+ TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel;
+ TxtEdtPiece.nCount = pPiece->GetLength();
+ TxtEdtPiece.nStart = nPieceStart;
+ TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles;
+ if (FX_IsOdd(pPiece->m_iBidiLevel)) {
+ TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
+ }
+ FX_FLOAT fParaBreakWidth = 0.0f;
+ if (pPiece->m_dwStatus > FX_TXTBREAK_PieceBreak) {
+ FX_WCHAR wRtChar = pParams->wLineBreakChar;
+ if (TxtEdtPiece.nCount >= 2) {
+ FX_WCHAR wChar = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
+ FX_WCHAR wCharPre = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 2);
+ if (wChar == wRtChar) {
+ fParaBreakWidth += fDefCharWidth;
+ }
+ if (wCharPre == wRtChar) {
+ fParaBreakWidth += fDefCharWidth;
+ }
+ } else if (TxtEdtPiece.nCount >= 1) {
+ FX_WCHAR wChar = pBuf->GetCharByIndex(m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
+ if (wChar == wRtChar) {
+ fParaBreakWidth += fDefCharWidth;
+ }
+ }
+ }
+ if (pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
+ TxtEdtPiece.rtPiece.left = fLinePos;
+ TxtEdtPiece.rtPiece.top = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+ TxtEdtPiece.rtPiece.width = pParams->fLineSpace;
+ TxtEdtPiece.rtPiece.height = (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
+ } else {
+ TxtEdtPiece.rtPiece.left = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
+ TxtEdtPiece.rtPiece.top = fLinePos;
+ TxtEdtPiece.rtPiece.width = (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
+ TxtEdtPiece.rtPiece.height = pParams->fLineSpace;
+ }
+ if (bFirstPiece) {
+ m_rtPageContents = TxtEdtPiece.rtPiece;
+ bFirstPiece = FALSE;
+ } else {
+ m_rtPageContents.Union(TxtEdtPiece.rtPiece);
+ }
+ nPieceStart += TxtEdtPiece.nCount;
+ m_PieceMassArr.Add(TxtEdtPiece);
+ for (FX_INT32 k = 0; k < TxtEdtPiece.nCount; k ++) {
+ CFX_Char* ptc = pPiece->GetCharPtr(k);
+ m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
+ }
+ }
+ fLinePos += fLineStep;
+ pBreak->ClearBreakPieces();
+ }
+ if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) {
+ bReload = TRUE;
+ pIter->Next(TRUE);
+ }
+ } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd));
+ if (m_rtPageContents.left != 0) {
+ FX_FLOAT fDelta = 0.0f;
+ if (m_rtPageContents.width < pParams->fPlateWidth) {
+ if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Right) {
+ fDelta = pParams->fPlateWidth - m_rtPageContents.width;
+ } else if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Center) {
+ if ((pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) && m_nCharCount > 1) {
+ FX_INT32 nCount = m_nCharCount - 1;
+ FX_INT32 n = (m_pEditEngine->m_nLimit - nCount) / 2;
+ fDelta = (m_rtPageContents.width / nCount) * n;
+ } else {
+ fDelta = (pParams->fPlateWidth - m_rtPageContents.width) / 2;
+ }
+ }
+ }
+ FX_FLOAT fOffset = m_rtPageContents.left - fDelta;
+ FX_INT32 nCount = m_PieceMassArr.GetSize();
+ for (FX_INT32 i = 0; i < nCount; i ++) {
+ FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
+ pPiece->rtPiece.Offset(-fOffset, 0.0f);
+ }
+ m_rtPageContents.Offset(-fOffset, 0.0f);
+ }
+ if (m_pEditEngine->GetEditParams()->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LastLineHeight) {
+ m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize;
+ FX_INT32 nCount = m_PieceMassArr.GetSize();
+ FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
+ pPiece->rtPiece.height = pParams->fFontSize;
+ }
+ pIter->Release();
+ m_nRefCount = 1;
+ m_bLoaded = TRUE;
+ return 0;
+}
+void CFDE_TxtEdtPage::UnloadPage(FX_LPCRECTF pClipBox )
+{
+ FXSYS_assert(m_nRefCount > 0);
+ m_nRefCount --;
+ if (m_nRefCount == 0) {
+ m_PieceMassArr.RemoveAll();
+ if (m_pTextSet) {
+ delete m_pTextSet;
+ m_pTextSet = NULL;
+ }
+ if (m_pCharWidth) {
+ delete [] m_pCharWidth;
+ m_pCharWidth = NULL;
+ }
+ if (m_pBgnParag) {
+ m_pBgnParag->UnloadParag();
+ }
+ if (m_pEndParag) {
+ m_pEndParag->UnloadParag();
+ }
+ if (m_pIter) {
+ m_pIter->Release();
+ m_pIter = NULL;
+ }
+ m_pBgnParag = NULL;
+ m_pEndParag = NULL;
+ }
+ return;
+}
+const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox()
+{
+ return m_rtPageContents;
+}
+FX_POSITION CFDE_TxtEdtPage::GetFirstPosition(FDE_HVISUALOBJ hCanvas)
+{
+ if (m_PieceMassArr.GetSize() < 1) {
+ return NULL;
+ }
+ return (FX_POSITION)1;
+}
+FDE_HVISUALOBJ CFDE_TxtEdtPage::GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet)
+{
+ if (m_pTextSet == NULL) {
+ pos = NULL;
+ return NULL;
+ }
+ FX_INT32 nPos = (FX_INT32)(FX_UINTPTR)pos;
+ pVisualSet = m_pTextSet;
+ if (nPos + 1 > m_PieceMassArr.GetSize()) {
+ pos = NULL;
+ } else {
+ pos = (FX_POSITION)(FX_UINTPTR)(nPos + 1);
+ }
+ return (FDE_HVISUALOBJ)(m_PieceMassArr.GetPtrAt(nPos - 1));
+}
+FDE_HVISUALOBJ CFDE_TxtEdtPage::GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet)
+{
+ return NULL;
+}
+FX_WCHAR CFDE_TxtEdtPage::GetChar(FX_LPVOID pIdentity, FX_INT32 index) const
+{
+ FX_INT32 nIndex = m_nPageStart + ((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index;
+ if (nIndex != m_pIter->GetAt()) {
+ m_pIter->SetAt(nIndex);
+ }
+ FX_WCHAR wChar = m_pIter->GetChar();
+ m_pIter->Next();
+ return wChar;
+}
+FX_INT32 CFDE_TxtEdtPage::GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const
+{
+ FX_INT32 nWidth = m_pCharWidth[((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index];
+ return nWidth;
+}
+void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF &ptF, const CFX_RectF &rtF, FX_FLOAT fTolerance) const
+{
+ if (rtF.Contains(ptF.x, ptF.y)) {
+ return;
+ }
+ if (ptF.x < rtF.left) {
+ ptF.x = rtF.left;
+ } else if (ptF.x >= rtF.right()) {
+ ptF.x = rtF.right() - fTolerance;
+ }
+ if (ptF.y < rtF.top) {
+ ptF.y = rtF.top;
+ } else if (ptF.y >= rtF.bottom()) {
+ ptF.y = rtF.bottom() - fTolerance;
+ }
+}
diff --git a/xfa/src/fee/src/fee/fde_txtedtpage.h b/xfa/src/fee/src/fee/fde_txtedtpage.h
new file mode 100644
index 0000000000..36021b66aa
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtpage.h
@@ -0,0 +1,130 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_TXTEDTPAGE_H
+#define _FDE_TXTEDTPAGE_H
+class CFDE_TxtEdtEngine;
+class IFX_CharIter;
+class CFDE_TxtEdtPage;
+class CFDE_TxtEdtLineExt;
+class CFDE_TxtEdtTextSet;
+class CFDE_TxtEdtParag;
+enum FDE_TXTEDT_CHARTYPE {
+ FDE_TXTEDT_CHARTYPE_Unknown = 0 ,
+ FDE_TXTEDT_CHARTYPE_Tab ,
+ FDE_TXTEDT_CHARTYPE_Space ,
+ FDE_TXTEDT_CHARTYPE_Punctuation ,
+ FDE_TXTEDT_CHARTYPE_LineBreak ,
+ FDE_TXTEDT_CHARTYPE_Number ,
+ FDE_TXTEDT_CHARTYPE_Char ,
+ FDE_TXTEDT_CHARTYPE_CJK ,
+};
+static FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar)
+{
+ if (wChar == 0x9) {
+ return FDE_TXTEDT_CHARTYPE_Tab;
+ } else if (wChar == 0x20 || wChar == 0xA0) {
+ return FDE_TXTEDT_CHARTYPE_Space;
+ } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 || (wChar >= L'!' && wChar <= L'/') || (wChar >= L':' && wChar <= L'@') || (wChar >= L'[' && wChar <= L'^') ||
+ (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) {
+ return FDE_TXTEDT_CHARTYPE_Punctuation;
+ } else if (wChar == 0x0a || wChar == 0x0d) {
+ return FDE_TXTEDT_CHARTYPE_LineBreak;
+ } else if (wChar >= '0' && wChar <= '9') {
+ return FDE_TXTEDT_CHARTYPE_Number;
+ } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) || (wChar >= 0x3000 && wChar <= 0x303f) || (wChar >= 0x31c0 && wChar <= 0x31ef)
+ || (wChar >= 0x3200 && wChar <= 0x32ff) || (wChar >= 0x3300 && wChar <= 0x33ff) || (wChar >= 0x3400 && wChar <= 0x4dbf)
+ || (wChar >= 0x4e00 && wChar <= 0x9fff) || (wChar >= 0xf900 && wChar <= 0xfaff) || (wChar >= 0xfe30 && wChar <= 0xfe4f)) {
+ return FDE_TXTEDT_CHARTYPE_CJK;
+ } else {
+ return FDE_TXTEDT_CHARTYPE_Char;
+ }
+}
+typedef struct _FDE_TXTEDTPIECE : public CFX_Object {
+ FX_INT32 nStart;
+ FX_INT32 nCount;
+ FX_INT32 nBidiLevel;
+ CFX_RectF rtPiece;
+ FX_DWORD dwCharStyles;
+} FDE_TEXTEDITPIECE, * FDE_LPTEXTEDITPIECE;
+typedef CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> CFDE_TXTEDTPieceMassArray;
+class CFDE_TxtEdtTextSet : public IFDE_TextSet, public CFX_Object
+{
+public:
+ CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage);
+ ~CFDE_TxtEdtTextSet();
+
+ virtual FDE_VISUALOBJTYPE GetType();
+ virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox);
+ virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix);
+ virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);
+ virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);
+ virtual FX_INT32 GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText);
+ virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText);
+ virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText);
+ virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText);
+ virtual FX_INT32 GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL);
+ virtual FX_INT32 GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray);
+ virtual FX_INT32 GetCharRects_Impl(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray, FX_BOOL bBBox = FALSE);
+private:
+
+ CFDE_TxtEdtPage * m_pPage;
+};
+class CFDE_TxtEdtPage : public CFX_Object, public IFDE_TxtEdtPage
+{
+public:
+ CFDE_TxtEdtPage(IFDE_TxtEdtEngine * pEngine, FX_INT32 nLineIndex);
+
+ virtual void Release();
+ virtual IFDE_TxtEdtEngine * GetEngine() const;
+
+ virtual FDE_VISUALOBJTYPE GetType();
+ virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox);
+ virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix);
+ virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);
+ virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);
+ virtual FX_INT32 GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox = FALSE) const;
+ virtual FX_INT32 GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore);
+ virtual FX_INT32 SelectWord(const CFX_PointF &fPoint, FX_INT32 &nCount);
+ virtual FX_INT32 GetCharStart() const;
+ virtual FX_INT32 GetCharCount() const;
+ virtual void CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const;
+ virtual FX_INT32 GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS *&pCharPos, FX_LPRECTF pBBox) const;
+
+ virtual FX_BOOL IsLoaded(FX_LPCRECTF pClipBox = NULL);
+ virtual FX_INT32 LoadPage(FX_LPCRECTF pClipBox = NULL, IFX_Pause *pPause = NULL);
+ virtual void UnloadPage(FX_LPCRECTF pClipBox = NULL);
+
+ virtual const CFX_RectF& GetContentsBox();
+ virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas);
+ virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet);
+ virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet);
+ virtual FX_WCHAR GetChar(FX_LPVOID pIdentity, FX_INT32 index) const;
+ virtual FX_INT32 GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const;
+protected:
+ virtual ~CFDE_TxtEdtPage();
+private:
+ void NormalizePt2Rect(CFX_PointF &ptF, const CFX_RectF &rtF, FX_FLOAT fTolerance) const;
+ IFX_CharIter *m_pIter;
+ CFDE_TxtEdtTextSet *m_pTextSet;
+ CFDE_TxtEdtEngine *m_pEditEngine;
+ CFDE_TXTEDTPieceMassArray m_PieceMassArr;
+ CFDE_TxtEdtParag * m_pBgnParag;
+ CFDE_TxtEdtParag * m_pEndParag;
+
+ FX_INT32 m_nRefCount;
+ FX_INT32 m_nPageStart;
+ FX_INT32 m_nCharCount;
+ FX_INT32 m_nPageIndex;
+ FX_BOOL m_bLoaded;
+ FX_BOOL m_bLastPage;
+ CFX_RectF m_rtPage;
+ CFX_RectF m_rtPageMargin;
+ CFX_RectF m_rtPageContents;
+ CFX_RectF m_rtPageCanvas;
+ FX_INT32* m_pCharWidth;
+};
+#endif
diff --git a/xfa/src/fee/src/fee/fde_txtedtparag.cpp b/xfa/src/fee/src/fee/fde_txtedtparag.cpp
new file mode 100644
index 0000000000..9887ddcd3c
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtparag.cpp
@@ -0,0 +1,149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "../../include/ifde_txtedtbuf.h"
+#include "../../include/ifde_txtedtengine.h"
+#include "../../include/fx_wordbreak.h"
+#include "fde_txtedtparag.h"
+#include "fde_txtedtengine.h"
+#include "fde_txtedtbuf.h"
+CFDE_TxtEdtParag::CFDE_TxtEdtParag(CFDE_TxtEdtEngine * pEngine)
+ : m_nLineCount(0)
+ , m_nCharStart(0)
+ , m_nCharCount(0)
+ , m_lpData(NULL)
+ , m_pEngine(pEngine)
+{
+ FXSYS_assert(m_pEngine);
+}
+CFDE_TxtEdtParag::~CFDE_TxtEdtParag()
+{
+ if (m_lpData != NULL) {
+ FX_Free(m_lpData);
+ }
+}
+void CFDE_TxtEdtParag::LoadParag()
+{
+ if (m_lpData != NULL) {
+ ((FX_INT32*)m_lpData)[0]++;
+ return;
+ }
+ IFX_TxtBreak * pTxtBreak = m_pEngine->GetTextBreak();
+ IFDE_TxtEdtBuf * pTxtBuf = m_pEngine->GetTextBuf();
+ const FDE_TXTEDTPARAMS *pParam = m_pEngine->GetEditParams();
+ FX_WCHAR wcAlias = 0;
+ if (pParam->dwMode & FDE_TEXTEDITMODE_Password) {
+ wcAlias = m_pEngine->GetAliasChar();
+ }
+ IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf, wcAlias);
+ pIter->SetAt(m_nCharStart);
+ FX_INT32 nEndIndex = m_nCharStart + m_nCharCount;
+ CFX_ArrayTemplate<FX_INT32> LineBaseArr;
+ FX_BOOL bReload = FALSE;
+ FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+ FX_INT32 nTextEnd = m_pEngine->GetTextBufLength();
+ do {
+ if (bReload) {
+ dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ } else {
+ FX_WCHAR wAppend = pIter->GetChar();
+ dwBreakStatus = pTxtBreak->AppendChar(wAppend);
+ }
+ if (pIter->GetAt() + 1 == nEndIndex && dwBreakStatus < FX_TXTBREAK_LineBreak) {
+ dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ }
+ if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+ FX_INT32 nCount = pTxtBreak->CountBreakPieces();
+ FX_INT32 nTotal = 0;
+ for (FX_INT32 j = 0; j < nCount; j ++) {
+ const CFX_TxtPiece * Piece = pTxtBreak->GetBreakPiece(j);
+ nTotal += Piece->GetLength();
+ }
+ LineBaseArr.Add(nTotal);
+ pTxtBreak->ClearBreakPieces();
+ }
+ if ((pIter->GetAt() + 1 == nEndIndex) && (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
+ bReload = TRUE;
+ pIter->Next(TRUE);
+ }
+ } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
+ pIter->Release();
+ pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ pTxtBreak->ClearBreakPieces();
+ FX_INT32 nLineCount = LineBaseArr.GetSize();
+ m_nLineCount = nLineCount;
+ if (m_lpData == NULL) {
+ m_lpData = FX_Alloc(FX_INT32, nLineCount + 1);
+ } else {
+ m_lpData = FX_Realloc(FX_INT32, m_lpData, (nLineCount + 1));
+ }
+ FX_INT32 * pIntArr = (FX_INT32*)m_lpData;
+ pIntArr[0] = 1;
+ m_nLineCount = nLineCount;
+ pIntArr ++;
+ for (FX_INT32 j = 0; j < nLineCount; j ++, pIntArr ++) {
+ *pIntArr = LineBaseArr[j];
+ }
+ LineBaseArr.RemoveAll();
+}
+void CFDE_TxtEdtParag::UnloadParag()
+{
+ FXSYS_assert(m_lpData != NULL);
+ ((FX_INT32*)m_lpData)[0]--;
+ FXSYS_assert(((FX_INT32*)m_lpData)[0] >= 0);
+ if (((FX_INT32*)m_lpData)[0] == 0) {
+ FX_Free(m_lpData);
+ m_lpData = NULL;
+ }
+}
+void CFDE_TxtEdtParag::CalcLines()
+{
+ IFX_TxtBreak * pTxtBreak = m_pEngine->GetTextBreak();
+ IFDE_TxtEdtBuf * pTxtBuf = m_pEngine->GetTextBuf();
+ IFX_CharIter * pIter = FX_NEW CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf);
+ FX_INT32 nCount = 0;
+ FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
+ FX_INT32 nEndIndex = m_nCharStart + m_nCharCount;
+ pIter->SetAt(m_nCharStart);
+ FX_BOOL bReload = FALSE;
+ FX_INT32 nTextEnd = m_pEngine->GetTextBufLength();
+ do {
+ if (bReload) {
+ dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ } else {
+ FX_WCHAR wAppend = pIter->GetChar();
+ dwBreakStatus = pTxtBreak->AppendChar(wAppend);
+ }
+ if (pIter->GetAt() + 1 == nEndIndex && dwBreakStatus < FX_TXTBREAK_LineBreak) {
+ dwBreakStatus = pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ }
+ if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
+ nCount ++;
+ pTxtBreak->ClearBreakPieces();
+ }
+ if ((pIter->GetAt() + 1 == nEndIndex) && (dwBreakStatus == FX_TXTBREAK_LineBreak)) {
+ bReload = TRUE;
+ pIter->Next(TRUE);
+ }
+ } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
+ pIter->Release();
+ pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
+ pTxtBreak->ClearBreakPieces();
+ m_nLineCount = nCount;
+}
+void CFDE_TxtEdtParag::GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const
+{
+ FX_INT32 * pLineBaseArr = (FX_INT32*)m_lpData;
+ FXSYS_assert(nLineIndex < m_nLineCount);
+ nStart = m_nCharStart;
+ pLineBaseArr ++;
+ for (FX_INT32 i = 0; i < nLineIndex; i ++) {
+ nStart += *pLineBaseArr;
+ pLineBaseArr ++;
+ }
+ nCount = *pLineBaseArr;
+}
diff --git a/xfa/src/fee/src/fee/fde_txtedtparag.h b/xfa/src/fee/src/fee/fde_txtedtparag.h
new file mode 100644
index 0000000000..72584feca8
--- /dev/null
+++ b/xfa/src/fee/src/fee/fde_txtedtparag.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FDE_TXTEDTPARAG_H
+#define _FDE_TXTEDTPARAG_H
+class CFDE_TxtEdtEngine;
+class CFDE_TxtEdtParag;
+class CFDE_TxtEdtParag : public IFDE_TxtEdtParag, public CFX_Object
+{
+public:
+ CFDE_TxtEdtParag(CFDE_TxtEdtEngine * pEngine);
+ ~CFDE_TxtEdtParag();
+ virtual FX_INT32 GetTextLength() const
+ {
+ return m_nCharCount;
+ }
+ virtual FX_INT32 GetStartIndex() const
+ {
+ return m_nCharStart;
+ }
+ virtual FX_INT32 CountLines() const
+ {
+ return m_nLineCount;
+ }
+ virtual void GetLineRange(FX_INT32 nLineIndex, FX_INT32& nStart, FX_INT32& nCount) const;
+ void LoadParag();
+ void UnloadParag();
+ void CalcLines();
+ FX_INT32 m_nCharStart;
+ FX_INT32 m_nCharCount;
+ FX_INT32 m_nLineCount;
+private:
+ FX_LPVOID m_lpData;
+ CFDE_TxtEdtEngine* m_pEngine;
+};
+#endif
diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp
new file mode 100644
index 0000000000..4847af9ed3
--- /dev/null
+++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.cpp
@@ -0,0 +1,263 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "fx_wordbreak_impl.h"
+#define FX_IsOdd(a) ((a) & 1)
+FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint)
+{
+ FX_DWORD dwProperty = (FX_DWORD)gs_FX_WordBreak_CodePointProperties[wcCodePoint >> 1];
+ return (FX_WordBreakProp)(FX_IsOdd(wcCodePoint) ? (dwProperty & 0x0F) : (dwProperty >> 4));
+}
+CFX_CharIter::CFX_CharIter(const CFX_WideString & wsText)
+ : m_wsText(wsText)
+ , m_nIndex(0)
+{
+ FXSYS_assert(!wsText.IsEmpty());
+}
+CFX_CharIter::~CFX_CharIter()
+{
+}
+void CFX_CharIter::Release()
+{
+ delete this;
+}
+FX_BOOL CFX_CharIter::Next(FX_BOOL bPrev )
+{
+ if (bPrev) {
+ if (m_nIndex <= 0) {
+ return FALSE;
+ }
+ m_nIndex --;
+ } else {
+ if (m_nIndex + 1 >= m_wsText.GetLength()) {
+ return FALSE;
+ }
+ m_nIndex ++;
+ }
+ return TRUE;
+}
+FX_WCHAR CFX_CharIter::GetChar()
+{
+ return m_wsText.GetAt(m_nIndex);
+}
+void CFX_CharIter::SetAt(FX_INT32 nIndex)
+{
+ if (nIndex < 0 || nIndex >= m_wsText.GetLength()) {
+ return;
+ }
+ m_nIndex = nIndex;
+}
+FX_INT32 CFX_CharIter::GetAt() const
+{
+ return m_nIndex;
+}
+FX_BOOL CFX_CharIter::IsEOF(FX_BOOL bTail ) const
+{
+ return bTail ? (m_nIndex + 1 == m_wsText.GetLength()) : (m_nIndex == 0);
+}
+IFX_CharIter * CFX_CharIter::Clone()
+{
+ CFX_CharIter * pIter = new CFX_CharIter(m_wsText);
+ pIter->m_nIndex = m_nIndex;
+ return pIter;
+}
+CFX_WordBreak::CFX_WordBreak()
+ : m_pPreIter(NULL)
+ , m_pCurIter(NULL)
+{
+}
+CFX_WordBreak::~CFX_WordBreak()
+{
+ if (m_pPreIter) {
+ m_pPreIter->Release();
+ m_pPreIter = NULL;
+ }
+ if (m_pCurIter) {
+ m_pCurIter->Release();
+ m_pCurIter = NULL;
+ }
+}
+void CFX_WordBreak::Release()
+{
+ delete this;
+}
+void CFX_WordBreak::Attach(IFX_CharIter * pIter)
+{
+ FXSYS_assert(pIter);
+ m_pCurIter = pIter;
+}
+void CFX_WordBreak::Attach(const CFX_WideString &wsText)
+{
+ m_pCurIter = new CFX_CharIter(wsText);
+}
+FX_BOOL CFX_WordBreak::Next(FX_BOOL bPrev)
+{
+ IFX_CharIter * pIter = bPrev ? m_pPreIter->Clone() : m_pCurIter->Clone();
+ if (pIter->IsEOF(!bPrev)) {
+ return FALSE;
+ }
+ pIter->Next(bPrev);
+ if (!FindNextBreakPos(pIter, bPrev, TRUE)) {
+ pIter->Release();
+ return FALSE;
+ }
+ if (bPrev) {
+ m_pCurIter->Release();
+ m_pCurIter = m_pPreIter;
+ m_pCurIter->Next(TRUE);
+ m_pPreIter = pIter;
+ } else {
+ m_pPreIter->Release();
+ m_pPreIter = m_pCurIter;
+ m_pPreIter->Next();
+ m_pCurIter = pIter;
+ }
+ return TRUE;
+}
+void CFX_WordBreak::SetAt(FX_INT32 nIndex)
+{
+ if (m_pPreIter) {
+ m_pPreIter->Release();
+ m_pPreIter = NULL;
+ }
+ m_pCurIter->SetAt(nIndex);
+ FindNextBreakPos(m_pCurIter, TRUE, FALSE);
+ m_pPreIter = m_pCurIter;
+ m_pCurIter = m_pPreIter->Clone();
+ FindNextBreakPos(m_pCurIter, FALSE, FALSE);
+}
+FX_INT32 CFX_WordBreak::GetWordPos() const
+{
+ return m_pPreIter->GetAt();
+}
+FX_INT32 CFX_WordBreak::GetWordLength() const
+{
+ return m_pCurIter->GetAt() - m_pPreIter->GetAt() + 1;
+}
+void CFX_WordBreak::GetWord(CFX_WideString &wsWord) const
+{
+ FX_INT32 nWordLength = GetWordLength();
+ if (nWordLength <= 0) {
+ return;
+ }
+ FX_LPWSTR lpBuf = wsWord.GetBuffer(nWordLength);
+ IFX_CharIter * pTempIter = m_pPreIter->Clone();
+ FX_INT32 i = 0;
+ while (pTempIter->GetAt() <= m_pCurIter->GetAt()) {
+ lpBuf[i++] = pTempIter->GetChar();
+ FX_BOOL bEnd = pTempIter->Next();
+ if (!bEnd) {
+ break;
+ }
+ }
+ pTempIter->Release();
+ wsWord.ReleaseBuffer(nWordLength);
+}
+FX_BOOL CFX_WordBreak::IsEOF(FX_BOOL bTail) const
+{
+ return m_pCurIter->IsEOF(bTail);
+}
+FX_BOOL CFX_WordBreak::FindNextBreakPos(IFX_CharIter * pIter, FX_BOOL bPrev,
+ FX_BOOL bFromNext )
+{
+ FX_WordBreakProp ePreType = FX_WordBreakProp_None;
+ FX_WordBreakProp eCurType = FX_WordBreakProp_None;
+ FX_WordBreakProp eNextType = FX_WordBreakProp_None;
+ if (pIter->IsEOF(!bPrev)) {
+ return TRUE;
+ }
+ if (!(bFromNext || pIter->IsEOF(bPrev))) {
+ pIter->Next(!bPrev);
+ FX_WCHAR wcTemp = pIter->GetChar();
+ ePreType = FX_GetWordBreakProperty(wcTemp);
+ pIter->Next(bPrev);
+ }
+ FX_WCHAR wcTemp = pIter->GetChar();
+ eCurType = FX_GetWordBreakProperty(wcTemp);
+ FX_BOOL bFirst = TRUE;
+ do {
+ pIter->Next(bPrev);
+ FX_WCHAR wcTemp = pIter->GetChar();
+ eNextType = FX_GetWordBreakProperty(wcTemp);
+ FX_WORD wBreak = gs_FX_WordBreak_Table[eCurType] & ((FX_WORD)(1 << eNextType));
+ if (wBreak) {
+ if (pIter->IsEOF(!bPrev)) {
+ pIter->Next(!bPrev);
+ return TRUE;
+ }
+ if (bFirst) {
+ FX_INT32 nFlags = 0;
+ if (eCurType == FX_WordBreakProp_MidLetter) {
+ if (eNextType == FX_WordBreakProp_ALetter) {
+ nFlags = 1;
+ }
+ } else if (eCurType == FX_WordBreakProp_MidNum) {
+ if (eNextType == FX_WordBreakProp_Numberic) {
+ nFlags = 2;
+ }
+ } else if (eCurType == FX_WordBreakProp_MidNumLet) {
+ if (eNextType == FX_WordBreakProp_ALetter) {
+ nFlags = 1;
+ } else if (eNextType == FX_WordBreakProp_Numberic) {
+ nFlags = 2;
+ }
+ }
+ if (nFlags > 0) {
+ FXSYS_assert(nFlags <= 2);
+ if (!((nFlags == 1 && ePreType == FX_WordBreakProp_ALetter) ||
+ (nFlags == 2 && ePreType == FX_WordBreakProp_Numberic))) {
+ pIter->Next(!bPrev);
+ return TRUE;
+ }
+ pIter->Next(bPrev);
+ wBreak = FALSE;
+ }
+ bFirst = FALSE;
+ }
+ if (wBreak) {
+ FX_INT32 nFlags = 0;
+ if (eNextType == FX_WordBreakProp_MidLetter) {
+ if (eCurType == FX_WordBreakProp_ALetter) {
+ nFlags = 1;
+ }
+ } else if (eNextType == FX_WordBreakProp_MidNum) {
+ if (eCurType == FX_WordBreakProp_Numberic) {
+ nFlags = 2;
+ }
+ } else if (eNextType == FX_WordBreakProp_MidNumLet) {
+ if (eCurType == FX_WordBreakProp_ALetter) {
+ nFlags = 1;
+ } else if (eCurType == FX_WordBreakProp_Numberic) {
+ nFlags = 2;
+ }
+ }
+ if (nFlags <= 0) {
+ pIter->Next(!bPrev);
+ return TRUE;
+ }
+ FXSYS_assert(nFlags <= 2);
+ pIter->Next(bPrev);
+ wcTemp = pIter->GetChar();
+ eNextType = (FX_WordBreakProp)FX_GetWordBreakProperty(wcTemp);
+ if (!((nFlags == 1 && eNextType == FX_WordBreakProp_ALetter) ||
+ (nFlags == 2 && eNextType == FX_WordBreakProp_Numberic))) {
+ pIter->Next(!bPrev);
+ pIter->Next(!bPrev);
+ return TRUE;
+ }
+ }
+ }
+ ePreType = eCurType;
+ eCurType = eNextType;
+ bFirst = FALSE;
+ } while (!pIter->IsEOF(!bPrev));
+ return TRUE;
+}
+IFX_WordBreak * FX_WordBreak_Create()
+{
+ return new CFX_WordBreak;
+}
diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h
new file mode 100644
index 0000000000..91895a54d7
--- /dev/null
+++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreak_impl.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_WORDBREAK_IMPL_H
+#define _FX_WORDBREAK_IMPL_H
+extern const FX_WORD gs_FX_WordBreak_Table[16];
+extern const FX_BYTE gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1];
+enum FX_WordBreakProp {
+ FX_WordBreakProp_None = 0 ,
+ FX_WordBreakProp_CR ,
+ FX_WordBreakProp_LF ,
+ FX_WordBreakProp_NewLine ,
+ FX_WordBreakProp_Extend ,
+ FX_WordBreakProp_Format ,
+ FX_WordBreakProp_KataKana ,
+ FX_WordBreakProp_ALetter ,
+ FX_WordBreakProp_MidLetter ,
+ FX_WordBreakProp_MidNum ,
+ FX_WordBreakProp_MidNumLet ,
+ FX_WordBreakProp_Numberic ,
+ FX_WordBreakProp_ExtendNumLet ,
+};
+FX_WordBreakProp FX_GetWordBreakProperty(FX_WCHAR wcCodePoint);
+class CFX_CharIter : public IFX_CharIter, public CFX_Object
+{
+public:
+ CFX_CharIter(const CFX_WideString & wsText);
+ virtual void Release();
+ virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
+ virtual FX_WCHAR GetChar();
+ virtual void SetAt(FX_INT32 nIndex);
+ virtual FX_INT32 GetAt() const;
+ virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
+ virtual IFX_CharIter * Clone();
+protected:
+ ~CFX_CharIter();
+private:
+ const CFX_WideString &m_wsText;
+ FX_INT32 m_nIndex;
+};
+class CFX_WordBreak : public IFX_WordBreak, public CFX_Object
+{
+public:
+ CFX_WordBreak();
+ virtual void Release();
+ virtual void Attach(IFX_CharIter * pIter);
+ virtual void Attach(const CFX_WideString &wsText);
+ virtual FX_BOOL Next(FX_BOOL bPrev);
+ virtual void SetAt(FX_INT32 nIndex);
+ virtual FX_INT32 GetWordPos() const;
+ virtual FX_INT32 GetWordLength() const;
+ virtual void GetWord(CFX_WideString &wsWord) const;
+ virtual FX_BOOL IsEOF(FX_BOOL bTail ) const;
+protected:
+ ~CFX_WordBreak();
+ FX_BOOL FindNextBreakPos(IFX_CharIter * pIter, FX_BOOL bPrev, FX_BOOL bFromNext = TRUE);
+private:
+ IFX_CharIter * m_pPreIter;
+ IFX_CharIter * m_pCurIter;
+};
+#endif
diff --git a/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp b/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp
new file mode 100644
index 0000000000..23e30479f4
--- /dev/null
+++ b/xfa/src/fee/src/fx_wordbreak/fx_wordbreakdata.cpp
@@ -0,0 +1,2062 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../foxitlib.h"
+#include "fx_wordbreak_impl.h"
+extern const FX_WORD gs_FX_WordBreak_Table[16] = {
+ 0xFFFF, 0xFFF9, 0xFFFB, 0xFFFB, 0xFFFB, 0xFFFB, 0xEFBB, 0xE77B,
+ 0xFFFB, 0xFFFB, 0xFFFB, 0xE77B, 0xE73B, 0xFFFB, 0xFFFB, 0xFFFB,
+};
+extern const FX_BYTE gs_FX_WordBreak_CodePointProperties[(0xFFFF - 1) / 2 + 1] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x89, 0x00, 0x00,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x70, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x70, 0x77, 0x00, 0x77, 0x77, 0x90,
+ 0x00, 0x00, 0x00, 0x78, 0x77, 0x70, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x04, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x00, 0x00, 0x00,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x09, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04,
+ 0x04, 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x0B, 0x90, 0x77, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x44, 0x44, 0x44, 0x45, 0x44,
+ 0x44, 0x44, 0x47, 0x74, 0x40, 0x44, 0x44, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x70, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x77, 0x00, 0x90, 0x70, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x74, 0x44, 0x44,
+ 0x44, 0x44, 0x74, 0x44, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x47, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x74, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x70, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77,
+ 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00, 0x77, 0x77, 0x00, 0x47, 0x44,
+ 0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x77, 0x07,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x44, 0x07, 0x77, 0x77, 0x70, 0x00, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x70, 0x77, 0x00, 0x40, 0x44,
+ 0x44, 0x40, 0x00, 0x04, 0x40, 0x04, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x77, 0x70, 0x70,
+ 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
+ 0x44, 0x44, 0x44, 0x04, 0x44, 0x04, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
+ 0x44, 0x44, 0x40, 0x04, 0x40, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x77, 0x07,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x47, 0x07, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x77, 0x77, 0x00, 0x07, 0x70, 0x70, 0x77,
+ 0x00, 0x07, 0x70, 0x00, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x44,
+ 0x44, 0x40, 0x00, 0x44, 0x40, 0x44, 0x44, 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x07, 0x44,
+ 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x77, 0x00, 0x00, 0x00,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x00, 0x47, 0x44,
+ 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x70,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x44,
+ 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77,
+ 0x00, 0x44, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00,
+ 0x77, 0x77, 0x77, 0x70, 0x00, 0x40, 0x00, 0x04, 0x44, 0x44, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x40, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x44, 0x44, 0x04, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x44,
+ 0x77, 0x77, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x40, 0x44, 0x77, 0x77, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x04, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x44,
+ 0x40, 0x44, 0x40, 0x04, 0x44, 0x44, 0x44, 0x00, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x44, 0x44, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x70, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70, 0x70, 0x77, 0x77, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x70,
+ 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x70, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x74, 0x70, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x40,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x47, 0x77, 0x77, 0x77, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x74, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x07, 0x77, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x47, 0x77, 0x74, 0x77, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x07, 0x07, 0x07, 0x07,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x70,
+ 0x00, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x55, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xA0, 0x08, 0x33, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
+ 0xC0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x55, 0x55, 0x50, 0x00, 0x00, 0x55, 0x55, 0x55, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x70, 0x00, 0x07, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00, 0x07, 0x77, 0x77, 0x00,
+ 0x00, 0x00, 0x70, 0x70, 0x70, 0x77, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77,
+ 0x00, 0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x70, 0x00, 0x00, 0x07, 0x77, 0x74, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
+ 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x70,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x06, 0x66, 0x66, 0x00, 0x00, 0x07, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46, 0x60, 0x00,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x66, 0x66,
+ 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x07,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77,
+ 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77,
+ 0x77, 0x47, 0x77, 0x47, 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x74, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x77, 0x77, 0x77, 0x00, 0x07, 0x00, 0x00,
+ 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x44, 0x44, 0x44, 0x44, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00,
+ 0x44, 0x44, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x74, 0x77, 0x77, 0x77, 0x77, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x40, 0x04, 0x40, 0x00, 0x00, 0x44,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x74, 0x44, 0x44, 0x44, 0x40, 0x44, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x70, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x00, 0x00, 0x07, 0x47,
+ 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x77, 0x77, 0x70, 0x70,
+ 0x77, 0x07, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x90, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCC, 0x90, 0xA0, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x70, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x05,
+ 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x90, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x0C,
+ 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x44,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70,
+ 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x77, 0x77, 0x00, 0x77, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x00, 0x00,
+};